循环结构

程序的重复执行

循环结构是程序重复执行某段代码的基础,它让程序能够高效地处理重复性任务。东巴文(db-w.cn) 将带你深入理解C语言的循环结构,掌握程序重复执行的核心技能。

💡 东巴文观点:循环是程序的效率,通过循环,程序可以轻松处理大量重复性工作。

循环结构概述

什么是循环?

循环是重复执行某段代码的结构,直到满足退出条件为止。

东巴文循环结构图

开始
  ↓
初始化
  ↓
┌──────┐
│ 循环 │ ←──┐
└──────┘    │
  ↓         │
条件判断    │
  ↓         │
┌─────┐     │
│ 真  │ ────┘
└─────┘
  ↓ 假
结束

循环的三要素

东巴文循环三要素

  1. 初始化:设置循环的初始状态
  2. 条件判断:决定是否继续循环
  3. 更新:改变循环状态,向退出条件靠近

for循环

基本语法

东巴文语法

for (初始化; 条件; 更新) {
    // 循环体
}

东巴文说明

  • 初始化:在循环开始前执行一次
  • 条件:每次循环前检查,为真则继续循环
  • 更新:每次循环后执行

执行流程

东巴文for循环流程图

开始
  ↓
初始化
  ↓
┌──────┐
│ 条件 │ ──── 假 ──→ 结束
└──────┘
  ↓ 真
执行循环体
  ↓
更新
  ↓
└──────┐
│      │
└──────┘
  ↑
  └─────┘

示例代码

#include <stdio.h>

int main() {
    printf("=== 东巴文for循环示例 ===\n\n");
    
    // 基本for循环
    printf("1到10:");
    for (int i = 1; i <= 10; i++) {
        printf("%d ", i);
    }
    printf("\n");
    
    // 计算1到100的和
    int sum = 0;
    for (int i = 1; i <= 100; i++) {
        sum += i;
    }
    printf("1到100的和:%d\n", sum);
    
    // 倒序输出
    printf("10到1:");
    for (int i = 10; i >= 1; i--) {
        printf("%d ", i);
    }
    printf("\n");
    
    return 0;
}

for循环的变体

#include <stdio.h>

int main() {
    // 省略初始化
    int i = 1;
    for (; i <= 10; i++) {
        printf("%d ", i);
    }
    printf("\n");
    
    // 省略条件(死循环)
    // for (int i = 1; ; i++) {
    //     printf("%d ", i);
    // }
    
    // 省略更新
    for (int i = 1; i <= 10; ) {
        printf("%d ", i);
        i++;
    }
    printf("\n");
    
    // 多个变量
    for (int i = 1, j = 10; i <= j; i++, j--) {
        printf("i=%d, j=%d\n", i, j);
    }
    
    return 0;
}

while循环

基本语法

东巴文语法

while (条件) {
    // 循环体
}

东巴文说明

  • 先检查条件,条件为真则执行循环体
  • 执行完循环体后再次检查条件
  • 直到条件为假才退出循环

执行流程

东巴文while循环流程图

开始
  ↓
┌──────┐
│ 条件 │ ──── 假 ──→ 结束
└──────┘
  ↓ 真
执行循环体
  ↓
└──────┐
│      │
└──────┘
  ↑
  └─────┘

示例代码

#include <stdio.h>

int main() {
    printf("=== 东巴文while循环示例 ===\n\n");
    
    // 基本while循环
    int i = 1;
    printf("1到10:");
    while (i <= 10) {
        printf("%d ", i);
        i++;
    }
    printf("\n");
    
    // 计算1到100的和
    int sum = 0;
    i = 1;
    while (i <= 100) {
        sum += i;
        i++;
    }
    printf("1到100的和:%d\n", sum);
    
    // 读取输入,直到输入0
    int num;
    printf("请输入数字(0退出):");
    while (scanf("%d", &num) == 1 && num != 0) {
        printf("输入:%d\n", num);
    }
    
    return 0;
}

