循环结构是程序重复执行某段代码的基础,它让程序能够高效地处理重复性任务。东巴文(db-w.cn) 将带你深入理解C语言的循环结构,掌握程序重复执行的核心技能。
💡 东巴文观点:循环是程序的效率,通过循环,程序可以轻松处理大量重复性工作。
循环是重复执行某段代码的结构,直到满足退出条件为止。
东巴文循环结构图:
开始
↓
初始化
↓
┌──────┐
│ 循环 │ ←──┐
└──────┘ │
↓ │
条件判断 │
↓ │
┌─────┐ │
│ 真 │ ────┘
└─────┘
↓ 假
结束
东巴文循环三要素:
东巴文语法:
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;
}
#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循环流程图:
开始
↓
┌──────┐
│ 条件 │ ──── 假 ──→ 结束
└──────┘
↓ 真
执行循环体
↓
└──────┐
│ │
└──────┘
↑
└─────┘
#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;
}
#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循环流程图:
开始
↓
执行循环体
↓
┌──────┐
│ 条件 │ ──── 假 ──→ 结束
└──────┘
↓ 真
└──────┐
│ │
└──────┘
↑
└─────┘
#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 用于跳出循环。
#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 用于跳过本次循环,继续下一次循环。
#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 用于无条件跳转到指定标签,但不推荐使用。
#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;
}
// ❌ 死循环
int i = 0;
while (i < 10) {
printf("%d\n", i);
// 忘记更新i
}
// ✅ 正确的循环
int i = 0;
while (i < 10) {
printf("%d\n", i);
i++; // 更新计数器
}
// ✅ 已知循环次数,使用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);
// ✅ 使用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);
}
// ❌ 嵌套过深,难以理解
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);
}
}
完成本章学习后,请确认:
掌握循环结构后,你可以继续学习:
如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!
东巴文(db-w.cn) - 让编程学习更简单
📦 东巴文循环结构提示:循环是程序的效率,掌握循环结构是编写高效程序的关键。在 db-w.cn,我们会通过大量实例帮你掌握循环的使用!