8.3 循环控制语句
8.3.1 while 循环
(1)基本语法
while(循环条件表达式)
{
循环体语句
}
说明:
(1)当循环条件表达式成立,就执行循环体语句,直到条件不成立停止循环
(2)为避免死循环,循环条件表达式不能永远成立,且随着循环次数增加,应该越来
越趋向于不成立。
(2)流程图

(3)案例 – 计数循环
实现计数循环要满足:①必须初始化循环变量 ②循环变量比较作为循环条件 ③循环变
量变化。
使用 while 循环实现如下需求:
1)输出 10 次 "我第 n 天吃了 n 个韭菜馅的包子"。
#include<stdio.h>
int main()
{
//输出10次“我第n天吃了n个韭菜包子”
//定义循环体
int num = 0;
while (num < 10)
{
printf("我第%d天吃了%d个韭菜包子\n", num, num);
num++;
}
printf("循环结束后循环变量的值:%d", num);
return 0;
}
2)循环输出数字7~15
#include<stdio.h>
int main()
{
int n = 7;
while (n <= 15)
{
printf("%d\n", n);
n++;
}
printf("循环结束后循环变量的值:%d", n);
return 0;
}
3)倒序输出数字56~43
#include<stdio.h>
int main()
{
int n = 56;
while (n >= 43)
{
printf("%d\n", n);
n--;
}
printf("循环结束后循环变量的值:%d", n);
return 0;
}
4)输出10以内的所有偶数
#include<stdio.h>
int main()
{
/* int i = 0;
while(i<=10)
if (i%2==0)
{
printf("%d\n", i);
}
i++;
*/
int i = 0;
while (i <= 10)
{
printf("%d\n", i);
i += 2;
}
printf("循环结束后循环变量的值:%d", i);
return 0;
}
5)计算100内所有数字和
#include<stdio.h>
int main()
{
int i = 0;
int sum = 0;
while (i <= 100)
{
sum += i;
i++;
}
printf("100 以内(包括 100)所有数字的和是 %d \n", sum);
printf("循环结束后循环变量的值:%d", i);
return 0;
}
6)计算10以内是所有奇数的乘积
#include<stdio.h>
int main()
{
int i = 1;
int product = 1;
while (i <= 10)
{
product *= i;
i += 2;
}
printf("10 以内所有奇数的乘积是 %d \n", product);
printf("循环结束后循环变量的值:%d", i);
return 0;
}
(4)案例 不确定循环
不确定循环直到循环表达式不成立之前,不确定循环次数,不需要循环变量。
实现需求:输入 6 位数密码,直到密码匹配成功结束循环。
#include<stdio.h>
int main()
{
//记录正确密码
int pwd1 = 123456;
//定义变量用于获取输入的密码
int pwd2=0;
//循环
while (pwd1 != pwd2)
{
printf("请输入6位密码:");
scanf_s("%d", &pwd2);
}
printf("密码正确,欢迎回家!");
return 0;
}
8.3.2 do...while 循环
(1)基本语法
do
{
循环体语句;
}while(循环条件表达式);
说明:
1)do…while 循环是先执行再判断,但只有第一次循环语句的执行没有经过判断,以
后的每一次仍然先经过判断。
2)注意 while 后面的分号不能省略。
(2)流程图

