qq空间做单页网站网站规划
循环结构
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、kfor(i = 1;i <= a;i++){ // 外层循环:控制行数,i从1到a(1到5)for (j = 1; j <= a - i;j++){ // 内层循环1:打印空格,空格数 = a - iprintf(" "); // 打印一个空格}for (k = 1; k <= 2 * i - 1; k++){ // 内层循环2:打印星号,星号数 = 2 * i - 1printf("*"); //打印一个*号}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)递减到1for (b = a; b >= 1; b--) { for (c = 1; c <= a - b; c++) { // 内层循环1:打印空格,空格数 = a - bprintf(" ");}for (d = 1; d <= 2 * b - 1; d++) { // 内层循环2:打印星号,星号数 = 2 * b - 1printf("*");}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; }
输出
*************************