C语言实例016

大家好 ,我是一童,今天继续分享指针,脑阔疼;用指向函数的指针,根据公式,求解定积分;

关于定积分的求解,首先,先了解一下这个公式:
公式

其实,定积分的求解有很多公式,其中左矩形,梯形,中矩形,复合梯形公式,辛普森公式等都是根据上式变换而来;还有就是高斯公式求解定积分,由于时间关系,没有实现,有机会以后实现;
下面是源程序

#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);
}

截图:

1

2

3

由于用别人的电脑写,自己的崩了,所以没有时间,很是匆忙,功能不太完善,重要的是高斯公式没写,hhh,若有错误或看不懂的地方欢迎下方留言!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值