(3)案例 – 计数循环
使用 do…while 循环实现如下需求:
1)输出 10 次 "我第 n 天吃了 n 个韭菜馅的包子"
#include<stdio.h>
int main()
{
int i = 0;
do
{
printf("我第%d 天吃了%d 个韭菜馅的包子 \n", i, i);
i++;
} while (i <= 10);
printf("循环结束后循环变量的值:%i", i);
return 0;
}
2)循环输出数字7~15
#include<stdio.h>
int main()
{
int i = 7;
do
{
printf("%d\n", i);
i++;
} while (i <= 15);
printf("循环结束后循环变量的值:%d", i);
return 0;
}
3)倒序输出数字56~43
#include<stdio.h>
int main()
{
int i = 56;
do
{
printf("%d\n", i);
i--;
} while (i >= 43);
printf("循环结束后循环变量的值:%d", i);
return 0;
}
4)输出10以内所有的偶数
#include<stdio.h>
int main()
{
int i = 0;
do
{
printf("%d\n", i);
i += 2;
} while (i<=10);
printf("循环结束后循环变量的值:%d", i);
return 0;
}
5)计算100以内所有数字的和
#include<stdio.h>
int main()
{
int sum = 0;
int i = 1;
do
{
sum += i;
i++;
} while (i<=100);
printf("100 以内(包括 100)所有数字的和是 %d \n", sum);
printf("循环结束后循环变量的值:%d", i);
return 0;
}
6)计算10以内所有奇数的乘积
#include<stdio.h>
int main()
{
int product = 1;
int i = 1;
do
{
product *= i;
i += 2;
} while (i<=10);
printf("10 以内所有奇数的乘积是 %d \n", product);
printf("循环结束后循环变量的值:%d", i);
return 0;
}
6)案例 – 不确定循环
实现需求:输入 6 位数密码,直到密码匹配成功结束循环。
#include<stdio.h>
int main()
{
int pwd1 = 123456;
int pwd2 = 0;
do
{
printf("请输入6位密码\n");
scanf_s("%d", &pwd2);
printf("请输入正确密码\n");
} while (pwd1!=pwd2);
printf("欢迎回家!\n");
return 0;
}
(5)while 和 do while 的区别
#include<stdio.h>
int main()
{
//while 循环一次也不会执行
int n = 10;
while (n > 10)
{
printf("%d\n", n);
n++;
}
//do while 陷入死循环
n = 10;
do
{
printf("%d\n", n);
n++;
} while (n>10);
return 0;
}
8.3.3 for循环
(1)基本语法
for (循环变量初始化; 循环条件表达式; 循环变量变化)
{
循环语句;
}
说明:
(1)循环变量初化只执行一次,且循环开始前就执行。
(2)循环条件表达式每次循环都执行,同 while 循环一样,每次先判断后执行循环体
语句。
(3)循环标记变量变化每次循环都执行,在大括号中循环体语句之后执行。
2)流程图

