C语言循环结构

循环结构是编程中用于重复执行代码块的控制结构。当需要多次执行相同或类似的操作时,循环可以大大简化代码并提高效率。C语言提供了三种主要的循环结构:for循环、while循环和do-while循环。本文将详细介绍这些循环结构的语法、特点和应用场景。

for循环

for循环是最常用的循环结构,特别适合已知循环次数的情况。

基本语法

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

执行流程

  1. 执行初始化表达式(只执行一次)
  2. 检查条件表达式
  3. 如果条件为真,执行循环体
  4. 执行更新表达式
  5. 返回步骤2,直到条件为假

基本示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>

int main() {
// 打印1到10的数字
printf("1到10的数字:\n");
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:\n");
for (int i = 10; i >= 1; i--) {
printf("%d ", i);
}
printf("\n");

return 0;
}

步长变化的for循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main() {
// 打印偶数
printf("0到20的偶数:\n");
for (int i = 0; i <= 20; i += 2) {
printf("%d ", i);
}
printf("\n");

// 打印2的幂
printf("2的幂(小于1000):\n");
for (int i = 1; i < 1000; i *= 2) {
printf("%d ", i);
}
printf("\n");

return 0;
}

嵌套for循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

int main() {
// 打印乘法表
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;
}

while循环

while循环在条件为真时重复执行循环体,适合循环次数不确定的情况。

基本语法

1
2
3
while (条件) {
// 循环体
}

基本示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main() {
// 使用while循环计算阶乘
int n = 5;
int factorial = 1;
int i = 1;

printf("%d的阶乘计算过程:\n", n);
while (i <= n) {
printf("%d! = %d × %d = ", i, factorial, i);
factorial *= i;
printf("%d\n", factorial);
i++;
}
printf("最终结果:%d! = %d\n", n, factorial);

return 0;
}

用户输入验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main() {
int number;

// 持续要求用户输入,直到输入有效数字
printf("请输入一个1到10之间的数字:");
scanf("%d", &number);

while (number < 1 || number > 10) {
printf("输入无效!请输入1到10之间的数字:");
scanf("%d", &number);
}

printf("你输入的数字是:%d\n", number);

return 0;
}

数字处理示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>

int main() {
int number = 12345;
int digit_count = 0;
int sum_of_digits = 0;
int temp = number;

printf("分析数字:%d\n", number);

// 计算位数和各位数字之和
while (temp > 0) {
int digit = temp % 10; // 获取最后一位
printf("当前位:%d\n", digit);
sum_of_digits += digit;
digit_count++;
temp /= 10; // 去掉最后一位
}

printf("位数:%d\n", digit_count);
printf("各位数字之和:%d\n", sum_of_digits);

return 0;
}

do-while循环

do-while循环至少执行一次循环体,然后检查条件。

基本语法

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

基本示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>

int main() {
int choice;

// 菜单系统
do {
printf("\n=== 主菜单 ===\n");
printf("1. 选项一\n");
printf("2. 选项二\n");
printf("3. 选项三\n");
printf("0. 退出\n");
printf("请选择:");
scanf("%d", &choice);

switch (choice) {
case 1:
printf("你选择了选项一\n");
break;
case 2:
printf("你选择了选项二\n");
break;
case 3:
printf("你选择了选项三\n");
break;
case 0:
printf("再见!\n");
break;
default:
printf("无效选择,请重试\n");
break;
}
} while (choice != 0);

return 0;
}

猜数字游戏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
int secret_number, guess, attempts = 0;
char play_again;

srand(time(NULL)); // 初始化随机数种子