while循环的应用

#include <stdio.h>

int main() {
    // 计算数字的位数
    int num = 12345;
    int count = 0;
    
    while (num != 0) {
        count++;
        num /= 10;
    }
    
    printf("数字有%d位\n", count);
    
    // 反转数字
    int original = 12345;
    int reversed = 0;
    num = original;
    
    while (num != 0) {
        reversed = reversed * 10 + num % 10;
        num /= 10;
    }
    
    printf("原数字:%d, 反转后:%d\n", original, reversed);
    
    return 0;
}

do-while循环

基本语法

东巴文语法

do {
    // 循环体
} while (条件);

东巴文说明

  • 先执行一次循环体
  • 然后检查条件,条件为真则继续循环
  • 直到条件为假才退出循环
  • 至少执行一次循环体

执行流程

东巴文do-while循环流程图

开始
  ↓
执行循环体
  ↓
┌──────┐
│ 条件 │ ──── 假 ──→ 结束
└──────┘
  ↓ 真
└──────┐
│      │
└──────┘
  ↑
  └─────┘

示例代码

#include <stdio.h>

int main() {
    printf("=== 东巴文do-while循环示例 ===\n\n");
    
    // 基本do-while循环
    int i = 1;
    printf("1到10:");
    do {
        printf("%d ", i);
        i++;
    } while (i <= 10);
    printf("\n");
    
    // 至少执行一次
    int num = 10;
    do {
        printf("这个循环至少执行一次\n");
    } while (num < 5);
    
    // 菜单选择
    int choice;
    do {
        printf("\n=== 菜单 ===\n");
        printf("1. 选项1\n");
        printf("2. 选项2\n");
        printf("3. 选项3\n");
        printf("0. 退出\n");
        printf("请选择:");
        scanf("%d", &choice);
        
        switch (choice) {
            case 1:
                printf("选择了选项1\n");
                break;
            case 2:
                printf("选择了选项2\n");
                break;
            case 3:
                printf("选择了选项3\n");
                break;
            case 0:
                printf("退出程序\n");
                break;
            default:
                printf("无效选择!\n");
                break;
        }
    } while (choice != 0);
    
    return 0;
}

循环对比

三种循环的区别

东巴文循环对比表

循环类型 执行顺序 最少执行次数 使用场景 东巴文说明
for 先判断后执行 0次 已知循环次数 最常用
while 先判断后执行 0次 未知循环次数 条件控制
do-while 先执行后判断 1次 至少执行一次 特殊场景

选择循环的原则

#include <stdio.h>

int main() {
    // ✅ 已知循环次数,使用for循环
    printf("使用for循环:");
    for (int i = 1; i <= 10; i++) {
        printf("%d ", i);
    }
    printf("\n");
    
    // ✅ 未知循环次数,使用while循环
    printf("使用while循环:\n");
    int num;
    while (scanf("%d", &num) == 1 && num != 0) {
        printf("输入:%d\n", num);
    }
    
    // ✅ 至少执行一次,使用do-while循环
    printf("使用do-while循环:\n");
    int choice;
    do {
        printf("请输入选项(1-3, 0退出):");
        scanf("%d", &choice);
    } while (choice < 0 || choice > 3);
    
    return 0;
}

嵌套循环

基本概念

嵌套循环是指在一个循环内部包含另一个循环。

示例代码

#include <stdio.h>

int main() {
    printf("=== 东巴文嵌套循环示例 ===\n\n");
    
    // 打印九九乘法表
    printf("九九乘法表:\n");
    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");
    }
    
    // 打印图形
    printf("\n打印图形:\n");
    for (int i = 1; i <= 5; i++) {
        for (int j = 1; j <= i; j++) {
            printf("*");
        }
        printf("\n");
    }
    
    // 打印矩形
    printf("\n打印矩形:\n");
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= 5; j++) {
            printf("*");
        }
        printf("\n");
    }
    
    return 0;
}

