《《循环控制》PPT课件》由会员分享,可在线阅读,更多相关《《循环控制》PPT课件(32页珍藏版)》请在金锄头文库上搜索。
1、第六章 循环控制 循环结构是一种重要的程序结构,它与顺序结构、分支结构一循环结构是一种重要的程序结构,它与顺序结构、分支结构一起构成三大基本结构。起构成三大基本结构。 循环是相似重复循环是相似重复 ,重复是完成工作的重要方法重复是完成工作的重要方法 :实例实例1. 考试后老师要对考试情况进行汇总,计算出全班考试后老师要对考试情况进行汇总,计算出全班N个学生个学生的平均分。的平均分。 实例实例2. 到超市购物完毕发现小票上写着共计到超市购物完毕发现小票上写着共计22件件 实例实例3. 听说某某书写得非常精彩,冲到书店按分类找到书架听说某某书写得非常精彩,冲到书店按分类找到书架 循环的共同点:循环
2、的共同点:重复发生前通常需要做一些准备工作。重复发生前通常需要做一些准备工作。 被重复的操作是被重复的操作是“相似相似”的而不是的而不是“相同相同”的的 ( (3) ) 重复一定有终止的时候。重复一定有终止的时候。 对重复操作进行控制对重复操作进行控制 条件判断条件判断条件判断条件判断操操 作作操操 作作C语言中提供了三种循环控制语句:语言中提供了三种循环控制语句:for语句、语句、while语句和语句和dowhile语句,前两个是语句,前两个是“先判断后循环先判断后循环”的模式,后一个是的模式,后一个是“先循环后判断先循环后判断”的模式。的模式。 概述C语言可实现循环的语句:用goto 和
3、if 构成循环while 语句do while 语句for 语句goto语句及用goto构成循环goto语句一般格式: goto 语句标号; .标号:语句; v功能:无条件转移语句v说明:l不能用整数作标号l标号只能出现在goto所在函数内,且唯一l标号只能加在可执行语句前面l限制使用goto语句求求1100的累计和。的累计和。根据已有的知识,可以用根据已有的知识,可以用“1+2+100”来求解,但显然很繁来求解,但显然很繁琐。现在换个思路来考虑:琐。现在换个思路来考虑:首先设置一个累计器首先设置一个累计器sum,其初值为,其初值为0,利用,利用sum += n来计算(来计算(n依次取依次取1
4、、2、100),只要解决以下),只要解决以下3个问题即可:个问题即可: (1)将)将n的初值置为的初值置为1; (2)每执行)每执行1次次“sum += n”后,后,n增增1; (3)当)当n增到增到101时,停止计算。此时,时,停止计算。此时,sum的值就是的值就是1100的累计和。的累计和。 根据已有的知识,单独实现每一步都不难。但是,由于需要根据已有的知识,单独实现每一步都不难。但是,由于需要经常使用这种重复计算结构(称为循环结构),经常使用这种重复计算结构(称为循环结构),C语言提供了语言提供了3条循环语句来实现,以简化、并规范循环结构程序设计。条循环语句来实现,以简化、并规范循环结构
5、程序设计。在语言中,可用以下语句实现循环:在语言中,可用以下语句实现循环:(1)用)用for语句。语句。(2)用)用do-while语句。语句。(3)用)用while语句。语句。 (4) 用用GOTO 语句语句例 用if 和goto语句构成循环,求/*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循环初值循环终值循环变量增值循环条件循环体例 从键盘输入一
6、组数据,以0结束输入,求数据和/*ch5_11.c*/#include main() int number,sum=0;read_loop: scanf(%d,&number); if(!number) goto print_sum; sum+=number; goto read_loop;print_sum: printf(The total sum is %dn,sum);while语句v一般形式:while(表达式) 循环体语句;v执行流程:expr循环体假(0)真(非0)whilev特点:先判断表达式,后执行循环体v说明:l循环体有可能一次也不执行l循环体可为任意类型语句l下列情况,退
7、出while循环u条件表达式不成立(为零)u循环体内遇break,return,gotol无限循环: while(1) 循环体;例 用while循环求 /*ch5_2.c*/#include main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%d,sum);循环初值循环终值循环变量增值循环条件循环体例 显示110的平方/*ch5_21.c*/#include main() int i=1; while(i=10) printf(%d*%d=%dn,i,i,i*i); i+; 运行结果:1*1=12*2=43*3=94*4=1
8、65*5=256*6=367*7=498*8=649*9=8110*10=100dowhile语句v一般形式:do 循环体语句; while(表达式);v执行流程:do循环体expr假(0)真(非0)whilev特点:先执行循环体,后判断表达式v说明:l至少执行一次循环体ldowhile可转化成while结构expr循环体假(0)真(非0)循环体While循环例 用dowhile循环求 /*ch5_3.c*/#include main() int i,sum=0; i=1; do sum+=i;i+; while(i=100); printf(%d,sum);例 while和dowhile比较
9、/*ch5_4.c*/#include main() int i,sum=0; scanf(%d,&i); do sum+=i;i+; while(i=10); printf(%d,sum);main() int i,sum=0; scanf(%d,&i); while(i=10) sum+=i;i+; printf(%d,sum);for语句v一般形式:for(expr1 ; expr2 ; expr3) 循环体语句;v执行流程:expr2循环体假(0)真(非0)forexpr1expr3vfor语句一般应用形式:for(循环变量赋初值;循环条件;循环变量增值)循环体语句;v说明:lfor语
10、句中expr1, expr2 ,expr3 类型任意,都可省略,但分号;不可省l无限循环: for(;)lfor语句可以转换成while结构expr1;while(expr2)循环体语句;expr3;例 用for循环求 #include main() int i,sum=0; for(i=1;i=100;i+) sum+=i; printf(%d,sum);【例例】编写程序,用编写程序,用“辗转相除法辗转相除法”求两个正整数的最大公约数。求两个正整数的最大公约数。分析:分析:“辗转相除法辗转相除法”求最大公约数基于数学上的知识:对于两个求最大公约数基于数学上的知识:对于两个正整数正整数a和和b
11、,记,记gcd( (a,b) )表示表示a与与b的最大公约数,若的最大公约数,若a除以除以b的余数的余数是正整数是正整数c,则,则gcd( (a,b) )=gcd( (b,c) )。与普通的短除法求最大公约数相。与普通的短除法求最大公约数相比,辗转相除法可以更快地求得结果。例如,用辗转相除法求比,辗转相除法可以更快地求得结果。例如,用辗转相除法求gcd(3324,1044)的具体过程)的具体过程 :33241044=3192这这说说明明3324与与1044的的最最大大公公约约数数就就等等于于1044与与192的的最最大大公公约约数数。求求1044与与192的的最最大大公公约约数数可可以以再再次
12、次利利用用辗辗转转相相除除法法,并并把把这这一一过过程程重重复复下下去,直到求得的余数为去,直到求得的余数为0。1044 192= 584 192 84 = 224 84 24 = 312 24 12 = 20 最后一次的除数最后一次的除数12就是所求结果,即就是所求结果,即gcd( (3324,1044) )=12 #include main( ( ) ) int a,b,c; printf( (Input two integers ( (0) ) : ) ); scanf( (%d%d,&a,&b) ); printf( (gcd( (%d,%d) ) = ,a,b) ); while(
13、(b0) ) c=a%b;a=b;/* 把刚才的除数放到把刚才的除数放到a中中 */ b=c; /* 把刚才的余数放到把刚才的余数放到b中中 */ printf( (%d,a) );(1) 循环体中循环体中a=b的操作和的操作和b=c的操作能否颠倒次序?的操作能否颠倒次序?(2) 能不能把程序中的后两个能不能把程序中的后两个printf合并到一起,写在合并到一起,写在while循环的后面?循环的后面?(3) 从从键键盘盘输输入入的的两两个个数数前前大大后后小小是是正正常常情情况况,如如果果前前小小后后大大程程序序还还能能求求出出正正确确结果吗?结果吗?(4) 在在例例中中并并没没有有对对键键盘
14、盘输输入入两两个个整整数数的的正正确确性性进进行行判判断断,如如果果输输入入数数据据有有问问题题,比如输入的是负数或零,程序可能出现异常结果。你能否为该程序加上判断功能?比如输入的是负数或零,程序可能出现异常结果。你能否为该程序加上判断功能?循环的嵌套v三种循环可互相嵌套,层数不限v外层循环可包含两个以上内循环,但不能相互交叉v嵌套循环的执行流程(1) while() while() . (2) do do while( ); . while( );(3) while() do while( ); . (4) for( ; ;) do while(); while() .v嵌套循环的跳转禁止:
15、l从外层跳入内层l跳入同层的另一循环l向上跳转例 循环嵌套,输出九九表1234567891234567892468101214161836912151821242791827364554637281.ij/*ch5_5.c*/#include main() int i,j; for(i=1;i10;i+) printf(%4d,i); printf(n-n); for(i=1;i10;i+) for(j=1;j10;j+) printf(j=9)?%4dn:%4d,i*j);i10printf假(0)真(非0)i=1j+j=1j10真(非0)假(0)i+for(i=1;i10;i+) for(
16、j=1;j10;j+) printf(j=9)?%4dn:%4d,i*j);外循环内循环为了使循环控制更加灵活,语言提供了为了使循环控制更加灵活,语言提供了break语句和语句和continue语句。语句。1一般格式:一般格式: break; continue;2功能功能(1)break:强行结束循环,转向执行循环语句的下一条语句。:强行结束循环,转向执行循环语句的下一条语句。(2)continue:对于:对于for循环,跳过循环体其余语句,转向循循环,跳过循环体其余语句,转向循环变量增量表达式的计算;对于环变量增量表达式的计算;对于while和和do-while循环,跳过循循环,跳过循环体其
17、余语句,但转向循环继续条件的判定。环体其余语句,但转向循环继续条件的判定。3break和和continue语句对循环控制的影响如图语句对循环控制的影响如图5-4所示。所示。4说明说明(1)break能用于循环语句和能用于循环语句和switch语句中,语句中,continue只能用只能用于循环语句中。于循环语句中。(2)循环嵌套时,)循环嵌套时,break和和continue只影响包含它们的最内层只影响包含它们的最内层循环,与外层循环无关。循环,与外层循环无关。break语句与语句与continue语句语句exprbreak;假(0)真(非0)whiledobreak;.expr假(0)真(非0
18、)whileexpr2break;.假(0)真(非0)forexpr1expr3switchexpr语句组1break;语句组2break;语句组nbreak;语句组break;.const 1const 2const ndefaultcase 例 break举例:输出圆面积,面积大于100时停止main() int r; float area; for(r=1;r100) break; printf(r=%d,area=%.2fn,r,area); continue语句v功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断v仅用于循环语句中exprcontinue;
19、假(0)真(非0)while真(非0)docontinue;.expr假(0)whileexpr2continue;.假(0)真(非0)forexpr1expr3例 求输入的十个整数中正数的个数及其平均值/*ch5_12.c*/#include main() int i,num=0,a; float sum=0; for(i=1;i=10;i+) scanf(%d,&a);if(a=0) continue;num+;sum+=a; printf(%d plus integers sum :%6.0fn,num,sum); printf(Mean value:%6.2fn,sum/num);程序
20、举例t=1,pi=0,n=1.0,s=1当|t|1e-6pi=pi+tn=n+2s=-st=s/npi=pi*4输出pi分子:1,-1,1,-1分母:1,3,5,7,.例例 求求Fibonacci数列:数列:1,1,2,3,5,8,的前的前40个数个数f1=1,f2=1for i=1 to 20输出输出f1,f2f1=f1+f2f2=f2+f11534233159710946750255142293524578241578171855377258417711121393832040570288739088169213896104181286571964181346269922746563245
21、986321144987676546368317811217830914930352102334155例例 判断判断m是否素数是否素数读入读入mk= mi=2当当i km被被i整除整除真真假假用用break结束循环结束循环i=i+1i k+1真真假假输出输出:m”是素数是素数”输出输出:m”不不是素数是素数”例:编程序,求100-200之间所的的素数。#include #include main()int m,k,i,n=0; for(m=101;m=200;m+=2) k=sqrt(m); for(i=2;i=k+1) printf( %d,m);n+; if (n%10=0) printf(n); printf(n);