C语言入门:分支与循环语句详解
一、为什么要学分支和循环?
程序如果只能从上到下顺序执行,功能会非常有限。实际开发中,我们需要程序具备"判断"和"重复"的能力:
- 分支语句:让程序根据不同条件执行不同的代码路径("如果......就......否则......")。
- 循环语句:让程序重复执行某段代码,直到满足退出条件("重复做......直到......")。
C语言提供了 if、switch 两个分支语句,以及 for、while、do...while 三个循环语句。下面通过几个经典例题,逐一讲解它们的用法。
二、分支语句
2.1 if 语句
if 是最基本的分支结构,语法如下:
arduino
if (条件) {
// 条件为真时执行
} else if (另一个条件) {
// 另一个条件为真时执行
} else {
// 以上条件都不满足时执行
}
例题1:
描述
KiKi想知道,已经给出的三条边 aa、bb、cc 能否构成一个非退化三角形,如果能构成,判断三角形的类型(等边三角形、等腰三角形或普通三角形)。
【名词解释】
非退化三角形:三条边长均大于 00 且任意两边之和均大于第三边的三角形。
输入描述:
在一行上输入三个整数 a,b,c(0<a,b,c<10)a,b,c(0<a,b,c<10),表示三角形的三条边。
输出描述:
在一行上输出一个字符串,表示三角形的类型,具体地:
∙ ∙如果三角形是等边三角形,则输出 Equilateral triangle!Equilateral triangle!;
∙ ∙如果三角形是等腰三角形,则输出 Isosceles triangle!Isosceles triangle!;
∙ ∙如果三角形是普通三角形,则输出 Ordinary triangle!Ordinary triangle!;
∙ ∙如果不能构成非退化三角形,则输出 Not a triangle!Not a triangle!。
示例1
输入:
2 3 2
输出:
Isosceles triangle!
示例2
输入:
3 3 3
输出:
Equilateral triangle!
示例3
输入:
4 3 2
输出:
Ordinary triangle!
示例4
输入:
3 2 1
输出
css
Not a triangle!
程序
C
#include <stdio.h>
int main() {
int a, b,c;
while (scanf("%d %d %d", &a, &b,&c) != EOF) { // 注意 while 处理多个 case
// 64 位输出请用 printf("%lld") to
if (a+b>c&&a+c>b&&b+c>a){
if(a==b&&b==c) printf("Equilateral triangle!\n");
else {
if(a==b||a==c||b==c) printf("Isosceles triangle!\n");
else printf("Ordinary triangle!\n");
}
}
else printf("Not a triangle!\n");
}
return 0;
}
2.2 switch 语句
当需要根据一个变量的多个离散值做不同处理时,switch 比多层 if-else 更清晰:
arduino
switch (变量) {
case 值1:
// 处理
break;
case 值2:
// 处理
break;
default:
// 默认处理
break;
}
注意每个 case 后面要加 break,否则会"穿透"到下一个 case。
三、循环语句
3.1 for 循环
for 循环适合已知循环次数的场景,语法最紧凑:
scss
for (初始化; 条件; 更新) {
// 循环体
}
执行顺序:初始化 → 判断条件 → 执行循环体 → 更新 → 再判断条件 → ......
3.2 while 循环
while 循环适合不确定循环次数、只知道终止条件的场景:
arduino
while (条件) {
// 循环体
}
3.3 do...while 循环
do...while 至少执行一次循环体,再判断条件:
arduino
do {
// 循环体
} while (条件);
3.4 break 和 continue
break:立即跳出整个循环。continue:跳过本次循环剩余代码,直接进入下一次循环的判断。
四、经典例题讲解
例题2:打印9×9乘法口诀表
这道题用双重 for 循环:外层控制行,内层控制列。
arduino
#include <stdio.h>
int main() {
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= i; j++) {
printf("%d*%d=%-2d ", j, i, i * j);
}
printf("\n");
}
return 0;
}
要点:%-2d 表示左对齐、占2位,让输出对齐更整齐。如果想输出完整方阵,把内层条件改成 j <= 9 即可。
例题3:求10个整数中的最大值
这道题用单层 for 循环遍历比较,是"打擂台"思想的典型应用。
arduino
#include <stdio.h>
int main() {
int i, num, max;
printf("请输入10个整数:\n");
scanf("%d", &max); // 先读第1个作为初始最大值
for (i = 1; i < 10; i++) {
scanf("%d", &num);
if (num > max) { // 分支判断:遇到更大的就更新
max = num;
}
}
printf("最大值是:%d\n", max);
return 0;
}
要点:先假设第一个数是最大值,然后逐个比较、更新。循环和分支在这里配合使用。
例题4:计算 1/1 - 1/2 + 1/3 - 1/4 + ... + 1/99 - 1/100
这道题用for 循环 + 符号变量,演示了循环体内做累加的技巧。
ini
#include <stdio.h>
int main() {
double sum = 0.0;
int i;
int sign = 1; // 控制正负号
for (i = 1; i <= 100; i++) {
sum += sign * (1.0 / i);
sign = -sign; // 每次循环切换符号
}
printf("结果 = %f\n", sum); // 输出约 0.688172
return 0;
}
要点:
- 必须写
1.0 / i,如果写1 / i会变成整数除法,i>1 时结果全为 0。 - 用
sign变量在 +1 和 -1 之间切换,比判断奇偶更简洁。
例题5:统计1到100中数字9出现的次数
这道题用for 循环 + 分支判断,演示了如何拆分各位数字。
ini
#include <stdio.h>
int main() {
int i;
int count = 0;
int ge, shi;
for (i = 1; i <= 100; i++) {
ge = i % 10; // 个位
shi = i / 10 % 10; // 十位
if (ge == 9) count++;
if (shi == 9) count++;
}
printf("数字9出现了 %d 次\n", count); // 输出 20
return 0;
}
要点:注意是统计"数字9出现的次数",不是"含9的数的个数"。99 里有2个9,所以答案是 20 而不是 19。
例题6:打印100~200之间的素数
这道题用双重 for 循环 + break,是循环与分支综合运用的经典题。
ini
#include <stdio.h>
#include <math.h>
int main() {
int i, j;
int isPrime;
int count = 0;
printf("100~200之间的素数:\n");
for (i = 100; i <= 200; i++) {
isPrime = 1; // 先假设是素数
for (j = 2; j <= (int)sqrt((double)i); j++) {
if (i % j == 0) {
isPrime = 0;
break; // 找到因子,立即跳出内层循环
}
}
if (isPrime) {
printf("%d ", i);
count++;
}
}
printf("\n共有 %d 个素数\n", count); // 输出 21 个
return 0;
}
要点:
- 只需试除到
sqrt(i),效率远高于试除到i-1。 - 找到第一个因子就用
break跳出,无需继续试除。 - 编译时需加
-lm链接数学库:gcc prime.c -o prime -lm。
例题7:打印1000年到2000年之间的闰年
这道题用for 循环 + 复合条件分支,演示了复杂逻辑条件的写法。
arduino
#include <stdio.h>
int main() {
int year;
int count = 0;
printf("1000年到2000年之间的闰年:\n");
for (year = 1000; year <= 2000; year++) {
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
printf("%d ", year);
count++;
}
}
printf("\n共有 %d 个闰年\n", count); // 输出 244 个
return 0;
}
要点:闰年规则是"四年一闰,百年不闰,四百年再闰",翻译成代码就是 (year%4==0 && year%100!=0) || (year%400==0)。注意括号不能省,&& 优先级高于 ||。
五、小结
表格
| 语句 | 适用场景 | 关键特点 |
|---|---|---|
if-else |
条件判断 | 最基础的分支 |
switch |
多值匹配 | 代码更清晰,别忘 break |
for |
已知循环次数 | 初始化、条件、更新写在一行 |
while |
未知次数、已知终止条件 | 先判断再执行 |
do-while |
至少执行一次 | 先执行再判断 |
break |
提前结束循环 | 跳出整个循环 |
continue |
跳过本次 | 进入下一次循环判断 |
掌握这些语句后,已经可以解决大部分基础编程问题了。