
第5章循环结构程序设计第一单元重点与难点解析1.除了while语句、do-while语句和for语句之外,还有什么语句可以构造循环?利用if语句与goto语句结合,也可以实现循环程序结构,但一般不会采用这种方式。2.循环条件可以是任意类型的表达式吗?不是的。循环条件除了可以是关系表达式或逻辑表达式之外,还可以是整型、实型字符型、枚举型和指针型的表达式。而且,只要表达式的值非0,就看作真;只要表达式的值为0,就看作假。3.循环体只能是单条语句吗?是的,循环体只能是语法意义上的单条语句。若循环体超过一条语句,则必须用花括号括起来,从而构成一条复合语句。4.为什么在累加(累乘)表达式中,累加(累乘)变量必须同时出现在赋值运算符的两侧?因为累积运算的特点是,累积变量的新值(赋值运算符左边的变量)是在其原有值(赋值运算符右边的相同变量)的基础上,通过加上或乘以另一个变量的值而求得的。故赋值运算符的右侧必须引用该变量的原有值。5.i++;与++i有区别吗?没有区别。当前自增(减)与后自增(减)单独作为一个表达式时,是没有区别的;只有当其作为另一个表达式的一部分时,才有区别。例如,语句计+:与语句++i:是完全等价的,而表达式j-i++与表达式j=++i则完全不同。6.若有inti-3,j:j=++i+++i+++i,,则变量j的值是多少呢?#include intmain(finti,j;i=3;printf("%dn",j=++i + ++i);1=3;printf("sdin",j=++i + ++i + ++i);i=3;printf("odin",j=(++i + ++i)+ ++i);i=3;printf("%dln",j=++i +(++i + ++i));return 0;当i-3时,在Dev-C++5.11中分别输出表达式j=++i+++i,j=++i+++i+++i,j=(++i

+++i)+++i和j=++i+(++i+++i)的值,结果分别是10,16,16和18。而当i=3时,在VisualC++2010中分别输出表达式j=++i+++i,j=++i+++i+++i,j=(++i+++i)+++i和j=++i+(++i+++i)的值,结果分别是10,18,18和18。可见,表达式的求值顺序并没有一个很明显的规则。因此,应当尽量避免在同一个表达式中多次对同一个变量进行赋值(或自增、自减)运算。7.若有inti=3,j:j-i+++i+++i++;,则变量j的值是多少呢?#includestdio.hyintmain()(int i,j;i=3;printf("%dln",j=i++ +i++);i=3;printf("sdin",j=i++ + i++ + i++);1=3;printf("8din",j=(i++ + i++)+ i++);i=3;printf("odln",j=i++ + (i++ + i++));return o;当1=3时,在Dev-C++5.11中分别输出表达式=+++i++,=i++i++计+,=(i+++i++)+i++和j=i+++(i+++i++)的值,结果分别是7,12,12和12。而当i=3时,在VisualC++2010中分别输出表达式j-i+++i++,j-i+++i+++i++,j=(i+++i++)+i++和j-i+++(i+++i++)的值,结果分别是6,9,9和9。可见,当在不同的编译器中运行时,同一个表达式的求值顺序是不一样的。因此,应当尽量避免在同一个表达式中多次对同一个变量进行赋值(或自增、自减)运算。8.在for语句中,当循环条件缺省时,看作循环条件为真还是为假?循环条件缺省,也就是没有循环条件,相当于循环条件永远满足,即永远为真9.for循环与while循环可以完全互换吗?是的。从功能上来说,for循环与while循环是完全等价的,只是表现形式不同而已。10.do-while循环与while循环可以完全互换吗?不能。do-while循环先执行一次循环体,再判断循环条件是真是假,故只适用于循环体至少执行一次的循环。因而,do-while循环与while循环不能完全互换。c11.什么情况下适于采用while循环或for循环?康如果一个循环的循环条件中所引用的变量,在第一次执行循环体之前已完成赋值,那言么这个循环就适于采用while循环或for循环结构实现。其实,从功能上来说,for循环与程while循环是完全等价的,只不过for循环更简洁,while循环更直观。序一般而言,如果循环变量赋初值的表达式、循环条件表达式、递变循环变量值的表达设计式比较简洁,则适合采用for循环;反之,则适合采用while循环。此外,在构成多重循环刘时,采用for循环的程序结构比采用while循环相对清晰一些。练12.什么情况下适于采用do-while循环?教一般而言,如果一个循环的循环条件所引用的变量中,某个变量的第一次赋值是在循程40

