循环结构是编程中用于重复执行代码块的控制结构。当需要多次执行相同或类似的操作时,循环可以大大简化代码并提高效率。C语言提供了三种主要的循环结构:for循环、while循环和do-while循环。本文将详细介绍这些循环结构的语法、特点和应用场景。
for循环 for循环是最常用的循环结构,特别适合已知循环次数的情况。
基本语法
执行流程
执行初始化表达式(只执行一次)
检查条件表达式
如果条件为真,执行循环体
执行更新表达式
返回步骤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 () { printf ("1到10的数字:\n" ); for (int i = 1 ; i <= 10 ; i++) { printf ("%d " , i); } printf ("\n" ); 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" ); 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 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> int main () { 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 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 ; 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 () { printf ("查找第一个能被7整除的三位数:\n" ); for (int i = 100 ; i <= 999 ; i++) { if (i % 7 == 0 ) { printf ("找到了:%d\n" , i); 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 () { 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 ; 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); } 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++) { 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); }
总结 循环结构是编程中的重要概念,通过本文的学习,你应该掌握:
for循环 :适合已知次数的循环
while循环 :适合条件驱动的循环
do-while循环 :适合至少执行一次的循环
循环控制 :break和continue的使用
嵌套循环 :处理多维问题
循环选择 :根据场景选择合适的循环类型
在实际编程中,要注意:
避免无限循环
正确处理循环边界
合理使用循环控制语句
选择最适合的循环类型
掌握循环结构将大大提高你的编程效率,为处理重复性任务和复杂算法打下坚实的基础。
版权所有,如有侵权请联系我