流程控制是程序设计的核心,它决定了程序的执行路径。东巴文(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 (条件表达式) {
// 条件为真时执行的代码
}
#include <stdio.h>
int main() {
int age;
printf("请输入年龄:");
scanf("%d", &age);
if (age >= 18) {
printf("您已成年!\n");
}
return 0;
}
东巴文语法:
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 (条件表达式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 (表达式) {
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;
}
#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。
#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 (初始化; 条件; 更新) {
// 循环体
}
东巴文说明:
#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 (条件) {
// 循环体
}
东巴文说明:先检查条件,条件为真则执行循环体,然后再次检查条件,直到条件为假。
#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 (条件);
东巴文说明:先执行一次循环体,然后检查条件,条件为真则继续循环,直到条件为假。
#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 用于跳出循环或 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 用于跳过本次循环,继续下一次循环。
#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 用于无条件跳转到指定标签,但不推荐使用。
#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;
}
// ✅ 已知循环次数,使用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);
// ❌ 死循环
int i = 0;
while (i < 10) {
printf("%d\n", i);
// 忘记更新i
}
// ✅ 正确的循环
int i = 0;
while (i < 10) {
printf("%d\n", i);
i++; // 更新计数器
}
#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;
}
// ❌ 嵌套过深,难以理解
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);
}
}
完成本章学习后,请确认:
掌握流程控制后,你可以继续学习:
如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!
东巴文(db-w.cn) - 让编程学习更简单
📦 东巴文流程控制提示:流程控制是程序的核心,掌握条件判断和循环是编写复杂程序的基础。在 db-w.cn,我们会通过大量实例帮你掌握流程控制的使用!