大家好 ,我是一童,今天继续分享指针,脑阔疼;用指向函数的指针,根据公式,求解定积分;
关于定积分的求解,首先,先了解一下这个公式:
其实,定积分的求解有很多公式,其中左矩形,梯形,中矩形,复合梯形公式,辛普森公式等都是根据上式变换而来;还有就是高斯公式求解定积分,由于时间关系,没有实现,有机会以后实现;
下面是源程序
#include <stdio.h>//求简单定积分
#include <stdlib.h>
#include <math.h>
double fun1(double a,double b,double (*p)(double),int n);//复合梯形公式
double fun2(double a,double b,double (*p)(double),int n);//左矩形公式
double fun3(double a,double b,double (*p)(double),int n);//普生森公式
double fun4(double a,double b,double (*p)(double),int n);//梯形公式
double f1(double x);//求x^2+x定积分
double f2(double x);//求e^x定积分
double f3(double x);//求sinx定积分
double f4(double x);//求-3^2+2^x定积分
double f5(double x);//求2^x定积分
void main()
{
int a,b,n;
char c;
puts("\n");
puts("\t\t\t==================欢迎使用本系统----定积分求解=============");
puts("\n");
printf("\t\t\t请输入下限a= ");
scanf("%d",&a);
puts("\n");
printf("\t\t\t请输入上限b= ");
scanf("%d",&b);
puts("\n");
printf("\t\t\t请输入区间等分个数(尽可能大,越大越精确) n= ");
scanf("%d",&n);
puts("\n");
puts("\t\t\t1 复合梯形公式");
puts("\t\t\t2 左矩形公式");
puts("\t\t\t3 普生森公式公式");
puts("\t\t\t4 梯形公式公式");
puts("\t\t\t5 退出!!!");
while(1)
{
puts("\n\t\t\t请输入您的选项:");
do
{
c=getchar();
}while(c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='5');
switch(c)
{
case'1':printf("\t\t\t复合梯形公式\n");
printf("\t\t\t\tf1= %f\n",fun1(a,b,f1,n));
printf("\t\t\t\tf2= %f\n",fun1(a,b,f2,n));
printf("\t\t\t\tf3= %f\n",fun1(a,b,f3,n));
printf("\t\t\t\tf4= %f\n",fun1(a,b,f4,n));
printf("\t\t\t\tf5= %f\n",fun1(a,b,f5,n));break;
case'2':
printf("\t\t\t左矩形公式\n");
printf("\t\t\t\tf1= %f\n",fun2(a,b,f1,n));
printf("\t\t\t\tf2= %f\n",fun2(a,b,f2,n));
printf("\t\t\t\tf3= %f\n",fun2(a,b,f3,n));
printf("\t\t\t\tf4= %f\n",fun2(a,b,f4,n));
printf("\t\t\t\tf5= %f\n",fun2(a,b,f5,n));break;
case'3':printf("\t\t\t普生森公式\n");
printf("\t\t\t\tf1= %f\n",fun3(a,b,f1,n));
printf("\t\t\t\tf2= %f\n",fun3(a,b,f2,n));
printf("\t\t\t\tf3= %f\n",fun3(a,b,f3,n));
printf("\t\t\t\tf4= %f\n",fun3(a,b,f4,n));
printf("\t\t\t\tf5= %f\n",fun3(a,b,f5,n));break;
case'4':
printf("\t\t\t梯形公式\n");
printf("\t\t\t\tf1= %f\n",fun4(a,b,f1,n));
printf("\t\t\t\tf2= %f\n",fun4(a,b,f2,n));
printf("\t\t\t\tf3= %f\n",fun4(a,b,f3,n));
printf("\t\t\t\tf4= %f\n",fun4(a,b,f4,n));
printf("\t\t\t\tf5= %f\n",fun4(a,b,f5,n));break;
case'5':puts("\t\t\t退出本系统!!");exit(0);break;
default:puts("\t\t\t输入错误请重新输入!!\n");
}
}
}
double fun1(double a,double b,double (*p)(double),int n)//复合梯形公式
{
int i;
double h,s;//h步长
h=(b-a)/n;
s=(p(a)+p(b))/2;
for(i=0;i<n;i++)
s=s+p(a+i*h);
s=s*h;
return s;
}
double fun2(double a,double b,double (*p)(double),int n)//左矩形公式
{
int i;
double h,s;//h步长
h=(b-a)/n;
s=p(a)*h;
for(i=1;i<n;i++)
s=s+p(a+i*h)*h;
return s;
}
double fun3(double a,double b,double (*p)(double),int n)//普生森公式
{
double s;//h步长
s=(4*fun1(a,b,p,2*n)-fun1(a,b,p,n))/3;
return s;
}
double fun4(double a,double b,double (*p)(double),int n)//梯形公式
{
int i;
double h,s;//h步长
h=(b-a)/n;
s=0.5*(p(a)+p(a+h))*h;
for(i=0;i<n;i++)
s=s+0.5*(p(a+i*h)+p(a+(i+1)*h))*h;
return s;
}
double f1(double x)//x^2+x
{
return 2*x+1;
}
double f2(double x)//e^x
{
return exp(x);
}
double f3(double x)//-cosx
{
return sin(x);
}
double f4(double x)//-x^3+x^2;
{
return (-3)*pow(x,2)+2*x;
}
double f5(double x)//xln2
{
return pow(2,x);
}
截图:
由于用别人的电脑写,自己的崩了,所以没有时间,很是匆忙,功能不太完善,重要的是高斯公式没写,hhh,若有错误或看不懂的地方欢迎下方留言!!