main () {
int n=50; /*循环变量初始化。*/
while(n<=100) /*先判断条件,再决定执行与否*/ { if(n%3!=0) printf(\ n++; } }
【例6-10】用do-while语句实现 #include\main () {
int n=50; /*循环变量初始化。*/
do /*先执行一次循环体,再判断条件,决定是否继续执行循环体*/ { if(n%3!=0) printf(\ n++;
}while(n<=100); }
【例6-11】用for语句实现 #include\main () {
int n;
/*循环变量初始化、条件判断、循环变量自增在一条语句中实现。*/ for(n=50;n<=100;n++) { if(n%3!=0) printf(\ } }
【例6-12】用if和goto语句构成的循环实现 #include\main () {
int n=50; loop: if(n%3!=0) printf(\ n++;
if(n<=100) goto loop; /*非结构化程序设计方法,不提倡。*/
11
}
从【例6-9】到【例6-12】这几个例子可以看出,处理同一问题可以使用不同形式的循环,相较而言for循环的功能更强大一些。goto型循环不符合结构化设计原则,可读性较差,一般不宜采用。
6.6 break和continue语句
6.6.1 break语句
前面已经介绍了C语言的三种循环语句,这三种循环语句都是在执行循环体之前或之后通过对一个表达式的测试来决定是否中止对循环体的执行。另外,在循环体中,也可以通过使用break语句来立即终止循环的执行,而转到循环结构的下一语句处执行。
break语句的一般形式如下所示: break ;
其执行过程是:终止对switch语句或循环语句的执行,即跳出这两种语句,而转入下一语句执行。
使用break语句应注意如下几个问题: (1) break语句只能用于循环语句或switch语句中。如果在程序中有下列语句: if(?) break;
则此时的if语句一定位于循环体中或switch语句中,break语句跳出的也不是if语句,而是跳出包含此if语句的循环体或switch语句。
(2)由于循环语句的循环体部分还可以使用循环语句,这样,循环语句就可以嵌套使用。在循环语句嵌套使用的情况下,break语句只能跳出(或终止)它所在的循环,而不能同时跳出(或终止)多层循环,如: for(?) {
for(?) {?
break; } }
上述的break语句只能从内层的for循环体中跳到外层的for循环体中,而不能同时跳出两层循环体。
【例6-13】 从键盘上连续输入字符,并统计其中大写字母的个数,直到输入“换行”字符时结束。
#include\main () {
char ch; int sum=0; while(1) { ch=getchar();
12
if(ch=='\\n') break; /*跳出整个while循环结构*/ if(ch>='A'&&ch<='Z') sum++; }
printf(\}
说明:在本程序中,while(1)表示“无限循环”,即循环条件总为“真”,在这种情况下,就只能依靠循环体中的语句来结束循环了。由程序可知,当读入的字符是“换行”符(’\\n’)时,将执行break语句,这时,将终止循环体的执行。
【例6-14】 在循环体中break语句执行示例。 #include\main () {
int i,s=0;
for(i=1;i<=10;i++) { s=s+2; if(s>5) break; /*跳出整个for循环结构*/ printf(\ } }
程序运行结果: s=2 s=4
上例中,如果没有break语句,程序将进行10次循环;但当i=3时,s的值为6,if语句中的表达式:s>5的值为1,于是执行break语句,跳出for循环,从而提前终止循环。
6.6.2 continue语句
continue语句的一般形式为: continue;
其作用是结束本次循环,即跳过本层循环体中余下尚未执行的语句,接着再一次进行循环的条件判定。注意:执行continue语句并没有使整个循环终止。 在while和do-while循环中,continue语句使得流程直接跳到循环控制条件的测试部分,然后决定循环是否继续进行。在for循环中,遇到continue后,跳过循环体中余下的语句,而去对for语句中的“表达式3”求值,然后进行“表达式2”的条件测试,最后根据“表达式2”的值来决定for循环是否执行。在循环体内,不论continue是作为何种语句中的语句成分,都将按上述功能执行,这点与break有所不同。
【例6-15】 从键盘输入30个字符,并统计其中数字字符的个数。
#include\main () {
int sum=0,i;
13
char ch;
for(i=0;i<30;i++) { ch=getchar(); if(ch<'0'||ch>'9') continue; /*终止本轮循环,但未跳出循环结构*/ sum++; }
printf(\}
在本程序中,当读入的字符(在ch中)不是数字字符(‘0’~‘9’)时,将不执行sum++语句,而立即进行下一轮循环。
【例6-16】 在循环体中continue语句执行示例。
#include\main () {
int k=0,s=0,i; for(i=1;i<=5;i++) { s=s+i; if(s>5) { printf(\ continue; /*终止本轮循环,但未跳出循环结构*/ } k=k+s; printf(\ } }
程序运行结果: i=1,s=1,k=1 i=2,s=3,k=4 ***i=3,s=6,k=4 ***i=4,s=10,k=4 ***i=5,s=15,k=4
程序运行时,当i为1和2时,并不执行if之后的复合语句,仅执行k=k+s;和第2个输出语句;执行第三次循环时,s的值已是6,这时表达式s>5的值为1,因此执行if分支中的第1个输出语句和continue语句,并跳过k=k+s;语句和第2个输出语句;接着执行for后面括号中的i++,继续执行下一次循环。由输出结果可见,后面三次循环中k的值没有改变。
由以上几个例子可以看出,continue语句和break语句的主要区别是:continue语句只终止本次循环,而不是终止整个循环结构的执行;break语句则是结束循环,不再进行条件判断。如果有以下两个循环结构:
(1) while (表达式1) (2) while (表达式1) { ……; { ……;
14
if(表达式2) break; if(表达式2)continue; …… ; ……; } }
表达式1真假表达式1真假表达式2假真break表达式2假真continuewhile循环的下一语句图 6-10 break流程示意while循环的下一语句图 6-11 continue流程示意程序(1)的流程图如图6-10所示,而程序(2)的流程图如图6-11所示。请注意图中当“表达式2”为真时,流程的转向。
6.7 应用举例
【例6-17】从键盘输入一个大于2 的整数n,判断n是不是素数。 只能被1和它本身整除的数是素数。为了判断n是不是素数,可以让n除以2到n的平方根(sqrt(n))之间的每一个整数,如果n能被某个数整除,则说明n不是素数,否则,n一定是素数。程序的执行过程见图6-12。程序如下:
#include\
读入n#include\直到n>2m=sqrt(n) flag=0main ()
for i=1 to m{ n被i整除真假 int n, m, i, flag;
flag=1 do 结束循环flag==1 scanf (\真假n是素数n不是素数 while(n<=2);
图 6-12 判断素数N—S图 m=sqrt(n); flag=0;
for(i=2;i<=m;i++) { if(n%i==0) { flag=1; break; }
15