C语言程序设计五_第1页
C语言程序设计五_第2页
C语言程序设计五_第3页
C语言程序设计五_第4页
C语言程序设计五_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章 循环结构的程序设计5.1 穷举与迭代算法5.2 goto 语句5.3 while语句5.4 do-while语句5.5 for语句5.6 循环的嵌套5.7 循环结构中使用break和continue语句5.8 循环结构程序设计举例5.1 穷举与迭代算法 穷举:将所有的可能都测试一遍。水仙花数:一个三位数,其各位数字的立方和等于该数本身。方法1:求出各位上的数字方法2:各位依次从最小值到最大值 迭代:不断地替换变量值,或由原值递推出新值的过程求阶乘:f=f*i5.2 goto语句(无条件分支结构)语句(无条件分支结构) goto 语句标号语句标号; 注:语句标号用标识符表示,用来表示程序

2、的某个位置。无条件分支结构无条件分支结构三种三种语句语句: goto 语句:语句:转向标号所在位置 continue 语句:语句:转向本层复合结构的末尾 break 语句:语句:转向本层复合结构的下一语句loop: : if (i=100) sum=sum+i; i+; goto loop;i=1 sum=0i=1 sum=0i100i100假假(0)(0)真真( (非非0)0)sum=sum+isum=sum+ii=i+1i=i+1图图5.1 5.1 求和流程图求和流程图输出输出sumsum【 例 5.1 】用用gotogoto语句与语句与ifif语句一起构成循环结构语句一起构成循环结构编写

3、求编写求s=1+2+3+,+100s=1+2+3+,+100的和程序。的和程序。/*ch5_1.c*/#include main() int i,sum=0; i=1;loop: if(i=100) sum+=i; i+; goto loop; printf(%d,sum);sum=0+1sum=1+2=3sum=3+3=6sum=6+4sum=4950+100=5050循环初值循环终值循环变量增值循环条件循环体5.3 while语句 while (表达式表达式) 语句语句 注:先判断,后执行循环体;循环体最少执行次,即表达式不成立时;死循环:while(1),即当循环体内无改变表达式的语句(

4、如 i+)。 while表达式表达式语句语句0非0例5.2求S=1+2+100的和。main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(SUM=%dn,sum);例5.2求S=1+2+100的和#include main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%d,sum);循环初值循环终值循环变量增值循环条件循环体SUM=5050 【 例 5.3 】 求两个正整数的最大公因子。 采用Euclid(欧几里德)算法来求最大公因子,其算法是: (1)输入两个正

5、整数m和n。 (2)用m除以n,余数为r,如果r等于0,则n是最大公因子,算法结束,否则(3)。 (3)把n赋给m,把r赋给n,转(2)。 例如: 有m=49,n=21,用m除以n,余数为7。由于70,将n赋给m,r赋给n,这时m=21,n=7,再次用m除以n,21除以7,余数为0,此时的n值7就是49和21的最大公因子。main() main() int m,n,r int m,n,r; ; printf(please printf(please type in two positive integersn); type in two positive integersn); scanf(%

6、d%d,&m,&n scanf(%d%d,&m,&n); ); while(n while(n) ) r=m%n r=m%n; ; m=n; m=n; n=r; n=r; printf(Their greatest common divisor is %dn,m printf(Their greatest common divisor is %dn,m); ); 运行输入运行输入: : please type in two positive integers please type in two positive integers 49 2149 21 运行结果

7、运行结果: : Their greatest common divisor is 7 Their greatest common divisor is 7 再次运行输入再次运行输入: : please type in two positive integers please type in two positive integers 50 10050 100再次运行结果再次运行结果: : Their greatest common divisor is 50 Their greatest common divisor is 50 5.4 do-while语句 do 语句语句 while (表达

8、式表达式); 注:先执行循环体,后判断;无论表达式成立不成立,循环体最少执行次; 死循环:while(1),即当循环体内无改变表达式的语句(如i+)。 do表达式表达式语句语句0非0例例5.4求求S=1+2+100的和。的和。main() int i,sum=0; i=1; do sum=sum+i; i+; while(i=100); printf(SUM=%dn,sum); SUM=5050例 while和dowhile比较#include main() int i,sum=0; scanf(%d,&i); do sum+=i;i+; while(i=10); printf(%d,