3)案例 使用 for 循环实现如下需求:
1)输出 10 次 "我第 n 天吃了 n 个韭菜馅的包子"。
#include<stdio.h>
int main()
{
//输出10次“我第 n 天吃了 n 个韭菜馅的包子”
for (int i = 0; i < 10; i++)
{
printf("我第%d 天吃了%d 个韭菜馅的包子 \n", i, i);
}
return 0;
}
2)循换输出7~15
#include<stdio.h>
int main()
{
for (int i = 7; i <= 15; i++)
{
printf("%d\n", i);
}
return 0;
}
3)倒序输出数字56~43
#include<stdio.h>
int main()
{
for (int i = 56; i >=43 ; i--)
{
printf("%d\n", i);
}
return 0;
}
4)输出 10(包括 10)以内所有的偶数
#include<stdio.h>
int main()
{
for (int i = 0; i <= 10; i += 2)
{
printf("%d\n", i);
}
return 0;
}
5)计算 100 以内(包括 100)所有数字的和
#include<stdio.h>
int main()
{
int sum = 0;
for (int i = 0; i <=100; i++)
{
sum +=i;
}
printf("100 以内(包括 100)所有数字的和是 %d \n", sum);
return 0;
}
6)计算10以内所有奇数的乘积
#include<stdio.h>
int main()
{
int product = 1;
for ( int i = 1; i <=10; i+=2)
{
product *= i;
}
printf("10 以内所有奇数的乘积是 %d \n", product);
return 0;
}
7)案例 – 不确定循环
实现需求:输入 6 位数密码,直到密码匹配成功结束循环。
#include<stdio.h>
int main()
{
int pwd1 = 123456;
int pwd2 = 0;
for (; pwd1!= pwd2; )
{
printf("请输入 6 位数密码:\n");
scanf_s("%d", &pwd2);
}
printf("密码正确,欢迎回家!");
return 0;
}
8)案例 特殊结构的for循环
#include<stdio.h>
int main()
{
// 标准结构
for (int i = 1; i < 10; i+=2)
{
printf("%d ", i);
}
printf("%d", i);
//循环变量写在外面
int i = 1;
for ( ; i < 10; i+=2)
{
printf("%d ", i);
}
printf("\n\n");
//循环变量写在外面 循环标记变量变化写在大括号中
i = 1;
for(; i < 10; i);
{
printf("%d ", i);
i += 2;
}
printf("\n\n");
//使用两个循环标记变量
for (int x = 1,y=1; x < 15 &&y<10; x++,y++)
{
printf("%d %d \n", x, y);
}
printf("\n\n");
//for后面括号中什么都不写,死循环
for (;;)
{
printf("死循环 \n");
}
return 0;
}
8.3.4 多重循环
(1)介绍
1)将一个循环放在另一个循环体内,就形成了嵌套循环, 其中,for、while、do…while
均可以作为外层循环和内层循环,建议一般使用两层,最多不要超过 3 层,如果嵌套循环过
多,会造成可读性降低。
2)如果外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n 次。
(2)代码示例
#include<stdio.h>
int main()
{
//输入列数和行数
int rows, cols;
printf("请输入行数:");
scanf_s("%d", &rows);
printf("请输入列数:");
scanf_s("%d", &cols);
//循环
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
printf("[%d,%d]", i, j);
}
printf("\n");
}
return 0;
}
(3)案例:分别打印初以下两种形式的九九乘法表
第一种:
#include<stdio.h>
int main()
{
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
printf("%d*%d=%d\t", j, i, j * i);
}
printf("\n");
}
return 0;
}
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81D:\c-code\3-16\x64\Debug\3-16.exe (进程 14864)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .
第二种:
#include<stdio.h>
int main()
{
for (int i = 9; i >=1; i--)
{
for (int j = 1; j <= i; j++)
{
printf("%d*%d=%d\t", j, i, i * j);
}
printf("\n");
}
return 0;
}
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*4=4 2*4=8 3*4=12 4*4=16
1*3=3 2*3=6 3*3=9
1*2=2 2*2=4
1*1=1D:\c-code\3-16\x64\Debug\3-16.exe (进程 14852)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .
8.4 跳转控制语句
8.4.1 break
(1)介绍
break 语句用于终止某个语句块的执行,用在 switch 语句或者循环语句中。
(2)流程图

#include<stdio.h>
int main()
{
for (int i = 0; i < 10; i++)
{
if (i==3)
{
break;
}
printf("%d\n", i);
}
return 0;
}
(4)案例:编写程序,要求输入一个数字,判断该数字是否是质数。
说明:质数指只能被 1 和自身整除且大于 1 的数字。
#include<stdio.h>
#include<stdbool.h>
int main()
{
//获取一个数字
int num;
printf("请输入一个数字:");
scanf_s("%2d", &num);
//定义变量,标记是否为质数
//大于1的数字先标记其为质数,再通过循环看是否推翻:小于1的数字直接标记为假
bool isPrime = num > 1 ? 1 : 0;
//循环判断
for (int i = 2; i < num/2; i++)
{
if (num % 1 == 0)
{
isPrime = 0;
break;
}
}
//输出结果
if (isPrime)
{
printf("%d是质数!", num);
}
else
{
printf("%d不是质数!",num);
}
return 0;
}
8.4.2 continue
(1)介绍
continue 语句用于结束本次循环,继续执行下一次循环。
(2)流程图

(3)案例
#include<stdio.h>
int main()
{
for (int i = 0; i < 10; i++)
{
if(i==3)
{
continue;
}
printf("%d\n", i);
}
return 0;
}
0
1
2
4
5
6
7
8
9D:\c-code\3-16\x64\Debug\3-16.exe (进程 31780)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. .
输出100以内的数字,跳过那些7的倍数或者包含7的数字。
#include<stdio.h>
int main()
{
for (int i = 1; i <=100; i++)
{
//i%7,判断7的倍数
//i%10,判断个位上带7的数字
//i/10,判断十位上带7的数字
if (1 % 7 == 0 || 1 % 10 == 7 || i / 10 == 7)
{
continue;
}
printf("%d\n", i);
}
return 0;
}
8.4.3 goto语句
(1)介绍
goto 语句是一种跳转语句,它允许程序控制流程在代码中跳转到带有标签(label)的语
句处,标签(label)的名称可以自行设置,需要满足标识符规范。
注意,我们在开发中不建议使用 goto 语句,但我们需要掌握 goto 语句的执行流程,
以能够看懂其他开发者的代码中可能出现的 goto 语句。
(2)基本语法
goto 标签名//跳转到指定的标签(label)处
...
标签名: //定义一个标签(label)
语句;
(3)流程图

