1、第5章 循环结构程序设计 P114,5.1 为什么需要循环控制 5.2 用 while 语句实现循环 5.3 用do while 语句实现循环 5.4 用for 语句实现循环 5.5 循环的嵌套 5.6 几种循环的比较 5.7 改变循环执行状态 5.8 循环程序举例 习题,5.1 为什么需要循环控制 P114,在实际问题中, 经常会遇到许多具有规律性的重复运算, 因此在程序中就需要将某些语句重复执行。 循环语句由两部分组成的:循环条件和循环体。 循环条件: 决定循环体中的语句是否执行的条件。 循环体: 一组被重复执行的语句。,*用循环算法来求 5! P18,可以设两个变量,一个变量p表示结果其
2、初值为1(被乘数),一个变量i代表乘数。 S1: 使 p=1 (p称为乘法器,其初值为1) S2: 使 i=2 (生成乘数,生成正整数) S3: 使 pi,乘积仍放在变量p中, 可表示为 pi=p S4: 使i的值加1,即i+1 = i (i 同时也是控制变量) S5: 如果i不大于5,返回重新执行步骤S3以及其后的步骤S4和S5;否则,算法结束。 最后得到p的值就是 5! 的值。,实现循环的方法:,(1) 用while()语句; (2) 用dowhile()语句; (3) 用for语句。 在下面各节中将分别作介绍。,5.2 while语句 P115,while语句用来实现“当型”循环结构。
3、其一般形式如下: while (表达式) 语句 执行过程: 计算表达式的值 若表达式非0, 则执行语句, 然后转 若表达式为0, 则退出循环, 执行该循环后的语句。 其流程图见图5.2。 特点:先判断表达式,后执行语句。,图 5.2,图5.3,例5.1 求n。P115 用传统流程图和NS结构流程图表示算法, 见图5.3(a)和图5.3(b)。,100 n=1,根据流程图写出程序: #include int main( ) int i=1,sum=0; while (i100”,因此在循环体中应该有使i增值以最终导致i100的语句,今用“i+;”语句来达到此目的。 如果无此语句,则i的值始终不改
4、变,循环永不结束。,5.3 do while( ) 语句 P117,一般形式为: do 循环体语句 while (表达式); 执行过程: 执行循环体 计算表达式值 若表达式的值为真(非0), 则转 若表达式的值为假(0), 则结束循环 可以用图表示其流程。 请注意do while循环用NS流程图的表示形式。 特点:是先执行循环体,然后判断循环条件是否成立。,图5.4,例5.3用do while( )语句求n。 先画出流程图,见图5.5。,图5.5,图5.6,100 n=1,程序如下: #include void main( ) int i,sum=0; i=1; do sum=sum+i; i
5、+; while (i10时,二者结果就不同了。,5.4 * for 语 句 P120,C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。,for语句的一般形式: for(表达式1;表达式2;表达式3) 语句 执行过程: 先求解表达式1。 求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。 (3) 求解表达式3。 (4) 转回上面第(2)步骤继续执行。 (5) 循环结束,执行for语句下面的一个语句。
6、,for语句的执行过程,可以用图5.8来表示for语句的执行过程。,图5.8,for语句一般的应用形式,for ( 循环变量赋初值;循环条件;循环变量增值) 语句 例如: int sum=0; for( i=1; i=100 ; i+) sum=sum+i ; 可以看到它相于以下while语句: int sum=0; i=1; while (i=100) sum=sum+i; i+; ,说明:P121,(1)对于以上for语句的一般形式 for ( 循环变量赋初值;循环条件;循环变量增值) 语句 也可以改写为while循环的形式: 表达式1; while (表达式2) 语句 表达式3; ,(2
7、)for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。 注意:省略表达式1时, 其后的分号不能省略。 如 : sum=0; i=1; for( ;i=100 ; i+ ) sum=sum+i; 执行时,跳过“求解表达式1”这一步,其他不变。,(3) 如果表达式2省略,即不判断循环条件, 循环无终止地进行下去。 也就是认为表达式2始终为真。 例如: sum=0; for ( i=1 ; ; i+) sum= sum + i; 表达式1是一个赋值表达式,表达式2空缺。 它相当于: sum=0; i=1; while (1) sum=sum+i; i+; ,图5.9
8、,(4) 表达式3也可以省略,此时程序设计者应另外增加语句,以便保证循环能正常结束。 如: sum=0; for (i=1; i=100; ) sum=sum+i; i+; (5)可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如: sum=0; i=1; sum=0; i=1; for( ; i=100; ) while(i=100) sum=sum+i; 相当于 sum=sum+i; i+; i+; 在这种情况下,完全等同于while语句。 但for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。,(6)*三个表达式都可省略。 如: for
9、( ; ; ) 语句 相当于: while (1) 语句 即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。 无终止地执行循环体。,(7) 表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。 如: i=1; for (sum=0; i=100; i+) sum=sum+i; 表达式3也可以是与循环控制无关的任意表达式。 (8)表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。 例: for(sum=0,i=1; i=100; i+) sum=sum+i;,(9) 表达式2一般是关系表达式 ( 如
10、i=100 ) 或逻辑表达式 ( 如ab ,分析下面两个例子: for( i=0 ;(c=getchar()!=n ; i+=c ); 在表达式2中先从终端接收一个字符赋给c,然后判断此赋值表达式的值是否不等于n(换行符),如果不等于n,就执行循环体。 它的作用是不断输入字符,将它们的ASCII码相加,直到输入一个“换行”符为止。 注意:此for语句的循环体为空语句,把本来要在循环体内处理的内容放在表达式3中,作用是一样的。, for( ; (c=getchar( )!=n; ) printf(%c,c); 只有表达式2,而无表达式1和表达式3。 其作用是每读入一个字符后立即输出该字符,直到输
11、入一个“换行”为止。 *请注意: 从终端键盘向计算机输入时,是在按Enter键以后才送到内存缓冲区中去的。 运行情况: computer (输入) computer (输出) 而不是 ccoommppuutteerr,强调:,运行情况: computer (输入) computer (输出) 而不是 ccoommppuutteerr 即不是从终端敲入一个字符马上输出一个字符,而是按Enter键后数据送入内存缓冲区,然后每次从缓冲区读一个字符,再输出该字符。,强调 P124,(10) C99 允许在 for 语句的 表达式1中定义变量并赋初值。 例如: for ( int i=1; i100时,
12、执行break语句,提前结束循环,即不再继续执行其余的几次循环。,5.7.2 continue语句 P127,一般形式: continue; 作用: 为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。 continue语句和break语句的区别是: continue语句只结束本次循环,而不是终止整个循环的执行。 break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。,如果有以下两个循环结构: (1) while (表达式1) 语句组1 if (表达式2) break; 语句组2 (2) while (表达式1) 语句组1 if (表达式2) co
13、ntinue; 语句组2 ,图5.13,图5.14,程序(1)的流程图如图5.13所示,而程序(2)的流程如图5.14所示。注意: 图5.13 和 图5.14 中当“表达式2”为真时流程的转向。,例5.5 P127,把100200之间的不能被3整除的数输出。 #include int main( ) int n; for ( n=100; n 1e-6 ) pi=pi+t; n=n+2; s=-s; t=S/n; pi=pi*4; printf( “pi=%10.6fn,pi); return(0); /*运行结果为: pi= 3.141594 */,例5.8 求 fibonacci 数列 4
14、0个数。 P133 这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即: f1=1 (n=1) f2=1 (n=2) fn=fn-1+fn-2 (n3) 这是一个有趣的古典数学问题: 有一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。 假设所有兔子都不死,问每个月的兔子总数为多少?解此题的算法如图5.16所示。,图5.16,程序如下: #include int main( ) long int f1,f2; int i; f1=1;f2=1; for(i=1; i=a 运行结果如下: China! Glmre!,备用,
15、练习:分析下列程序段写出结果 int n=0; while (n=1) n+; printf(“%dt”,n); ,运行结果: 1 2 说明: 留心“边界值”, int n=0; while ( n+c) j+; do k+; while(ad+); printf(“%d,%d,%dn”,i,j,k); printf(“%d,%d,%dn”,b,c,d);,运行结果: 5,4,6 10,10,11 程序说明: while、 for和do-while 三种循环的比较。,summarize,练习:看程序写结果 #include void main() int i ,j; for( i =1;i3) break; printf(“%d,%dn”,i,j); j+; printf(“this time j is:%dn”,j); ,运行结果: 1,1 1,2 this time j is:3 2,1 this time j is:2 this time j is:1 ?问题: 若把 break改为 continue结果将如何 要点: 循环结构的嵌套 break与continue 的区别,R,应用举例,