控制结构与语句2.ppt

上传人:本田雅阁 文档编号:2594064 上传时间:2019-04-14 格式:PPT 页数:49 大小:449.51KB
返回 下载 相关 举报
控制结构与语句2.ppt_第1页
第1页 / 共49页
控制结构与语句2.ppt_第2页
第2页 / 共49页
控制结构与语句2.ppt_第3页
第3页 / 共49页
亲,该文档总共49页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《控制结构与语句2.ppt》由会员分享,可在线阅读,更多相关《控制结构与语句2.ppt(49页珍藏版)》请在三一文库上搜索。

1、第4章 控制结构与语句,第4章 控制结构与语句,4.1 算法与程序 4.2 结构化程序设计 4.3 顺序结构 4.4 选择结构 4.5 循环结构 4.6 多重循环结构 4.7 实际应用举例,4.5 循环结构,循环结构程序设计 四种循环语句 常用算法 枚举法(穷举法) 归纳法(递推法),循环是在循环条件为真时计算机反复执行的一组 指令(循环体)。 循环控制通常有两种方式: 计数控制 用于事先能够准确知道循环次数时 用专门的循环变量来计算循环的次数,循环变量的值在每次执行完循环体各语句后递增,达到预定循环次数时则终止循环,继续执行循环结构后的语句。 标记控制 用于事先不知道准确的循环次数时 由专门

2、的标记变量控制循环是否继续进行。当标记变量的值达到指定的标记值时,循环终止,继续执行循环结构后的语句。,在C语言中可用以下语句构成循环: if goto while do while for 其中if goto是通过编程技巧(if语句和goto语句组合)构成循环功能。而且goto语句将影响程序流程的模块化,使程序可读性变差,所以结构化程序设计主张限制goto语句的使用。 其他三种语句是C语言提供的循环结构专用语句。,循环结构两大要素: 循环条件 p 结束循环的条件表达式 循环体 A 循环执行的语句或语句组 设置循环条件要特别注意确定: 循环变量的初值 循环变量的终值 循环变量的变化规律,名词解

3、释 无限循环 死循环,名词解释 空循环,4.5.1 if goto语句循环结构 格式:goto 标号; 例1:计算1+2+3+10000 的值,goto 语句为无条件转向语句,它的一般形式为: 语句标号: 语句; goto 语句标号;,【例一】 main() int n=0,sum=0; loop: sum+=n; +n; if (n=10000) goto loop; printf(“sum = %dn”,sum); ,【例二】 main() int n=0,sum=0; loop: if (n=10000) goto end; sum+=n; +n; goto loop; end: pri

4、ntf(“sum = %dn”,sum); ,直到型,当 型,4.5.2 while语句循环结构,一般形式 while (表达式) 循环体; 用于构成当型循环:先判断后执行/条件为真继续循环,直到条件为假时结束循环。,注意,若循环体包含一条以上语句,应以复合语句形式出现。 循环前,必须给循环控制变量赋初值。 循环体中,必须有改变循环控制变量值的语句(使循环趋向结束的语句)。 循环体可以为空。如 while(c=getchar()!=A); 等价于 c=getchar(); while(c!=A)c=getchar(); 从键盘输入字符,直到输入A为止。,例2:输入100个数,求它们的和并输出。

5、,#include void main() float x, sum=0; int i=0; printf(“please input data x:n”); while (i100) /当循环体是复合语句时,必须用花括号括起 scanf(“%f”, ,4.5.3 dowhile语句循环结构 P108,一般形式 do 循环语句(组) while (条件表达式); 用于构成直到型循环:先执行后判断/条件为真继续循环,直到条件为假时结束循环。 【注意】条件表达式或循环体内同样应有改变条件使循环结束的语句,否则可能陷入“死循环”。,不可省略 切记切记!,例3:输入100个数,求它们的和并输出。,#i

