编写一个求定积分的通用函数,用它分别求以下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;
}