9、sum);main() int i,sum=0; scanf(%d,&i); while(i=10) sum+=i;i+; printf(%d,sum);例例5.5将一个整数的各位数字颠倒后输出。将一个整数的各位数字颠倒后输出。算法:提取最后一位数字,用取模算法:提取最后一位数字,用取模1010的余数求得。的余数求得。main() int i,r; printf(Input an integern); scanf(%d,&i); do r=i%10; printf(%d,r); while(i/=10)!=0); printf(n); Input an integer 1234

10、 4321 for (表达式;表达式;表达式表达式;表达式;表达式) 语句语句 5.5for语句 注:注:表达式表达式1:变量赋初值;表达:变量赋初值;表达式式2:循环条件;表达式:循环条件;表达式3:循环后:循环后修正变量,使循环趋向结束;语句:修正变量,使循环趋向结束;语句:循环体。循环体。已知循环次数或开始条件和结已知循环次数或开始条件和结束条件的重复问题;束条件的重复问题;表达式表达式1和和3省略时,相当于省略时,相当于while循环。循环。先判断,后执行;循环体最少先判断,后执行;循环体最少执行执行0次;次;死循环:表达式死循环:表达式3省略时,则循省略时,则循环体内应有改变表达式环

11、体内应有改变表达式2的语句。表的语句。表达式达式2省略时,无终止条件,则循环省略时,无终止条件,则循环体内应有跳出循环的语句,如体内应有跳出循环的语句,如break, goto, exit(), return。表达式表达式2语句语句0非0表达式表达式1表达式表达式3变量赋初值循环条件修正变量循环体While循环循环例例5.6求求S=1+2+10的和。的和。main() int i,sum=0; for(i=1;i=100;i+) sum=sum+i; printf(“SUM=%dn”,sum); SUM=5050例:#include main( ) int i=0; for(i=0;i10;i

12、+) putchar(a+i); 运行结果:abcdefghij例:#include main( ) int i=0; for(;i10;i+) putchar(a+i); 例:#include main( ) int i=0; for(;i10;) putchar(a+(i+); 例:#include main( ) int i=0; for(;i10;putchar(a+i),i+) ; 例例5.7输入输入10个字符,输出最大的个字符,输出最大的ASCII值。值。 #include stdio.h#define NUM 10main() int i,c,max; max=0; for(i=

13、1;imax) max=c; printf(The largest ASCII value is %dn,max); 12 AB9 xab The largest ASCII value is 120例例5.8求菲波那契数列的前求菲波那契数列的前20个数。个数。main() int i,a,b,c; a=0; b=1; printf(%10d%10d,a,b); for(i=3;i=20;i+) c=a+b; printf(%10d,c); if(i%5=0) printf(n); a=b; b=c; printf(n); 0 1 1 2 3 5 8 13 21 3455 89 144 233

14、 377610 987 1597 2584 41815.6 5.6 循环的嵌套循环的嵌套 如果将一个循环语句用于另一个循环语句的循环体如果将一个循环语句用于另一个循环语句的循环体中,就构成了嵌套循环,中,就构成了嵌套循环,whilewhile、do-whiledo-while和和forfor这三种这三种循环均可以相互嵌套,即在循环均可以相互嵌套,即在whilewhile循环、循环、do-whiledo-while循环循环和和forfor循环体内,都可以完整地包含上述任一种循环结循环体内,都可以完整地包含上述任一种循环结构。嵌套的循环(即多重循环)常用于解决矩阵运算、构。嵌套的循环(即多重循环)

15、常用于解决矩阵运算、报表打印这类问题。报表打印这类问题。(1) while() while() .(2) do do while( ); .while( );(3) while() do while( ); .(4) for( ; ;) do while(); while() .使用嵌套的循环,应注意以下问题:使用嵌套的循环,应注意以下问题:1 1)在嵌套循环的循环体中,应使用一对大花括号在嵌套循环的循环体中,应使用一对大花括号将循环体语句括起来以保证逻辑上的正确性。将循环体语句括起来以保证逻辑上的正确性。2 2)内层和外层循环控制变量不应同名。)内层和外层循环控制变量不应同名。3 3)循环体