6、nclude void main() float x, sum=0; int i=0; printf(“please input data x:n”); do /直到循环体是复合语句时,必须用花括号括起 scanf(“%f”, ,main() int num,c; printf(“请输入一个整数:“); scanf(“%d”, ,例4:从键盘输入一个整数12456,分析以下程序运行结果。,/*取得num的个位数*/,/*输出num的个位数*/,/*直到num/10为0*/,结果: 65421 将各位数字反序显示出来,/*去掉num的个位数*/,4.5.4 for语句循环结构 P110,一般形式

7、 for (表达式1;条件表达式;表达式3) 循环语句(组); 执行步骤: 1、求表达式1: 整个循环中只执行1次,常用来对循环变量设置初值。 2、求表达式2: 其值为真(非0)时继续执行循环语句(组),否则结束循环, 转到for的后续语句执行。 3、求表达式3: 然后转到第2步继续执行; 常用于循环变量值的更新(属于循环体的一部分,每次循环语句组执行完后执行一次),例5:求i =1+2+3+4+99+100 (i=1100),#include void main() int i , sum=0; for (i=1;i=100;i+) sum=sum+i; printf(“sum=%dn”,s

8、um); ,例6:输入10个数,求最大数输出,#include void main() double x,max; int i; printf(“input data:n”); scanf(“%lf”, ,for循环的特殊形式,for循环的特殊形式说明,1、表达式1省略,但是其后的“;”不能省略 i=1; for ( ; i = 100; i+) sum += i; 2、表达式2省略。(即不判断循环条件,无限循环) “;”不能省略 for (i = 1; ; i+) sum += i; 3、表达式3省略。(应保证循环能正常结束) for (i = 1; i = 100; ) sum += i;

9、 i+; ,4、表达式1和表达式2省略(无限循环) for ( ; ; i+) sum += i; 5、表达式1和表达式3省略(等同于while语句) for ( ; i = 100; ) sum += i; i+ 相当于: while (i = 100) sum += i; i+ 6、表达式2和表达式3省略(无限循环) for ( i=1; ; ),7、表达式1和表达式3可以是逗号表达式。 for (i = 0, j = 100; i = j; i+, j-) k = i + j; 8、每一个表达式也可以是数值表达式或字符表达式。 for (i = 0; (c = getchar () !

10、= n; i += c) 9、表达式1可以设置成循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如: for ( sum=0; i=100; i+ ) sum=sum+i;,其他循环控制结构,break 结束循环 在switch中退出switch结构; 在循环中结束循环。 continue 结束本次循环 循环“短路” (跳过循环体后面的语句,开始下一轮循环 )。 goto 跳转 跳到循环体外指定标号处。 【注意】 goto 语句只能从循环内向外跳转 ,反之不可!,#include void main( ) int a,y; a=10,y=0; do a+=2;y+=a; if (

11、y50) break; while (a=14); printf(“a=%d,y=%dn“,a,y); ,结果:a=16,y=60,变量跟踪 a y 10 0 12 12 14+2 16+12=28 14+2 16+28=44 14+2 16+44=60,变量跟踪 分析法,其他循环控制结构,break 结束循环 在switch中退出switch结构; 在循环中结束循环。 continue 结束本次循环 循环“短路” (跳过循环体后面的语句,开始下一轮循环 )。 goto 跳转 跳到循环体外指定标号处。 【注意】 goto 语句只能从循环内向外跳转 ,反之不可!,求以下程序段执行后x和i的值。

12、int i,x; for ( i=1,x=1;i=10) break; if (x%2=1) x+=5; continue; x-=3; ,结果:x的值为10,i的值为6,变量跟踪 i x 1 16 2 63 3 38 4 85 5 510,其他循环控制结构,break 结束循环 在switch中退出switch结构; 在循环中结束循环。 continue 结束本次循环 循环“短路” (跳过循环体后面的语句,开始下一轮循环 )。 goto 跳转 跳到循环体外指定标号处。 【注意】 goto 语句只能从循环内向外跳转 ,反之不可!,#include void main() int i=1; wh

13、ile (i=15) if (+i%3!=2) continue; else printf(“%d “,i); printf(“n“); ,结果:2 5 8 11 14,变量跟踪 i +i%3 输出i 12 2 2 23 0 34 1 45 2 5 56 0 ,其他循环控制结构,break 结束循环 在switch中退出switch结构; 在循环中结束循环。 continue 结束本次循环 循环“短路” (跳过循环体后面的语句,开始下一轮循环 )。 goto 跳转 跳到循环体外指定标号处。 【注意】 goto 语句只能从循环内向外跳转 ,反之不可!,#include void main() i

14、nt i,k=0; for (i=1; ;i+) k+; while (ki*i) k+; if (k%3=0) goto loop; loop:printf(“%d,%d“,i,k); ,结果:2 ,3,变量跟踪 i k i*i 1 01 1 2 12 3 4,7、输入一串以回车健为结束的字符,分别统计字母、数字、其他字符的个数。 #include #include void main() char ch; int digit,others,alph; digit=0;others=0;alph=0; ch=getchar(); while (ch!=n) if (ch=0 ,程序举例:,8

15、.判断一个数是否素数问题 方法一 #include void main () int i,flag=1; long n; printf(“please input n:n”) scanf (“%ld“, ,判断一个数是否素数问题方法二,#include void main() int n,i; printf(“请输入数据n”); scanf(“%d”,/意味着循环条件不成立,循环正常结束 ,#include void main() int i, n ; float s,s1; printf ( “请输入n=“) ; scanf ( “%d“, ,10.求n! =1!+2!+n! (n由键盘输入

16、),#include void main() int i, n ; float s1; printf ( “请输入n=“) ; scanf ( “%d“, ,9.求n! (n由键盘输入),4.6 循环的嵌套,一个循环体内包含着另一个完整的循环结构,就称循环嵌套。 内嵌的循环体中又可以嵌套循环,从而构成多重循环。 三种循环可以互相嵌套。,4.6 多重循环结构,While () while () ,do while () while ();,for ( ; ; ) for ( ; ; ) ,常用算法,1、枚举法(穷举法) “笨人之法”: 把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。

