C语言课件第5章PPT.ppt

上传人:本田雅阁 文档编号:3479898 上传时间:2019-09-01 格式:PPT 页数:44 大小:377.02KB
返回 下载 相关 举报
C语言课件第5章PPT.ppt_第1页
第1页 / 共44页
C语言课件第5章PPT.ppt_第2页
第2页 / 共44页
C语言课件第5章PPT.ppt_第3页
第3页 / 共44页
C语言课件第5章PPT.ppt_第4页
第4页 / 共44页
C语言课件第5章PPT.ppt_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《C语言课件第5章PPT.ppt》由会员分享,可在线阅读,更多相关《C语言课件第5章PPT.ppt(44页珍藏版)》请在三一文库上搜索。

1、第5章 循环结构的语句及流程控制,问题1:假如全班41人,欲从键盘上输入每人的数学成绩,然后计算出平均成绩; 问题2: 编程计算n! . 这些都是重复计算的问题,需要由循环结构来解决。C 提供了以下3种重复计算的结构:,n while (表达式) 语句 n do 语句 while (表达式) n for (表达式1;表达式2;表达式3) 语句,循环结构的语句及流程控制,格式1: while (表达式) 语句 功能: 当表达式的值非0时,执行语句,该语句一般是复合语句,被称之为循环体.,例1: 解问题2 ,求 n! 的值. 需要定义的变量: mul - 存放累乘积 ; i - 计数; n -,程

2、序:,#include void main() int i=1, n; double mul=1; printf(“n Input n:”); scanf(“%d”, ,说明:,循环体可以用复合语句 while语句前应有为测试表达式中的循环控制变量赋初值的语句,以确保循环的正常开始; 循环体内应有改变循环控制变量的语句,以确保循环进行有限次后正常结束; 如: i=1; while (i=100) sum=sum+1; (死循环) while 循环的特点是先判断后执行,故循环有可能一次都不被执行; 如: i=3; while (i3) printf(“i=%dn”, i);,例2:求整数a和b的

