河北工业大学计算机软件技术基础(VC)课程设计报告
学院信息工程学院院班级通信101 姓名崔羽飞学号 102117
成绩 __ ____
一、题目:
设计采用梯形法和辛普生法求定积分的程序
二、设计思路
1、总体设计
1)分析程序的功能
本题目的功能是对梯形法和辛普森法,在不同区间数下计算所得的定积分的值,进行精度比较。
2)系统总体结构:
设计程序的组成模块,简述各模块功能。
该程序共分为以下几个模块
模块一:各函数原型的声明。
模块二:主函数。
模块三:各函数的定义。
包括两个数学函数y1=1+x*x、y2=1+x+x*x+x*x*x的定义和两个函数指针double integralt(double ,double ,int ,double(*f)(double))
double integrals(double ,double ,int ,double(*f)(double))
的定义。
2、各功能模块的设计:说明各功能模块的实现方法
模块一:对各种函数进行声明。
模块二:求梯形法和辛普森法,在不同区间数下计算所得的定积分的值。
模块三:将各函数写出来。
3、设计中的主要困难及解决方案
在这部分论述设计中遇到的主要困难及解决方案。
1)困难1:函数指针的应用。
解决方案:仔细阅读课本,以及与同学之间的讨论,和向老师求助。
2)困难2:将程序分成不同的.cpp文件。
解决方案:与同学讨论。
4、你所设计的程序最终完成的功能
1)说明你编制的程序能完成的功能
在数学上求一个函数与x轴在一定范围内所围的面积即求定积分,对梯形法和辛普森法求定积分的比较。
2)准备的测试数据及运行结果
三、程序清单
本程序共六个文件,其中包含main.cpp,f1.cpp,f2.cpp,integrals.cpp, integralt.cpp,shengming.h
1.main.cpp
#include <iostream.h>
#include "shengming.h"
void main()
{
double a,b,intesum1,intesum2,intesum3,intesum4;//对求定积分的定义.
cout<<"please shangxian xiaxian a,b:";//输入上限和下限.
cin>>a>>b;
int n[7]={2,10,100,1000,5000,10000,50000};//n的不同取值.
//下面是对第一行不同n的值的输出.
cout<<" n值 ";
for(int i=0;i<7;i++)
cout<<" "<<n[i];
cout<<endl;
//下面是对n取不同值时,用梯形法对f1求定积分.
cout<<"intesum1";
for(i=0;i<7;i++)
{
intesum1=integralt(a,b,n[i],f1);
cout<<" "<<intesum1;
}
cout<<endl;
//下面是对n取不同值时,用梯形法对f2求定积分.
cout<<"intesum2";
for(i=0;i<7;i++)
{
intesum2=integralt(a,b,n[i],f2);
cout<<" "<<intesum2;
}
cout<<endl;
//下面是对n取不同值时,用用辛普森法对f1求定积分.
cout<<"intesum3";
for(i=0;i<7;i++)
{
intesum3=integrals(a,b,n[i],f1);
cout<<" "<<intesum3;
}
cout<<endl;
//下面是对n取不同值时,用用辛普森法对f2求定积分.
cout<<"intesum4";
for(i=0;i<7;i++)
{
intesum4=integrals(a,b,n[i],f2);
cout<<" "<<intesum4;
}
cout<<endl;
}
2.f1.cpp
double f1(double x) //定义函数y1=1+x*x.
{
double y1;
y1=1+x*x;
return y1;
}
3.f2cpp
double f2(double x) //定义函数y2=1+x+x*x+x*x*x.
{
double y2;
y2=1+x+x*x+x*x*x;
return y2;
}
4.integrals.cpp
double integrals(double a,double b,int n,double(*f)(double))//定义用辛普森法求定积分.
{
int i;
double sum1=0,sum2=0,intesum,h;
h=(b-a)/2/n;
for(i=1;i<=2*n-1;i+=2)
sum1+=(*f)(a+i*h);
for(i=2;i<=2*n-2;i+=2)
sum2+=(*f)(a+i*h);
intesum=h*((*f)(a)+(*f)(b)+4*sum1+2*sum2)/3;
return intesum;
}
5.integralt.cpp
double integralt(double a,double b,int n,double(*f)(double))//定义用梯形法求定积分.
{
int i;
double sum=0,intesum,h;
h=(b-a)/n;
for(i=1;i<=n-1;i++)
sum+=(*f)(a+i*h);
intesum=h*((*f)(a)+2*sum+(*f)(b))/2;
return intesum;
}
6.shengming.h
double integralt(double ,double ,int ,double(*f)(double));//用梯形法求定积分的声明.
double integrals(double ,double ,int ,double(*f)(double));//用辛普森法求定
积分的声.明.
double f1(double x);//函数y1=1+x*x的声明.
double f2(double x);//函数y2=1+x+x*x+x*x*x的声明.
四、对该设计题目有何更完善的方案
1、对自己完成程序进行自我评价。
设计过程中问题重重,但经过和同学之间的讨论,以及老师的解答和我的努力最终写出了程序。
五、收获及心得体会
1、通过本次课程设计,自己在哪些方面的能力有所提高。
独立思考的能力,团结协作的能力,动手操作的能力。
2、收获和心得体会。
主要在三方面:一、通过这次课程学会独立思考问题;二、通过这次课程对课本知识有了更深的认识;三、通过这次课程认识到团队协作的重要性。
日期:2011年6 月21 日。