1、第第 5 5 章章 循环控制程序设计循环控制程序设计 1. 目的、要求目的、要求 掌握掌握实现循环的实现循环的3种方法及其比较种方法及其比较。 掌握循环的嵌套。掌握循环的嵌套。 掌握掌握break和和continue语句的使用。语句的使用。2. 重点、难点重点、难点 循环结构的灵活应用。循环结构的灵活应用。可整理ppt2循环型程序设计循环型程序设计 循环结构在程序设计中十分重要。所谓循环结构就是当给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。循环结构是结构化程序三种基本结构之一,可用于实现循环的C语句有: goto语句+if语句 wh
2、ile语句 dowhile语句 for语句可整理ppt3q问题提出打印整数打印整数1-10打印整数打印整数1-100打印整数打印整数1-n方法一:方法二:printf(“%d”,1);printf(“%d”,2);printf(“%d”,10);printf(“%d%d%d%d”,1,2,3,10);printf(“%d”,i);i+;printf(“%d”,i); i+;printf(“%d”,i); i+;i=1;程序段 int i=1; while (i=10) printf(%d,i); i+; 循环不变式循环不变式可整理ppt4goto 语句及其构成的循环语句及其构成的循环goto语
3、句为无条件转向语句,一般形式为:goto 语句标号;语句标号;语句标号的命名规则与变量名相同。 goto语句程序的可读性差、无规律,不符合结构化程序设计原则,因而只有在万不得已时才使用。1001nnsummain()int i,sum=0; i=1; loop:if (i=100) sum=sum+i; i+; goto loop; printf(%d,sum);可整理ppt5while结构的应用结构的应用while语句用于实现“当型”循环结构,一般形式为:while(条件表达式)(条件表达式) 循环体循环体当表达式为非非0时,执行while的内嵌语句。特点:先判断表达式,后执行语句。特点:先
4、判断表达式,后执行语句。可整理ppt6 注意: 循环体可以是用花括号括起的复合语句;循环体中应有使循环趋于结束的语句,否则将进入死循环。 用计数法设置循环条件时,应特别注意“边界值”的选取。可整理ppt7 while语句的意义为:计算表达式的值,若表达式的值为真(非0)时,则执行循环体语句;不断反复,直到表达式的值为假(0),则不执行循环体语句,而直接转向循环体外的第一条语句。 注意,whlie语句后没有分号(;)。 为了保证循环体可以结束,通常采用每循环一次向某种方向改变表达式的值,使得表达式的值最终可以为假。还有一种方法是在某种条件下,强行从循环体中跳出(如使用break语句)。 若表达式
5、的值永远为真,则循环体被不断地执行,也就是说,永远不能从循环中退出,我们通常称这种循环为“死循环”。在绝大多数情况下,都不允许死循环。PA假真A当P为真可整理ppt8 计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0 时结束循环,转去执行while后面的语句。 当表达式为真当表达式为真 语句语句表 达 式 非表 达 式 非0?语句语句可整理ppt9【例5.2】编写程序,求100个自然数的和即: SUM=1+2+3+ +100 sum=0sum+1 sumsum+2 sumsum+3 sumsum+100 sum循环不变式sum=sum+
6、?main( ) int i,sum; i=1; sum=0; while (i=100) sum=sum+i; i+; printf(sum=%dn,sum); i=1,sum=0 当当i = 100 sum=sum+i i+输出输出sum可整理ppt10 为了保证循环正常运行,应该特别注意: 循环控制条件的描述 控制条件的初始状态(初始值) 循环体内部对控制条件的影响可整理ppt11用于实现“直到型”循环结构,一般形式为:do 循环体循环体 while(条件表达式)(条件表达式); 先执行语句,再判断表达式的值,直到表达式的值为0时结束循环。特点:先执行语句,后判断表达式。特点:先执行语句
7、,后判断表达式。do while结构的应用结构的应用PA假真A直到P为真 可整理ppt12 循环体循环体当表达式为真当表达式为真N-S结构图结构图NY循环体循环体表达式非表达式非0?流程图流程图main( ) int i=1,sum=0; do sum=sum+i; i+; while (i=100); printf(%dn,sum);可整理ppt13可整理ppt14对于do-while语句还应注意以下几点:l 在if语句、while语句中,表达式后面都不能加分号,而在do-while语句的表达式后面则必须加分号;l do-while语句也可以组成多重循环,而且也可以和while语句相互嵌套;
8、l 在do和while之间的循环体由多个语句组成时,必须用括起来;l do-while和while语句相互替换时,要注意修改循环控制条件;可整理ppt15例:求i+(i+1)+(i+2)+10,其中i由键盘输入,分别用两种语句编程while 循环程序do -while 循环程序#includemain()int i,sum=0; scanf(%d,&i); while(i=10) sum=sum+i; i+; printf(i=%d,sum=%dn,i,sum);#includemain()int i,sum=0; scanf(%d,&i); do sum=sum+i; i+; while(i
9、=10); printf(i=%d,sum=%dn,i,sum);可整理ppt16例:输入一些数,求和,直到输入负数为止#includemain() int x,sum=0; scanf(%d,&x); while(x=0) sum=sum+x; scanf(%d,&x); printf(sum=%d,sum);#includemain() int x,sum=0; do scanf(%d,&x); sum=sum+x; while(x=0); printf(sum=%d,sum);输入:1,2,5,-10输入:-10,1,2,5结果:sum=8结果:sum=-2结果:sum=0结果:sum=
10、-10可整理ppt17一般形式为: for(表达式表达式1;表达式;表达式2;表达式;表达式3) 语句语句 最简单、最易理解的形式为:for(循环变量初值;循环条件;循环变量增值)语句循环变量初值;循环条件;循环变量增值)语句如:for(i=1;i=100;i+) sum=sum+i;求解表达式1表达式2语句求解表达式3for语句的下一语句for结构的语法结构的语法0非 0可整理ppt18 for语句一般格式 for (表达式1;表达式2;表达式3) 语句 可整理ppt19 for(表达式表达式1;表达式;表达式2;表达式;表达式3)语句)语句表达式表达式1;while (表达式(表达式2)
11、语句语句 表达式表达式3; 可整理ppt20N-S结构图结构图for (表达式表达式1;表达式表达式2;表达式表达式3) 语句语句NY流程图流程图计算表达式计算表达式1 计算表达式计算表达式3表达式表达式2为真为真?例如:main( ) int i,sum; sum=0; for ( i=1; i=100; i+) sum=sum+i; printf(sum=%dn,sum);for语句用while实现 exp1;while(exp2) 语句语句; exp3; 可整理ppt21 for ( ; ; ) 注意:在省略某个表达式时,应在适当位置进行循注意:在省略某个表达式时,应在适当位置进行循环控
12、制的必要操作,以保证循环的正确执行环控制的必要操作,以保证循环的正确执行可整理ppt22 3. 限定转向语句限定转向语句 break:终止循环或多路选择结构。 continue:结束本次循环。 函数调用和返回:转向被调函数和从被调函数返回。while ()() | break; | while ()() | continue; | 可整理ppt23后续语句后续语句后续语句后续语句break语句 功能:利用break语句能够强迫终止本层循环,转到后续语句执行。后续语句后续语句可整理ppt24后续语句后续语句 后续语句后续语句continue语句 功能:中断循环体的本次执行(即跳过循环体中尚未执行
13、的语句),立即开始执行下一次循环。后续语句后续语句可整理ppt25#includemain()int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%dn,sum);可整理ppt26#include stdio.hmain() int c; while(c=getchar( )!=n) putchar(c);可整理ppt27#include stdio.hvoid wait_a_char() char ch; printf(请输入正确的密码请输入正确的密码:n); scanf(%c,&ch); while (ch!=c) printf(密码输
14、入不正确,请重输密码输入不正确,请重输!); scanf(%c,&ch); return;main()wait_a_char();printf(password ok!n);可整理ppt28main()int i,sum=0; i=1; do sum=sum+i; i+; while(i=100); printf(%dn,sum);可整理ppt29几种循环的比较几种循环的比较1)虽然4种循环通常可以互相代替,但不提倡用goto循环。2)对while和dowhile循环,在循环体中包含应反复执行的操作语句;而对for循环,可将循环体中的操作全部放到表达式3中。因此for语句的功能更强,可完全代替
15、while循环。3)对while和dowhile循环,循环变量的初始化应在while和dowhile语句之前完成,而for语句可在表达式1中完成。4)while和for是先判断后执行,dowhile是先执行后判断。5)while、dowhile、for可用break和continue控制。可整理ppt30循环的嵌套循环的嵌套 对于相互嵌套的循环,应遵循以下原则:对于相互嵌套的循环,应遵循以下原则: 1、内外循环不得交叉;、内外循环不得交叉; 2、外循环的控制变量不能与任何一个内循环变量相同,、外循环的控制变量不能与任何一个内循环变量相同,但几个并列的内循环允许用相同的控制变量;但几个并列的内循
16、环允许用相同的控制变量; 一个循环(称为一个循环(称为“外循环外循环”)的循环体内包含另一个循)的循环体内包含另一个循环(称为环(称为“内循环内循环”)。内循环中还可以包含循环,形成多)。内循环中还可以包含循环,形成多层循环。(循环嵌套的层数理论上无限制)层循环。(循环嵌套的层数理论上无限制), 三种循环(三种循环(while循环、循环、do-while循环、循环、for循环)可以互相嵌套。循环)可以互相嵌套。 可整理ppt31while( ) while( ) for( ; ; ) while( ) . for( ; ; ) for( ; ; ) . do do . while( ); wh
17、ile( ); for( ; ;) do . while(); 可整理ppt32#includemain() int i,j; for(i=0;i5;i+) for(j=0;j=i;j+) printf(“%3d”,j); printf(“n”); 运行结果:运行结果: 0 0 1 0 1 2 0 1 2 3 0 1 2 3 4 循环嵌套举例一循环嵌套举例一可整理ppt33#include main() int i,j; for(i=1;i=9;i+) for(j=1;j=i;j+) printf(“%dX%d=%d ”,i,j,i*j); printf(“n”); 循环嵌套举例二:打印九九乘
18、法表循环嵌套举例二:打印九九乘法表运行结果:运行结果:1X1=12X1=2 2X2=43X1=3 3X2=6 3X3=94X1=4 4X2=8 4X3=12 4X4=16 可整理ppt34#includemain() int i,j; int sum1,sum2=0; for(i=1;i=5;i+) sum1=1; for(j=1;j=i;j+) sum1=sum1*j; sum2=sum2+sum1; printf(“1!+2!+3!+4!+5!=%dn”,sum2);循环嵌套举例三:计算循环嵌套举例三:计算1!+2!+3!+4!+5! sum1=1; for(j=1;j=5;j+) sum
19、1=sum1*j;求求5!可整理ppt35#includemain() int n; for (n=100;n=200;n+) if (n%3=0) continue; printf(%d,n); 可整理ppt36#includemain() int a,sum=0; printf(输入一批数输入一批数:n); scanf(%d,&a); for(; ;) if(a0)break; sum=sum+a; scanf(%d,&a); printf(此次输入的正数之和是此次输入的正数之和是%dn,sum);可整理ppt37#includemain() int i=0; for( ; ;) i+;
20、if(i=3) printf(“next,”); continue; printf(“%d ”,i); if(i=5) printf(“break,”); break; printf(“End!n”);运行结果:运行结果:1 2 next, 4 5 break,End!可整理ppt38程程 序序 举举 例例例例1-1 1-1 求求1+2+3+1+2+3+n+n算法:算法:i=1 to n s=s+t t+i+i=1 to n s=s+i i+for(i=1;i=n; i+) s=s+i; 可整理ppt39程程 序序 举举 例例例例1-2 1-2 求求1+1/2+1/3+1+1/2+1/3+1/
21、n+1/n算法:算法:i=1 to n s=s+t t+i+i=1 to n s=s+t t=1.0/ii+s=0;for(i=1;i=n; i+) s=s+1.0/i; 可整理ppt40程程 序序 举举 例例例例1-3 1-3 求求1-1/2+1/3-1/41-1/2+1/3-1/41/n1/n算法:算法:i=1 to n s=s+t t=1.0/ii+i=1 to n s=s+t t=1.0/i*flag flag=(-1)*flagi+s=0;flag=1;for(i=1;i=n; i+) s=s+1.0/i*flag; flag=-flag; 可整理ppt41算法:算法:i=1 to
22、n s=s+t t=1.0/ii+i=1 to n s=s+t t=1.0/i*flag flag=(-1)*flagi+s=0;t=1;tt=1;flag=1;for(i=1;i=n; i+) s=s+1.0/tt*flag; flag=-flag; tt=2*i+1; 例例1-4 1-4 求求1-1/3+1/5-1/71-1/3+1/5-1/71/n1/ni=1 to n s=s+t t=1.0/tt*flag flag=(-1)*flag tt=2*i+1i+i=1 to n s=s+t t=1.0/(2*i-1)*flag flag=(-1)*flagi+s=0;t=1;tt=1;fl
23、ag=1;for(i=1;i=n; i+) s=s+1.0/(2*i-1)*flag; flag=-flag; 可整理ppt42算法:算法:i=1 to n s=s+t t=i/(i+1)i+i=1 to n s=s+t t= i/(i+1) *flag flag=(-1)*flagi+s=0; flag=1;for(i=1;i=n; i+) s=s+1.0*i/ (i+1) *flag; flag=-flag; i+; 例例1-5 1-5 求求s = 1/2 -2/3 + 3/4 - 4/5 + s = 1/2 -2/3 + 3/4 - 4/5 + (-1)(-1)n-1 n-1 n/(n+
24、1) n/(n+1) 可整理ppt4371513114#include #includemain() int flag =1; float s,t,tt,pi; s=0; t=1.0; tt=1.0; while(fabs(t)=1E-6) s=s+t; tt=tt+2; flag =-flag; t=1.0/tt* flag; pi=s*4; printf(pi=%10.7fn,pi);例例2-1 2-1 求求1-1/3+1/5-1/71-1/3+1/5-1/7, ,直到最后一项的绝对值直到最后一项的绝对值 =1E-6 s=s+t t=1.0/tt*flag flag=(-1)*flag t
25、t=tt+2可整理ppt44例例3-1 3-1 求求n!n!算法:算法:i=1 to n s=s*t t+i+i=1 to n t=t*i i+t=1;for(i=1;i=n; i+) t=t*i; 可整理ppt45例例3-2 3-2 求求x xn n算法:算法:i=1 to n t=t*x i+#includemain() int n=10,x,i; long int t=1; scanf(%d,&x); for(i=1;i=n; i+) t=t*x; printf(%d的的%d次方是次方是:%dn,x,n,t); 可整理ppt46#includemain() int x1,x2,i,t;
26、x1=x2=1; printf(%d %d ,x1,x2); for (i=1;i=18;i+) t=x1+x2; printf(%d ,t); x1=x2; x2=t; printf(n);例例4-1 4-1 输出输出FibonacciFibonacci数列前数列前2020个数个数1,1,2,3,5,8,13,x1 x2tx1 x2t算法:算法:x1=x2=1;t=x1+x2;x1=x2;x2=t;x1 x2t可整理ppt47例例5-1 5-1 求最大数求最大数abcmaxmaxmax循环不变式循环不变式scanf(“%d”,&x)x max#includemain() int a,b,c,
27、max; printf(input a,b,c:n); scanf(%d%d%d,&a,&b,&c); max=a; if(maxb)max=b; if(maxc)max=c; printf(max is %d,max);可整理ppt48例例5-2 5-2 输入一个正整数输入一个正整数n n,再输入,再输入n n个数,输出个数,输出n n个数中个数中的最大数的最大数abcmaxmaxmax循环不变式循环不变式scanf(“%d”,&x)x maxmax#include#includemain()main() int i,x,n,max; int i,x,n,max; printf(input
28、n:n); printf(input n:n); scanf(%d,&n); scanf(%d,&n); if(n0) if(n0) scanf(%d,&x); scanf(%d,&x); max=x; max=x; for(i=1;in;i+) for(i=1;in;i+) scanf(%d,&x); scanf(%d,&x); if(maxx)max=x; if(maxx)max=x; printf(max is %d,max); printf(max is %d,max); 可整理ppt49#include math.hmain()int i,m; scanf(%d,&m); for (
29、i=2;i=m) printf(%d is a prime numbern,m); else printf(%d is not a prime numbern,m);例例6-1 6-1 判断判断m m是否是素数是否是素数算法:除了算法:除了1 1和和m m,不能被其它整数整除,不能被其它整数整除 m %2 %3 %4 %5 m %2 %3 %4 %5 %(m-1) %(m-1) 是素数是素数 & !=0 !=0 !=0 !=0 !=0& !=0 !=0 !=0 !=0 !=0不是素数不是素数 | =0 =0 =0 =0 =0| =0 =0 =0 =0 =0循环结束两个出口:循环结束两个出口:
30、1、自然结束、自然结束!(i=m2、强制终止、强制终止(m%i=0) break可整理ppt50#include math.hmain() int m,k,i,n=0; for (m=101;m=200;m=m+2) if (n%10=0) printf(n); k=sqrt(m); for (i=2;i=k+1) printf(%d ,m); n=n+1; printf(n);例例6-2 6-2 求求100-200100-200间的全部素数间的全部素数可整理ppt51例例7-1 7-1 将一个正整数逆序输出将一个正整数逆序输出123455 4 3 2 112345%10=5 12345/10
31、=12341234%10=4 1234/10=123123%10=3 123/10=1212%10=2 12/10=1 1%10=1 1/10=0结束结束循环不变式:循环不变式:x%10 x= x/10 x%10 x= x/10循环条件:循环条件:x!=0 x!=0scanf(“%d”,&x)while(x!=0) digit=x%10; x=x/10; printf(“%d”,digit);可整理ppt52循环编程注意事项:循环编程注意事项: 写出写出循环不变式循环不变式和和循环条件循环条件,其中循环条件包,其中循环条件包括:指定循环次数、判断某项的值、输入一个特殊括:指定循环次数、判断某项
32、的值、输入一个特殊数作为结束。数作为结束。循环分类:循环分类:求和、求积求和、求积求最大值、最小值求最大值、最小值FibonacciFibonacci数列,数列中某项的值与前若干项有关数列,数列中某项的值与前若干项有关判断素数、完数判断素数、完数拆分一个整数拆分一个整数输入一些字符,统计输入一些字符,统计7. 7. 穷举法穷举法 可整理ppt53#includemain() int n=0; printf(输入一行字符输入一行字符:n); while(getchar()!=n) n+; printf(%d,n);1.1.统计从键盘输入一行字符的个数统计从键盘输入一行字符的个数课堂练习课堂练习可
33、整理ppt54#includemain() int n=100; while(n) printf(“%d”,n); n-; 2.2.在屏幕上从大到小输出在屏幕上从大到小输出100100以内的整数以内的整数可整理ppt55程序一程序一 #include main() int i,j=1; for(i=1;i=5;i+) printf(%d ,i); j+; printf(n* * * * * n); printf(j=%dn,j); 程序二程序二 #include main() int i,j=1; for(i=1;i=5;i+) printf(%d ,i); j+; printf(n* * *
34、 * * n); printf(j=%dn,j); 3.3.试比较下列两程序的运行结果试比较下列两程序的运行结果可整理ppt56#includemain() char c; int l=0,m=0,n=0; c=getchar(); while(c!=n) switch(c) case a:l+;break; case b:m+;break; case c:n+;break; default:; c=getchar(); printf(a、b、c出现的次数分别是出现的次数分别是%d、%d、%dn,l,m,n);4.4.检查键盘输入的一行字符中字母检查键盘输入的一行字符中字母a a、b b和和c
35、 c出现的次数出现的次数可整理ppt571 1、我国、我国19911991年有年有11.611.6亿人口,要求计算出当人口平均增亿人口,要求计算出当人口平均增长率为每年长率为每年5%5%、2%2%、1%1%时,从时,从19911991年算起经过多少年年算起经过多少年后我国的人口增长到后我国的人口增长到1515亿?亿?2 2、兑换零钱:将、兑换零钱:将1010元钱换成元钱换成5 5角、角、2 2角、角、1 1角(至少各一角(至少各一枚),列出所有可能的方案。枚),列出所有可能的方案。课堂练习课堂练习可整理ppt58#includemain() float sum=11.6,x; int year
36、=0; scanf(%f,&x); do sum=sum*(1+x); year+; while(sum=15); printf(“当增长率为当增长率为%4.1f%时,需经过时,需经过%d年人年人 口达到口达到 15亿亿,x*100,year); 我国我国19911991年有年有11.611.6亿人口,要求计算出当人口平均增长率亿人口,要求计算出当人口平均增长率为每年为每年5%5%、2%2%、1%1%时,从时,从19911991年算起经过多少年后我国的人口年算起经过多少年后我国的人口增长到增长到1515亿?亿?可整理ppt59兑换零钱:将兑换零钱:将1010元钱换成元钱换成5 5角、角、2 2角、角、1 1角(至少各一枚),角(至少各一枚), 列出所有可能的方案。列出所有可能的方案。#includemain() int num1,num2,num5,i=1; for(num1=1;num1100;+num1) for(num2=1;num250;+num2) for(num5=1;num520;+num5) if(1*num1+2*num2+5*num5=100) printf(“可能的方案可能的方案%d如下如下:其中其中1角角%d个个,2角角%d个个,5角角%d个个n”, i,num1,num2,num5); i+;