计算机程序设计基础-第十四讲编程例题_第1页
计算机程序设计基础-第十四讲编程例题_第2页
计算机程序设计基础-第十四讲编程例题_第3页
计算机程序设计基础-第十四讲编程例题_第4页
计算机程序设计基础-第十四讲编程例题_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

求定积分

1、用梯形公式计算面积的近似值。

一<b—a

面积、/⑷+"))

这样计算面积误差太大。

b-a

2

2、改进:将区间b-a划分成2n等分。用变步长的梯形

法,定义Tn为将积分区间n等分时求出的近似面积。

n=1时,

b—a

丁—+…))

令"=b-a

二「

____T___72hh

+—2L于"k+—)

2/々=0/

昌H=1日寸

Txh'hx

T;=—+一于(a-------)

2

(i)(2)

3

(1)为按公式算出的面积的二分之一;

(2)为等分中线的函数值/在7+历力与〃的乘积,得出

面积的二分之一。

当n=2时,

T2

/n

;2

rri2Thh

2,7一十;2”4+7)

2/k=0N

当〃二1时

rri2

h2h23.

T;二q+丁[/(。+丁)+/("+二犷)]

2

5

(3)代表面积

解释如下:将好区间分成两段

0111

h=­h=­(b—Q)

22

积分面积用矩形acde~\~矩形场b来近似

h2

ac的长度取/(a+—)

3

牙的长度取/(〃+—/)

2

力23

这两块的面积之和为=%*"(。+—)+〃。+—〃?)]

再取一半就是

)2"1

一£/(4+(左+0・5)*『)

2k=o

3、用辛普生公式计算积分的近似值

1

/2n=-。('4K2n-Tn)>

当I2n-In<£认为达到了近似要求。

如未达此精度要求,则让

n<------2%h<-------h/2

2x2

例:求定积分/=1-——Jdx

Jo1+x3

7

#include<stdio.h>〃预编译命令

#include<math.h>〃预编译命令,数学函数

doublef(doublex);〃定义被调用函数f

voidmain()〃主函数

〃主程序开始

intk,n=l;〃声明整型变量k,n,并初始化n

doublex,xl=0,x2=2;〃声明双精度变量x,和xLx2

doubles,h,tn,t2n,InJ2n;〃声明计算中使用的中间变量

constdoubleeps=le-6;〃声明双精度变量eps作为阈值

//计算n=l时的tn和In,为便于编程

//分别将它们赋给t2n和I2n

h=x2-xl;

t2n=I2n=(h*(f(xl)+f(x2)))/2;

printf("第一次近似计算梯形面积值为

In=0;8

while(fabs(I2mJn)>=eps)//当型循环,精度未达要求则继续

(〃循环体开始,

//将上一次计算结果转存入m和In

tn=t2n;

In=I2n;

〃计算k从0至If(xl+(k+0.5)*h)的和

s=0.0;力求和变量s清零

for(k=0;k<n;k=k+l)//循环求和

{、〃循环体开始

x=xl+(k+0.5)*h;

s=s+f(x);

)〃循环体结束

//计算t2n和I2n

t2n=(tn+h*s)/2.0;

I2n=(4^t2n-tn)/3.0;9

〃更新n和h,用于下一次计算

n=2*n;

h=h/2;

}〃循环体结束

printf「积分值为%m11八,1211);//输出结果

)〃主函数结束

doublef(doublex)//被调用函数f,用于计算积分项

{、〃函数体开始▼

〃计算并返回积分项

return((exp(x)+x*x)/(l+x*x*x));

)〃函数体结束

运行结果:第一次近似计算提醒面积值为2.265451

积分值为3.138948

while(fabs(I2mJn)>=eps)//当型循环,精度未达要求则继续

(〃循环体开始,

//将上一次计算结果转存入m和In

tn=t2n;

In=I2n;

〃计算k从0至If(xl+(k+0.5)*h)的和

s=0.0;力求和变量s清零

for(k=0;k<n;k=k+l)//循环求和

{、〃循环体开始

x=xl+(k+0.5)*h;

s=s+f(x);

)〃循环体结束

//计算t2n和I2n

t2n=(tn+h*s)/2.0;

I2n=(4^t2n-tn)/3.0;11

随机数

说明:

1、要产生随机数需要在预编译中加入库函数

#include<stdlib.h>

2、rand()是产生随机数的函数,它可生成0至32767的

整数\

3、最大随机数为RAND_MAX,值为32767

4、产生随机数需要设置种子

srand((unsigned)time(NULL));

因为时间每分每秒不同,第一个随机数就不会固

定。你可以做试验,如去掉这条,产生十个随机数,

每次都会是一样的。…

产生的随机数:

41

18467

6334

26500

11478\

29358

26962

24464

加上这条之后,你再观察,每一次出的十个数都不同。

13

下面的程序是产生十个小数(随机函数4.c)

#include<stdio.h>〃预编译命令

#include<math.h>〃预编译命令

#include<stdlib.h>〃预编译命令

voidmain(void)〃主函数

(〃主函数开始

intk;〃定义整型变量k

srand((unsigned)time(NULL));〃设置

for(k=0;k<10;k=k+l)//循环

(

〃输出随机小数

printfC6%^nf\(float)rand()/RANDMAX);

力输出最大随机数

printf(n最大随机数为%d\iT,RAND_MAX);

)〃主函数结束

说明

1、用rand()/RAND_MAX来产生大于0而小于1的

小数。

2、因为rand()是整型数,RAND_MAX是整型常数,

两者相除,如不作特殊处理得不出小数,只能为0。

因为被除数小于除数。因此需要强制转换数据类型,

在除式前加(float),即

(float)rand()/RANDMAX

伪随机数的应用——蒙特卡罗法求几何面积

例:求九的近似值。

如右图,正方形的面积A=l;1/4圆的面积B=TT/4。我们

想象有一个容器在正方形中夹有一个极薄的圆弧隔板。

下小雨时搬至屋外,经一定时间后,称1/4圆的容器内的

水重C,与作为一个整体的正方形中的水重D。C与D之

比应该等于B与A之比,、t

4DD16

我们让计算机产生伪随机数X和y,让x的值的范围在0〜

1之间;让y的值的范围也在0〜1之间,模拟雨点落在正

方形中,当然会有的雨点落在1/4圆中,数以百万计雨点

可以累计得到C和D,从而上述公式算出江的近似值。这

里关键是落入扇形区的判据:

如果满足了上述条件,则让C=C+L

参考程序见“随机函数Lc”

17

#include<stdio.h>〃预编译命令

#include<math.h>〃预编译命令

#include<stdlib.h>〃预编译命令

voidmain(void)〃主函数

〃主函数开始

longk,c=0,d=0;〃定义长整型变量

floatpai,x,y;〃定义浮点类型变量

srand((unsigned)time(NULL));//设置

for(k=l;k<=100000000;k=k+l)//循环

//循环体开始

d=d+l;//累加正方形中落入的一个雨点

x=(float)rand()/32767;〃雨点在x方向的位置

y=(float)rand()/32767;〃雨点在y方向的位置

if(sqrt(x*x+y*y)v=l)

c=c+l;//累加扇形中落入的一个雨

pai=4.0^(float)c/d;//计算pai的值

printf(npai=%f\nf\pai);//输出pai的值18

・・•,,―/―L

下面可演化为计算图形的面积。如图所示计算有阴影

线的图形的面积,乍看似乎有些难,但仔细分析即可

在上面程序的基础上来做了。

从思路上考+y2

虑落在阴影这块面

积上的雨点数g与+y2=i

落在正方形整体上

的雨点数d的比就

是这块面积s的近

似值。

1

19

此题的关键是如何判断雨点是落在阴影线的区域内。这

就要用到解析几何的知识:对于以原点x=0,y=0为圆心,

半径为1的圆弧,阴影线中的每个点应满足

I2+/>1〈公式1〉

对于以x=Ly=0为圆心的圆弧,阴影线中的每个点应满

d(X-if+J>](公式2>

当然这个条件在产生随机数时就已经保证了,

故可以不再考虑了。

因此,要同时满足公式1和公式2,雨点才能落入阴影线

区域,语句2。

if((sqrt(x^x+y^y)>l)&&(sqrt((x-l)^(x-l)+y^y)>l))

g=g+l;

就是依据上述的思路。

为了比较所得结果是否有效,程序中给出了s的精确值,

这个值是用几何的解法计算出的,见图

兀73兀

A+B+A=——+^―+——

12412

s=1-(A+B+A)30°

21

参考程序如下(随机函数6.c)

#include<stdio.h>〃预编译命令

#include<math.h>//预编译命令

#include<stdlib.h>〃预编译命令

voidmain(void)〃主函数

(〃主函数开始

longk,d=0,g=0;〃定义长整型变量

floats汉y;〃定义浮点类型变量

srand((unsigned)time(NULL));〃设置

22

for(k=l;k<=10000000;k=k+l)//循环

{〃循环体开始

d=d+l;//累加正方形中落入的一个雨点

x=(float)rand()/32767;//雨点在x方向的位置

y=(float)rand()/32767;//雨点在y方向的位置

if((sqrt(x*x+y*y)>l)&&(sqrt((x-l)*(x-l)+ywy)>l))

g=g+l;//累加阴影亩积中落入%勺一个布点

}、//循环体结束

s=(float)g/d;//计算s的值

printf(ns=%Rn",s);//输出s的值

〃输出s的精确值

printfjs的精确值为%f\nf\1.0-(3.14159/6.0+1.73205/4.0));

整数分拆

题目:有一个整数n,将n分解成若干个整数之和,问如

何分解能使这些数的乘积最大,输出这个乘积m。

分析:分解出的数既不是越多越好,也不是越大越好。

例n=12

(1)分解为1+1+1+…+1,12个

m=1*1*1・・・

(2)分角星为2+2+.・・+2,6个2

m=26=64

24

(3)分解为3+3+3+3,4个3

m=34=81

(4)分解为4+4+4,3个4

m=43=64

(5)分解为6+6,2个6

m=62=36

(6)分角星为5+7

m=5*7=35

(7)分角翠为4+8

=4*8=3225

显然,3最好。

算法:见与或结点图。

26

图的说明:

1.当n可以被3整除时,就让n分解成k个3,k=n13。

之后,调用一个算3的k次方的函数p(k),输出p(k)。

2.当n除3余1时,可分解为1,3,3,…,3。从使乘积最大

的角度出发,我们不希望分解出1来,这时,宁可让1

与其中的一个3合并,为4。让左=(〃—4)/3,接着

调用p(k),但输出时再将原来减去的4当作一个乘数

乘进来,即输出4*p(k)。▼

3.当n除3余2时,可分解为2,3,3,…,3。可以沿用上诉

思路让左=(〃-2)/3,求p(k)。最后输出时将2乘

入,即输出2*p(k)。

4.这个程序我们采用多分支选择语句,格式为“

switch(表达式)

case常量表达式1:{语句块1;}

case常量表达式2:{语句块2;}

case常量表达式n:{语句块n;}

}

switch后面括弧中的表达式的值与case后面的常量

表达式的值相等时,就执行其后的语句。比如

28

switch(a)

case0{b=1;break;}

case1{b=10;break;}

case2{b=100;break;}

case3{b=1000;break;}

case4{b=10000;}

实践上完成的任务是

29

1a=0

10—■1

b=\10Qa=2

1000a=3

10000,q=4

注音-

不可以没有break。如果没有的话,不管a为0,还

是为1,为2或为3,b的值均为10000。

30

参考程序如下(n的分解.c)

#include<stdio.h>〃预编译命令

longp(int);〃声明函数p为长整型,

//形参为整型

voidmain()//主函数

(//主程序开始

intn,k;〃整型变量

longm;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论