1、第六章 循环控制,C语言中的循环结构可以用以下语句实现:1. 用 goto 语句和 if 语句的组合2. 用 while 语句3. 用 do-while 语句4. 用 for 语句,第六章 循环控制,循环结构是结构化程序设计的基本结构之一。,6.1 概述,goto 语句为无条件转移语句。一般形式: goto 语句标号 ;例如: goto loop; goto laber_1 ; - 合法goto 123; goto 1ab ; - 不合法,用标识符表示, 定名规则与变量名相同, 但是不能用整数,6.2 goto 语句和 用 goto 语句构成循环,goto 语句的用法:1. 与 if 语句一起
2、构成循环结构。2. 强制转移到指定语句(如:从循环体内跳到循环体外)一般用在跳出多层循环。,结构化程序设计中应尽量不用 goto 语句,因为褴用goto 语句将使程序流程无规则,可读性差。,注意:,用 if 语句和 goto 语句构成循环,求 1+2+3+.+100。,#include void main( ) int i,sum=0;i=1; loop: if (i=100) sum=sum+i ;i+;goto loop; printf(“%d“,sum); ,例 6.1,while 用来实现“当型循环“结构一般形式: while (表达式)语句,当“表达式“为 非0 值时 执行该语句,“
3、语句”部分就是循环体, while 循环是先判断后执行。,6.3 while 语句,while 流程图:,表达式,语句,非0,0,语句,当表达式成立,N-S流程图,1. 如果语句部分包含一个以上的语句,那么应该用复合语句“ ”的形式。2. 在循环体中应有使循环趋于结束的语句。,注 意,例如: 有以下程序段x=y=1 ;while (y10)+y ;x+=y ;这里while的循环体只有一个语句+y,不必用复合语句 。,想一想以下表达式执行后x和y的值:x=y=1;while(y10) +y; x+=y; ,这个语句每次循环改变y值 可使循环结束。,注意:x+=y ; 不是循环体中的语句。这个程
4、序段循环执行9次,循环结束后 y 值为10,x值为11。,用 while 语句构成循环,求 1+2+3+.+100.,#include void main( ) int i , sum ;i=1; sum=0 ;while (i=100)sum=sum+i;i+;printf(“%d“,sum); ,循环体中有二个语句,要用 括起耒。 其中i+是改变条件表达式的语句。,流程图,真,假,i=0; sum=0;,i=100,sum=sum+i; i+;,例 6.2,do-while 语句用来实现“直到型“循环结构一般形式: do 语句 while (表达式) ;,先执行“语句”,后判断“表达式”,
5、 即至少执行一次循环体。当“表达式”的值为 非0 时,返回重新执行“语句”。,当“语句”部分包含一个以上的语句时,应该用 复合语句“ “的形式,6.4 do-while 语句,1. 对于同一个问题, 既可以用 while语句 , 也可以用 do-while语句 处理。2. while语句可能一次也不执行循环体,但do-while语句至少执行一次循环体。3. 特别要注意while 语句后加分号 ;,循环体语句,表达式,真,假,流程图,语 句,当表达式成立,N-S流程图,注意,用 do-while 语句构成循环,求 1+2+3+.+100。,#include void main( ) int i,
6、 sum=0;i=1;do sum=sum+i;i+; while(i=100) ;printf(“%d“, sum) ; ,真,假,i=1;,sum=sum+i; i+;,i=100,例 6.3,while和do-while循环的比较,(1) void main( ) int sum=0,i ; scanf(“%d”, ,运行情况如下: 输入: 1 输出: sum=55 再运行一次: 输入: 11 输出: sum=0,(2) void main( )int sum=0, i ;scanf(“%d”,运行情况如下: 输入:1 输出:sum=55 再运行一次: 输入: 11 输出: sum=11
7、,例 6.4,for 语句既可用于循环次数已经确定的情况,也可用于只有 循环结束条件的情况。,一般形式: for (表达式1; 表达式2; 表达式3)语句,当“语句“部分包含一个以上的语句时,应该用复合语句“ “的形式,执行过程: 1. 求解表达式1;2. 求解表达式2: 如果值为真(非0), 则执行“语句”部分;如果值为假( 0 ), 则结束循环;3. 当表达式2为真时, 在执行了“语句”部分后, 求解表达式3;4. 转到第2步继续执行.,6.5 for 语句,for 语句最常用的形式:for (循环变量赋初值 ; 循环结束条件 ; 循环变量增值) 语句,求解表达式1,表达式2,表达式 1,
8、语句,求解表达式3,求解表达式3,for语句的 下一条语句,void main( ) int i, sum=0;for (i=1; i=100; i+)sum=sum+i ;printf(“%d“,sum) ; ,例如:用 for 语句构成循环, 求1+2+3+.+100。,i = ?,求解,for语句的 下一条语句,其中 i 为循环变量.,真,假,for 循环语句也可以写为while 语句形式:表达式 1 ; while( 表达式 2 ) 语句 ;表达式 3 ; 例如: for(i=1 ; i=100 ; i+)sum=sum+i ;,i=1 ; while(i=100) sum=sum+i
9、 ;i+ ;,相当于:,1. 当循环变量在 for 语句之前已经赋初值, 那么for 语句 的一般形 式中的“表达式1”,可以省略,但是“;”不能省略。例如:i=1 ;for( ; i=100 ; i+)sum+=i ;,注意以下几点,2. 如果“表达式2”省略,那么循环无法终止(死循环)。for( i=1 ; ; i+) sum+=i ;,3. 如果“表达式3”省略,那么程序中必须要有保证循环能正常结束的语句。for( i=1 ; i=100 ; ) sum+=i ;i+ ;,4. 如果三个表达式都省略,那么循环无法终止(死循环)。for( ; ;),5. “表达式1”既可以是设置循环变量初
10、值,也可以是其它表达式i=1;for(sum=0 ; i=100 ; i+)sum=sum+i ;“表达式1”和“表达式3”可以是一个简单的表达式,也可以是逗号表达式例如: 求 1+2+3+4+100。for (i=1 , j=100 ; i=j ; i+, j- -)k+=i+j;,两个分号不能省略,6. “表达式2”一般是关系表达式或逻辑表达式,但也可以是数值表达式 和字符 表达式,只要其值为非0,就执行循环体。例如: for( ; (c=getchar( ) )!=n; )putchar(c) ; 7. 由于 for 语句功能很强,尽量按 for 语句的规范来写,也尽量不要把与循环控制无
11、关的内容放到 for 语句中。,当一个循环体内又包含另一个完整的循环结构时,就是循环的嵌套循环嵌套可以多于一层,即多层循环嵌套。三种循环( while循环、do-while循环、和for循环)可以互相嵌套,6.6 循环的嵌套,(1). while( ) do for( ; ;) : : while( ) do for( ; ;) : : : : : while( ) ; while( ) ; (2). while( ) do( ) for( ; ;) : : :do for(;) while( ) while( ); . : : : ,共有四种循环结构( if 与 goto , while ,
12、 do-while , for )1. 四种循环都可以处理同一问题,一般情况下可以互换,但是尽量不用 goto型。2. while 和 do-while 循环,在while后面只指定循环的条件,而使循环趋于结束的语句包含在循环体中。而for 循环可以在“表达式3”中包含使循环趋于结束的操作。3. 用while 和 do-while循环时,循环变量初始化应在 while 和 do-while之前 ;而for 循环可以在“表达式1”中实现循环变量的初始化。,6.7 几种循环的比较,4. while循环:先判断后执行;do-while循环:先执行后判断;for循环:先判断后执行。5. 对 while
13、循环、do-while循环、for循环,用 break 语句跳出循环,可以用 continue 语句结束本次循环。,void main( ) int i,sum=0;i=1; loop: if (i=100) sum=sum+i;i+;goto loop; printf(“%d“,sum); ,void main( ) int i,sum=0;i=1;while (i=100)sum=sum+i;i+;printf(“%d“,sum); ,void main( ) int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(“%d“,sum); ,g
14、oto 语句 构成的循环,while语句 构成的循环,do-while语句 构成的循环,void main( ) int i,sum=0;for (i=1;i=100;i+)sum=sum+i;printf(“%d“,sum); ,for 语句 构成的循环,例如:求 1+2+3+.+100 ?,break 语句除了可以用来跳出 switch 结构之外,还可以用来从循环体内跳出循环。 语句的一般形式:break ;,6.8 break语句和continue,语句的一般形式:continue ;作用: 结束本次循环。即跳过循环体中的 continue 之后的其它语句,接着进行下一 次 是否执行循环
15、的判断。,6.8.1 break 语句,break 语句只能用于循环语句和 switch 语句。,6.8.2 continue 语句,注意,输出 100-200 之间的不能被 3 整除的数。,break语句和continue语句的区别:,(1). break语句结束整个最内层循环,不再进行条件判断。,(2). continue语句只结束本次循环,,直接进行是否执行下一次循环的判断。,#include void main( ) int n;for (n=100 ; n=200 ; n+)if (n%3=0)continue; printf(“%d,“,n); ,结束本次循环,输出: 102,10
16、5,108198,例 6.5,#include void main( ) int n ;for( n=100 ; n=200 ; n+) if(n%3=0)break ;printf(“%d,”,n) ; ,例 6.5如写为:,只输出100,101。因为102%3= =0,则break 跳出循环。 不是题意。,跳出整个循环,#include “math.h“ void main( ) int s;float n,t,pi;t=1; n=1;s=1; pi=0;while ( fabs(t)=1.0e-4 ) pi=pi+t;n=n+2; s = -s ;t=s / n;pi=pi*4;prin
17、tf(“%fn“,pi); ,否,是,用公式 /41-1/3+1/5-1/7+. 求的近似值。 直到最后一项的绝对值 10-4 。,6.9 程序举例,n 定义为 float 型 ,是为了 s / n 的结果是实型,n :表示分母 s :表示符号 t :表示每一项 pi :表示级数和,| t | =10-4,pi=pi*4,例 6.6,说明:,求 Fibonacci 数列: 1, 1, 2, 3, 5, 8,. 的前40个数。F1=1 (n=1)F2=1 (n=2)Fn=Fn-1 + Fn-2 (n=3),i=40,否,是,i=1,void main( ) long int f1,f2,f3;i
18、nt i; f1=1; f2=1;printf(“%12ld%12ld“,f1,f2);for (i=3; i=40; i+) f3=f2+f1;printf(“%12ld“,f3);if (i%4=0)printf(“n“);f1=f2;f2=f3; ,置初值 f1=1; f2=1;,f3=f2+f1,输出 f 3,i=i+1,结束,例 6.7,判断一个数是否为素数 ( 只能被 1 和 自身 整除的数)。对于一个数 m , 当 m 不能被 2 m 之中的任一整数整除时,m 是素数。,#include “math.h“ void main( ) int m,i,k;scanf(“%d“, ,注
19、意: 循环正常结束时 i 的值是 k+1,例 6.8,在1973年美国学者I.Nassi B.Shneiderman提出了一种新的 流程图,称为 N-S流程图,用于取消“流程线”。,A,B,(2)选择结构,P,A,B,是,否,(3)循环结构,当 p 成立,A,A,直到 p不成立,(1)顺序结构,N-S 流程图小结,例如:求1+2+3+4+5+6+7+8+9+10,i=1,i=10 ( p),sum=sum+i ;i+ ;,while,do-while,sum=sum+i ;i+ ;,i=1 ;,直到 i1,1. 有几种循环结构,其形式和语义是什么?2. 这几种循环结构语句有什么区别?3. br
20、eak 语句和 continue 语句语义有什么区别?4. 如何跳出整个循环或终止当前循环?5. 如何计算循环执行次数。特别要注意死循环。,本 章 要 点,第 二 次 上 机,1。输入并运行以下程序。main( ) int i , j , m , n ;i=8 ; j=9 ;m=+i;n=j+ ;printf(“%d,%d,%d,%dn”, i , j , m , n) ;分别作以下修改并运行:(1) m=i+ ; n=+j ; (4) 程序改为:(2) 程序改为: main( )main( ) int i , j , m=0 , n=0 ; int i , j ; i=8 ; j=10 ;i
21、=8 ; j=9 ; m+=i+ ;printf(“% d,% d”, i+ , j+) ; n - = - -j ; printf(“i=% d,j=% dn”, i,j); (3) 在(2) 中修改: printf(“m=%d,n=%d”,m,n); printf(“% d,% d”, +i , +j) ; ,2。P84 4.4 3。p85 4.8 用 scanf( ) 输入:r=1.5, h=3 ; 用 printf( )输出,保留小数点后两位数字。 4。p105 5.5,测 验 二 1. 写出下列程序的运行结果。main( ) int x, y, z ;x=y=1 ;while(y2; x+, y/=10)printf(“x=%d y=%dn”, x,y) ;,2. 写出以下函数关系的语句段,并画出相应的 N-S 流程图。-1 (x0)3. 用三种循环语句编写程序计算e (n,x 输入)e =1+ x +x /2!+x /3!+.+x /n!,x,x,2 3 n,