info
对应 GESP C++ 2 级知识块⑥ & ⑦:多层分支结构、多层循环语句
官方要求:掌握多层分支结构(if / if...else / switch 语句及相互嵌套);掌握多层循环结构(for / while / do...while 语句及相互嵌套)。
这是 2 级编程题的核心——两道编程题基本都考"嵌套 + 综合案例"。
第15章 循环、分支的嵌套
嵌套指在一个分支/循环内部完整包含另一组分支或循环,用于处理多层判断、多层重复逻辑,是复杂程序的基础结构。
15.1 分支嵌套
15.1.1 if 语句嵌套
在 if / else if / else 的代码块中再写 if 结构。
规则:else 匹配最近、未配对的 if,大括号可明确划分层级。
示例:成绩分级
int score = 85;
if (score >= 60)
{
if (score >= 90)
cout << "优秀";
else if (score >= 80)
cout << "良好";
else
cout << "及格";
}
else
{
cout << "不及格";
}
15.1.2 switch 语句嵌套
case、default 内部可写完整 switch;内层 break 只跳出内层,不影响外层。
int a = 1, b = 2;
switch (a)
{
case 1:
printf("a=1\n");
switch (b)
{
case 2: printf("b=2\n"); break;
default: break;
}
break;
default: break;
}
tip
switch 易错
忘了写 break 会继续往下"穿透"执行下一个 case。嵌套时更要注意:内层 break 只管内层。2 级通常只考单层或简单两层 switch。
15.2 循环嵌套
循环体内包含另一循环,外层走一次,内层完整跑完一轮。多用于打印图形、二维遍历。
15.2.1 for 嵌套(最常用)
打印 5 行 5 列星号:
for (int i = 1; i <= 5; i++)
{
for (int j = 1; j <= 5; j++)
cout << "*";
cout << endl;
}
15.2.2 while 嵌套
int i = 1;
while (i <= 3)
{
int j = 1, sum = 0;
while (j <= 2)
{
sum += i * j;
j++;
}
i++;
}
15.2.3 不同循环互相嵌套
for 套 do-while、while 套 for 都合法。
15.3 分支与循环互相嵌套
15.3.1 循环内套 if(高频)
求 1~10 偶数和:
int sum = 0;
for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
sum += i;
}
15.3.2 if 内套循环
仅满足条件才执行循环:
int n;
cin >> n;
if (n > 0)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i; j++)
cout << j << "*" << i << "=" << i * j << " ";
cout << endl;
}
}
caution
核心注意事项(必看)
- 内外循环变量名必须不同(i、j 区分),否则内层会把外层变量改乱;
break/continue只作用当前最内层循环 /switch;- 嵌套层数不宜过多,降低可读性;
- 用缩进区分层级,大括号避免
else匹配错误; - 保证内层循环有终止条件,防止死循环。
tip
综合练习题(2 级风格)
输入一个正整数 n,输出 1~n 中所有既能被 3 整除又能被 5 整除的数。思路:外层 for 遍历 1~n,循环内 if (i % 3 == 0 && i % 5 == 0) 才输出。这就是"循环 + 分支"最典型的组合。
练习题(2 级单选风格)
- 下列代码执行后输出什么?
int s = 0;for (int i = 1; i <= 3; i++)for (int j = 1; j <= 2; j++)s++;cout << s;
- A. 5
- B. 6
- C. 3
- D. 2
- 下列代码执行后输出什么?
int n = 5;if (n > 0) {if (n > 3) cout << "A";else cout << "B";} else cout << "C";
- A. A
- B. B
- C. C
- D. 无输出
- 在双重循环的内层循环中执行
break;,会?- A. 跳出最内层循环
- B. 跳出最外层循环
- C. 结束整个程序
- D. 跳过本次迭代
- 下列代码执行后输出什么?
for (int i = 1; i <= 3; i++) {if (i == 2) continue;cout << i;}
- A. 123
- B. 13
- C. 12
- D. 23
- 下列代码执行后输出什么?
int cnt = 0;for (int i = 1; i <= 3; i++)for (int j = i; j <= 3; j++)cnt++;cout << cnt;
- A. 6
- B. 9
- C. 3
- D. 0
参考答案(点击展开)
- B — 外层 3 次、内层每次 2 次,共 3×2=6 次自增,
s=6。 - A —
n=5>0进入外层,再n>3成立,输出 "A";"B""C" 分支都不走。 - A —
break只跳出当前所在的那一层循环(最内层),外层继续。 - B —
i==2时continue跳过本次输出;i=1输出 1,i=3输出 3,结果 "13"。 - A — 内层从
j=i到 3:i=1计 3 次、i=2计 2 次、i=3计 1 次,合计 6。