编写一个求定积分的通用函数,用它分别求以下5个函数的定积分:∫ab(1+x)dx,∫ab (2x+3)dx,∫ab(ex+1)dx,∫ab(1+x)2dx,∫abx3dx。其中a,b为积分上下限...

编写一个求定积分的通用函数,用它分别求以下5个函数的定积分:∫ab (1+x)dx , ∫ab (2x+3)dx , ∫ab (ex+1)dx ,
∫ab (1+x)2dx , ∫ab x3dx 。其中,a,b为积分上下限,数值待定。在这里插入图片描述
方法一:指向函数的指针(数学公式)

#include<stdio.h>
#include<math.h>
#define e 2.71828//定义自然常数e; 

int main()
{ 
	double f1(double,double);
  	double f2(double,double);
  	double f3(double,double);
  	double f4(double,double);
  	double f5(double,double);
  	double integral(double m,double n,double (*fun)(double,double));
  	double a,b;
	printf("enter a and b(中间以空格隔开):");   
 	scanf("%lf%lf",&a,&b);
 	printf("\n函数(1+x)在%4.1f到%4.1f的积分是:",a,b);
 	integral(a,b,f1);
 	printf("\n函数(2*x+3)在%4.1f到%4.1f的积分是:",a,b);
 	integral(a,b,f2);
 	printf("\n函数(e^x+1)在%4.1f到%4.1f的积分是:",a,b);
 	integral(a,b,f3);
 	printf("\n函数((1+x)^2)在%4.1f到%4.1f的积分是:",a,b);
 	integral(a,b,f4);
 	printf("\n函数(x^3)在%4.1f到%4.1f的积分是:",a,b);
 	integral(a,b,f5);
 	return 0;
}

double integral(double m,double n,double (*fun)(double,double))
{
	double result;
	result=(*fun)(m,n);
	printf("%6.3f\n",result);
	return 1;
}

double f1(double a,double b)
{
    return b-a+0.5*(b*b-a*a);
}

double f2(double a,double b)
{ 
	return b*b-a*a+3*b-3*a;
}

double f3(double a,double b)
{
	return pow(e,b)-pow(e,a)+b-a;
}
	
double f4(double a,double b)
{
	return (pow(b+1,3)-pow(a+1,3))/3;
}

double f5(double a,double b)
{
	return (pow(b,4)-pow(a,4))/4;
}

在VS2019下,需将源文件的scanf改为scanf_s:

#include<stdio.h>
#include<math.h>
#define e 2.71828//定义自然常数e; 

int main()
{
    double f1(double, double);
    double f2(double, double);
    double f3(double, double);
    double f4(double, double);
    double f5(double, double);
    double integral(double m, double n, double (*fun)(double, double));
    double a, b;
    printf("enter a and b(中间以空格隔开):");
    scanf_s("%lf%lf", &a, &b);
    printf("\n函数(1+x)在%4.1f到%4.1f的积分是:", a, b);
    integral(a, b, f1);
    printf("\n函数(2*x+3)在%4.1f到%4.1f的积分是:", a, b);
    integral(a, b, f2);
    printf("\n函数(e^x+1)在%4.1f到%4.1f的积分是:", a, b);
    integral(a, b, f3);
    printf("\n函数((1+x)^2)在%4.1f到%4.1f的积分是:", a, b);
    integral(a, b, f4);
    printf("\n函数(x^3)在%4.1f到%4.1f的积分是:", a, b);
    integral(a, b, f5);
    return 0;
}

double integral(double m, double n, double (*fun)(double, double))
{
    double result;
    result = (*fun)(m, n);
    printf("%6.3f\n", result);
    return 1;
}

double f1(double a, double b)
{
    return b - a + 0.5 * (b * b - a * a);
}

double f2(double a, double b)
{
    return b * b - a * a + 3 * b - 3 * a;
}

double f3(double a, double b)
{
    return pow(e, b) - pow(e, a) + b - a;
}

double f4(double a, double b)
{
    return (pow(b + 1, 3) - pow(a + 1, 3)) / 3;
}

double f5(double a, double b)
{
    return (pow(b, 4) - pow(a, 4)) / 4;
}

方法二:指向函数的指针(矩形法求定积分)

#include<stdio.h>
#include<math.h>

int main()
{ 
	double f1(double);
  	double f2(double);
  	double f3(double);
  	double f4(double);
  	double f5(double);
  	double integral(double,double,double (*fun)(double));
  	double a,b;
	printf("enter a and b(中间以空格隔开):");  
 	scanf("%lf%lf",&a,&b);
 	printf("\n函数(1+x)在%4.1f到%4.1f的积分是:",a,b);
 	integral(a,b,f1);
 	printf("\n函数(2*x+3)在%4.1f到%4.1f的积分是:",a,b);
 	integral(a,b,f2);
 	printf("\n函数(e^x+1)在%4.1f到%4.1f的积分是:",a,b);
 	integral(a,b,f3);
 	printf("\n函数((1+x)^2)在%4.1f到%4.1f的积分是:",a,b);
 	integral(a,b,f4);
 	printf("\n函数(x^3)在%4.1f到%4.1f的积分是:",a,b);
 	integral(a,b,f5);
 	return 0;
}