17、 例11:百元买百鸡:用一百元钱买一百只鸡。已知公鸡5元/只,母鸡3元/只,小鸡1元/3只。 分析: 这是个不定方程三元一次方程组问题(三个变量,两个方程) 设公鸡为x只,母鸡为y只,小鸡为z只。 xyz=100 5x3yz/3=100,百元买百鸡问题分析,百元买百鸡问题分析,#include void main() int x,y,z; for (x=0;x=100;x+) for (y=0;y=100;y+) for (z=0;z=100;z+) if (x+y+z=100 ,结果:x=0,y=25,z=75 x=4,y=18,z=78 x=8,y=11,z=81 x=12,y=4,z=8

18、4,【讨论 此为“最笨”之法要进行101101101= 1030301次(100多万次)运算。,百元买百鸡问题分析,#include void main() int x,y,z; for (x=0;x=100;x+) for (y=0;y=100;y+) z=100-x-y; if (5*x+3*y+z/3.0=100 ) printf(“cocks=%d,hens=%d,chickens=%dn“,x,y,z); ,【讨论】 令z=100-x-y 只进行101101= 10201 次运算(是前一种运算的1%),取x=19,y=33 只进行2034= 680 次运算,【例12】雨水淋湿了算术书

19、的一道题,8个数字只 能看清3个,第一个数字虽然看不清,但可看出不是1。编程求其余数字是什么? (3)2 = 89,分析 设分别用A、B、C、D、E五个变量表示自左到右五个未知的数字。其中A的取值范围为29,其余取值范围为09。条件表达式即为给定算式。,#include void main() int A,B,C,D,E; for (A=2;A=9;A+) for (B=0;B=9;B+) for (C=0;C=9;C+) for (D=0;D=9;D+) for (E=0;E=9;E+) if (A*(B*10+3+C)*A*(B*10+3+C)=8009+D*100+E*10) print

