控制结构与语句2_第1页
控制结构与语句2_第2页
控制结构与语句2_第3页
控制结构与语句2_第4页
控制结构与语句2_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

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

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

3、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 end; sum+=n; +n; goto loop;end: printf(“sum = %dn”,sum); 直到型当 型74.5.2 while语句循环结构一般形式 while (表达式) 循环体;用于构成当型循环:先判断后执行/条件为真继续循环,直到条件为假时结束循环。表达式非00

4、循环体如: k=1; while(k=100)s=s+k; k+循环控制表达式循环体循环控制变量8注意若循环体包含一条以上语句,应以复合语句形式出现。循环前,必须给循环控制变量赋初值。循环体中,必须有改变循环控制变量值的语句(使循环趋向结束的语句)。循环体可以为空。如while(c=getchar()!=A);等价于c=getchar();while(c!=A)c=getchar();从键盘输入字符,直到输入A为止。9例2:输入100个数,求它们的和并输出。#include void main() float x, sum=0; int i=0; printf(“please input da

5、ta x:n”); while (i100) /当循环体是复合语句时,必须用花括号括起 scanf(“%f”,&x); /输入一个数 sum+=x; /累加 +i; /循环控制变量自加1,向表达式“假”的方向发展 printf(“sum = %fn”,sum);10 4.5.3 dowhile语句循环结构 P108 一般形式 do 循环语句(组) while (条件表达式); 用于构成直到型循环:先执行后判断/条件为真继续循环,直到条件为假时结束循环。【注意】条件表达式或循环体内同样应有改变条件使循环结束的语句,否则可能陷入“死循环”。表达式非00循环体不可省略切记切记!11例3:输入100个

6、数,求它们的和并输出。#include void main() float x, sum=0; int i=0; printf(“please input data x:n”); do /直到循环体是复合语句时,必须用花括号括起 scanf(“%f”,&x); /输入一个数 sum+=x; /累加 +i; /循环控制变量自加1,向表达式“假”的方向发展 while (i0); printf(“n”);例4:从键盘输入一个整数12456,分析以下程序运行结果。 /*取得num的个位数*/ /*输出num的个位数*/ /*直到num/10为0*/ 结果: 65421将各位数字反序显示出来 /*去掉

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

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

9、for (i = 1; ; i+) sum += i;3、表达式3省略。(应保证循环能正常结束) for (i = 1; i = 100; ) sum += i; i+; 184、表达式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; ; )197、表达式1和表达式3可以是逗号表达式。 for (i = 0, j = 100;

10、i = j; i+, j-) k = i + j;8、每一个表达式也可以是数值表达式或字符表达式。 for (i = 0; (c = getchar () ! = n; i += c)9、表达式1可以设置成循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如: for ( sum=0; i=100; i+ ) sum=sum+i; 20其他循环控制结构break 结束循环 在switch中退出switch结构; 在循环中结束循环。 continue 结束本次循环 循环“短路” (跳过循环体后面的语句,开始下一轮循环 )。goto 跳转 跳到循环体外指定标号处。 【注意】 goto

11、语句只能从循环内向外跳转 ,反之不可!#include void main( ) int a,y; a=10,y=0; do a+=2;y+=a; if (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变量跟踪分析法21其他循环控制结构break 结束循环 在switch中退出switch结构; 在循环中结束循环。 continue 结束本次循环 循环“短路” (跳过循环体后面的语句,开始下一轮循

12、环 )。goto 跳转 跳到循环体外指定标号处。 【注意】 goto 语句只能从循环内向外跳转 ,反之不可!求以下程序段执行后x和i的值。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 22其他循环控制结构break 结束循环 在switch中退出switch结构; 在循环中结束循环。 continue 结束本次循环 循环“短路” (跳过循环体后面的语句,开始下一轮循环 )。goto 跳转 跳到循环体外指定标

13、号处。 【注意】 goto 语句只能从循环内向外跳转 ,反之不可!#include void main() int i=1; while (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 23其他循环控制结构break 结束循环 在switch中退出switch结构; 在循环中结束循环。 continue 结束本次循环 循环“短路” (跳过循环体后面的语句,开始下一轮循环 )。goto 跳转 跳到循环体外指

14、定标号处。 【注意】 goto 语句只能从循环内向外跳转 ,反之不可!#include void main() int 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 4247、输入一串以回车健为结束的字符,分别统计字母、数字、其他字符的个数。#include #include void main() char ch; int digit,others,alph; digit=0;others=0;

15、alph=0; ch=getchar(); while (ch!=n) if (ch=0 & ch=A & ch=a & ch=z) alph+; else others+; ch=getchar(); printf(“%d,%d,%d”, digit, alph , others);程序举例:258.判断一个数是否素数问题方法一#include void main () int i,flag=1; long n; printf(“please input n:n”) scanf (%ld, &n);for (i = 2; i = n-1; i+) / i = n/2或i = sqrt (n)