16、采用缩进格式,保证层次的清晰性。)循环体采用缩进格式,保证层次的清晰性。4 4)循环嵌套不能交叉,即在一个循环体内必须完)循环嵌套不能交叉,即在一个循环体内必须完整地包含着另一个循环。整地包含着另一个循环。5 5)嵌套循环执行时,先由外层循环进入内层循环,)嵌套循环执行时,先由外层循环进入内层循环,并在内层循环终止之后接着执行外层循环,再由并在内层循环终止之后接着执行外层循环,再由外层循环进入内层循环中,当外层循环终止时,外层循环进入内层循环中,当外层循环终止时,程序结束。程序结束。【 例例 5.9 】下面程序可用于演示嵌套循环的执行过程。下面程序可用于演示嵌套循环的执行过程。main()ma

17、in() int i,j int i,j; ; for(i for(i=0;i3;i+)=0;i3;i+) printf( printf( i=%d:i=%d: ,i,i);); for(j for(j=0;j4;j+)=0;j4;j+) printf( printf( j j=%-4d=%-4d ,j);,j); printf( printf(n n );); 运行结果运行结果: : i=0:j=0 j=1 j=2 j=3i=0:j=0 j=1 j=2 j=3i=1:j=0 j=1 j=2 j=3i=1:j=0 j=1 j=2 j=3i=2:j=0 j=1 j=2 j=3i=2:j=0 j=

18、1 j=2 j=3【 例 5.10 】编程输出如下形式的乘法九九表。1 2 3 4 5 6 7 8 9- - - - - - - - -12 43 6 94 8 12 16510 15 20 25612 18 24 30 367 14 21 28 35 42 498 16 24 32 40 48 56 649 18 27 36 45 54 63 72 81问题分析:打一下三角形的关键是控制每行打印的列数,规律是:第1行打印1列,第2行打印2列,第9行打印9列,第m行打印m列,而在上例中是每行都打印9列。main()main() int m,n int m,n; ; for(m for(m=1;

19、m10;m+) =1;m10;m+) printf(%4d,m); / printf(%4d,m); /* *打印表头打印表头* */ / printf(n printf(n);); for(m for(m=1;m10;m+) =1;m10;m+) printf printf( _);( _); printf(n printf(n);); for(m for(m=1;m10;m+) /=1;m10;m+) /* *被乘数被乘数m m从从1 1变化到变化到9 9* */ / for(n=1;nm;n for(n=1;nm;n+) /+) /* *乘数乘数n n从从1 1变化到变化到m m* */

20、 / printf(%4d,m printf(%4d,m* *n); /n); /* *输出第输出第m m行行n n列中的列中的m m* *n n的值的值* */ / printf(n printf(n); /); /* *输出换行符,准备打印下一行输出换行符,准备打印下一行* */ / 5.7 循环结构中使用break和continue语句5.7.1 break语句语句 5.7.2 continue语句语句 5.7.1break语句break 语句的两个用途: 跳出switch语句; 跳出本层循环。表达式2break;.假(0)真(非0)for表达式1表达式3switch表达式语句组1bre

21、ak;语句组2break;语句组nbreak;语句组break;.常量 1常量 2常量 ndefaultcase 表达式break;假(0)真(非0)whiledobreak;.表达式假(0)真(非0)while例例5.11 break语句结束循环。语句结束循环。main() int i; for(i=1;i9) break; printf(n);1 2 3 4 5 6 7 8 9 10 例例5.12求调和级数中第多少项的值大于求调和级数中第多少项的值大于10。 调和级数的第调和级数的第n项形式为:项形式为:1+1/2+1/3+1/n#define LIMIT 10main() int n;