do {
secret_number = rand() % 100 + 1; // 1-100的随机数
attempts = 0;

printf("\n=== 猜数字游戏 ===\n");
printf("我想了一个1到100之间的数字,你能猜到吗?\n");

do {
printf("请输入你的猜测:");
scanf("%d", &guess);
attempts++;

if (guess > secret_number) {
printf("太大了!\n");
} else if (guess < secret_number) {
printf("太小了!\n");
} else {
printf("恭喜!你猜对了!\n");
printf("你用了%d次尝试。\n", attempts);
}
} while (guess != secret_number);

printf("\n想再玩一次吗?(y/n):");
scanf(" %c", &play_again);

} while (play_again == 'y' || play_again == 'Y');

printf("谢谢游戏!\n");
return 0;
}

循环控制语句

break语句

break语句用于立即退出循环。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>

int main() {
// 查找第一个能被7整除的三位数
printf("查找第一个能被7整除的三位数:\n");
for (int i = 100; i <= 999; i++) {
if (i % 7 == 0) {
printf("找到了:%d\n", i);
break; // 找到后立即退出循环
}
}

// 在嵌套循环中使用break
printf("\n在矩阵中查找数字5:\n");
int matrix[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int found = 0;

for (int i = 0; i < 3 && !found; i++) {
for (int j = 0; j < 3; j++) {
printf("检查位置[%d][%d] = %d\n", i, j, matrix[i][j]);
if (matrix[i][j] == 5) {
printf("在位置[%d][%d]找到数字5\n", i, j);
found = 1;
break;
}
}
}

return 0;
}

continue语句

continue语句跳过当前迭代的剩余部分,直接进入下一次迭代。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>

int main() {
// 打印1到20中的奇数
printf("1到20中的奇数:\n");
for (int i = 1; i <= 20; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
printf("%d ", i);
}
printf("\n");

// 计算正数的平均值
int numbers[] = {10, -5, 8, -3, 15, -7, 20};
int count = sizeof(numbers) / sizeof(numbers[0]);
int sum = 0, positive_count = 0;

printf("\n处理数组中的正数:\n");
for (int i = 0; i < count; i++) {
if (numbers[i] <= 0) {
printf("跳过负数或零:%d\n", numbers[i]);
continue;
}
printf("处理正数:%d\n", numbers[i]);
sum += numbers[i];
positive_count++;
}

if (positive_count > 0) {
printf("正数平均值:%.2f\n", (float)sum / positive_count);
}

return 0;
}

无限循环

创建无限循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>

int main() {
int counter = 0;

// 方法1:for循环创建无限循环
/*
for (;;) {
printf("无限循环 %d\n", ++counter);
if (counter >= 5) break;
}
*/

// 方法2:while循环创建无限循环
while (1) {
printf("无限循环 %d\n", ++counter);
if (counter >= 5) {
printf("达到限制,退出循环\n");
break;
}
}

return 0;
}

服务器模拟程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>

int main() {
int command;
int server_running = 1;

printf("服务器启动...\n");

while (server_running) {
printf("\n=== 服务器控制台 ===\n");
printf("1. 查看状态\n");
printf("2. 重启服务\n");
printf("3. 查看日志\n");
printf("0. 关闭服务器\n");
printf("请输入命令:");
scanf("%d", &command);

switch (command) {
case 1:
printf("服务器状态:运行中\n");
break;
case 2:
printf("重启服务...完成\n");
break;
case 3:
printf("显示最近日志...\n");
break;
case 0:
printf("正在关闭服务器...\n");
server_running = 0;
break;
default:
printf("未知命令\n");
break;
}
}

printf("服务器已关闭\n");
return 0;
}

循环的选择指南

何时使用for循环

  • 已知循环次数
  • 需要计数器变量
  • 遍历数组或集合
1
2
3
4
5
6
7
// 遍历数组
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);

for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}

何时使用while循环

  • 循环次数不确定
  • 基于条件的循环
  • 处理用户输入
1
2
3
4
5
// 读取文件直到结束
char ch;
while ((ch = getchar()) != EOF) {
putchar(ch);
}

何时使用do-while循环

  • 至少需要执行一次
  • 菜单驱动程序
  • 输入验证
