内容正文:
专题五 C语言控制语句:循环(讲义)
---《编程语言基础—C语言》专题复习讲练测
[考纲要求]
1:掌握while循环、do…while循环、for循环和循环嵌套的用法。
2:理解break语句和continue语句的用法。
[课时安排]
3课时
[知识梳理]
一:循环语句
· while循环
C语言中的while循环是一种基本的循环结构,允许重复执行一段代码直到某个条件不再满足。while循环的基本语法如下:
1. while (条件) {
2. // 要执行的代码块
3. }
"条件"是一个布尔表达式,当其结果为真(true)时,循环内的代码块会被执行。一旦条件的结果为假(false),循环就会停止。控制流将跳到循环之后的第一条语句。
while循环执行步骤:
① 程序首先判断条件表达式。
② 如果条件为true,执行循环体内的代码块。
③ 循环体执行完毕后,再次判断条件表达式。
④ 如果条件仍然为true,重复步骤2和3。
⑤ 当条件表达式的结果为false时,循环终止,程序继续执行循环外的代码。
示例:
1. #include <stdio.h>
2.
3. int main() {
4. int count = 0;
5.
6. while (count < 5) {
7. printf("%d ", count);
8. count++; // 每次循环后递增count
9. }
10.
11. return 0;
12. }
while循环会打印从0到4的数字,然后停止,因为当count达到5时,条件count < 5不再为真。
注意,如果条件表达式始终为真或者没有在循环体内部修改条件表达式,那么while循环可能会变成无限循环。为了避免这种情况,确保循环体内部有逻辑可以改变条件表达式的值。
· do...while循环
C语言中的do...while循环是一种后测试循环结构,与while循环类似,但它至少会执行一次循环体。do...while循环的基本语法如下:
1. do {
2. // 循环体:至少执行一次的代码块
3. } while (条件表达式);
循环体:这是一组代码,至少会被执行一次,无论条件表达式的结果如何。
条件表达式:这是一个逻辑表达式,它返回一个布尔值(true 或 false)。循环体执行后,程序会评估这个条件表达式。
do...while循环执行流程:
① 执行循环体内的代码块。
② 评估条件表达式。
③ 如果条件为true,返回步骤1,再次执行循环体。
④ 如果条件为false,循环终止,程序继续执行循环外的代码。
示例:
1. #include <stdio.h>
2.
3. int main() {
4. int i = 0; // 初始化循环控制变量
5.
6. do {
7. printf("%d
", i); // 打印当前的i值
8. i++; // 更新循环控制变量
9. } while (i < 5); // 条件表达式
10.
11. return 0;
12. }
do...while循环将打印0到4的数字,每次循环后i的值增加1。当i等于5时,条件i < 5不再满足,循环终止。
· do...while循环是后测试循环,意味着它先执行循环体,然后再判断条件表达式。
· 与while循环不同,do...while循环保证至少执行一次循环体。
注意事项:
① 条件表达式的位置:do...while循环的条件表达式位于循环体之后,使用分号;结束。
② 避免无限循环:与while循环一样,确保循环体内部包含逻辑以改变条件表达式的值,以避免无限循环。
· for循环
C语言中的for循环是一种非常灵活的循环结构,允许初始化循环控制变量、定义循环继续的条件以及更新循环控制变量,所有这些都在循环的头部完成。
基本语法:
1. for (初始化表达式; 条件表达式; 更新表达式) {
2. // 循环体:当条件表达式为真时执行的代码块
3. }
· 初始化表达式:这是在循环开始之前执行的表达式,通常用于设置循环控制变量的初始值。
· 条件表达式:这是一个逻辑表达式,返回一个布尔值(true 或 false)。只有当条件表达式为true时,循环体才会执行。
· 更新表达式:每次循环体执行完毕后,这个表达式会被执行,通常用于更新循环控制变量。
for循环的执行流程
① 执行初始化表达式。
② 判断条件表达式。
③ 如果条件为true,执行循环体内的代码块。
④ 执行更新表达式。
⑤ 返回步骤2,再次判断条件表达式。
⑥ 如果条件为false,循环终止,程序继续执行循环外的代码。
示例:
1. #include <stdio.h>
2.
3. int main() {
4. for (int i = 0; i < 5; i++) {
5. printf("%d ", i);
6. }
7. return 0;
8. }
在这个示例中,for循环将打印0到4的数字。初始化表达式int i = 0设置了循环控制变量i的初始值。条件表达式i < 5决定了循环体的执行。更新表达式i++在每次循环后递增i的值。
for循环的条件表达式可以被省略。当条件表达式被省略时,for循环会变成一个无限循环,因为省略的条件默认被视为真(true)。这意味着只要没有显式地在循环体内使用break语句来退出循环,循环就会一直执行下去。
1. for (初始化表达式; ; 更新表达式) {
2. // 循环体
3. // 必须使用break来退出循环
4. }
示例:
1. #include <stdio.h>
2.
3. int main() {
4. int i = 0;
5. for ( ; ; i++) { // 条件表达式被省略
6. if (i > 10) { // 显式检查条件以退出循环
7. printf("退出循环
");
8. break; // 退出循环
9. }
10. printf("%d ", i);
11. }
12. return 0;
13. }
for循环的条件表达式被省略,循环将无限执行,直到遇到break语句。循环体内的if语句检查i的值,当i大于10时,执行break语句,退出循环。
二:循环语句的嵌套
在C语言中,循环语句可以嵌套使用,即一个循环内部可以包含另一个循环。嵌套循环的基本语法可以是任意类型的循环相互嵌套,包括for、while和do...while。外层循环控制大的迭代范围,内层循环则在每次外层循环迭代中执行。例如,以下是for循环的嵌套。
1. for (int outer = 0; outer < n; outer++) {
2. for (int inner = 0; inner < m; inner++) {
3. // 执行一些操作
4. }
5. }
示例:
1. #include <stdio.h>
2.
3. int main() {
4. int rows, cols;
5. rows = 5; // 假设我们有一个5x5的矩阵
6. cols = 5;
7.
8. // 外层循环控制行
9. for (int i = 0; i < rows; i++) {
10. // 内层循环控制列
11. for (int j = 0; j < cols; j++) {
12. // 假设我们在打印矩阵中的元素
13. printf("%d ", (i * cols) + j);
14. }
15. printf("
");
16. }
17.
18. return 0;
19. }
执行步骤:
① 外层循环开始,初始化外层循环变量,并检查条件。
② 如果外层条件为真,执行内层循环。
③ 内层循环开始,初始化内层循环变量,并检查条件。
④ 如果内层条件为真,执行内层循环体。
⑤ 执行内层循环的更新表达式,然后再次检查内层条件。
⑥ 重复步骤3-5,直到内层条件为假。
⑦ 内层循环结束,外层循环执行更新表达式,然后再次检查外层条件。
⑧ 重复步骤1-7,直到外层条件为假。
所有循环结束,程序继续执行循环外的代码。
三:跳转语句:break和continue
在C语言中,break语句是一种控制流语句,用于立即终止最近的for、while或do...while循环的执行,强制使程序流程跳出循环体,继续执行循环之后的代码。
1. break; //它没有参数,单独作为一个语句使用
break语句在不同类型的循环中的使用示例:
1. #include <stdio.h>
2.
3. int main() {
4. // 在while循环中使用break
5. int i = 0;
6. while (1) { // 无限循环
7. if (i > 5) {
8. break; // 当i大于5时退出循环
9. }
10. printf("%d ", i);
11. i++;
12. }
13.
14. // 在for循环中使用break
15. for (int j = 0; j < 10; j++) {
16. if (j == 5) {
17. break; // 当j等于5时退出循环
18. }
19. }
20.
21. // 在do...while循环中使用break
22. int k = 0;
23. do {
24. if (k == 5) {
25. break; // 当k等于5时退出循环
26. }
27. k++;
28. } while (k < 10);
29.
30. return 0;
31. }
break语句作用:
break语句会立即终止最近的循环,不管循环的条件是否还满足。执行break后,程序流程会跳到循环外,不会执行循环的更新表达式或条件表达式。
注意事项:
只能在循环或switch语句中使用:break语句只能在for、while或do...while循环中使用,或者在switch语句的case分支中使用。
在C语言中,continue语句是另一种控制流语句,用于跳过当前循环的剩余部分,并立即开始下一次循环迭代。continue语句通常用于在满足特定条件时忽略当前迭代的剩余部分,而不是退出整个循环。
1. continue; ////它没有参数,单独作为一个语句使用
1. #include <stdio.h>
2.
3. int main() {
4. // 在for循环中使用continue
5. for (int i = 0; i < 10; i++) {
6. if (i % 2 == 0) {
7. continue; // 如果i是偶数,跳过当前迭代的剩余部分
8. }
9. printf("%d ", i); // 只有奇数会被打印
10. }
11.
12. // 在while循环中使用continue
13. int j = 0;
14. while (j < 10) {
15. if (j % 3 == 0) {
16. continue; // 如果j能被3整除,跳过当前迭代的剩余部分
17. }
18. printf("%d ", j);
19. j++;
20. }
21.
22. // 在do...while循环中使用continue
23. int k = 0;
24. do {
25. if (k == 5) {
26. continue; // 如果k等于5,跳过当前迭代的剩余部分
27. }
28. k++;
29. } while (k < 10);
30.
31. return 0;
32. }
continue语句作用:
continue语句会导致跳过当前循环迭代的剩余部分,直接进入下一次迭代的条件检查。continue语句不会退出整个循环,只是跳过当前迭代。
注意事项:
continue语句只能在for、while或do...while循环中使用。
[真题练讲]
1.(2020职教高考题)若有定义语句intk=-1,s=5;,则以下循环体的执行次数是do{s+=k++;}while(!k != 0);
A.0次 B.1次
C.2次 D.无限次
【答案】C
【解析】do...while循环先执行循环体,执行“s+=k++”,此时k的值为0。判断条件“!k != 0”,循环条件成立。继续执行循环体,再次判断条件,此时条件不成立。因此循环体执行的次数为2次。
2.(2020职教高考题)运行以下程序:
#include <stdio. h>
main()
int m,n,r,s;
scanf("%d,%d",&m,&n);
s=m * n;
while(n)
{
r=m % n;
m=n;
n=r;
}
printf("%d,%d
",m,s/m);
输人20,30,输出结果是( )
A.5,120 B.10,60
C.20,30 D.30,20
【答案】B
【解析】m = 20,n = 30,s = m * n = 600。计算 m % n 得到余数 r。将 n 赋值给 m,将 r 赋值给 n。重复这个过程直到 n 为 0。循环结束:m 中的值即为 20 和 30 的最大公约数。对于输入 20 和 30:最大公约数是 10。最小公倍数是 600 / 10 = 60。
3.(2020年职教高考题)下面有关for循环结构描述正确的是( )
A.for 循环中的三个表达式都不能缺少
B.for循环可以用continue语句跳出循环体
C.for循环只能用于循环次数已经确定的情况
D.for循环的循环体可以包含多条语句,但必须用花括号括起来
【答案】D
【解析】A. 错误:for 循环的三个表达式可以省略,不是必须的。B. 错误:continue 语句用于跳过当前循环的剩余部分,而不是跳出整个循环体。C. 错误:for 循环不仅限于已知次数的循环,也可以用于条件控制的循环。
4.(2019年职教高考题)以下程序段的运行结果是( )
int a=-3,b=-4
while(++a&&b++)
printf(“%d,%d
”,a,b);
A.0,-2 B.0,-1 C.0,0 D.1,0
【答案】A
【解析】初始:a = -3,b = -4。第一次循环:++a 变为 -2,b++ 判断条件时是 -4,循环继续。打印:a = -2,b = -4(b 打印后自增,变为 -3)。第二次循环:++a 变为 -1,b++ 判断条件时是 -3,循环继续。打印:a = -1,b = -3(b 打印后自增,变为 -2)。第三次循环:++a 变为 0,b++ 判断条件时是 -2,由于 ++a 结果为0,循环停止。最终结果是打印了两次,a 的最终值是 0,b 的最终值是 -2。所以正确答案是 A. 0, -2。
5.(2019年职教高考题)以下程序段的运行结果是
int x=3;
do{
printf(“%2d”,x-=2);
}while(!(--x));
A.2-1 B.1-3 C.1-2 D.0-3
【答案】C
【解析】do...while循环先执行循环体,此时x的值为1并在屏幕上打印出来,执行判断条件“!(--x)”,条件为真,继续执行循环体,x的值为-2并在屏幕上打印出来。判断条件,此时条件不成立,因此,输出结果为“1-2”。
6.(2018年职教高考题)若i是int型变量,以下循环体执行的次数是( )
for(i=2;i==0;)
printf(“%d
”,i--);
A.0 B.1 C.2 D.无限次
【答案】A
【解析】初始化:i=2。条件判断:i==0,这是false,因为i是2。循环体:由于for循环的条件是false,循环体实际上不会执行。
[限时练习]
1.下列for循环的次数为( )
for ( i=0,x=0;! x && i<=5;i++)
A. 5 B. 6 C. 1 D. 无限
【答案】B
【解析】初始化:i = 0,x = 0。条件判断:!x && i <= 5 为真(因为 !x 为真,i 初始为0,小于等于5)。执行循环体。循环更新:i++。循环将继续执行,直到条件 !x && i <= 5 不再为真。由于 x 的值在循环体中没有改变,!x 始终为真。因此,循环将一直执行,直到 i 的值超过5。循环更新 i 从0开始,直到5,所以循环将执行6次(0到5,共6个整数值)。当 i 增加到6时,条件 i <= 5 不再满足,循环结束。
2.下述关于循环体的描述中错误是( )
A.循环体中可以出现break语句和continue语句;
B.循环体中还可以出现循环语句;
C.循环体中不能出现goto语句;
D.循环体中可以出现开关语句
【答案】C
【解析】在C语言中,goto 语句可以跳出循环体,跳转到程序中预先指定的标签位置。因此,goto 语句是可以在循环体中使用的。
3.语句while(!e);中的条件 !e 等价于( )
A.e==0 B.e!=1 C.e!=0 D.~e
【答案】A
【解析】e != 1 表示 e 的值不等于1。这并不等同于 !e,因为 e 可以是任何非1的值,包括0,也可以是其他非零值。 e != 0 表示 e 的值不等于零。这与 !e 的含义相反,因为当 e 为非零时,!e 为假。 ~e 是按位取反运算符,它对 e 的每个位进行取反,这与逻辑非运算符 ! 不同。
4.C语言中while 和do-while 循环的主要区别是( )
A.do-while的循环体至少无条件执行一次
B.while 的循环控制条件比do-while 的循环控制条件严格
C.do-while 允许从外部转到循环体内
D.do-while 的循环体不能是复合语句
【答案】A
【解析】while 和 do-while 的循环控制条件严格性是一样的,它们都要求布尔表达式的结果来决定是否继续执行循环。do-while 循环不允许从外部转到循环体内,它只能从循环体内部通过 continue 语句跳到循环末尾的条件判断处。do-while 的循环体可以是复合语句(即由多条语句组成的花括号 {} 内的语句),这与 while 循环相同。
5.该程序的输出结果为___________。
#include <stdio.h>
int main()
{
int a = 0, b = 0;
for (a = 1, b = 1; a <= 100; a++)
{
if (b >= 20) break;
if (b % 3 == 1)
{
b = b + 3;
continue;
}
b = b-5;
}
printf("%d
", a);
return 0;
}
【答案】8
【归纳小结】
C语言中的循环语句主要包括 for 循环、while 循环和 do-while 循环,它们的基本用法如下:
for 循环:
格式:for (初始化表达式; 条件表达式; 迭代表达式) { 循环体; }
特点:初始化、条件判断、迭代更新都在同一行,适合已知循环次数的情况。
while 循环:
格式:while (条件表达式) { 循环体; 迭代表达式; }
特点:先判断条件,条件为真时执行循环体,适合循环次数未知的情况。
do-while 循环:
格式:do { 循环体; 迭代表达式; } while (条件表达式);
特点:至少执行一次循环体,然后判断条件,条件为真继续循环,适合需要至少执行一次循环体的情况。
循环控制语句:
break:立即退出循环。
continue:跳过当前循环的剩余部分,进入下一次迭代。
学科网(北京)股份有限公司
$$