资源预览内容
第1页 / 共32页
第2页 / 共32页
第3页 / 共32页
第4页 / 共32页
第5页 / 共32页
第6页 / 共32页
第7页 / 共32页
第8页 / 共32页
第9页 / 共32页
第10页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,第十四讲 编程例题,2,求定积分,1、用梯形公式计算面积的近似值。,这样计算面积误差太大。,3,2、改进:将区间b-a划分成2n等分。用变步长的梯形法,定义Tn为将积分区间n等分时求出的近似面积。,4,5,(1)为按公式算出的面积的二分之一; (2)为等分中线的函数值f(x1+h/2)与h的乘积,得出面积的二分之一。,6,(3)代表面积,7,3、用辛普生公式计算积分的近似值,8,#include / 预编译命令 #include / 预编译命令,数学函数 double f(double x); / 定义被调用函数fvoid main() / 主函数 / 主程序开始int k,n=1; / 声明整型变量k,n,并初始化ndouble x,x1=0,x2=2; / 声明双精度变量x,和x1,x2double s,h,tn,t2n,In,I2n;/ 声明计算中使用的中间变量const double eps=1e-6;/ 声明双精度变量eps作为阈值/ 计算n=1时的tn和In,为便于编程/ 分别将它们赋给t2n和I2nh=x2-x1;t2n=I2n=(h*(f(x1)+f(x2)/2;printf(“第一次近似计算梯形面积值为%lfn“,t2n);In=0;,9,while(fabs(I2n-In)=eps)/当型循环,精度未达要求则继续 / 循环体开始,/ 将上一次计算结果转存入tn和Intn=t2n; In=I2n; / 计算k从0至n-1,f(x1+(k+0.5)*h)的和s=0.0; / 求和变量s清零for(k=0;kn;k=k+1) / 循环求和 / 循环体开始x=x1+(k+0.5)*h;s=s+f(x); / 循环体结束/ 计算t2n和I2nt2n=(tn+h*s)/2.0;I2n=(4*t2n-tn)/3.0;,10,/ 更新n和h,用于下一次计算n=2*n;h=h/2; / 循环体结束printf(“积分值为%lfn“,I2n); / 输出结果 / 主函数结束double f(double x) / 被调用函数f,用于计算积分项 / 函数体开始/ 计算并返回积分项return ( (exp(x)+x*x)/(1+x*x*x); / 函数体结束,运行结果:第一次近似计算提醒面积值为2.265451积分值为3.138948,11,说明: 1、要产生随机数需要在预编译中加入库函数 #include 2、rand()是产生随机数的函数,它可生成0至32767的整数 3、最大随机数为RAND_MAX,值为32767 4、产生随机数需要设置种子 srand(unsigned)time(NULL); 因为时间每分每秒不同,第一个随机数就不会固定。你可以做试验,如去掉这条,产生十个随机数,每次都会是一样的。,随机数,12,产生的随机数: 4118467633426500191691572411478293582696224464加上这条之后,你再观察,每一次出的十个数都不同。,13,#include / 预编译命令 #include / 预编译命令 #include / 预编译命令void main(void) / 主函数 / 主函数开始int k; / 定义整型变量k srand( (unsigned)time(NULL); /设置for(k=0;k10;k=k+1) /循环/输出随机小数printf(“%fn“,(float)rand()/RAND_MAX);/输出最大随机数printf(“ 最大随机数为%dn“,RAND_MAX); / 主函数结束,下面的程序是产生十个小数(随机函数4.c),14,1、用 rand() / RAND_MAX 来产生大于0而小于1的小数。 2、因为rand()是整型数,RAND_MAX是整型常数,两者相除,如不作特殊处理得不出小数,只能为0。因为被除数小于除数。因此需要强制转换数据类型,在除式前加(float),即 (float) rand() / RAND_MAX,说 明,15,例:求的近似值。 如右图,正方形的面积A=1;1/4圆的面积B= /4。我们想象有一个容器在正方形中夹有一个极薄的圆弧隔板。下小雨时搬至屋外,经一定时间后,称1/4圆的容器内的水重C,与作为一个整体的正方形中的水重D。C与D之比应该等于B与A之比, 即可得,伪随机数的应用蒙特卡罗法求几何面积,0,16,我们让计算机产生伪随机数x和y,让x的值的范围在01之间;让y的值的范围也在01之间,模拟雨点落在正方形中,当然会有的雨点落在1/4圆中,数以百万计雨点可以累计得到C和D,从而上述公式算出的近似值。这里关键是落入扇形区的判据:,如果满足了上述条件,则让C=C+1。 参考程序见“随机函数1.c”,17,#include / 预编译命令 #include / 预编译命令 #include / 预编译命令 void main(void) / 主函数 / 主函数开始 long k,c=0,d=0; / 定义长整型变量float pai,x,y; / 定义浮点类型变量 srand( (unsigned)time(NULL);/ 设置for(k=1;k=100000000;k=k+1)/ 循环 / 循环体开始 d=d+1; / 累加正方形中落入的一个雨点x=(float)rand()/32767; / 雨点在x方向的位置 y=(float)rand()/32767; / 雨点在y方向的位置if(sqrt(x*x+y*y)=1) c=c+1; / 累加扇形中落入的一个雨点 pai=4.0*(float)c/d; / 计算pai的值cout“pai= “pai1) 就是依据上述的思路。 为了比较所得结果是否有效,程序中给出了s 的精确值,这个值是用几何的解法计算出的,见图 无阴影线部分可分解为ABA三块,21,参考程序如下(随机函数6.c),#include / 预编译命令 #include / 预编译命令 #include / 预编译命令void main(void) / 主函数 / 主函数开始long k,d=0,g=0; / 定义长整型变量float s,x,y; / 定义浮点类型变量 srand( (unsigned)time(NULL); / 设置,22,for(k=1;k1),23,整数分拆,题目:有一个整数n,将n分解成若干个整数之和,问如何分解能使这些数的乘积最大,输出这个乘积m。 分析:分解出的数既不是越多越好,也不是越大越好。 例 (1)分解为1+1+1+1,12个1(2)分解为2+2+2,6个2,24,(3)分解为3+3+3+3,4个3(4)分解为4+4+4,3个4(5)分解为6+6,2个6(6)分解为5+7(7)分解为4+8,25,显然,3最好。 算法:见与或结点图。,26,图的说明: 当n可以被3整除时,就让n分解成k个3, 。之后,调用一个算3的k次方的函数p(k),输出p(k)。 当n除3余1时,可分解为1, 3, 3, , 3。 从使乘积最大的角度出发,我们不希望分解出1来,这时,宁可让1与其中的一个3合并,为4。让 ,接着调用p(k),但输出时再将原来减去的4当作一个乘数乘进来,即输出4*p(k)。 当n除3余2时,可分解为2, 3, 3, , 3。可以沿用上诉思路让 ,求p(k)。最后输出时将2乘入,即输出2*p(k)。 这个程序我们采用多分支选择语句,格式为,27,switch(表达式)case 常量表达式1: 语句块1; case 常量表达式2: 语句块2; case 常量表达式n: 语句块n; switch后面括弧中的表达式的值与case后面的常量表达式的值相等时,就执行其后的语句。比如,28,switch( a )case 0 : b = 1; break; case 1 : b = 10; break; case 2 : b = 100; break; case 3 : b = 1000; break; case 4 : b = 10000; 实际上完成的任务是,29,注意:不可以没有break。如果没有的话,不管a为0,还是为1,为2或为3,b的值均为10000。,参考程序如下(n的分解.c),#include /预编译命令 long p(int ) ; /声明函数p为长整型, /形参为整型 void main() /主函数 /主程序开始int n,k; /整型变量long m; /长整型coutn; /输入正整数nswitch(n % 3) /多分支选择语句/switch,31,case 0: /n % 3 为 0 时做k=n/3;m=p(k); /p(k)为被调用函数 break;case 1: /n % 3 为 1 时做 k=(n-4)/3;m=4*p(k); /p(k)为被调用函数 break;case 2: /n % 3 为 2 时做k=(n-2)/3;m=2*p(k); /p(k)为被调用函数 break;/switch,32,cout“最大乘积为 “mendl; /输出结果 /主程序结束/以下函数是被主程序调用的函数long p(int kk) /长整型自定义函数/形参kk为整型变量 /自定义函数体开始int i,mm=1; /整型变量for(i=1;i=kk;i=i+1) /累乘 3,放入中mm=mm*3;return mm; /返回mm值 /自定义函数体结束,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号