第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 <stdio.h>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 <stdio.h>#include <stdio.h>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 <stdio.h>#include<stdio.h>int 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 <stdio.h>#include<stdio.h>int main(void)int main(void)tint i;(int i:for(i=0;i<10;i+2)for(i=0;i<100;i++)printf("%d,",i);(if(i%2)return O;continue;美printf("gd,",i);1return 0;C.D.#include <stdio.h>#include<stdio.h>int main(void)int main(void)(int i;int i;for(i=0;;i++)1=0;[if(1%2)while(i<100)continue;(if(1(i82))printf("d,",i);continue;1elsei++;return O;c1printf("%d,",i);语1言return O;程序3.以下程序中不能求得10!的是设0计AB.训#include <stdio.h>#include <stdio.h>练int main(void)int main(void)教(long p=l;(longp=l;程42
int i;int i;for(i=l;i<=lo;i++)for(i=l;i<=lo;i++)p=i*(i+1);p=p*i;printf("p=&ldln",p);printf("p=%ldln",p);return O;return O;1YC.D.#include <stdio.h>#include<stdio.h>int 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;i<j;i++,j--(p=p*i;P=p*i*j:i--;printf("p=$ldln",p);1return O;1printf("p=ldin",p);return o;4.若有以下程序:#include<stdio.h>int main(void){int i,j,m=o;for(i=l;i<=15;i+=4)for(j=3;j<=19;j+=4)m++;printf("gdin",m):return ;则程序的输出结果是L0A. 12B. 15C.20D.255.若有以下程序:第5#include <stdio.h>章int main(void)(int x=3;循do环printf("%d",x-=2);结while(!(--x));构程return ;库1设则程序的输出结果是0计43