五、循环结构程序设计本章概述:以笔试和上机两种形式考核。
笔试中,多出现在选择题第20-23题。
填空题第8、9题。
分值约占12%。
上机中,三种题型中均有体现,抽中几率约为37%。
考生要熟练掌握。
大纲要求:1.for循环结构。
2.while和do-while循环结构。
3.continue语句和break语句。
4.循环的嵌套。
重点难点:1.for循环结构。
2.continue语句和break语句。
3.循环的嵌套。
考点分析:while 语句while 语句一般形式:while (条件表达式){循环体}while 语句执行过程:先判断条件是否成立,只要条件成立则一直执行循环体语句,直到条件不成立则结束循环,结束while语句。
说明:(1)while语句的特点是先判断,再执行。
因此,若条件表达式的值一开始就为“假”,那么循环体一次也不执行。
(2)当循环体为多个语句组成,必须用{}括起来,形成复合语句。
(3)在循环体中应有使循环趋于结束的语句,以避免“死循环”的发生。
试题解析1.要求通过while循环不断读入字符,当读入字母N时结束循环。
若变量已正确定义,以下正确的程序段是(A)A)while((ch=getchar())!=′N′)printf("%c",ch);B)while(ch=getchar()!=′N′)printf("%c",ch);C)while(ch=getchar()==′N′)printf("%c",ch);D)while((ch=getchar())==′N′)printf("%c",ch);解析:while语句的功能是:计算表达式的值,如为真,则执行循环体语句,执行完毕后,再计算表达式的值,若仍为真,则重复执行循环体语句。
直到表达式的值为假时,结束循环。
ch=getchar()应加一个括号,表示输入字符的函数。
2.利用while语句,计算1+1/2+1/4+…+1/50的值,并显示出来。
#include“stdio.h”main(){float sum=1;int i=2;while (i<=50){sum +=1/(float) i;i+=2;}printf("sum=%f",sum);}运行结果:sum=2.907979解析:在此程序中,在循环体中进行累加计算时,必须要对变量i进行强制类型转换,即利用(float)i使其变为浮点型中间变量后再参加运算,否则,由于i中存放的是大于1的整型量,所以,1/i将按整型规则运算,其结果总是为0。
do-while 语句do{循环体}while(条件表达式);do-while语句执行过程:先执行循环体,之后判断条件,条件为真,则重复执行循环体,再判断条件,直到条件为假为止,该do-while语句结束。
【特别提醒】:(1)do是C语言的关键字,必须与While联合使用。
do-while循环由do开始,用while 结束。
注意:在while(表达式)后的“;”不可丢,它表示do-while语句的结束。
(2)do-while总是先执行一次循环体,再求表达式的值,因此,无论表达式的值是真或假,循环体至少要被执行一次。
(3)和while循环一样,在do-while循环体中,一定要有能使while后表达式的值变为0的操作,否则,循环将会无限制的进行下去。
do while、while 语句区别:(1)do while:先执行,再判断,循环体至少执行一次。
(2)While:先判断,再执行,循环体至少执行0次。
试题解析1.while和do-while循环的比较main() main(){ {int sum=0,i; int sum=0,i;scanf("%d",&i); scanf("%d",&i);while(i<=10) do{ {sum=sum+i; sum=sum+i;i++; i++;} }while(i<=10);printf("sum=%d\n",sum); printf("sum=%d\n",sum);} }解析:本例左半部分用while循环求i到10的连加和,i的值由用户输入。
右半部分用do-while循环实现相同的功能。
当输入i的值小于或等于10时,二者得到的结果相同。
例如,当输入的i=1时,用while结构和do-while结构得到的结果是都是55;而当输入的i的值大于10时,二者得到的结果就不同了。
例如,当输入的i=15时,用while结构得到的结果是0;而用do-while结构得到的结果是15。
这是因为此时对while循环来说,一次也不执行循环体,而对do-while循环来说,则要执行一次循环体。
由此可以得到结论:当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。
否则,两者结果。
for 语句for(变量初始化表达式;条件表达式;变量变化表达式){循环体}// 变量初始化表达式一般用来设置变量的初始值.//条件表达式是控制循环次数的,只有当条件成立时,循环才进行。
//变量变化表达式控制每次循环后变量的变化。
for 语句执行过程:(1) 当进入for循环时,首先执行变量初始化表达式,接着就判断条件,如条件不成立,则循环一次也不会执行。
(2) 如条件成立,则执行循环的语句,循环语句可以是单个语句,也可以是复合语句。
(3) 变量变化表达式在循环体语句执行完成后执行,之后回到(2)。
说明:(1)for语句一般形式中的“变量初始化表达式”可以省略,此时应在for语句之间前给循环变量赋初值。
(2)如果“条件表达式”省略,即不判断循环条件,循环将无终止地进行下去(3)“变量变化表达式”也可以省略,但此时程序设计者应另外设法保证循环能正常结束。
【特别提醒】:几种循环的比较(1)一般来说,do与while循环常用于预先不确定循环次数的循环中,而for循环更适合用于预先确定循环次数的循环中。
//例如计算n个(或指定个数)数的平均成绩、阶乘等。
(2)For 语句的循环体至少执行0次,可改写为相应的 while 语句(注意不可改写为do while 语句)试题解析1.For语句可以省略其他表达式,只给循环条件。
如:for( ;i<=10;) while(i<=10){ {fac=fac*i; 相当于: fac=fac*i;i++; i++;} }解析:在这种情况下,完全等同于while语句。
可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。
2.以下程序的输出结果是【11】。
main(){ int s,i;for(s=0,i=1;i<3;i++,s+=i);printf("%d\n",s);}解析:此程序中,for循环语句后面直接跟了一个“;”,表明循环体为空。
输出语句不在for循环体内,所以在循环执行完毕后才输出s的值。
s、i的初值分别为0和1,判断循环条件,表达式“1<3”成立,执行“i++,s+=i”后,i和s的值分别为2和1,继续判断循环条件,表达式“2<3”成立,执行“i++,s+=i”后,i和s的值分别为3,再次判断循环条件,表达式“3<3”不成立,循环结束。
3.用for循环计算1~100的累加和。
void main(){int i, sum = 0; // i是循环控制变量,sum保存累加和for (i = 1; i <= 100; i++)sum = sum + i;printf("1~100的累加和为:%d" ,sum);}解析:for循环连同循环体构成一个作用域,for循环内定义的变量仅仅在for循环内具有可见性。
上例也可写成如下形式:void main(){int i, sum = 0; // i是循环控制变量,sum保存累加和for (i = 1; i <= 100; i++)sum = sum + i;printf("1~100的累加和为:%d\n" ,sum);printf("%d\n" ,i); //在for语句外i不可见}上例中把声明循环控制变量i的语句放在for循环内,这样i在循环外不可见。
如果删除最后一行的注释符,将产生无法解析变量i的错误。
循环的嵌套这就是循环的嵌套。
三种循环(while循环、do-while循环和for循环)可以相互嵌套。
【特别提醒】:循环嵌套的层数并没有限制,但层数过多会使可读性变差,一般嵌套层数不宜超过3层。
试题解析1.用for循环与while循环求100以内的所有素数。
素数是除了1和自身外,不能被其它数整除的数。
本程序使用外层循环控制变量从2~100变化,内层循环则检验外层循环控制变量是否为素数。
void main( ){for (int i = 2; i <= 100; i++){boolean sushu = true; // 假设i为素数int j = 2;// 如果2~i/2之间有能够整数i的数,i就不是素数while ((j <= i / 2) && sushu) {if (i % j == 0)sushu = false;j++;}//如果sushu的值保持为true, 说明i%j==0一直不成立,因此,i是素数if (sushu) printf(“%d\n”,i);}}程序的运行后的输出为:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97解析:循环语句的循环体也可以是循环,这样就构成了多重循环。
多重循环既可以是语句自身的循环,也可以是这些语句的复合。
break、continue语句break ;break语句作用:终止对switch语句或循环语句的执行,即跳出这两种语句,而转入这两种语句的下一语句执行。
说明:(1)break语句只能用于循环语句或switch语句中。
(2)在循环语句嵌套使用的情况下,break语句只能跳出(或终止)它所在层的循环,而不能同时跳出(或终止)多层循环,如:for(…){for(…){…break;}}上述的break语句只能从内层的for循环体中跳到外层的for循环体中,而不能同时跳出两层循环体。
continue语句一般形式:continue;continue语句作用:再循环语句内,结束本次循环,即跳过本层循环体中余下尚未执行的语句,接着再一次进行本层循环的条件判定。