第六章 循环控制
§6.1 概述 循环:反复执行称为“循环体”的程序段的过程。 循环控制常用于数学迭代、对象遍历等问 题的求解,几乎所有实用程序都包含循环。 C语言中用如下语句实现循环: 1、用goto语句和if语句构成循环。 2、用while语句构成循环。 3、用do-while语句构成循环。 4、用for语句构成循环。
§6.2 goto语句 一般形式: goto 语句标号 作 用: 无条件转向“语句标号”处执行。 “语句标号”是一个标识符,它表示程序指令 作 用: 无条件转向“语句标号”处执行。 “语句标号”是一个标识符,它表示程序指令 的地址。这个标号不能是数字。 结构化程序设计方法主张限制使用goto语句。 goto语句有两种用途: 一是与if语句一起构成循环结构; 二是从循环体中跳转到循环体外。Break和continue
loop: if (i <= 100) /*标号表示程序指令的地址,当i≤100时,执行加法 */ { sum = sum+ i; [例6.2] 用If语句和goto语句构成循环 sum=sum+i i=i+1 i<=100 假 真 i=1,sum=0 main() { int i,sum=0; i = 1; loop: if (i <= 100) /*标号表示程序指令的地址,当i≤100时,执行加法 */ { sum = sum+ i; i++; goto loop; /*无条件转向标号loop处的指令 */ } printf("%d",sum);
§6.3 while语句 一般形式:while (表达式) 语句 作用:实现“当型”循环。 当“表达式”非0(真)时, “语句”是被循环执行的程序,称 为“循环体”。 特点:先判“表达式(条件)”,后执行语句。 循环体如果包含一个以上的语句,应该以复 合语句形式出现。 在循环体中应有使循环趋向于结束的语句。 语句 表达式 假 真
[例6.3] 用while循环实现1~100的累加。 main() { int i,sum=0; /*为循环赋初值 */ i = 1; while (i <= 100) /*“当型”循环*/ sum = sum + i; i++; /* 使循环趋于结束*/ } printf("%d",sum);
§6.4 do-while语句 一般形式: do 语句 while (表达式) 特点:“直到型”循环结构。 先执行一次“语句”,再判别“表达式”。当“表达式” 为非0时,再执行“语句”,直到“表达式”为0时,循 环结束。 语句 条件P 非0
main() { int i,sum=0; i = 1; do { sum = sum + i; i++; } [例6.4] 用d0_while循环实现1~100的累加。 main() { int i,sum=0; i = 1; do { sum = sum + i; i++; } while (i<=100); printf("%d",sum);
§6.5 for 语句 for语句常用于循环次数已知的循环控制; 也可以用于循环次数不确定而只给出循环结束条件的 情况,它完全可以代替while语句。 一般形式: for(表达式1;表达式2;表达式3) 语 句 循环初始条件 判别循环条件 修改循环条件 执行过程: (1)求表达式1; (2)求表达式2,若为“真”,执行“语句”; 若为假,转第(5)步。 (3)求表达式3。 (4)转第(2)步。 (5)执行for语句以外的语句。
for (i=1;i<=100;i++) sum = sum + i; 变量”。 这是for语句的典型用法:已知循环次数。 (本例100次)
main() { int i,sum=0; for(i=1;i<=100;i++) sum=sum+i; printf("%d\n",sum); } i = 1; while (i <= 100) { sum = sum + i; i++; }
关于For语句的几点说明: 1、for语句中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值,否则不执行for循环。 真,将无限循环。例如:for(i=1; ;i++) sum=sum+i; 它相当于: i=1; while(1) {sum=sum+1; i++;} 3、 for语句中的“表达式3”也可以省略,但此时程序员应设 法保证循环能正常结束。如: for(i=1;i<=100; ) 否则将无限循环。 { sum=sum+i; i++; }
4、for语句中的表达式1、3省略,只有表达式2,即只给出循环的条件,如无初值,for 将不执行,后者将出错。 for(;i<=100;) while(i<=100) { sum=sum+i; { sum=sum+i; i++; } i++; } 5、 for语句中的三个表达式都省略,如:for( ; ; ) 相当于:while(1) 无终止的执行循环体。 6、表达式1可以是设置循环变量初值的赋值表达式,也可以 是其他与循环无关的表达式。 如: for(sum=0,i=1;i<=100;i++,j- - ) sum=sum+i; 7、表达式一般是关系表达式(如i<=100)或逻辑表达式 (如s<b && x<y),也可以是数值表达式或字符表达式。
例:表达式1、表达式3是空语句。 #include <stdio.h> main() { char c; for ( ;(c=getchar())!=‘\n’; ) printf(“%c”,c); } 运行: computer ↙ (输入) computer (输出) 输出c
§6.8 break语句和continue语句 一、break语句 作用:跳出所在的多分支switch语句,跳出所在 的while、do-while、for循环语句(提前结束循 环)。 #define pi 3.14 main() { int r; float area; for (r=1;r<=10;r++) { area = pi*r*r; if (area > 100) break; printf("%d,%6.2f\n",r,area); } #include "stdio.h" main() { char grade; printf(“请输入学生的等级:"); scanf("%c\n",&grade); switch (grade) { case 'A':printf("85~100\n");break; case 'B':printf("70~84\n");break; case 'C':printf("60~69\n");break; case 'D':printf("<60\n");break; default: printf("error\n"); } } 当r=6时,area>100,执行 break语句,提前结束循环, 不再计算r =7~10的area。 运行结果: 1 3.14 2 12.57 3 28.27 4 50.27 5 78.54 6 113.10 7 153.94 8 201.06 9 254.47 10 314.16
§6.8 break语句和continue语句 二、continue语句 作用:提前结束本次循环体的执行,接着进行下 一次循环条件的判别。 [例5.5] 把100~200之间不能被3整除的数输出。 main () { int n; for (n=100; n<=200; n++) { if (n%3 == 0) continue; printf("%d",n); } 当n能被3整除时,执行continue 语句,结束执行本次循环的循环 体,即跳过printf语句。
三、break语句和continue语句的区别 while (表达式1) while (表达式1) { ┇ { ┇ if (表达式2) if (表达式2) break; continue; ┇ ┇ } } break语句跳出循环 continue语句结束本次 循环体的执行,进入下 一次循环
课堂练习 例、小游戏猜数字 main( ) { int x=67,y; printf(“Please input a number: \n”); scanf(“%d”,&y); if (y<x) { printf(“It is smaller!\n”); goto loop; } if (y>x) { printf(“It is bigger!\n”); goto loop; } if (y==x) printf(“It is ok!\n”); } loop: