1、第六章 循环控制 6 61 1 概述概述 所谓循环控制,就是如何实现循环结构所谓循环控制,就是如何实现循环结构的控制问题。的控制问题。有有4 4种方法:种方法: 用用gotogoto语句和语句和ifif构成循环。构成循环。 用用whilewhile语句。语句。 用用do-whiledo-while语句。语句。 用用forfor语句。语句。6 62 2 用用gotogoto语句和语句和ifif语句构成循环语句构成循环例例: : 对于计算对于计算 s=1+2+3+4+5+6+7+8+9+100 s1 is+i s i+1 ii10 输出syn s=0;s=0; i=1; i=1; lablelab
2、le: :s+=i;s+=i; i+; i+; if(i=10) if(i=10) goto lablegoto lable; ; printf printf(“%d”,s)(“%d”,s) ;语句标号 无条件转向语句 goto goto 语句可以构语句可以构造循环,但不主张用,造循环,但不主张用,因为它容易破坏结构因为它容易破坏结构化程序设计。化程序设计。 goto 语句可以构造循环,但不主张用,因为它容易破坏结构化程序设计。 6 63 while3 while语句语句 whilewhile语句是专门用于实现循环控制的语语句是专门用于实现循环控制的语 句之一。句之一。 其一般形式为:其一般形
3、式为: while (while (表达式表达式) ) 语句语句 含义:当表达式的值为非含义:当表达式的值为非0 0时,执行循环体,时,执行循环体,否则执行后续语句。否则执行后续语句。语句关键 表达循环条件的表达式循环体 语句关键字 执行过程执行过程: : while (while (表达式表达式) ) 语句语句 表达式循环体0非0i 1 0? s=0 i=1s=s+ii=i+1例:用例:用whilewhile语句实现前面算法:语句实现前面算法:main()main() int int i=1,s=0;i=1,s=0; while(i=10)while(i=10) s=s+i; s=s+i;
4、i+; i+; printf printf(“n %d”,s);(“n %d”,s); 注意与注意与ifif语句的区别。语句的区别。循环体中要有使循环条件趋于成立的条件循环体中要有使循环条件趋于成立的条件yn while(i=10)while(i=10) s=s+i; s=s+i; i+; i+; 可简写为:可简写为: while(i=10) s+=i+;while(i=10) s+=i+;非0(真)0(假)表达式循环体 6 64 do-while4 do-while语句语句 do-whiledo-while语句主要用于实现直到型循环。语句主要用于实现直到型循环。 其一般形式为:其一般形式为:
5、 dodo 循环体循环体 while(while(表达式表达式););执行过程:执行过程: 真s=0i=1i10?s=s+ii=i+1假例:用例:用do-whiledo-while语句实现前面算法:语句实现前面算法: main()main() int int i=1,s=0;i=1,s=0; dodo s+=i+; s+=i+; while(i=10);while(i=10); printf printf(“n%d”,s);(“n%d”,s); 注意注意与与whilewhile语句的区别。语句的区别。 假表达式2求解表达式1循环体求解表达式3真 6 65 for 5 for 语句语句 forf
6、or语句是一种使用最为灵活,语句是一种使用最为灵活,并且是用得最多的循环控制语句,并且是用得最多的循环控制语句,其一般形式为:其一般形式为: for(for(表达式表达式1;1;表达式表达式2;2;表达式表达式3)3) 循环体循环体大体含义:大体含义: 对于()的情况执行循环体内容。对于()的情况执行循环体内容。例:用例:用forfor语句实现前面的算法:语句实现前面的算法:s=0;s=0;for(i=1;i=10;i+) s+=i; for(i=1;i=10;i+) s+=i; 标准形式标准形式表达式1 表达式2表达式3循环体可以理解:可以理解: 循环变量循环变量i i从初值从初值1 1开始
7、到终值开始到终值1010,步长为,步长为1 1,重复执,重复执行循环体。行循环体。forfor语句的常见变化:语句的常见变化: s=0; i=1;s=0; i=1; for(;i=10;i+)s+=i; for(;i=10;i+)s+=i; s=0;s=0; f o r ( i = 1 ; i = 1 0 ; ) s + = i + + ; f o r ( i = 1 ; i = 1 0 ; ) s + = i + + ; s=0;i=1; s=0;i=1; f o r ( ; i = 1 0 ; ) s + = i + + ; f o r ( ; i 10) break; if(i10) b
8、reak; s=10;i=10; s=10;i=10; for(;-i;) s+=i; for(;-i;) s+=i;省略表达式省略表达式2 2表达式表达式2 2是是任意表达式任意表达式 s=0; s=0; for(i=1,j=10;ij;i+,j-) s+=i+j; for(i=1,j=10;ij;i+,j-) s+=i+j; 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10在程序设计中不要过分追求它的多变性在程序设计中不要过分追求它的多变性ij用逗号表达式用逗号表达式例:例:求求n! n!=1n! n!=1* *2 2* *3 3(n-1)(n-1)* *
9、n n 参照累加求和参照累加求和main()main() int int i,n=5 i,n=5,s=1;s=1; for(i=1;i=n;i+)s for(i=1;i=n;i+)s* *=i;=i; printf printf(“n s=%d”,s);(“n s=%d”,s); 注意注意s s的初值。的初值。注意当注意当n n较大时的情况。较大时的情况。求和与连乘都是最常用的算法,要熟练掌握。求和与连乘都是最常用的算法,要熟练掌握。 例:求自然数例:求自然数1-1001-100中能被中能被3 3整除的数之和。整除的数之和。 main()main() int int i,s=0; i,s=0;
10、 printf printf(“n %d”,s);(“n %d”,s); 求能被求能被3 3整除但不被整除但不被7 7整除的数之和?整除的数之和?for(i=1;i=100;i+) s+=i;for(i=1;i=100;i+) if(i%3=0)s+=i;for(i=3;i=100;i+=3) s+=i; for(i=3;i=100;i+=3) if (i%7)s+=i; 例:求任意例:求任意100100个数中的最大值。个数中的最大值。 main()main() int int i,a,max; i,a,max; max=?max=? for(i=1;i=100;i+) for(i=1;ima
11、x) max=a;if(amax) max=a; printf printf(“n max=%d”,max);(“n max=%d”,max); 循环体中没有引用循环变量。循环体中没有引用循环变量。i i的作用?的作用? 求任意个数中的最大值?求任意个数中的最大值?for(i=1; ;i+)for(i=1; ;i+) if(a=-9999)break;if(a=-9999)break;max=-32768;max=-32768;外重循环内重循环执行200次要掌握多重循环执行的全过程6 66 6 循环的嵌套循环的嵌套 循环体内又包含另一个完整的循环结构循环体内又包含另一个完整的循环结构( (多重
12、多重循环循环) )。 for(i=1;i=10;i+)for(i=1;i=10;i+) for(j=1;j=20;j+) for(j=1;j=20;j+) s+=i+j; s+=i+j; 以上多重循环结构可以简写为:以上多重循环结构可以简写为: for(i=1;i=10;i+)for(i=1;i=10;i+) for(j=1;j=20;j+) for(j=1;j=20;j+) s+=i+j; s+=i+j;例:例:一场晚会要现场随机抽取幸运观众,抽一场晚会要现场随机抽取幸运观众,抽取办法是由主持人随机给定一个数字,如座位取办法是由主持人随机给定一个数字,如座位的行号和列号之和正好等于该数字的观
13、众就是的行号和列号之和正好等于该数字的观众就是幸运观众,已知晚会现场共有幸运观众,已知晚会现场共有3030排座位,每排排座位,每排2020个座位,请编写程序,从键盘输入主词人随个座位,请编写程序,从键盘输入主词人随机给定数字,输出所有幸运观众的坐号。机给定数字,输出所有幸运观众的坐号。 main()main() int i,j,num; int i,j,num; scanf scanf(“%d”,&num);(“%d”,&num); for(i=1;i=30;i+) for(i=1;i=30;i+) for(j=1;j=20;j+) for(j=1;j=20;j+) if(i+j=num) i
14、f(i+j=num) printf printf(“n%d,%d”,i,j);(“n%d,%d”,i,j); 注意循环的关系例:百钱买百鸡问题。例:百钱买百鸡问题。 给定给定100100块钱,要求正好买块钱,要求正好买100100只鸡,已知公只鸡,已知公鸡鸡5 5元元/ /只,母鸡只,母鸡3 3元元/ /只,小鸡只,小鸡1 1元元/3/3只,问公只,问公鸡、母鸡和小鸡应各买多少只?鸡、母鸡和小鸡应各买多少只?若考虑用方程组:若考虑用方程组: x+y+z=100 x+y+z=100 5x+3y+z/3=100 5x+3y+z/3=100 是一多解问题。是一多解问题。用测试法求解的程序:用测试法求
15、解的程序: main()main() int int x,y,z; x,y,z; for(x=1;x=100;x+) for(x=1;x=100;x+) for(y=1;y=100;y+) for(y=1;y=100;y+) for(z=1;z=100;z+) for(z=1;z=100;z+) if(x+y+z=100&5 if(x+y+z=100&5* *x+3x+3* *y+z/3.0=100)y+z/3.0=100) printf printf(“n%d,%d,%d”,x,y,z);(“n%d,%d,%d”,x,y,z); 程序可进一步简化为:程序可进一步简化为: main()main
16、() int int x,y,z; x,y,z; for(x=1;x=20;x+) for(x=1;x=20;x+) for(y=1;y=33;y+) for(y=1;y=33;y+) z=100-x-y; z=100-x-y; if(5 if(5* *x+3x+3* *y+z/3.0=100)y+z/3.0=100) printf printf(“n%d,%d,%d”,x,y,z);(“n%d,%d,%d”,x,y,z); 用测试法求解问题的典型例子用测试法求解问题的典型例子测试法求解的程序设计有两个要点:测试法求解的程序设计有两个要点: 通过循环列出所有可能的解。通过循环列出所有可能的解。
17、 对所有列出的可能的解进行条件测试。对所有列出的可能的解进行条件测试。例:判断一个数例:判断一个数m m是否为素数。是否为素数。main()main() int int i,m; i,m; scanf scanf(“%d”,&m);(“%d”,&m); for(i=2;im;i+) if(m%i=0)break;for(i=2;im;i+) if(m%i=0)break; if(i=m) if(i=m) printf printf(“n %d is a prime”,m);(“n %d is a prime”,m); else else printf printf(“n %d is not a
18、 prime”,m);(“n %d is not a prime”,m); 用测试法求解用测试法求解例:(习题例:(习题6.66.6) 打印出所有的打印出所有的“水仙花数水仙花数”,所谓,所谓“水水仙花数仙花数”是指一个三位数,其各位数字的是指一个三位数,其各位数字的立方和等于该数本身。如:立方和等于该数本身。如:153153是一水仙花是一水仙花数,因为数,因为 153=1153=13 3+5+53 3+3+33 3。main()main() int int i,j,k,n; i,j,k,n; for(n=100;n=999;n+) for(n=100;n=999;n+) i=? i=? j=
19、? j=? k=? k=? if(i if(i* *i i* *i+ji+j* *j j* *j+kj+k* *k k* *k=n)k=n) printf printf(“n%d”,n);(“n%d”,n); 通过循环列出通过循环列出n n的所有可能的范围的所有可能的范围 i=n/100;k=n%10;j=n/10%10;main()main() int int i,j,k,n; i,j,k,n; for(i=1;i=9;i+) for(i=1;i=9;i+) for(j=0;j=9;j+) for(j=0;j=9;j+) for(k=0;k=9;k+) for(k=0;k=9;k+) n=i
20、n=i* *100+j100+j* *10+k;10+k; if(i if(i* *i i* *i+ji+j* *j j* *j+kj+k* *k k* *k=n)k=n) printf printf(“n%d”,n);(“n%d”,n); 通过循环列出通过循环列出i,j,ki,j,k的所有可能的范围的所有可能的范围例例:(:(习题习题6.46.4) 求求S=i! =1 1!+2+2!+3+3!+4+4!+ +19+19!+20+20!20i=1main()main() int int i,j; i,j; float t,s=0; float t,s=0; for(i=1;i=20;i+) f
21、or(i=1;i=20;i+) s+=?s+=?; ; printf printf(“n s=%f”,s);(“n s=%f”,s); 用两重循环实现用两重循环实现s+=t;t=1;t=1;for(j=1;j=i;j+) tfor(j=1;j=i;j+) t* *=j;=j;用递推法:用递推法: 递推公式:递推公式:t ti i=t=ti i-1-1.i.i求求S=i! =1 1!+2+2!+3+3!+4+4!+ +19+19!+20+20!20i=1=1+(i-1)!.i = 1+ti-1.i 20i=220i=2main()main() int int i,j; i,j; float t=
22、1,s=t; float t=1,s=t; for(i= for(i=2 2;i=20;i+);i=20;i+) t=tt=t* *i;i; s+=t; s+=t; printf printf(“n s=%f”,s);(“n s=%f”,s); 例:例: 递推公式:递推公式: s=s= i i!1120= = + + + + + 1! 2! 3! 4! 20!1 1 1 1 1t ti i= t= ti i-1 -1 / / i imain()main() int int i,j; i,j; float t= float t=1 1,s=t;,s=t; for(i= for(i=2 2;i=2
23、0;i+);i=20;i+) t=tt=t* *i;i; s+=t; s+=t; printf(“n printf(“n s=%f”,s); s=%f”,s); t=t/i;t=t/i;习题习题6.3:6.3: s=a+aa+aaa+aaaa+aaaaa s=a+aa+aaa+aaaa+aaaaa 2+22+222+2222+222222+22+222+2222+22222 递推公式:递推公式:t ti i= t= ti i-1-1? ?t ti i= t= ti i-1 -1 * * 10+a10+amain()main() int int i,j,a=2; i,j,a=2; float t
24、= float t=a a,s=t;,s=t; for(i= for(i=2 2;i=5;i+);i=5;i+) t=tt=t* *10+a;10+a; s+=t; s+=t; printf(“n printf(“n s=%f”,s); s=%f”,s); 例:例:求方程求方程 2 2x x3 3+3x+3x2 2-4x+1=0-4x+1=0的根。的根。 简单迭代法基本思想:简单迭代法基本思想: 将原方程将原方程f(x)f(x)化为:化为:x=g(x)x=g(x)迭代公式迭代公式: : x x2 2=g(x=g(x1 1) ) x2=(2x1 x2=(2x13 3+3x1+3x12 2+1)/
25、4+1)/4迭代过程:迭代过程:假定一个x1x2=g(x1)不成立|x2-x1x1=x2输出x2成立main()main() float x1,x2; float x1,x2; scanf scanf(“%f”,&x1);(“%f”,&x1); while(1) while(1) x2=(2x2=(2* *x1x1* *x1x1* *x1+3x1+3* *x1x1* *x1+1)/4;x1+1)/4; if(fabs if(fabs(x2-x1)1e-6)break;(x2-x1)1e-6)break; ? ? printf printf(“n %f”,x2);(“n %f”,x2); x1=
26、x2;牛顿迭代法基本思想:牛顿迭代法基本思想: 牛顿迭代公式牛顿迭代公式 f(x1)=f(x1)/(x1-x2)f(x1)=f(x1)/(x1-x2) x2=x1-f(x1)/ f(x1) x2=x1-f(x1)/ f(x1)x1x2yxf (x1)f (x2) main()main() float x1,x2,f1,f; float x1,x2,f1,f; scanf scanf(“%f”,&x1);(“%f”,&x1); while(1) while(1) f=2f=2* *x1x1* *x1x1* *x1+3x1+3* *x1x1* *x1-4x1-4* *x1+1;x1+1; f1=6
27、 f1=6* *x1x1* *x1+6x1+6* *x1-4;x1-4; x2=x1-f/f1; x2=x1-f/f1; if(fabs if(fabs(x2-x1)1e-6) break;(x2-x1)1e-6) break; x1=x2; x1=x2; printf printf(“n %f”,x2);(“n %f”,x2); 例:例:求定积分:求定积分: 数值积分数值积分 f (x)abxsinxxdxab等分nh=b-an第i个矩形:x=?x=a+(i-1).h#include “math.h” main() int n,i; float a,b,x,y,h,s=0; scanf(“%f%f%d”,&a,&b,&n); h=(b-a)/n; for(i=1;i=n;i+) x=a+(i-1)*h; y=sin(x)/x; s+=h*y; printf(“n s=%f”,s);
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。