16、; if (n% i = 0) flag=0;if (flag=1) printf (“yesn);else printf (non); 26判断一个数是否素数问题方法二#include void main() int n,i; printf(“请输入数据n”); scanf(“%d”,&n); for(i=2;i=n/2;i+) if (n%i=0) break; if(i=n/2) printf(“不是素数n”); /意味着分支条件成立,循环提前结束 else printf(“是素数n”);/意味着循环条件不成立,循环正常结束27#include void main() int i, n

17、; float s,s1; printf ( 请输入n=) ; scanf ( %d,&n); s=0, s1=1; for (i=1;i=n;i+) s1=s1* i ; s=s+s1; printf ( Sum=%.0fn,s) ;10.求n! =1!+2!+n! (n由键盘输入)#include void main() int i, n ; float s1; printf ( 请输入n=) ; scanf ( %d,&n); s1=1; for (i=1;i=n;i+) s1=s1* i ; printf ( %fn,s1) ;9.求n! (n由键盘输入)284.6 循环的嵌套一个循环

18、体内包含着另一个完整的循环结构,就称循环嵌套。内嵌的循环体中又可以嵌套循环,从而构成多重循环。三种循环可以互相嵌套。294.6 多重循环结构While () while () do while () while ();for ( ; ; ) for ( ; ; ) 30常用算法1、枚举法(穷举法) “笨人之法”: 把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。 例11:百元买百鸡:用一百元钱买一百只鸡。已知公鸡5元/只,母鸡3元/只,小鸡1元/3只。 分析: 这是个不定方程三元一次方程组问题(三个变量,两个方程) 设公鸡为x只,母鸡为y只,小鸡为z只。 xyz=100 5x3yz

19、/3=10031百元买百鸡问题分析32百元买百鸡问题分析#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 & 5*x+3*y+z/3.0=100 ) printf(cocks=%d,hens=%d,chickens=%dn,x,y,z); 结果:x=0,y=25,z=75 x=4,y=18,z=78 x=8,y=11,z=81 x=12,y=4,z=84【讨论 此为“最笨”之法要进行101101101= 1030301次(100多万次)运算

20、。33百元买百鸡问题分析#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 次运算34【例12】雨水淋湿了算术书的一道题,8个数字只 能看清3个,第一个数字虽然看不清,但可看出不是1。编程求其余数字是什么?

21、 (3)2 = 89分析 设分别用A、B、C、D、E五个变量表示自左到右五个未知的数字。其中A的取值范围为29,其余取值范围为09。条件表达式即为给定算式。35#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) printf(“%2d%2d%2d%2d%2dn”,A,B,C,D,E);结果:3 2 8 6 4 【例1

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

23、 通过分析归纳,找出从变量旧值出发求新值的规律。求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+n38A、累加型算法【累加型】例如 + 求其前n项之和的编程题。 若设i为循环变量,s为前n项累加之和,则程序的基本结构为: s=0; for( i=1 ;i=n ;i+ ) s=s+;39【例14】编程求i =1+2+3+4+n ( n 100)程序:#include void

24、main() int i ,n, s=0; printf(n=); scanf(%d,&n); for ( i=1;i=n;i+) s=s+i; printf(Sum=%dn,s);运行结果:n=100Sum=5050如果是求i =1+1/2+1/3+1/n 呢?40【例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

25、=%fn,s); 方法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); 41B、阶乘型算法【阶乘型】例如 求其前n项之积的编程题。 阶乘型算法 若设i为循环变量,s为前n项相乘之积,则程序的 基本结构为: s=1;

26、 for( i=1 ;i=n ;i+ ) s=s*;42【例16】编程求n! =1!+2!+3!+n! (n由键盘输入)方法1外循环为求累加和内循环为求阶乘方法2在同一个循环中 先阶乘,后累加方法1(双重循环实现):main() int i, j , n ; float s,s1; printf ( 请输入n=) ; scanf ( %d,&n); s=0; for (i=1;i=n;i+) s1=1; for (j=1; j=i ; j+) s1=s1*j ; s=s+s1; printf ( Sum=%.0fn,s) ; 运行结果:n=5Sum=153方法2(单循环实现):main() i

27、nt i, n ; float s,s1; printf ( 请输入n=) ; scanf ( %d,&n); s=0, s1=1; for (i=1;i=n;i+) s1=s1* i ; s=s+s1; printf ( Sum=%.0fn,s) ;43【例17】编程显示以下图形(共N 行,N 由键盘输入)。 * * * * * * * * * * * * * * * * * * * * * * * * *此类题目分析的要点是:通过分析,找出每行空格、* 与行号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-

温馨提示

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

评论

0/150

提交评论