20、f(“%2d%2d%2d%2d%2dn”,A,B,C,D,E); ,结果:3 2 8 6 4,【例12】雨水淋湿了算术书的一道题,8个数字只 能看清3个,第一个数字虽然看不清,但可看出不是1。编程求其余数字是什么? (3)2 = 89,【例13】 求100200之间不能被3整除也不能被7整除的数。,分析:求某区间内符合某一要求的数,可用一个变量“穷举”。所以可用一个独立变量x,取值范围100200。,for (x=100;x=200;x+) if (x%3!=0 ,如果是求指定条件的奇数呢?,如果是求指定条件的偶数呢?,(x=101;x=200;x=x+2),(x=100;x=200;x=x+

21、2),2、归纳法(递推法) “智人之法” : 通过分析归纳,找出从变量旧值出发求新值的规律。,求i =1+2+3+4+99+100 (i=0100),分析 S0= 0 (初值) i=1 S1= 0+1=S0+1 i=2 S2=1+2=S1+2 i=3 S3=1+2+3=S2+3 i=4 S4=1+2+3+4=S3+4 i=n Sn=1+ 2+3+4+n=Sn-1+n,A、累加型算法,【累加型】例如 + 求其前n项之和的编程题。 若设i为循环变量,s为前n项累加之和,则程序的基本结构为: s=0; for( i=1 ;i=n ;i+ ) s=s+;,【例14】编程求i =1+2+3+4+n (

22、n 100),程序: #include void main() int i ,n, s=0; printf(“n=“); scanf(“%d“, ,运行结果: n=100 Sum=5050,如果是求 i =1+1/2+1/3+1/n 呢?,【例15】编程求1-1/2+1/3-1/4+1/5- +1/99-1/100,分母为奇数时,相加 分母为偶数时,相减,方法1: #include void main() int i; float s=0; for (i=1;i=100;i+) if (i%2) s=s+1.0/i; else s=s-1.0/i; printf(“Sum=%fn“,s); ,

23、方法2: #include void main(); int i ; float s=0; for (i=1;i=100;i+) s=s+pow (-1.0, i+1) / i ; printf(“Sum=%fn“,s); ,方法3: #include void main() int i; float s=0, k=1.0; for (i=1;i=100;i+) s=s+ k / i ; k = -k ; printf(“Sum=%fn“,s); ,B、阶乘型算法,【阶乘型】例如 求其前n项之积的编程题。 阶乘型算法 若设i为循环变量,s为前n项相乘之积,则程序的 基本结构为: s=1; fo

24、r( i=1 ;i=n ;i+ ) s=s*;,【例16】编程求n! =1!+2!+3!+n! (n由键盘输入),方法1 外循环为求累加和 内循环为求阶乘 方法2 在同一个循环中 先阶乘,后累加,方法1(双重循环实现): main() int i, j , n ; float s,s1; printf ( “请输入n=“) ; scanf ( “%d“, ,运行结果: n=5 Sum=153,方法2(单循环实现): main() int i, n ; float s,s1; printf ( “请输入n=“) ; scanf ( “%d“, ,【例17】编程显示以下图形(共N 行,N 由键盘输

25、入)。 * * * * * * * * * * * * * * * * * * * * * * * * *,此类题目分析的要点是: 通过分析,找出每行空格、* 与行号i、列号j及总行数N的关系。,分析:(设N=5) 第1行 4个空格=5-1 1个“*”=2*行号-1 第2行 3个空格=5-2 3个“*”=2*行号-1 第3行 2个空格=5-3 5个“*”=2*行号-1 第4行 1个空格=5-4 7个“*”=2*行号-1 第5行 0个空格=5-5 9个“*”=2*行号-1,由此归纳出:第i行的空格数N-i个; 第i行的“*”数是2i-1个。,* * * * * * * * * * * * * *

26、 * * * * * * * * * * *,#include void main() int i,j,N; printf (“请输入N=”) ; scanf(“%d”, ,【例18】编程求,分析:将区间a,b分为n等分,用每一个曲边梯形内的矩形面积代替曲边梯形面积进行相加,就可以得到所求定积分的近似值。 其中: #include void main( ) float a,b,h,x,s=0; int n,i; scanf(“%f%f%d”, ,19 、亲密数对:a、b为亲密数对,则a的因子和等于b,b的因子和等于a。,输出6-1000之间的亲密数对的程序: #include void mai

27、n( ) int a,b,c,i; for(a=6;a=1000;a+) b=1; for(i=2;i=a/2;i+) if(a%i=0) b=b+i; c=1; for(i=2;i=b/2;i+) if(b%i=0) c=c+i; if(c=a ,20、水仙花数:一个三位数,各位数字的和等于其本身,如:,输出所有水仙花数的程序为: #include void main( ) int a,b,c,x,s; x=100; while(x=999) a=x/100; b=x/10%10; c=x%10; s=a*a*a+b*b*b+c*c*c; if(s=x) printf(“%6d”,x); x+; ,小结: 1)循环结构 2)多重循环结构 3)实际应用举例 作业: 课后习题,

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

当前位置:首页 > 其他


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