c#用复合梯形公式求积分,已知上下限及步长为什么计算结果为0

charles_su
  • 42

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{

class Program
{
    static void Main(string[] args)
    {
        int a, b, select;
        double result,step;
        Console.WriteLine("请选择要积分的函数,1:f(x)=1+x^2 2:f(x)=log10(x) 3:1/(1+x^2)");
        select = Console.Read();
        Console.WriteLine("请输入积分上下限及步长");
        a = Console.Read();
        b = Console.Read();
        step = Console.Read();
        Integration func = new Integration();
        FunctionDelegate f1 = new FunctionDelegate(func.fun_1);
        FunctionDelegate f2 = new FunctionDelegate(func.fun_2);
        FunctionDelegate f3 = new FunctionDelegate(func.fun_3);
        if (select == 1)
        {
            result = func.Integral(a, b,step, f1);
        }
        else if (select == 2)
        {
            result = func.Integral(a, b, step, f2);
        }
        else
        {
            result = func.Integral(a, b,step, f3);
        }
        Console.WriteLine("The result is {0}", result);
        System.Threading.Thread.Sleep(1000 * 1000);
    }
    //定义委托
    public delegate double FunctionDelegate(double x);
    public partial class Integration
    {
        public double fun_1(double x)
        { return 1 + x * x; }
        public double fun_2(double x)
        { return Math.Log10(x); }
        public double fun_3(double x)
        { return 1 / (1 + x * x); }
        public double Integral(double a, double b,double s, FunctionDelegate f)
        {//梯形法求积分的值
            double sum = 0;
            for(double i=a; i<=b; i+=s)
            {
                sum += f(i);
            }
            sum *= s;
            return sum;
        }

    }
}

}

回复
阅读 2.6k
2 个回答
✓ 已被采纳

提供一个不是很完美的解决方法
输入一个值就回车一次

    select = int.Parse(Console.ReadLine());
    Console.WriteLine("请输入积分上下限及步长");
    a = int.Parse(Console.ReadLine());
    b = int.Parse(Console.ReadLine());
    step = Double.Parse(Console.ReadLine());

程序数据输入有问题, 你输入的所以数据都会当做字符处理

Read方法的处理方式是:
第一次调用会阻塞你的程序,直到输入Enter,同时会在输入内容上添加一个终止序列(Windows下是回车符和换行符)

后续的Read方法调用不会阻塞你的程序,直到Read方法检索完毕了最后一个字符,这时如果要再调用Read方法,程序又会再次处于阻塞状态了,就像第一次调用Read方法一样,但是这又是新的一次轮回了!

多谢大神受教了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