概述
本文档详细介绍C语言中的各种控制流结构,包括条件语句、循环语句以及控制循环的特殊语句。控制流结构是程序设计的核心部分,它们允许程序根据不同的条件执行不同的代码块,或者重复执行某些代码块。
条件语句
if-else语句
if-else语句是C语言中最基本的条件语句,用于根据条件的真假执行不同的代码块。
基本语法
1 2 3 4 5 6 7
| if (条件表达式) { } else if (另一个条件表达式) { } else { }
|
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| int number = 10;
if (number > 0) { printf("%d 是正数\n", number); } else if (number < 0) { printf("%d 是负数\n", number); } else { printf("%d 是零\n", number); }
int age = 25; if (age >= 18) { printf("%d岁,已成年", age); if (age >= 60) { printf(",且已退休\n"); } else { printf(",但未退休\n"); } } else { printf("%d岁,未成年\n", age); }
|
补充示例:判断闰年
1 2 3 4 5 6 7 8
| int year = 2024;
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { printf("%d年是闰年\n", year); } else { printf("%d年不是闰年\n", year); }
|
switch语句
switch语句用于根据变量的值选择执行不同的代码块,适用于多分支条件判断。
基本语法
1 2 3 4 5 6 7 8 9 10 11 12
| switch (表达式) { case 值1: break; case 值2: break; default: break; }
|
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| char grade = 'B'; switch (grade) { case 'A': printf("优秀\n"); break; case 'B': printf("良好\n"); break; case 'C': printf("中等\n"); break; case 'D': printf("及格\n"); break; case 'F': printf("不及格\n"); break; default: printf("无效等级\n"); break; }
|
补充示例:使用switch判断月份天数
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
| int month = 2; int year = 2024; int days;
switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 4: case 6: case 9: case 11: days = 30; break; case 2: if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { days = 29; } else { days = 28; } break; default: days = 0; printf("无效的月份\n"); break; }
if (days > 0) { printf("%d年%d月有%d天\n", year, month, days); }
|
循环语句
for循环
for循环是一种常用的循环语句,特别适合已知循环次数的情况。
基本语法
1 2 3
| for (初始化表达式; 条件表达式; 更新表达式) { }
|
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| printf("1到5的数字:"); for (int i = 1; i <= 5; i++) { printf("%d ", i); } printf("\n");
printf("5到1的数字:"); for (int i = 5; i >= 1; i--) { printf("%d ", i); } printf("\n");
printf("1到10的奇数:"); for (int i = 1; i <= 10; i += 2) { printf("%d ", i); } printf("\n");
|
补充示例:计算阶乘
1 2 3 4 5 6 7 8 9
| int n = 5; long long factorial = 1;
for (int i = 1; i <= n; i++) { factorial *= i; }
printf("%d的阶乘是:%lld\n", n, factorial);
|
while循环
while循环在条件为真时重复执行循环体,适合不确定循环次数的情况。
基本语法
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| int count = 1; printf("1到5的数字:"); while (count <= 5) { printf("%d ", count); count++; } printf("\n");
int sum = 0; int num = 1; while (num <= 100) { sum += num; num++; } printf("1到100的和:%d\n", sum);
|
补充示例:猜数字游戏
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
| #include <stdio.h> #include <stdlib.h> #include <time.h>
int main() { int secret_number, guess, attempts = 0; srand(time(0)); secret_number = rand() % 100 + 1; printf("猜数字游戏:请猜一个1-100之间的数字\n"); while (1) { printf("请输入你的猜测:"); scanf("%d", &guess); attempts++; if (guess < secret_number) { printf("太小了!\n"); } else if (guess > secret_number) { printf("太大了!\n"); } else { printf("恭喜你猜对了!你用了%d次尝试\n", attempts); break; } } return 0; }
|
do-while循环
do-while循环与while循环类似,但它会先执行一次循环体,然后再检查条件是否为真。
基本语法
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| int i = 1; printf("1到5的数字:"); do { printf("%d ", i); i++; } while (i <= 5); printf("\n");
int j = 10; printf("即使条件一开始就不满足,do-while也会执行一次:"); do { printf("%d ", j); j++; } while (j <= 5); printf("\n");
|
补充示例:菜单选择
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
| int choice;
do { printf("\n菜单:\n"); printf("1. 选项一\n"); printf("2. 选项二\n"); printf("3. 选项三\n"); printf("4. 退出\n"); printf("请选择(1-4):"); scanf("%d", &choice); switch (choice) { case 1: printf("你选择了选项一\n"); break; case 2: printf("你选择了选项二\n"); break; case 3: printf("你选择了选项三\n"); break; case 4: printf("退出程序\n"); break; default: printf("无效的选择,请重新输入\n"); break; } } while (choice != 4);
|
嵌套循环
嵌套循环是指在一个循环内部包含另一个循环,常用于处理二维数组、矩阵等二维结构。
示例代码
1 2 3 4 5 6 7 8
| printf("九九乘法表(前5行):\n"); for (int row = 1; row <= 5; row++) { for (int col = 1; col <= row; col++) { printf("%d*%d=%-2d ", col, row, col * row); } printf("\n"); }
|
补充示例:打印金字塔
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int height = 5;
for (int i = 1; i <= height; i++) { for (int j = 1; j <= height - i; j++) { printf(" "); } for (int k = 1; k <= 2 * i - 1; k++) { printf("*"); } printf("\n"); }
|
控制循环的特殊语句
break语句
break语句用于跳出当前循环或switch语句,执行循环或switch语句之后的代码。
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| printf("使用break,当i=3时跳出循环:"); for (int i = 1; i <= 5; i++) { if (i == 3) { break; } printf("%d ", i); } printf("\n");
printf("在while循环中使用break,当count=4时跳出:"); int count_break = 1; while (count_break <= 5) { if (count_break == 4) { break; } printf("%d ", count_break); count_break++; } printf("\n");
|
continue语句
continue语句用于跳过当前循环的剩余部分,直接开始下一次循环迭代。
示例代码
1 2 3 4 5 6 7 8 9
| printf("使用continue,跳过i=3:"); for (int i = 1; i <= 5; i++) { if (i == 3) { continue; } printf("%d ", i); } printf("\n");
|
补充示例:使用continue跳过偶数
1 2 3 4 5 6 7 8 9
| printf("1到10之间的奇数:"); for (int i = 1; i <= 10; i++) { if (i % 2 == 0) { continue; } printf("%d ", i); } printf("\n");
|
goto语句
goto语句用于无条件跳转到程序中的指定标签位置,应谨慎使用,以免破坏程序的结构。
基本语法
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int i, j;
for (i = 1; i <= 3; i++) { for (j = 1; j <= 3; j++) { printf("i=%d, j=%d\n", i, j); if (i == 2 && j == 2) { goto end_loop; } } }
end_loop: printf("跳出循环\n");
|
综合示例
示例1:判断素数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| int num = 17; int is_prime = 1;
if (num <= 1) { is_prime = 0; } else { for (int i = 2; i * i <= num; i++) { if (num % i == 0) { is_prime = 0; break; } } }
if (is_prime) { printf("%d是素数\n", num); } else { printf("%d不是素数\n", num); }
|
示例2:斐波那契数列
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int n = 10; int a = 0, b = 1, c;
printf("斐波那契数列的前%d项:\n", n); printf("%d %d ", a, b);
for (int i = 2; i < n; i++) { c = a + b; printf("%d ", c); a = b; b = c; } printf("\n");
|
总结
C语言提供了丰富的控制流结构,包括:
条件语句:
if-else语句:用于基本的条件判断
switch语句:用于多分支条件判断
循环语句:
for循环:适合已知循环次数的情况
while循环:适合不确定循环次数的情况
do-while循环:至少执行一次循环体
- 嵌套循环:处理二维结构
控制循环的特殊语句:
break:跳出当前循环或switch语句
continue:跳过当前循环的剩余部分
goto:无条件跳转到指定标签(应谨慎使用)
掌握这些控制流结构是编写高效、灵活的C程序的基础。在实际编程中,应根据具体情况选择合适的控制流结构,以提高代码的可读性和执行效率。
control_flow.c
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
| #include <stdio.h>
int main() { printf("=== if-else 语句 ===\n"); int number = 10; if (number > 0) { printf("%d 是正数\n", number); } else if (number < 0) { printf("%d 是负数\n", number); } else { printf("%d 是零\n", number); } int age = 25; if (age >= 18) { printf("%d岁,已成年", age); if (age >= 60) { printf(",且已退休\n"); } else { printf(",但未退休\n"); } } else { printf("%d岁,未成年\n", age); } printf("\n"); printf("=== switch 语句 ===\n"); char grade = 'B'; switch (grade) { case 'A': printf("优秀\n"); break; case 'B': printf("良好\n"); break; case 'C': printf("中等\n"); break; case 'D': printf("及格\n"); break; case 'F': printf("不及格\n"); break; default: printf("无效等级\n"); break; } printf("\n"); printf("=== for 循环 ===\n"); printf("1到5的数字:"); for (int i = 1; i <= 5; i++) { printf("%d ", i); } printf("\n"); printf("5到1的数字:"); for (int i = 5; i >= 1; i--) { printf("%d ", i); } printf("\n"); printf("1到10的奇数:"); for (int i = 1; i <= 10; i += 2) { printf("%d ", i); } printf("\n\n"); printf("=== while 循环 ===\n"); int count = 1; printf("1到5的数字:"); while (count <= 5) { printf("%d ", count); count++; } printf("\n"); int sum = 0; int num = 1; while (num <= 100) { sum += num; num++; } printf("1到100的和:%d\n\n", sum); printf("=== do-while 循环 ===\n"); int i = 1; printf("1到5的数字:"); do { printf("%d ", i); i++; } while (i <= 5); printf("\n"); int j = 10; printf("即使条件一开始就不满足,do-while也会执行一次:"); do { printf("%d ", j); j++; } while (j <= 5); printf("\n\n"); printf("=== 嵌套循环 ===\n"); printf("九九乘法表(前5行):\n"); for (int row = 1; row <= 5; row++) { for (int col = 1; col <= row; col++) { printf("%d*%d=%-2d ", col, row, col * row); } printf("\n"); } printf("\n"); printf("=== break 和 continue 语句 ===\n"); printf("使用break,当i=3时跳出循环:"); for (int i = 1; i <= 5; i++) { if (i == 3) { break; } printf("%d ", i); } printf("\n"); printf("使用continue,跳过i=3:"); for (int i = 1; i <= 5; i++) { if (i == 3) { continue; } printf("%d ", i); } printf("\n"); printf("在while循环中使用break,当count=4时跳出:"); int count_break = 1; while (count_break <= 5) { if (count_break == 4) { break; } printf("%d ", count_break); count_break++; } printf("\n"); return 0; }
|