循环结构
while语句
while 循环:用于重复执行一段代码,直到条件不满足为止。
语法:
while (条件) { // 循环体:条件为真时执行 }
条件:一个布尔表达式,每次循环开始前检查。如果为真(非0),执行循环体;如果为假(0),退出循环。
循环体:需要重复执行的代码块。
执行流程:
检查条件是否为真。
如果为真,执行循环体。
重复步骤1和2,直到条件为假。
示例:
打印1到5的数字
#include <stdio.h> #include <stdlib.h> int main(void) { int i=1; int n=0; printf("请输入n的值\n"); if (scanf("%d", &n) != 1) // 检查scanf返回值是否为1(成功读取一个整数) { printf("输入无效,请输入一个整数\n"); return 1; // 返回1表示输入错误 } while(i <= n) // while循环:当i小于等于n时,执行循环体 { printf("%d\n",i); i++; // i自增1,进入下一次循环 } system("pause"); return 0; // 程序正常退出,返回0表示执行成功 }
假如输入5,则输出
1 2 3 4 5
关键点:
条件控制:
确保条件最终会变为假,否则会进入死循环。
例如:
while (1)
会无限循环。循环体:
必须包含改变条件的代码,否则循环可能无法结束。
例如:
i++
确保i
最终大于5,退出循环。适用场景:
不确定循环次数时(如读取用户输入直到满足条件)。
对比 for 循环:
while:适合不确定循环次数的场景。
for:适合已知循环次数的场景。
例如,下述代码用 for 实现:
for (int i = 1; i <= 5; i++) { printf("%d\n", i); }
do while语句
do while 循环:先执行循环体,再检查条件。即使条件一开始为假,循环体也会至少执行一次。
语法:
do { // 循环体:至少执行一次 } while (条件);
循环体:需要重复执行的代码块。
条件:一个布尔表达式,每次循环结束后检查。如果为真(非0),继续循环;如果为假(0),退出循环。
执行流程:
执行循环体。
检查条件是否为真。
如果为真,重复步骤1和2;如果为假,退出循环。
示例:
用户输入验证
#include <stdio.h> #include <stdlib.h> int main(void) { int num; do { printf("请输入一个正数\n"); scanf("%d",&num); } while (num <= 0); printf("你输入的是:%d\n",num); system("pause"); return 0; }
运行示例:
请输入一个正数:-5 请输入一个正数:0 请输入一个正数:10 你输入的是:10
关键点:
至少执行一次:
即使条件一开始为假,循环体也会执行一次。
例如:
do { ... } while (0);
仍然会执行一次循环体。条件控制:
确保条件最终会变为假,否则会进入死循环。
适用场景:
需要至少执行一次的场景(如用户输入验证、菜单选择)。
对比 while 循环:
while
:先检查条件,再执行循环体(可能一次都不执行)。
do-while
:先执行循环体,再检查条件(至少执行一次)。例如,用 while 实现上述示例:
int number = -1; // 初始化为一个无效值 while (number <= 0) { printf("请输入一个正数:"); scanf("%d", &number); }
for语句
for 循环:用于重复执行一段代码,通常用于已知循环次数的场景。
for (初始化; 条件; 更新) { // 循环体:条件为真时执行 }
初始化:在循环开始前执行一次,通常用于初始化计数器。
条件:每次循环开始前检查。如果为真(非0),执行循环体;如果为假(0),退出循环。
更新:每次循环结束后执行,通常用于更新计数器。
循环体:需要重复执行的代码块。
执行流程:
执行初始化。
检查条件是否为真。
如果为真,执行循环体,然后执行更新,重复步骤2和3。
如果为假,退出循环。
示例 1
打印1到5的数字
#include <stdio.h> #include <stdlib.h> int main() { int i; // 变量声明在循环外 for (i = 1; i <= 5; i++) //i = 1:初始化循环变量 i,将其值设置为 1。 //i <= 5:循环条件。只要 i 的值小于或等于 5,循环就会继续执行。 //i++:每次循环结束后,i 的值增加 1。 { printf("%d\n", i); } system("pause"); return 0; }
示例1:正三角塔
#include <stdio.h> #include <stdlib.h> int main() { int a=5; // 定义整型变量a并赋值为5,表示三角形的高度 int i,j,k; // 声明循环控制变量i、j、k for(i = 1;i <= a;i++){ // 外层循环:控制行数,i从1到a(1到5) for (j = 1; j <= a - i;j++){ // 内层循环1:打印空格,空格数 = a - i printf(" "); // 打印一个空格 } for (k = 1; k <= 2 * i - 1; k++){ // 内层循环2:打印星号,星号数 = 2 * i - 1 printf("*"); //打印一个*号 } printf("\n"); //每行结束后换行 } system("pause"); return 0; }
for循环逐行解释
for (i = 1; i <= a; i++)
外层循环:控制行数,
i
从1
到5
。
for (j = 1; j <= a - i; j++)
内层循环1:打印空格,空格数 =
a - i
。例如:
第1行:
a - i = 5 - 1 = 4
个空格。第2行:
a - i = 5 - 2 = 3
个空格。
printf(" ");
打印一个空格。
for (k = 1; k <= 2 \* i - 1; k++)
内层循环2:打印星号,星号数 =
2 * i - 1
。例如:
第1行:
2 * 1 - 1 = 1
个星号。第2行:
2 * 2 - 1 = 3
个星号。输出:
* *** ***** ******* *********
示例2:倒三角塔
某位同学错误写法
int main(void){ int a=5; int b,c,d; for(b = 1; b <= a; b++){ for(c = 1; c >=a; c++){ printf(" "); } for(d = 1; d=b ;d++){ printf("*"); } printf("\n"); } return 0; }
正确写法
int main(void) { int a = 5; // 定义整型变量a并初始化为5,表示三角形的高度 int b, c, d; // 外层循环:控制行数,b从a(5)递减到1 for (b = a; b >= 1; b--) { for (c = 1; c <= a - b; c++) { // 内层循环1:打印空格,空格数 = a - b printf(" "); } for (d = 1; d <= 2 * b - 1; d++) { // 内层循环2:打印星号,星号数 = 2 * b - 1 printf("*"); } printf("\n"); } system("pause"); return 0; }
for循环逐句解释
for (b = a; b >= 1; b--)
外层循环:控制行数,
b
从a
(5)递减到1
。
for (c = 1; c <= a - b; c++)
内层循环1:打印空格,空格数 =
a - b
。例如:
第1行:
a - b = 5 - 5 = 0
个空格。第2行:
a - b = 5 - 4 = 1
个空格。完美写法
int main(void) { int a; int b, c, d; printf("请输入三角形的高度(正整数):"); // 提示用户输入高度 // 输入验证 if (scanf("%d", &a) != 1 || a <= 0) { // 检查输入是否有效 printf("输入无效,请输入一个正整数。\n"); return 1; // 输入无效,程序异常退出 } for (b = a; b >= 1; b--) { for (c = 1; c <= a - b; c++) { printf(" "); } for (d = 1; d <= 2 * b - 1; d++) { printf("*"); } printf("\n"); } system("pause"); return 0; }
输出
********* ******* ***** *** *