嵌套循环的应用

#include <stdio.h>

int main() {
    // 打印金字塔
    printf("金字塔:\n");
    for (int i = 1; i <= 5; i++) {
        // 打印空格
        for (int j = 1; j <= 5 - i; j++) {
            printf(" ");
        }
        // 打印星号
        for (int j = 1; j <= 2 * i - 1; j++) {
            printf("*");
        }
        printf("\n");
    }
    
    // 打印菱形
    printf("\n菱形:\n");
    int n = 5;
    // 上半部分
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n - i; j++) {
            printf(" ");
        }
        for (int j = 1; j <= 2 * i - 1; j++) {
            printf("*");
        }
        printf("\n");
    }
    // 下半部分
    for (int i = n - 1; i >= 1; i--) {
        for (int j = 1; j <= n - i; j++) {
            printf(" ");
        }
        for (int j = 1; j <= 2 * i - 1; j++) {
            printf("*");
        }
        printf("\n");
    }
    
    return 0;
}

跳转语句

break语句

东巴文说明break 用于跳出循环。

#include <stdio.h>

int main() {
    printf("=== 东巴文break示例 ===\n\n");
    
    // 跳出for循环
    printf("跳出for循环:");
    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            printf("遇到5,跳出循环\n");
            break;
        }
        printf("%d ", i);
    }
    printf("\n");
    
    // 查找第一个能被7整除的数
    for (int i = 1; i <= 100; i++) {
        if (i % 7 == 0) {
            printf("第一个能被7整除的数:%d\n", i);
            break;
        }
    }
    
    // 跳出嵌套循环
    printf("\n跳出嵌套循环:\n");
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= 3; j++) {
            if (i == 2 && j == 2) {
                printf("跳出内层循环\n");
                break;
            }
            printf("(%d, %d) ", i, j);
        }
        printf("\n");
    }
    
    return 0;
}

continue语句

东巴文说明continue 用于跳过本次循环,继续下一次循环。

#include <stdio.h>

int main() {
    printf("=== 东巴文continue示例 ===\n\n");
    
    // 跳过偶数
    printf("1到10的奇数:");
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            continue;  // 跳过偶数
        }
        printf("%d ", i);
    }
    printf("\n");
    
    // 跳过特定数字
    printf("跳过5:");
    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            continue;
        }
        printf("%d ", i);
    }
    printf("\n");
    
    // 只输出能被3整除的数
    printf("1到20中能被3整除的数:");
    for (int i = 1; i <= 20; i++) {
        if (i % 3 != 0) {
            continue;
        }
        printf("%d ", i);
    }
    printf("\n");
    
    return 0;
}

goto语句

东巴文说明goto 用于无条件跳转到指定标签,但不推荐使用。

#include <stdio.h>

int main() {
    printf("=== 东巴文goto示例 ===\n\n");
    
    // 使用goto跳出多层循环
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= 3; j++) {
            if (i == 2 && j == 2) {
                printf("跳出多层循环\n");
                goto end;
            }
            printf("(%d, %d) ", i, j);
        }
        printf("\n");
    }
    
end:
    printf("程序结束\n");
    
    return 0;
}

东巴文警告goto 语句会破坏程序结构,应尽量避免使用。

循环应用实例

累加求和

#include <stdio.h>

int main() {
    // 计算1到100的和
    int sum = 0;
    for (int i = 1; i <= 100; i++) {
        sum += i;
    }
    printf("1到100的和:%d\n", sum);
    
    // 计算阶乘
    int n = 5;
    long factorial = 1;
    for (int i = 1; i <= n; i++) {
        factorial *= i;
    }
    printf("%d! = %ld\n", n, factorial);
    
    // 计算斐波那契数列
    printf("斐波那契数列前10项:\n");
    int a = 1, b = 1;
    printf("%d %d ", a, b);
    for (int i = 3; i <= 10; i++) {
        int c = a + b;
        printf("%d ", c);
        a = b;
        b = c;
    }
    printf("\n");
    
    return 0;
}

