流程控制

程序的执行路径

流程控制是程序设计的核心,它决定了程序的执行路径。东巴文(db-w.cn) 将带你深入理解C语言的流程控制,掌握程序逻辑的核心技能。

💡 东巴文观点:流程控制是程序的大脑,通过条件判断和循环,程序可以根据不同情况做出不同的响应。

流程控制概述

程序的三种基本结构

东巴文程序结构图

程序结构
├── 顺序结构
│   └── 按照代码顺序依次执行
├── 选择结构
│   ├── if语句
│   ├── if-else语句
│   ├── if-else if-else语句
│   └── switch语句
└── 循环结构
    ├── for循环
    ├── while循环
    └── do-while循环

东巴文说明

  • 顺序结构:最基本的结构,按照代码书写的顺序依次执行
  • 选择结构:根据条件判断选择不同的执行路径
  • 循环结构:重复执行某段代码,直到满足退出条件

顺序结构

基本概念

顺序结构是最简单的程序结构,程序按照代码书写的顺序,从上到下依次执行每一条语句。

示例代码

#include <stdio.h>

int main() {
    printf("=== 东巴文顺序结构示例 ===\n\n");
    
    // 第一步:声明变量
    int a = 10;
    int b = 20;
    
    // 第二步:计算
    int sum = a + b;
    
    // 第三步:输出结果
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("sum = %d\n", sum);
    
    return 0;
}

东巴文说明:顺序结构就像一条直线,程序从起点走到终点,中间不会跳过任何步骤。

选择结构

if语句

东巴文语法

if (条件表达式) {
    // 条件为真时执行的代码
}

示例代码

#include <stdio.h>

int main() {
    int age;
    
    printf("请输入年龄:");
    scanf("%d", &age);
    
    if (age >= 18) {
        printf("您已成年!\n");
    }
    
    return 0;
}

if-else语句

东巴文语法

if (条件表达式) {
    // 条件为真时执行的代码
} else {
    // 条件为假时执行的代码
}

示例代码

#include <stdio.h>

int main() {
    int num;
    
    printf("请输入一个整数:");
    scanf("%d", &num);
    
    if (num % 2 == 0) {
        printf("%d 是偶数\n", num);
    } else {
        printf("%d 是奇数\n", num);
    }
    
    return 0;
}

if-else if-else语句

东巴文语法

if (条件表达式1) {
    // 条件1为真时执行
} else if (条件表达式2) {
    // 条件2为真时执行
} else if (条件表达式3) {
    // 条件3为真时执行
} else {
    // 所有条件都为假时执行
}

示例代码

#include <stdio.h>

int main() {
    int score;
    
    printf("请输入成绩:");
    scanf("%d", &score);
    
    if (score >= 90) {
        printf("优秀!\n");
    } else if (score >= 80) {
        printf("良好!\n");
    } else if (score >= 70) {
        printf("中等!\n");
    } else if (score >= 60) {
        printf("及格!\n");
    } else {
        printf("不及格!\n");
    }
    
    return 0;
}

switch语句

东巴文语法

switch (表达式) {
    case 常量1:
        // 代码块1
        break;
    case 常量2:
        // 代码块2
        break;
    // ...
    default:
        // 默认代码块
        break;
}

示例代码

#include <stdio.h>

int main() {
    int day;
    
    printf("请输入星期几(1-7):");
    scanf("%d", &day);
    
    switch (day) {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;
        case 4:
            printf("星期四\n");
            break;
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期日\n");
            break;
        default:
            printf("输入错误!\n");
            break;
    }
    
    return 0;
}

break的作用

#include <stdio.h>

int main() {
    int num = 2;
    
    // 没有break的情况
    printf("没有break:\n");
    switch (num) {
        case 1:
            printf("case 1\n");
        case 2:
            printf("case 2\n");
        case 3:
            printf("case 3\n");
        default:
            printf("default\n");
    }
    
    // 有break的情况
    printf("\n有break:\n");
    switch (num) {
        case 1:
            printf("case 1\n");
            break;
        case 2:
            printf("case 2\n");
            break;
        case 3:
            printf("case 3\n");
            break;
        default:
            printf("default\n");
            break;
    }
    
    return 0;
}

东巴文说明break 语句用于跳出 switch 语句,如果没有 break,程序会继续执行下一个 case。

嵌套if语句

#include <stdio.h>

int main() {
    int age;
    char gender;
    
    printf("请输入年龄:");
    scanf("%d", &age);
    
    printf("请输入性别(M/F):");
    scanf(" %c", &gender);
    
    if (age >= 18) {
        if (gender == 'M' || gender == 'm') {
            printf("成年男性\n");
        } else if (gender == 'F' || gender == 'f') {
            printf("成年女性\n");
        }
    } else {
        printf("未成年\n");
    }
    
    return 0;
}

条件运算符

#include <stdio.h>

int main() {
    int a = 10, b = 5;
    
    // 使用条件运算符
    int max = (a > b) ? a : b;
    printf("最大值:%d\n", max);
    
    // 等价的if-else语句
    int max2;
    if (a > b) {
        max2 = a;
    } else {
        max2 = b;
    }
    printf("最大值:%d\n", max2);
    
    return 0;
}

循环结构

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;
}

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);
    
    return 0;
}

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);
    
    return 0;
}

循环对比

东巴文循环对比表

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

嵌套循环

#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");
    }
    
    return 0;
}

跳转语句

break语句

东巴文说明break 用于跳出循环或 switch 语句。

#include <stdio.h>

int main() {
    printf("=== 东巴文break示例 ===\n\n");
    
    // 跳出循环
    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;
        }
    }
    
    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");
    
    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() {
    // 正确的计数器使用
    int count = 0;
    for (int i = 1; i <= 100; i++) {
        if (i % 7 == 0) {
            count++;
        }
    }
    printf("1到100中能被7整除的数有%d个\n", count);
    
    return 0;
}

循环累加

#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);
    
    return 0;
}

循环查找

#include <stdio.h>

int main() {
    int arr[] = {3, 7, 2, 9, 5, 8, 1, 6, 4, 0};
    int target = 5;
    int found = 0;
    int index = -1;
    
    // 查找目标值
    for (int i = 0; i < 10; i++) {
        if (arr[i] == target) {
            found = 1;
            index = i;
            break;
        }
    }
    
    if (found) {
        printf("找到%d,位置:%d\n", target, index);
    } else {
        printf("未找到%d\n", target);
    }
    
    return 0;
}

东巴文最佳实践

1. 选择合适的循环

// ✅ 已知循环次数,使用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");
    printf("1. 选项1\n");
    printf("2. 选项2\n");
    printf("0. 退出\n");
    printf("请选择:");
    scanf("%d", &choice);
} while (choice != 0);

2. 避免死循环

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

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

3. 合理使用break和continue

#include <stdio.h>

int main() {
    // ✅ 使用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);
    }
    printf("\n");
    
    return 0;
}

4. 循环嵌套不要过深

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

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

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

东巴文验证清单

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

  • 理解程序的三种基本结构
  • 掌握if语句的使用
  • 掌握if-else语句的使用
  • 掌握if-else if-else语句的使用
  • 掌握switch语句的使用
  • 掌握for循环的使用
  • 掌握while循环的使用
  • 掌握do-while循环的使用
  • 掌握break和continue的使用
  • 了解goto语句的使用

下一步学习

掌握流程控制后,你可以继续学习:

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


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

📦 东巴文流程控制提示:流程控制是程序的核心,掌握条件判断和循环是编写复杂程序的基础。在 db-w.cn,我们会通过大量实例帮你掌握流程控制的使用!