1
2
3
4
5
6
// 输入验证
int age;
do {
printf("请输入年龄(1-120):");
scanf("%d", &age);
} while (age < 1 || age > 120);

实际应用示例

示例1:素数判断和生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <math.h>

int is_prime(int n) {
if (n <= 1) return 0;
if (n <= 3) return 1;
if (n % 2 == 0 || n % 3 == 0) return 0;

for (int i = 5; i * i <= n; i += 6) {
if (n % i == 0 || n % (i + 2) == 0) {
return 0;
}
}
return 1;
}

int main() {
int limit = 100;

printf("100以内的素数:\n");
for (int i = 2; i <= limit; i++) {
if (is_prime(i)) {
printf("%d ", i);
}
}
printf("\n");

return 0;
}

示例2:简单的银行账户系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>

int main() {
float balance = 1000.0;
int choice;
float amount;
int transaction_count = 0;

printf("欢迎使用银行系统\n");
printf("初始余额:%.2f元\n", balance);

do {
printf("\n=== 银行操作菜单 ===\n");
printf("1. 查询余额\n");
printf("2. 存款\n");
printf("3. 取款\n");
printf("4. 查看交易次数\n");
printf("0. 退出\n");
printf("请选择操作:");
scanf("%d", &choice);

switch (choice) {
case 1:
printf("当前余额:%.2f元\n", balance);
break;
case 2:
printf("请输入存款金额:");
scanf("%f", &amount);
if (amount > 0) {
balance += amount;
transaction_count++;
printf("存款成功!当前余额:%.2f元\n", balance);
} else {
printf("存款金额必须大于0\n");
}
break;
case 3:
printf("请输入取款金额:");
scanf("%f", &amount);
if (amount > 0) {
if (amount <= balance) {
balance -= amount;
transaction_count++;
printf("取款成功!当前余额:%.2f元\n", balance);
} else {
printf("余额不足!当前余额:%.2f元\n", balance);
}
} else {
printf("取款金额必须大于0\n");
}
break;
case 4:
printf("总交易次数:%d次\n", transaction_count);
break;
case 0:
printf("谢谢使用,再见!\n");
break;
default:
printf("无效选择,请重试\n");
break;
}
} while (choice != 0);

return 0;
}

常见错误和注意事项

1. 无限循环

1
2
3
4
5
6
7
8
9
10
11
12
13
// 错误:忘记更新循环变量
int i = 0;
while (i < 10) {
printf("%d\n", i);
// 忘记 i++,导致无限循环
}

// 正确:
int i = 0;
while (i < 10) {
printf("%d\n", i);
i++; // 记住更新循环变量
}

2. 循环边界错误

1
2
3
4
5
6
7
8
9
10
// 错误:数组越界
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i <= 5; i++) { // 应该是 i < 5
printf("%d\n", arr[i]);
}

// 正确:
for (int i = 0; i < 5; i++) {
printf("%d\n", arr[i]);
}

3. 浮点数比较

1
2
3
4
5
6
7
8
9
10
11
// 错误:直接比较浮点数
for (float f = 0.0; f != 1.0; f += 0.1) {
printf("%.1f\n", f);
// 可能因为精度问题导致无限循环
}

// 正确:使用整数计数
for (int i = 0; i < 10; i++) {
float f = i * 0.1;
printf("%.1f\n", f);
}

总结

循环结构是编程中的重要概念,通过本文的学习,你应该掌握:

  1. for循环:适合已知次数的循环
  2. while循环:适合条件驱动的循环
  3. do-while循环:适合至少执行一次的循环
  4. 循环控制:break和continue的使用
  5. 嵌套循环:处理多维问题
  6. 循环选择:根据场景选择合适的循环类型

在实际编程中,要注意:

  • 避免无限循环
  • 正确处理循环边界
  • 合理使用循环控制语句
  • 选择最适合的循环类型

掌握循环结构将大大提高你的编程效率,为处理重复性任务和复杂算法打下坚实的基础。

版权所有,如有侵权请联系我