查找和统计

#include <stdio.h>

int main() {
    int arr[] = {3, 7, 2, 9, 5, 8, 1, 6, 4, 0};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    // 查找最大值
    int max = arr[0];
    for (int i = 1; i < size; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    printf("最大值:%d\n", max);
    
    // 查找最小值
    int min = arr[0];
    for (int i = 1; i < size; i++) {
        if (arr[i] < min) {
            min = arr[i];
        }
    }
    printf("最小值:%d\n", min);
    
    // 统计偶数个数
    int count = 0;
    for (int i = 0; i < size; i++) {
        if (arr[i] % 2 == 0) {
            count++;
        }
    }
    printf("偶数个数:%d\n", count);
    
    return 0;
}

数字处理

#include <stdio.h>

int main() {
    // 计算数字的位数
    int num = 12345;
    int count = 0;
    int temp = num;
    
    while (temp != 0) {
        count++;
        temp /= 10;
    }
    printf("%d有%d位\n", num, count);
    
    // 反转数字
    int reversed = 0;
    temp = num;
    while (temp != 0) {
        reversed = reversed * 10 + temp % 10;
        temp /= 10;
    }
    printf("反转后:%d\n", reversed);
    
    // 判断回文数
    temp = num;
    reversed = 0;
    int original = temp;
    while (temp != 0) {
        reversed = reversed * 10 + temp % 10;
        temp /= 10;
    }
    if (original == reversed) {
        printf("%d是回文数\n", original);
    } else {
        printf("%d不是回文数\n", original);
    }
    
    return 0;
}

东巴文最佳实践

1. 避免死循环

// ❌ 死循环
int i = 0;
while (i < 10) {
    printf("%d\n", i);
    // 忘记更新i
}

// ✅ 正确的循环
int i = 0;
while (i < 10) {
    printf("%d\n", i);
    i++;  // 更新计数器
}

2. 选择合适的循环

// ✅ 已知循环次数,使用for循环
for (int i = 0; i < 10; i++) {
    printf("%d\n", i);
}

// ✅ 未知循环次数,使用while循环
int num;
while (scanf("%d", &num) == 1 && num != 0) {
    printf("输入:%d\n", num);
}

// ✅ 至少执行一次,使用do-while循环
int choice;
do {
    printf("菜单:\n");
    scanf("%d", &choice);
} while (choice != 0);

3. 合理使用break和continue

// ✅ 使用break提前退出
for (int i = 1; i <= 100; i++) {
    if (i % 7 == 0) {
        printf("第一个能被7整除的数:%d\n", i);
        break;
    }
}

// ✅ 使用continue跳过特定情况
for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        continue;  // 跳过5
    }
    printf("%d ", i);
}

4. 循环嵌套不要过深

// ❌ 嵌套过深,难以理解
for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        for (int k = 0; k < 10; k++) {
            // 代码逻辑
        }
    }
}

// ✅ 拆分为函数
void processLevel2(int i, int j) {
    for (int k = 0; k < 10; k++) {
        // 代码逻辑
    }
}

void processLevel1(int i) {
    for (int j = 0; j < 10; j++) {
        processLevel2(i, j);
    }
}

东巴文验证清单

完成本章学习后,请确认:

  • 理解循环的概念
  • 掌握for循环的使用
  • 掌握while循环的使用
  • 掌握do-while循环的使用
  • 理解三种循环的区别
  • 掌握嵌套循环的使用
  • 掌握break和continue的使用
  • 了解goto语句的使用
  • 能使用循环解决实际问题
  • 了解循环的最佳实践

下一步学习

掌握循环结构后,你可以继续学习:

如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!


东巴文(db-w.cn) - 让编程学习更简单

📦 东巴文循环结构提示:循环是程序的效率,掌握循环结构是编写高效程序的关键。在 db-w.cn,我们会通过大量实例帮你掌握循环的使用!