(4)代码示例
使用 goto 语句实现语句跳转。
#include<stdio.h>
int main()
{
printf("start\n");
goto label1;//label1是标签名
printf("ok1\n");
printf("ok2\n");
label1:
printf("ok3 \n");
printf("ok4 \n"); \
return 0;
}
start
ok3
ok4D:\c-code\3-16\x64\Debug\3-16.exe (进程 32752)已退出,代码为 0 (0x0)。
按任意键关闭此窗口. . .
案例:使用 goto 语句实现循环输出数字1-5,
#include<stdio.h>
int main()
{
int i = 1;
start:
if (i<=5)
{
printf("%d", i);
i++;
goto start;//跳转到start处继续执行
}
return 0;
}
课后练习:
(1)实现判断一个整数,属于哪个范围:大于 0;小于 0;等于 0。
(2)判断一个年份是否为闰年。
(3)判断一个整数是否是水仙花数,所谓水仙花数是指一个 3 位数,其各个位上数字
立方和等于其本身,例如:153 = 1*1*1 + 5*5*5 + 3*3*3。
(4)编写程序,根据输入的月份和年份,求出该月的天数(1-12), 就是需要考虑闰
年(2 月份 29)和平年(2 月份 28)。
(5)输入星期几,如果是星期一到星期三,打印:AAA,星期四到星期五,打印:
BBB,星期六到星期日,打印 CCC,如果都不是,提示“输入错误”。
(6)请使用 for、while、do—while 三种形式打印 1000——9999 年内所有的闰年。
(7)输出小写的 a-z 以及大写的 Z—A。
(8)求出 1-1/2+1/3-1/4…..1/100 的和。
每日一测day-4
1.【代码题】请写出下面程序的运行结果
int i;
for(i=0;i<5;i++)
{
printf("%d",i);
i++;
}
printf("\n%d",i);
.【答案】
0 2 4
6
【解析】
(1)在这个程序中,使用了一个 for 循环来迭代 i 的值,然后在循环体内打印 i 的值,接着
将 i 递增,同时,在循环体内部手动将 i 再次递增了一次。
(2)在 for 循环内部,i 从 0 开始,每次递增 2(i++和循环自身的 i++)。因此,for 循环将
执行 3 次(i=0, 2, 4),分别打印 0,2 和 4。
(3)在循环外部,printf("\n%d", i);语句将打印循环结束后的 i 的值,i 最终的值为 6。
2.【代码题】请写出下面程序的运行结果
int sum = 0;
for (int i = 1; i < 5; i++)
{
if (i == 3)
{
continue;
}
sum += i;
}
printf("%d", sum);
【答案】
7
【解析】
(1)当 i 等于 1 时,sum 变为 1。
(2)当 i 等于 2 时,sum 变为 1 + 2 = 3。
(3)当 i 等于 3 时,由于 continue 语句,循环体内的 sum += i;不会执行,所以 sum 保持不
变为 3。
(4)当 i 等于 4 时,sum 变为 3 + 4 = 7。
(5)因此,最终的输出是:7
3.【代码题】以下代码共输出多少次”你好“
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= i; j++)
{
printf("你好 ");
}
}
【答案】
6 次
【解析】
(1)当 i 等于 1 时,内层循环执行一次,输出"尚硅谷"一次。
(2)当 i 等于 2 时,内层循环执行两次,输出"尚硅谷"两次。
(3)当 i 等于 3 时,内层循环执行三次,输出"尚硅谷"三次。
(4)因此,总共输出了 1 + 2 + 3 = 6 次 "尚硅谷"。
4.【编码题】使用 while 循环实现一个死循环
【答案】
while (1)
{
}
9713

被折叠的 条评论
为什么被折叠?