double integral(double m,double n,double (*fun)(double))
{
	double sum=0.0;
	double length=1e-6;
	double z=m;
	while(z<n)											//条件是积分函数的下标必须小于上标 
   	{
   		sum+=((*fun)(z)+(*fun)(z+length))*length/2;   /*这里可以替换为sum+=((*fun)(z+length))*length; */
    	z+=length;                                    /*当然也可以替换为sum+=((*fun)(z))*length; */
   }
	printf("%6.3f\n",sum);
	return 1;
}

double f1(double x)
{
    return 1+x;
}

double f2(double x)
{ 
	return 2*x+3;
}

double f3(double x)
{
	return exp(x)+1;
}
	
double f4(double x)
{
	return x*x+2*x+1;
}

double f5(double x)
{
	return x*x*x;
}

在VS2019下,需将源文件的scanf改为scanf_s:

#include<stdio.h>
#include<math.h>

int main()
{
    double f1(double);
    double f2(double);
    double f3(double);
    double f4(double);
    double f5(double);
    double integral(double, double, double (*fun)(double));
    double a, b;
    printf("enter a and b(中间以空格隔开):");
    scanf_s("%lf%lf", &a, &b);
    printf("\n函数(1+x)在%4.1f到%4.1f的积分是:", a, b);
    integral(a, b, f1);
    printf("\n函数(2*x+3)在%4.1f到%4.1f的积分是:", a, b);
    integral(a, b, f2);
    printf("\n函数(e^x+1)在%4.1f到%4.1f的积分是:", a, b);
    integral(a, b, f3);
    printf("\n函数((1+x)^2)在%4.1f到%4.1f的积分是:", a, b);
    integral(a, b, f4);
    printf("\n函数(x^3)在%4.1f到%4.1f的积分是:", a, b);
    integral(a, b, f5);
    return 0;
}

double integral(double m, double n, double (*fun)(double))
{
    double sum = 0.0;
    double length = 1e-6;
    double z = m;
    while (z < n)											//条件是积分函数的下标必须小于上标 
    {
        sum += ((*fun)(z) + (*fun)(z + length)) * length / 2;   /*这里可以替换为sum+=((*fun)(z+length))*length; */
        z += length;                                    /*当然也可以替换为sum+=((*fun)(z))*length; */
    }
    printf("%6.3f\n", sum);
    return 1;
}

double f1(double x)
{
    return 1 + x;
}

double f2(double x)
{
    return 2 * x + 3;
}

double f3(double x)
{
    return exp(x) + 1;
}

double f4(double x)
{
    return x * x + 2 * x + 1;
}

double f5(double x)
{
    return x * x * x;
}

方法三:顺序结构(数学公式)

#include<stdio.h>
#include<math.h>
#define e 2.71828//定义自然常数e; 

int main ()
{
    double a,b,n1,n2,n3,n4,n5,t;
    printf("enter a and b(中间以空格隔开):");  
    scanf("%lf%lf",&a,&b);
    if(b<a)//保证上限比下限大; 
    {
    	t=b;
    	b=a;
		a=t;
	}
    n1=b-a+0.5*(b*b-a*a);//a和b是未知数,积分运算后,原式=a和b混合运算的代数式; 
    n2=b*b-a*a+3*b-3*a;
    n3=pow(e,b)-pow(e,a)+b-a;
    n4=(pow(b+1,3)-pow(a+1,3))/3;
    n5=(pow(b,4)-pow(a,4))/4;
    printf("\n函数(1+x)在%4.1f到%4.1f的积分是:%.2f",a,b,n1);
    printf("\n函数(2*x+3)在%4.1f到%4.1f的积分是:%.2f",a,b,n2);
    printf("\n函数(e^x+1)在%4.1f到%4.1f的积分是:%.2f",a,b,n3);
    printf("\n函数((1+x)^2)在%4.1f到%4.1f的积分是:%.2f",a,b,n4);
    printf("\n函数(x^3)在%4.1f到%4.1f的积分是:%.2f",a,b,n5);
    return 0;
}

在VS2019下,需将源文件的scanf改为scanf_s:

#include<stdio.h>
#include<math.h>
#define e 2.71828//定义自然常数e; 

int main()
{
    double a, b, n1, n2, n3, n4, n5, t;
    printf("enter a and b(中间以空格隔开):");
    scanf_s("%lf%lf", &a, &b);
    if (b < a)//保证上限比下限大; 
    {
        t = b;
        b = a;
        a = t;
    }
    n1 = b - a + 0.5 * (b * b - a * a);//a和b是未知数,积分运算后,原式=a和b混合运算的代数式; 
    n2 = b * b - a * a + 3 * b - 3 * a;
    n3 = pow(e, b) - pow(e, a) + b - a;
    n4 = (pow(b + 1, 3) - pow(a + 1, 3)) / 3;
    n5 = (pow(b, 4) - pow(a, 4)) / 4;
    printf("\n函数(1+x)在%4.1f到%4.1f的积分是:%.2f", a, b, n1);
    printf("\n函数(2*x+3)在%4.1f到%4.1f的积分是:%.2f", a, b, n2);
    printf("\n函数(e^x+1)在%4.1f到%4.1f的积分是:%.2f", a, b, n3);
    printf("\n函数((1+x)^2)在%4.1f到%4.1f的积分是:%.2f", a, b, n4);
    printf("\n函数(x^3)在%4.1f到%4.1f的积分是:%.2f", a, b, n5);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值