靳润昭C语言教程讲义 2001年2月17日 6循环控制 61概述 62goto语句以及用goto语句构成循环 63 while语句 64do- while语句 65for语句 66循环的嵌套 67几种循环的比较 68 break和 continue语句 69999 68.1 break语句 682 continue语句 10 69程序举例 11 6循环控制 61概述 循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序 段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语 言提供了多种循环语句,可以组成各种不同形式的循环结构。 1)用goto语句和if语句构成循环 2)用 while语句; 3)用 do-while语句; 4)用for语句 62goto语句以及用goto语句构成循环 goto语句是一种无条件转移语句,与 BASIC中的goto语句相似。goto语句的使用格 式为: goto语句标号 其中标号是一个有效的标识符,这个标识符加上一个":〃一起出现在函数内某处,执行 goto语句后,程序将跳转到该标号处并执行其后的语句。另外标号必须与goto语句同处于 个函数中,但可以不在一个循环层中。通常goto语句与if条件语句连用,当满足某一条 件时,程序跳到标号处运行。 goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时, 用goto语句则比较合理 【例6.1】用goto语句和if语句构成循环,nl aino 第1页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第1页 6 循环控制 ................................................................................................................... 1 6.1 概述................................................................................................................. 1 6.2 goto 语句以及用 goto 语句构成循环................................................................... 1 6.3 while 语句......................................................................................................... 2 6.4 do-while 语句.................................................................................................... 4 6.5 for 语句............................................................................................................. 6 6.6 循环的嵌套 ...................................................................................................... 9 6.7 几种循环的比较 ............................................................................................... 9 6.8 break 和 continue 语句........................................................................................ 9 6.8.1 break 语句 ............................................................................................... 9 6.8.2 continue 语句........................................................................................ 10 6.9 程序举例.........................................................................................................11 6 循环控制 6.1 概述 循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序 段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语 言提供了多种循环语句,可以组成各种不同形式的循环结构。 1) 用 goto 语句和 if 语句构成循环; 2) 用 while 语句; 3) 用 do-while 语句; 4) 用 for 语句; 6.2 goto 语句以及用 goto 语句构成循环 goto 语句是一种无条件转移语句, 与 BASIC 中的 goto 语句相似。goto 语句的使用格 式为: goto 语句标号; 其中标号是一个有效的标识符,这个标识符加上一个“:”一起出现在函数内某处, 执行 goto 语句后,程序将跳转到该标号处并执行其后的语句。另外标号必须与 goto 语句同处于 一个函数中,但可以不在一个循环层中。通常 goto 语句与 if 条件语句连用, 当满足某一条 件时, 程序跳到标号处运行。 goto 语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时, 用 goto 语句则比较合理。 【例 6.1】用 goto 语句和 if 语句构成循环, = 100 n 1 n 。 main() {
靳润昭C语言教程讲义 2001年2月17日 int i, sum=0: oop: if(i<=100) isum=sumti goto loop; I printf("%d\n", sum) 63whle语句 while语句的一般形式为 while(表达式)语句 其中表达式是循环条件,语句为循环体 while语句的语义是:计算表达式的值,当值为真(非0)时,执行循环体语句。其执行 过程可用下图表示。 表达式 非0 语句 n 【例6.2】用 while语句求n=l 用传统流程图和N-S结构流程图表示算法,见图: 第2页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第2页 int i,sum=0; i=1; loop: if(i<=100) {sum=sum+i; i++; goto loop;} printf("%d\n",sum); } 6.3 while 语句 while 语句的一般形式为: while(表达式)语句 其中表达式是循环条件,语句为循环体。 while 语句的语义是:计算表达式的值,当值为真(非 0)时, 执行循环体语句。其执行 过程可用下图表示。 【例 6.2】用 while 语句求 = 100 n 1 n 。 用传统流程图和 N-S 结构流程图表示算法,见图:
靳润昭C语言教程讲义 2001年2月17日 非0 sum=sum+ i 当i100 main while(i maino[ printf( input a string: \n") while(getchar!='\n')n++ printf(%d,n) 第3页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第3页 main() { int i,sum=0; i=1; while(i main(){ int n=0; printf("input a string:\n"); while(getchar()!='\n') n++; printf("%d",n); }
靳润昭C语言教程讲义 2001年2月17日 本例程序中的循环条件为 getchar!=’n’,其意义是,只要从键盘输入的字符不是回 车就继续循环。循环体n+完成对输入字符个数计数。从而程序实现了对输入一行字符的字 符个数计数 使用 while语句应注意以下几点 1) while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可 继续循环, 【例6.4】 mainO( int a=0. n: tf(\n input n:") scanf(%d", &n); printf(%d a++* 本例程序将执行n次循环,每执行一次,n值减1。循环体输出表达式a++凇的值。该 表达式等效于(a*2;a++)。 2)循环体如包括有一个以上的语句,则必须用{括起来,组成复合语句。 64 do-while语句 do-while语句的一般形式为 语句 while(表达式); 这个循环与 while循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为 真,如果为真则继续循环;如果为假,则终止循环。因此,do-whie循环至少要执行一次 循环语句。其执行过程可用下图表示。 盾环体语句 表达式 0 第4页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第4页 本例程序中的循环条件为 getchar()!='\n',其意义是, 只要从键盘输入的字符不是回 车就继续循环。循环体 n++完成对输入字符个数计数。从而程序实现了对输入一行字符的字 符个数计数。 使用 while 语句应注意以下几点: 1) while 语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非 0)即可 继续循环。 【例 6.4】 main(){ int a=0,n; printf("\n input n: "); scanf("%d",&n); while (n--) printf("%d ",a++*2); } 本例程序将执行 n 次循环,每执行一次,n 值减 1。循环体输出表达式 a++*2 的值。该 表达式等效于(a*2;a++)。 2) 循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。 6.4 do-while 语句 do-while 语句的一般形式为: do 语句 while(表达式); 这个循环与 while 循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为 真, 如果为真则继续循环;如果为假, 则终止循环。因此, do-while 循环至少要执行一次 循环语句。其执行过程可用下图表示
靳润昭C语言教程讲义 2001年2月17日 循环体语句 当表达式值为真 n 【例6.5】用 do-while语句求n= 用传统流程图和N-S结构流程图表示算法,见图: sum=sum+ 1 真 长100 假 1=+1 >100 hile(i<=100) printf("%d\n", sum 第5页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第5页 【例 6.5】用 do-while 语句求 = 100 n 1 n 。 用传统流程图和 N-S 结构流程图表示算法,见图: main() { int i,sum=0; i=1; do { sum=sum+i; i++; } while(i<=100) printf("%d\n",sum); }
靳润昭C语言教程讲义 2001年2月17日 同样当有许多语句参加循环时,要用”{"和"}"把它们括起来 【例6.6】 while和do- while循环比较。 (1) lint sumO, i while(i<=10) (sum=sumti printf( sum=%d", sum Hint sumo, i scanf(%d",&i) while(i<=10) printf("sum=%d", sum 65for语句 在C语言中,for语句使用最为灵活,它完全可以取代 while语句。它的一般形式为 for(表达式1:表达式2:表达式3)语句 它的执行过程如下 1)先求解表达式1。 2)求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面 第3)步;若其值为假(0),则结束循环,转到第5)步 )求解表达式3。 4)转回上面第2)步继续执行。 5)循环结束,执行for语句下面的一个语句。 其执行过程可用下图表示 第6页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第6页 同样当有许多语句参加循环时, 要用"{"和"}"把它们括起来。 【例 6.6】while 和 do-while 循环比较。 (1)main() {int sum=0,i; scanf(“%d”,&i); while(i<=10) {sum=sum+i; i++; } printf(“sum=%d”,sum); } (2)main() {int sum=0,i; scanf(“%d”,&i); do {sum=sum+i; i++; } while(i<=10); printf(“sum=%d”,sum); } 6.5 for 语句 在 C 语言中,for 语句使用最为灵活,它完全可以取代 while 语句。它的一般形式为: for(表达式 1;表达式 2;表达式 3) 语句 它的执行过程如下: 1) 先求解表达式 1。 2) 求解表达式 2,若其值为真(非 0),则执行 for 语句中指定的内嵌语句,然后执行下面 第 3)步;若其值为假(0),则结束循环,转到第 5)步。 3) 求解表达式 3。 4) 转回上面第 2)步继续执行。 5) 循环结束,执行 for 语句下面的一个语句。 其执行过程可用下图表示
靳润昭C语言教程讲义 2001年2月17日 求解表达式1 表达式2 真 语句 求解表达式3 for语句的 下一语句 for语句最简单的应用形式也是最容易理解的形式如下: for(循环变量赋初值:循环条件:循环变量增量)语句 循环变量赋初值总是一个赋值语句,它用来给循环控制变量赋初值;循环条件是一个 关系表达式,它决定什么时候退出循环;循环变量増量,定义循环控制变量每循环一次后 按什么方式变化。这三个部分之间用”:"分开。 例如 for(i=l: i100时,结東循环。 相当于 while (i<=100) SUmEsumtl 对于for循环中语句的一般形式,就是如下的 while循环形式 表达式1: while(表达式2) 句 表达式3 注意 l)for循环中的表达式1(循环变量赋初值)〃、"表达式2(循环条件)〃和“表达式3(循 第7页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第7页 for 语句最简单的应用形式也是最容易理解的形式如下: for(循环变量赋初值;循环条件;循环变量增量) 语句 循环变量赋初值总是一个赋值语句, 它用来给循环控制变量赋初值; 循环条件是一个 关系表达式,它决定什么时候退出循环;循环变量增量,定义循环控制变量每循环一次后 按什么方式变化。这三个部分之间用“;”分开。 例如: for(i=1; i100 时,结束循环。 相当于: i=1; while(i<=100) { sum=sum+i; i++; } 对于 for 循环中语句的一般形式,就是如下的 while 循环形式: 表达式 1; while(表达式 2) {语句 表达式 3; } 注意: 1) for 循环中的“表达式 1(循环变量赋初值)”、“表达式 2(循环条件)”和“表达式 3(循
靳润昭C语言教程讲义 2001年2月17日 环变量増量)〃都是选择项,即可以缺省,但:〃不能缺省 2)省略了“表达式1(循环变量赋初值)〃,表示不对循环控制变量赋初值。 3)省略了“表达式2(循环条件)",则不做其它处理时便成为死循环。 例如 for(i=l: i++)sumsumti 相当于 while(1) (sum=sum+ 4)省略了“表达式3(循环变量增量)〃,则不对循环控制变量进行操作,这时可在语句体中 加入修改循环控制变量的语句 例如: for(i=1;i<=100;) sum=sumti 5)省略了“表达式1(循环变量赋初值)〃和ν表达式3(循环变量增量) 例如 Isum=sumti 相当于 while(i=100) 6)3个表达式都可以省略。 例如 for(;;)语句 相当于 while(1)语句 7)表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式 例如 for(sumF0: i<=100: i++)sum=sum+ 8)表达式1和表达式3可以是一个简单表达式也可以是逗号表达式 for(sum=0, i=1: i<=100: i++)sum=sum+i 或: for(i=0,j=100;i<=100;i++,j)k 9)表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其 值非零,就执行循环体。 例如 for(i=0; (c=getchar O)!=/\n;i+=c) 又如: ((c=getchar O)!=/\n: 第8页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第8页 环变量增量)”都是选择项, 即可以缺省,但“;”不能缺省。 2) 省略了“表达式 1(循环变量赋初值)”, 表示不对循环控制变量赋初值。 3) 省略了“表达式 2(循环条件)”, 则不做其它处理时便成为死循环。 例如: for(i=1;;i++)sum=sum+i; 相当于: i=1; while(1) {sum=sum+i; i++;} 4) 省略了“表达式 3(循环变量增量)”, 则不对循环控制变量进行操作,这时可在语句体中 加入修改循环控制变量的语句。 例如: for(i=1;i<=100;) {sum=sum+i; i++;} 5) 省略了“表达式 1(循环变量赋初值)”和“表达式 3(循环变量增量)”。 例如: for(;i<=100;) {sum=sum+i; i++;} 相当于: while(i<=100) {sum=sum+i; i++;} 6) 3 个表达式都可以省略。 例如: for(;;)语句 相当于: while(1)语句 7) 表达式 1 可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。 例如: for(sum=0;i<=100;i++)sum=sum+i; 8) 表达式 1 和表达式 3 可以是一个简单表达式也可以是逗号表达式。 for(sum=0,i=1;i<=100;i++)sum=sum+i; 或: for(i=0,j=100;i<=100;i++,j--)k=i+j; 9) 表达式 2 一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其 值非零,就执行循环体。 例如: for(i=0;(c=getchar())!=’\n’;i+=c); 又如: for(;(c=getchar())!=’\n’;) printf(“%c”,c);
靳润昭C语言教程讲义 2001年2月17日 66循环的嵌套 【例6.7】 maino printf( i j k\n") for(i=0;i<2;i++) for(j=0; j<2: j++) for(k=0;k<2;k+) printf(%d %d %d\n k); 67几种循环的比较 1)四种循环都可以用来处理同一个问题,一般可以互相代替。但一般不提倡用goto型循 环 2) while和do- while循环,循环体中应包括使循环趋于结束的语句。for语句功能最强。 3)用 while和 do-while循环时,循环变量初始化的操作应在 while和do-whil语句之前完 成,而for语句可以在表达式1中实现循环变量的初始化 6.8 break和 continue语句 681 break语句 break语句通常用在循环语句和开关语句中。当 break用于开关语句 switch中时,可使 程序跳出 switch而执行 switch以后的语句:如果没有brek语句,则将成为一个死循环而 无法退出。 break在 switch中的用法已在前面介绍开关语句时的例子中碰到,这里不再举 当 break语句用于do- while、for、 while循环语句中时,可使程序终止循环而执行循环 后面的语句,通常 break语句总是与if语句联在一起。即满足条件时便跳出循环。 【例6.8】 main O int i=0: while(l /*设置循环* /*变量赋初值*/ 第9页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第9页 6.6 循环的嵌套 【例 6.7】 main() { int i, j, k; printf("i j k\n"); for (i=0; i<2; i++) for(j=0; j<2; j++) for(k=0; k<2; k++) printf(“%d %d %d\n", i, j, k); } 6.7 几种循环的比较 1) 四种循环都可以用来处理同一个问题,一般可以互相代替。但一般不提倡用 goto 型循 环。 2) while 和 do-while 循环,循环体中应包括使循环趋于结束的语句。for 语句功能最强。 3) 用 while 和 do-while 循环时,循环变量初始化的操作应在 while 和 do-while 语句之前完 成,而 for 语句可以在表达式 1 中实现循环变量的初始化。 6.8 break 和 continue 语句 6.8.1 break 语句 break 语句通常用在循环语句和开关语句中。当 break 用于开关语句 switch 中时,可使 程序跳出 switch 而执行 switch 以后的语句;如果没有 break 语句,则将成为一个死循环而 无法退出。break 在 switch 中的用法已在前面介绍开关语句时的例子中碰到,这里不再举 例。 当 break 语句用于 do-while、for、while 循环语句中时,可使程序终止循环而执行循环 后面的语句, 通常 break 语句总是与 if 语句联在一起。即满足条件时便跳出循环。 【例 6.8】 main() { int i=0; char c; while(1) /*设置循环*/ { c='\0'; /*变量赋初值*/
靳润昭C语言教程讲义 2001年2月17日 while(c!=13&&c!=27)/*键盘接收字符直到按回车或Esc键* c=getcho printf(%c\n", c) /*判断若按Esc键则退出循环* printf(" The No. is %d\n", i) printf( The end") 注意 1) break语句对 if-else的条件语句不起作用 2)在多层循环中,一个 break语句只向外跳一层 682 continue语句 continue语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。 continue语 句只用在for、 while、do- while等循环体中,常与i条件语句一起使用,用来加速循环。其 执行过程可用下图表示。 1) while(表达式1) f(表达式2) break while(表达式1) if(表达式2) continue 第10页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第10页 while(c!=13&&c!=27) /*键盘接收字符直到按回车或 Esc 键*/ { c=getch(); printf("%c\n", c); } if(c==27) break; /*判断若按 Esc 键则退出循环*/ i++; printf("The No. is %d\n", i); } printf("The end"); } 注意: 1) break 语句对 if-else 的条件语句不起作用。 2) 在多层循环中, 一个 break 语句只向外跳一层。 6.8.2 continue 语句 continue 语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。continue 语 句只用在 for、while、do-while 等循环体中,常与 if 条件语句一起使用,用来加速循环。其 执行过程可用下图表示。 1) while(表达式 1) { …… if(表达式 2)break; …… } 2) while(表达式 1) { …… if(表达式 2)continue; …… }