22、float sum; sum=0.0; n=1; for(;) sum=sum+1.0/n; if(sumLIMIT) break; n+; printf(n=%dn,n);n=123675.7.2continue语句continue语句作用:立即结束本次循环,转去判断循环条件是否成立。表达式2continue;.假(0)真(非0)for表达式1表达式3真(非0)docontinue;.表达式假(0)while表达式continue;假(0)真(非0)while例例5.13求输入的正数之和。求输入的正数之和。main() int i,n,sum=0; for(i=1;i10;i+) scanf

23、(%d,&n); if(n0) continue; sum=sum+n; printf(SUM=%dn,sum);SUM=55循环语句小结循环语句小结 1)1)三种循环都可以用来处理同一个问题,一般情三种循环都可以用来处理同一个问题,一般情况下它们可以互相代替。况下它们可以互相代替。 2)while2)while和和do-whiledo-while循环,在循环中包含反复执循环,在循环中包含反复执行的循环体和使循环趋于结束的语句。行的循环体和使循环趋于结束的语句。forfor循环可循环可以在表达式以在表达式3 3中包含使循环趋于结束的操作,甚至中包含使循环趋于结束的操作,甚至可以将循环体

24、中的操作全部放到表达式可以将循环体中的操作全部放到表达式3 3中。因此,中。因此,forfor语句的功能更强,凡用语句的功能更强,凡用whilewhile循环能完成的,循环能完成的,用用forfor循环都能实现。循环都能实现。 3)3)用用whilewhile和和do-whiledo-while循环时,循环变量初始化循环时,循环变量初始化的操作应在执行的操作应在执行whilewhile和和do-whiledo-while语句之前完成,语句之前完成,而而forfor语句可以在表达式语句可以在表达式1 1中实现或也可在执行中实现或也可在执行forfor语句之前实现循环变量的初始化。语句之前实现循环

25、变量的初始化。 (4)while (4)while 和和 forfor语句是先判断表达式的值,后执行语句是先判断表达式的值,后执行循环体语句循环体语句; ;而而dodowhilewhile循环是先执行循环体语句,后循环是先执行循环体语句,后判断表达式的值。判断表达式的值。 (5)(5)对对whilewhile语句、语句、do-whiledo-while语句和语句和forfor语句,可以用语句,可以用breakbreak语句跳出循环,用语句跳出循环,用continuecontinue语句结束本次循环。而语句结束本次循环。而对用对用gotogoto语句和语句和ifif语句构成的循环,不能用语句构成

26、的循环,不能用breakbreak语句和语句和continuecontinue语句进行控制。语句进行控制。 (6)(6)如果如果breakbreak出现在循环体内的出现在循环体内的switchswitch语句中的语句中的casecase或或defaultdefault后面,其作用只是跳出后面,其作用只是跳出 该该switchswitch语句,语句,不跳出本层循环。如果不跳出本层循环。如果breakbreak出现在循环体内,但不在出现在循环体内,但不在switchswitch语句中,则在执行语句中,则在执行 breakbreak后,跳出本层循环。后,跳出本层循环。 main() int x,y,

27、z; for(x=1;x=20;x+) for(y=1;y=33;y+) z=100-x-y; if(z%3=0)&(5*x+3*y+z/3=100) printf(cook=%dt hen=%dt chiken=%dn,x,y,z); 例5.14鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁,鸡母,鸡雏各几何?cock=4 hen=18 chick=78cock=8 hen=11 chick=81cock=12 hen=4 chick=84算法:不定方程问题。设算法:不定方程问题。设x、y、z分别表示翁、分别表示翁、母、雏三个量,则母、雏三个量,则x最多为最多为2

28、0,y最多为最多为33,且且z=100-x-y。其解不只一组。其解不只一组。5.8 循环结构程序设计举例main() int m,i,n=0; for(m=101;m=200;m=m+2) if(n%10=0) printf(n); for(i=2;i=m) printf(%d ,m); n=n+1; printf(nprime number=%dn,n);例例5.15 求求100200间的全部素数。间的全部素数。101 103 107 109 113 127 131 137 139 149151 157 163 167 173 179 181 191 193 197199prime number=21 算法:算法:m不能被不能被2(m-1)之间任

温馨提示

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

评论

0/150

提交评论