一:while循环
(1)基本语法
while (循环条件表达式)
{
循环体语句;
}
当循环条件表达式成立,就执行循环体语句,直到条件不成立停止循环
为避免死循环,循环条件表达式不能永远成立,且随着循环次数增加,应该越来越趋向于不成立。
实现计数循环要满足:①必须初始化循环变量 ②循环变量比较作为循环条件 ③循环变量变化。
使用while循环实现如下需求:
循环输出数字 7~15:
#include <stdio.h>
int main()
{
// 循环输出数字 7~15
int n = 7;
while (n <= 15)
{
printf("%d \n", n);
n++;
}
printf("循环结束后循环变量的值:%d", n);
return 0;
}
倒序输出数字 56 ~ 43
#include <stdio.h>
int main()
{
// 倒叙输出数字 56 ~ 43
int i = 56;
while (i >= 43)
{
printf("%d \n", i);
i--;
}
printf("循环结束后循环变量的值:%d", i);
return 0;
}
输出10(包括10)以内所有的偶数
#include <stdio.h>
int main()
{
// 输出10(包括10)以内所有的偶数
/*
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;
}
计算100以内(包括100)所有数字的和
#include <stdio.h>
int main()
{
// 计算100以内(包括100)所有数字的和
int sum = 0; // 定义变量记录和
int i = 1; // 循环变量初始化
while (i <= 100)
{
sum += i;
i++;
}
printf("100以内(包括100)所有数字的和是 %d \n", sum);
printf("循环结束后循环变量的值:%d", i);
return 0;
}
计算10以内所有奇数的乘积
#include <stdio.h>
int main()
{
// 计算10以内所有奇数的乘积
int product = 1; // 定义变量记录乘积
int i = 1;
while (i < 10)
{
product *= i;
i += 2;
}
printf("10以内所有奇数的乘积是 %d \n", product);
printf("循环结束后循环变量的值:%d", i);
return 0;
}
不确定循环
不确定循环直到循环表达式不成立之前,不确定循环次数,不需要循环变量。
实现需求:输入6位数密码,直到密码匹配成功结束循环。
#include <stdio.h>
int main()
{
// 记录正确密码
int pwd1 = 123456;
// 定义变量用于获取输入的密码
int pwd2;
// 循环
while (pwd1 != pwd2)
{
printf("请输入6位数密码:");
scanf("%d", &pwd2);
}
printf("密码正确,欢迎回家!");
return 0;
}
二:do…while循环
(1)基本语法
do
{
循环体语句;
} while (循环条件表达式);
说明:
- do…while循环是先执行再判断,但只有第一次循环语句的执行没有经过判断,以后的每一次仍然先经过判断。
- 注意while后面的分号不能省略。
倒序输出数字56 ~ 43
#include <stdio.h>
int main()
{
// 倒叙输出数字 56 ~ 43
int i = 56;
do
{
printf("%d \n", i);
i--;
} while (i >= 43);
printf("循环结束后循环变量的值:%d", i);
return 0;
}
计算100以内(包括100)所有数字的和
#include <stdio.h>
int main()
{
// 计算100以内(包括100)所有数字的和
int sum = 0; // 定义变量记录和
int i = 1; // 循环变量初始化
do
{
sum += i;
i++;
} while (i <= 100);
printf("100以内(包括100)所有数字的和是 %d \n", sum);
printf("循环结束后循环变量的值:%d", i);
return 0;
}
(2)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;
}
三:for循环
(1)基本语法
for (循环变量初始化; 循环条件表达式; 循环变量变化)
{
循环语句;
}
说明:
- 循环变量初化只执行一次,且循环开始前就执行。
- 循环条件表达式每次循环都执行,同while循环一样,每次先判断后执行循环体语句。
- 循环标记变量变化每次循环都执行,在大括号中循环体语句之后执行。
循环输出数字7~15
#include <stdio.h>
int main()
{
// 循环输出数字 7~15
for (int i = 7; i <= 15; i++)
{
printf("%d \n", i);
}
return 0;
}
输出10(包括10)以内所有的偶数
#include <stdio.h>
int main()
{
// 输出10(包括10)以内所有的偶数
/* for (int i = 0; i <= 10; i ++) {
if (i % 2 == 0) {
printf("%d \n", i);
}
}*/
for (int i = 0; i <= 10; i += 2)
{
printf("%d \n", i);
}
return 0;
}
实现需求:输入6位数密码,直到密码匹配成功结束循环。
#include <stdio.h>
int main()
{
// 正确密码
int pwd1 = 123456;
// 定义变量用于获取输入的密码
int pwd2;
// 循环
for (; pwd1 != pwd2;)
{
printf("请输入6位数密码:");
scanf("%d", &pwd2);
}
printf("密码正确,欢迎回家!");
return 0;
}
(2)特殊结构的for循环
#include <stdio.h>
int main()
{
// 标准结构
for (int i = 1; i < 10; i += 2)
{
printf("%d ", i);
}
printf("\n\n");
// 循环变量写在外面
int i = 1;
for (; i < 10; i += 2)
{
printf("%d ", i);
;
}
printf("\n\n");
// 循环变量写在外面 循环标记变量变化写在大括号中
i = 1;
for (; i < 10;)
{
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;
}
四:多重循环
- 将一个循环放在另一个循环体内,就形成了嵌套循环, 其中,for、while、do…while均可以作为外层循环和内层循环,建议一般使用两层,最多不要超过3层,如果嵌套循环过多,会造成可读性降低。
- 如果外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。
#include <stdio.h>
int main()
{
// 输入列数和行数
int rows, cols;
printf("请输入行数:");
scanf("%d", &rows);
printf("请输入列数:");
scanf("%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;
}
(1)打印九九乘法表
其一:
#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, i * j);
}
printf("\n");
}
return 0;
}
其二:
#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;
}
其三:
#include <stdio.h>
int main()
{
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= 9 - i; j++)
{
printf("\t");
}
for (int j = 1; j <= i; j++)
{
printf("%d*%d=%d\t", j, i, i * j);
}
printf("\n");
}
return 0;
}
其四:
int main()
{
for (int i = 9; i >= 1; i--)
{
for (int j = 1; j <= 9 - i; j++)
{
printf("\t");
}
for (int j = 1; j <= i; j++)
{
printf("%d*%d=%d\t", j, i, i * j);
}
printf("\n");
}
return 0;
}
五:跳转控制语句
(1)break
break语句用于终止某个语句块的执行,用在switch语句或者循环语句中。
#include <stdio.h>
int main()
{
for (int i = 0; i < 10; i++)
{
if (i == 3)
{
break;
}
printf("%d \n", i);
}
return 0;
}
编写程序,要求输入一个数字,判断该数字是否是质数。
#include <stdio.h>
#include <stdbool.h>
int main()
{
// 获取输入的数字
int num;
printf("输入一个数字:");
scanf("%2d", &num);
// 定义变量,标记是否为质数
// 大于1的数字先标记为真,再通过循环看是否推翻; 小于1的数字直接标记为假
_Bool isPrime = num > 1 ? 1 : 0;
// 循环判断
for (int i = 2; i <= num / 2; i++)
{
if (num % i == 0)
{
isPrime = 0;
break;
}
}
// 输出结果
if (isPrime)
{
printf("%d 是质数!", num);
}
else
{
printf("%d 不是质数!", num);
}
return 0;
}
(2)continue
continue语句用于结束本次循环,继续执行下一次循环。
#include <stdio.h>
int main()
{
for (int i = 0; i < 10; i++)
{
if (i == 3)
{
continue;
}
printf("%d \n", i);
}
return 0;
}
输出100以内(包括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 (i % 7 == 0 || i % 10 == 7 || i / 10 == 7)
{
continue; // 跳过
}
printf("%d\n", i);
}
return 0;
}
(3)goto 语句
- 介绍
goto语句是一种跳转语句,它允许程序控制流程在代码中跳转到带有标签(label)的语句处,标签(label)的名称可以自行设置,需要满足标识符规范。
注意,我们在开发中不建议使用goto语句,但我们需要掌握 goto 语句的执行流程,以能够看懂其他开发者的代码中可能出现的 goto 语句。
基本语法:
goto 标签名 // 跳转到指定的标签(label)处
...
标签名: // 定义一个标签(label)
语句;
注意: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;
}
使用goto语句实现循环输出数字1 ~ 5。
int main()
{
int i = 1;
start:
if (i <= 5)
{
printf("%d ", i);
i++;
goto start; // 跳转到标签start处继续执行
}
return 0;
}
六:本章习题
(1)第一题
请使用for、while、do—while 三种形式打印1000——9999年内所有的闰年。
#include <stdio.h>
//请使用for、while、do—while 三种形式打印1000——9999年内所有的闰年。
int main()
{ // 方法一:for循环
// for (int year = 1000; year < 10000; year++)
// {
// if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
// {
// printf("%d\n", year);
// }
// }
// 方法二:while循环
// int year = 1000;
// while (year<10000)
// {
// if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
// printf("%d\n", year);
// }
// year++;
// }
// 方法三:do-while循环
int year = 1000;
do
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
printf("%d\n", year);
}
year++;
} while (year < 10000);
return 0;
}
(2)第二题
输出小写的a-z以及大写的Z—A。
#include <stdio.h>
//输出小写的a-z以及大写的Z—A。
int main()
{
for (int i = 97; i <= 122; i++)
{
printf("%c", i);
}
printf("\n");
for (int j = 90; j >= 65; j--)
{
printf("%c", j);
}
return 0;
}
(3)第三题
求出1-1/2+1/3-1/4…..1/100的和。
#include <stdio.h>
//(8)求出1-1/2+1/3-1/4…..1/100的和。
int main()
{
double sum = 1.0;
for (int i = 2; i <= 100; i++)
{
if (i % 2 == 0)
{
sum -= 1.0/ i;
}
else
{
sum += 1.0 / i;
}
}
printf("%lf", sum);
return 0;
}
(4)第四题
输出星星
#include <stdio.h>
//输出星星
int main()
{ printf("请输入你想要几行星星");
int num;
scanf("%d",&num);
for (int i = 0; i < num; i++)
{
for (int j = 0; j < 2*i -1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
(5)第五题
请写出下面程序的运行结果
int i;
for (i = 0; i < 5; i++)
{
printf("%d ", i);
i++;
}
printf("\n%d", i);
【答案】
0 2 4
6
【解析】
- 在这个程序中,使用了一个for循环来迭代i的值,然后在循环体内打印i的值,接着将i递增,同时,在循环体内部手动将i再次递增了一次。
- 在for循环内部,i从0开始,每次递增2(i++和循环自身的i++)。因此,for循环将执行3次(i=0, 2, 4),分别打印0,2和4。
- 在循环外部,printf("\n%d", i);语句将打印循环结束后的i的值,i最终的值为6。
(6)第六题
请写出下面程序的运行结果
int sum = 0;
for (int i = 1; i < 5; i++)
{
if (i == 3)
{
continue;
}
sum += i;
}
printf("%d", sum);
答案:7
(7)第七题
使用 while 循环实现一个死循环
答案:
while (1)
{
}
本章的内容就到这里。
关注我一起成为嵌入式大佬。