3、最小公倍数,算法流图如下:,程序如下:,void main( ) int a,b, i; scanf(“%d%d”, ,void main( ) int a,b, i,m,n; scanf(“%d%d”, ,#include #include ,循环结构的语句及流程控制,格式2: do 语句 while (表达式); 功能: 先执行语句,该语句一般是复合语句,被称之为循环体.当表达式的值非0时, 继续执行该语句,直到表达式的值为0. 例3: sum=1+2+3+100.(c604.c),#include void main() int i=1,sum=0; do sum=sum+i; i+;

4、while (i=100); printf(“n sum=%d“,sum); ,#include void main() int i=1,sum=0; do sum+=i+; while (i=100); printf(“n sum=%d“,sum); ,例子4,需要定义的变量: e - 存放累加值; i - 计数; n - 存放计算阶 乘值.,计算: e1+1/1!+1/2!+.+1/100!,通常该类问题会给出一个计算误差,例如,可设定当某项的值小于10-7时停止计算。,#include void main() int i=1; double e=1.; double n=1.; do n

5、=n*i; e=e+1./n; i=i+1; while (i=100); printf(“n e=%f“,e); ,#include void main() int i=1; double t,e=1.,n=1.; e=1.,n=1.; do n=n*i; / 计算i的阶乘 t=1./n; e=e+t; i=i+1; /为计算下一项作准备 while (t =1e-7); printf(“n e=%f“,e); ,循环结构,格式3: for (表达式1;表达式2;表达式3) 语句 也可理解为: for (循环变量初值; 循环条件; 循环变量增值) 语句,N,Y,该语句的执行过程是: (1)执

6、行for后面的表达式1; (2)执行表达式2,若表达式2的值为真,则执行for语句的内嵌语句(即循环体语句),然后执行第(3)步,若为假,则循环结束,执行第(5)步; (3)执行表达式3; (4)返回继续执行第(2)步; (5)循环结束,执行for语句的循环体下面的语句。,程序示例,例: 计算 sum=1+2+3+100,#include void main() int i, sum=0; for(i=1;i=100;i+) sum+=i; printf(“n sum=%d“,sum); ,例: 计算: e1+1/1!+1/2!+.+1/100!,#include void main() in

7、t i ; double e=1. ; double n=1.; for (i=1;i=100;i+) n=n*i ; e=e+1./n; printf(“n e=%f“,e); ,综合例子:,用/41-1/3+1/5-1/7+近似公式计算的值直到最后一项1/n10-6,需要定义如下变量: t- 计算存放各分 项值; n-计算各项分母 的值; s-确定各项的符号; pi-存放求和的值.,参考程序,#include void main() int s; /*确定各项的符号*/ float n, t, pi; /* n:分母;t:分项值;pi:和值.*/ t=1. ; pi=0. ; n=1.;

8、s=1; do pi=pi+s*t; n=n+2; s=-s; t=1./n; while(t1e-7); pi=pi*4; printf(“n pi=%10.6f“,pi); ,求Fibonacci数列的前40个数,这是一个古典数学问题:一对兔子从它出生后第3个月起,每个月都生一对小兔子,小兔子3个月后又生一对小兔子,假设兔子都不死,求每个月的兔子对数。该数列为: 1 1 2 3 5 8 13 21 即从第3项开始,其该项是前两项之和。,需要定义的变量: i - 计数; f1 - 计算前项值; f2 - 计算下项值.,参考程序,#include void main() int i; long

9、 int f1, f2; f1=f2=1; for (i=1; i=20; i+) printf(“%12ld %12ld“,f1,f2); if (i%2=0) printf(“n”); /*输出两次后换行*/ f1=f1+f2; f2=f2+f1; ,计算下列公式的和,要求最后一项小于10-5,通项公式:,#include void main() int p=1; /*说明符号位*/ long n; float t ,sum; t=1.0/3.0; sum=1 - 1/3.0; for( n=3 ; t=1.0e-5; n+) t=1.0/(n*n+1); sum=sum+p*t ; p=

10、-p; printf(“n sum= %f n”,sum); ,输入30个字符,分别统计其中数字、字母及其它字符的个数。,main() char c; int k; int n1=0,a1=0,u1=0; /*分别存放数字、字母及其它字符个数*/ printf(“n Input 30 chars:”); for (k=1; k=A ,求 s=1+(1+2)+(1+2+3)+,并输出其结果,#include void main() long s=0,sn=0; int k, n; printf(“n Input n=“); scanf(“%d”, ,百钱买百鸡问题,大公鸡5钱一只,母鸡3钱一只,

11、雏鸡一钱买3只,有几种买法,求出所有解。,参考程序,#include void main() int x,y,z; printf(“n 大公鸡 母鸡 雏鸡“); for (x=0; x20; x+) for (y=0;y34;y+) z=100-x-y; if (z%3!=0) continue; if (5*x+3*y+z/3=100) printf(“n%8d %8d %8d“,x,y,z); 循环次数为20*34次,0 25 75 4 18 78 8 11 81 12 4 84,输出以下图案,* * * * * * *,#include void main() int i , j; fo

12、r (i=1 ; i0 ; i-) for (j=1; j=40-i ; j+) printf(“ ”); for (j=1; j=2*i-1;j+) printf(“*”); printf(“n”); ,输出九九乘法表,#include void main() int k,m; for( k=1; k=9; k+) for (m=1; m=k; k+) printf(“%d*%d=%-2d “,m,k,m*k); printf(“n”); ,求1000 2000之间的素数,参考程序,#include #include void main() int i,j,k,m; printf(“1000

13、2000之间的素数:n”); for (i=1000; i2000; i+) k=0; /*用于标识是否素数*/ m= sqrt(i); for (j=2; j= m; j+) if (i%j=0) k=1; break; if (k=0) printf(“%8d“,i); ,输入两个正整数,求它们的最大公约数。 分析:求最大公约数可以用“辗转相除法”,方法如下: (1)比较两数,并使m大于n。 (2)将m作被除数,n作除数,相除后余数为r。 (3)将mn,nr; (4)若r=0,则m为最大公约数,结束循环。若r0,执行步骤步骤(2)和(3) 根据此分析画出流程图,如图所示。,说明: 求两个数

14、的最小公倍数,只需将两数相乘除以最大公约数,即m1*n1/m。由于在求解过程中,m和n已经发生了变化,故可以将其保存在另外两个变量m1和n1中,#include void main( ) int m,n,r,t; int m1,n1; printf(“请输入两个正整数:n”); scanf(“%d,%d”, ,求sn=a+aa+aaa+aaaaa+aaaaa, 其中a是一个数字。例如:2+22+222+2222+22222(此时有5项),数字a和项数n由键盘输入。 分析:需要定义如下变量: 数字 a; 项数 n; 计数 count(1n); 分项,#include void main() in

15、t n,count=1; long sn=0,tn=0,a; printf(“n请输入a,n:“); scanf(“%ld,%d“, ,#include void main() int k; float s=0; for(k=1; k=100;k+) s=s+k; for(k=1;k=50;k+) s=s+k*k; for(k=1;k=10;k+) s=s+1.0/k; printf(“n sum=%fn”,s); ,#include void main() int k; float s=0; for(k=1; k=100;k+) s=s+k; if(k=50) s=s+k*k; if(k=1

16、0) s=s+1.0/k; printf(“n sum=%fn”,s); ,打印出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身。例如,153是一个“水仙花数”,因为153=13+53+33,参考程序,#include void main() int i, j, k, n; for(n=100; n1000; n+) i=n/100; j=n/10-i*10; k=n%10; if (n= =i*i*i+j*j*j+k*k*k) printf(“%4d”, n); printf(“n”); ,找出1000之内的完数.所谓完数即是它的因子之和等于该数。如: 6

17、=1+2+3。并按下列格式输出其因子: its factors are 1,2,3,#include void main() int m,n,s; for (m=2;m1000;m+) s=0; for (n=1;nm;n+) if (m%n= =0) s=s+n; if (s= =m) printf(“n its factors are 1”); for (n=2; nm; n+) if (m%n= =0) printf(“ ,%d ”,n); ,有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13.求出这个数列的前20项之和。 分析:注意分子与分母的变化规律,可知后项分母为前

18、项分子,后项分子为前项分子分母之和。,main( ) int n, t, number=20; float a=2.0,b=1.0,s=0; for(n=1;n=number;n+) s=s+a/b; t=a; a=a+b; b=t; printf(“总和=%9.6fn”,s); ,一球从100米高度自由落下,每次落地后反弹 回原高度的一半,再落下。求在第10次落地时,共经过多少米?第10次反弹多高? #include void main() int i; float n=50,s=100; for(i=2; i=10; i+) s+=2*n; n/=2.0; printf(“n 共经过s=%

19、f, 第10次反弹高度 n=%fn”,s,n); ,猴子第一天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉了一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个。到第10天早上再想吃时,发现只剩下一个桃子了。求第一天共摘多少个桃子。采取逆向思维的方法,从后往前推。 分析:假设s为剩下的,则s+1为前一天的一半,而2(s+1)为前一天的总个数。依次类推,10天前的桃子数即可算出.,#include void main ( ) int s=1, i=9; for ( ; i=1;i-) s=(s+1)*2; printf(“s=%dn”,s); ,用迭代

20、法求,迭代公式:,精度要求:,#include void main() float a , x , x0 ; printf(“n Input a=” ); scanf(“%f”, ,f(x)=2x3-4x2+3x-6 f1(x)=6x2-8x+3 需要定义的量: 存放函数值 f,f1; 近似根 x0,x1; 关键3要素: 初值、迭代公式、精度要求,用牛顿迭代法求方程 在1.5附近的实根。 迭代公式:xk+1=xk-f(xk)/f(xk) 迭代到: |xk+1-xk|=10-5,说明:在计算过程中,要用x的新值x1替换其原值x0,再使用牛顿迭代公式由新的x0产生下一轮的x1。由于在进入循环后的第

21、1条语句为x0 = x1,故应将迭代初值赋给x1而非x0。,#include void main() float x0, x1=1.5, f, f1; do x0=x1; f=2*x0*x0*x0-4*x0*x0+3*x0-6; f1=6*x0*x0-8*x0+3; x1=x0-f/f1; while ( fabs(x1-x0) =1.e-5); printf(“n x=%10.7f“,x1); ,用二分法求,方程在(-10,10)之间的实根。,#include “math.h” void main() float a,b,c,f,f1; printf(“n 请输入两端点值a,b:”); scanf(“%f,%f”, printf(“n 在(a,b)中的实根=%fn”,c); ,两个乒乓球队进行比赛,各出三人甲队为A、B、C.乙队为X、Y、Z三人.已经抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Z比. 编程序找出三对赛手的名单.,#include void main() char i, j, k; for ( i=X; i=Z; i+) for ( j=X; j=Z; j+) if(i!=j) for (k=X;k=Z;k+) if(i!=k ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1