环体中完成的,那么这个循环就适于采用do-while循环结构实现。13.什么情况下适于采用while(1)形式的循环?在构造循环时,对循环条件进行判断的时机是至关重要的。一方面,要保证先给循环控制变量赋值,后判断循环条件;另一方面,还要保证先判断循环条件,后进行相应处理。当采用其他形式的循环难以满足上述要求时,可以采用while(1)形式的循环。在这种循环中,其循环条件永远为真,因此从形式上看其是一个无限循环。不过,可以在它的循环体中借助有条件的break语句,在合适的时机结束循环,从而变成一个有限循环。14.能不能用break语句从内层循环中直接跳出多层循环?不能。break语句只能跳出本层的循环体或switch语句。若需要从内层循环中直接跳出多层循环,可以使用goto语句实现。15.逗号表达式i=3,i++,i+2,*5的值为什么不是30?按照逗号表达式的求值步骤,依次执行=3与i++,此时i的值为4;再执行+2,i的值不变,因为并没有对变量i进行赋值;因而最后求得i*5的值为20。可见,在逗号表达式中,除了最后一个表达式之外,如果在前面的表达式中没有对变量进行赋值,那么这个表达式实际上不起作用。题第二单元习一、判断题1.循环体为空语句的循环一定是死循环。2.从语法意义上来说,循环体只能是单条语句。(03.语句i++:与++i:的功能是完全相同的。(O4.for语句与while语句是可以完全互换的。(5前自增运算与后自增运算的优先级是相同的。()6.循环的条件只能是关系表达式或逻辑表达式。(7.break语句能改变循环的次数,而continue语句不改变循环的次数。()二、选择题1.以下循环中不是死循环的是A.B.第#include #include 5章int main(void)int main(void)tint i;int i;循1=0;for(i=0;i<10;i++);环(while(i<l0)printf("gd,",i);结printf("gd,",i);return 0;构i++;程1序return o;设计I41

C.D.#include #includeint main(void)intmain(void)(short int i;funsigned short i;for(i=0;i>=0;i++)for(i=0;i>=0;i++)printf("%hd,",i);printf("%hu,",i);printf("\nghdin",i);printf("\nghu\n",i);return O;return o;12.以下循环中不是死循环的是0AB.#inalude #includeint main(void)int main(void)tint i;(int i:for(i=0;i#includeint main(void)int main(void)(int i;int i;for(i=0;;i++)1=0;[if(1%2)while(i#include 练int main(void)int main(void)教(long p=l;(longp=l;程42

int i;int i;for(i=l;i#includeint main(void)int main(void)(long p=l;(long p=l;int i=10;int i,j;while(i>=2)for(i=1,j=l0;iint main(void){int i,j,m=o;for(i=l;i章int main(void)(int x=3;循do环printf("%d",x-=2);结while(!(--x));构程return ;库1设则程序的输出结果是0计43

A. 1B. 1 -2C.30D.死循环6.若有以下程序:#includeint main (void){int x,i;for(i=1;iint main (void)(int i,j;for(i=3;i>=l;i--)(for(j=l;j语int main(void)言程(char b,c;序int i;设b='al;计C-"AN:训for(i=0;i<6;i++)练(if (i%2)教putchar(b+i);程44

elseputchar(c+i);1return O;则程序的输出结果是A.abcdefB.ABCDEFC.aBcDeFD.AbCdEf三、填空题1.循环条件可以是枚举型和指针型的表时,达式。而且,当表达式的值为时,看作真;当表达式的值为看作假。,a的值为2.若有inta=6;,则执行语句b=-a++;之后b的值为3.表达式a=3a++,++a,a+3,a*5的值为4.若有inta=6,b=16;,则执行b-=a+3;之后b的值为5.在for语句中,当循环条件表达式缺省时,可看作循环条件永远为6.do-while循环的循环体最少执行次。四、读程序写结果1.#includeint main(void)(int i,j;for(i=0,j=0;i环int main (void)结(int i,j;构程(for(i=0;i<2:i++)序【for(j=0:j<3;j++)设printf("d,edin",i,j);计145

printf("*****ln");1return O;4.#include int main(void)(int i,k,j;for(i=l;iint main(void)(int x,max,i;printf("请输人20个整数:In");for(i=l;imax)max=x;1printf("最大数=%d\n",max);return 0;2.程序功能:判断正整数m是否为素数c#include 语int main(void)言{int m,i;程printf("请输人一个大于1的正整数:")序设scanf("d",&m);计for(i=2;i<m;i++)训(if(mi==0)练printf("%d不是素数\n",m);教1程46

printf("%d是素数\n",m);return O;3.程序功能:求斐波那契数列的前30项。该数列的变化规律是:前两项都是1,从第三项开始的每一项等于其前面两项之和(限定不能增加变量定义)。#includeint main(void)(long fl,f2;int i;f1=l;f2=1;printf("gl6ldgl6ld",fl.f2)for(i=2:iint main(void)(longa;short r;printf("请输人一个正整数:");scanf("%ld",&a);printf("分离之后的结果:In")while((l))(r=(2);printf("gdn",r);an(3);第15章return O;2.程序功能:从键盘输入一个非最简分数,将其约分为最简分数。循环#include结int main(void)构inta,b,m,n,r;程printf("请以a/b的形式输人一个分数:"):库scanf("%d/%d",&a,&b);设m=(1);计47

n=(2);/*循环条件总为真*while(1)(3)(r=if(r==0)/*余数为0时终止循环*】break;(4)/*以上一次的除数作为新的被除数*/m=n=(5)/*以上一次的余数作为新的除数*1/*分子除以最大公约数*a=(6);b=(7)/*分子除以最大公约数*printf("约分之后的分数=%d/%dln",a,b);return 0;3.程序功能:求出100000以内的所有完数。如果一个正整数的真因子之和与其本身恰好相等,则称其为完数。#include int main (void)(int m,s,i;for(m=l:m#include int main(void)(charch;cint x=0;语double y;言printf("请输人一行字符:In"):程while((1)/*先赋值后判断*/!=n')序(if(ch>="0'&&ch<="9")设(2)/*ch-0将数字字符转化为对应整数*X=计刘(3)y=练printf("得到的整数=%dn其常用对数=%fin",x,y);教return 0;程48