🔄

第5章 循环结构程序设计

谭浩强《C程序设计》第五版 · 交互式教学演示

🔁 1. while 循环(当型循环)

语法形式

while (条件表达式) {
    循环体语句;
}
执行流程:先判断条件,条件为真则执行循环体,然后再次判断……直到条件为假时退出
/* 示例:输出1到n */
int i = 1;
while (i <= n) {
    printf("%d ", i);
    i++;
}

while 循环流程图

开始 条件? 循环体 结束

🎮 while 循环动画演示

① 初始化 i=1
② 判断 i<=n
③ 执行循环体
④ i++
⑤ 退出
🔃 2. do-while 循环(直到型循环)

语法形式

do {
    循环体语句;
} while (条件表达式);
关键区别:先执行一次循环体,再判断条件。即使条件一开始就为假,循环体也会执行至少一次
/* 输入验证:确保输入正整数 */
do {
    printf("请输入正整数: ");
    scanf("%d", &n);
} while (n <= 0);

do-while 流程图

开始 循环体 条件? 结束

🎮 while vs do-while 区别演示

while 循环:

do-while 循环:

🔢 3. for 循环(最常用)

for 循环结构解析

for  ( 初始化 ① 执行一次 条件 ② 每次先判断 更新 ④ 每次最后执行  ) {
循环体;   ← ③ 条件为真时执行
}
① 初始化:执行一次 ② 判断条件 ③ 执行循环体 ④ 更新变量 ↩ 回②

🎮 for 循环计数动画

i=start
i<=end?
printf
i+=step
结束
进度:0%
0%

for 循环的灵活写法

省略初始化表达式:

int i = 0;
for (; i < 5; i++)
    printf("%d ", i);

省略更新表达式:

for (i=0; i < 5;) {
    printf("%d ", i);
    i++;
}

逆向循环:

for (i=10; i >= 1; i--)
    printf("%d ", i);
⚠️ 死循环(三个表达式都省略):
for (;;)
    语句;  // 永远循环!
⚖️ 4. 三种循环对比与转换

相同任务:输出 1 到 5

while 写法

int i = 1;
while (i <= 5) {
  printf("%d ",i);
  i++;
}

do-while 写法

int i = 1;
do {
  printf("%d ",i);
  i++;
} while (i <= 5);

for 写法

for (int i=1;
     i <= 5;
     i++) {
  printf("%d ",i);
}

三种循环特点对比

循环类型先判断/先执行适用场景循环次数不定时
while 先判断条件 不确定循环次数,条件驱动 ✅ 适合
do-while 先执行一次 至少执行一次(如输入验证) ✅ 适合
for 先判断条件 循环次数确定,计数型循环 可以,但 while 更直观
🚦 5. break 与 continue 语句

break — 跳出整个循环

for (i=1; i<=10; i++) {
    if (i == 5)
        break;   // 遇到5就退出
    printf("%d ", i);
}
// 输出: 1 2 3 4

continue — 跳过本次迭代

for (i=1; i<=10; i++) {
    if (i % 2 == 0)
        continue;  // 跳过偶数
    printf("%d ", i);
}
// 输出: 1 3 5 7 9

⚡ break vs continue 可视化对比

break

循环开始 执行语句 break? 是→退出 结束

continue

循环条件 continue? 执行语句 是↑跳过
🪆 6. 循环嵌套

双重 for 循环:乘法表 / 图案打印

/* 九九乘法表 */
for (i=1; i<=9; i++) {
    for (j=1; j<=i; j++) {
        printf("%d×%d=%-3d", j, i, i*j);
    }
    printf("\n");
}

🎮 图案打印演示

🏆 7. 经典算法演示

① 求 1+2+…+n(累加)

int sum = 0;
for (i=1; i<=n; i++)
    sum += i;

② 求阶乘 n!

long long fac = 1;
for (i=1; i<=n; i++)
    fac *= i;

③ 判断素数

int prime = 1;
for (i=2; i*i <= n; i++) {
    if (n % i == 0) {
        prime = 0;
        break;
    }
}

④ 输出所有素数(埃氏筛)

/* 输出2到n之间的所有素数 */
for (n=2; n<=limit; n++) {
    for (i=2; i*i<=n; i++)
        if (n%i==0) break;
    if (i*i > n)
        printf("%d ", n);
}

⑤ 辗转相除法(求最大公约数)

while (b != 0) {
    t = b;
    b = a % b;
    a = t;
}
/* a 即为最大公约数 */