GESP C++ 2 级 · 知识点

多层分支/循环结构

GESP C++ 二级要求熟练使用嵌套的 if 与 for、while 结构,能把多层条件与重复执行拆解成清晰的执行路径。嵌套题的难点不在语法,而在搞清楚每一层分别控制什么、执行多少次。

对应知识域:多层分支/循环结构相关真题 4 套

本页为本站原创整理,例题与解析均由本站编写,不取自任何题库原题;考试范围以 CCF 官方公布为准,本平台不是 GESP 官方平台。

考纲要求

  • 掌握 if 嵌套与 if-else if 多分支的写法,理解条件按从上到下的顺序依次判断。
  • 掌握 for 与 while 的嵌套,能确定内外层循环各自执行的次数和先后关系。
  • 能根据嵌套结构推算执行次数,例如外层 3 次、内层 4 次时循环体共执行 12 次。
  • 能用嵌套结构解决查表、图形输出、简单统计这类综合问题。

典型题型

  • 给出嵌套循环,要求写出输出内容或统计循环体执行次数。
  • 用嵌套分支完成成绩等级划分、闰年判断等分段问题。
  • 输出指定行数与列数的图形,例如三角形或乘法表。

常见错误

  • 多分支写成多个独立 if,导致同时满足多个条件时重复执行。互斥条件应使用 else if。
  • 内外层循环变量用混,内层循环次数依赖外层变量时导致次数错误。
  • 把累加变量定义在循环内部,导致每次进入循环都被清零。
  • 以为 break 能跳出所有嵌套循环。break 只跳出当前所在的那一层。

深入理解

先问「每一层各管什么」

嵌套结构的难点从来不是语法,而是职责划分。外层循环通常管「第几轮」,内层循环管「这一轮里做几件事」。例如输出九九乘法表,外层 i 是行号,内层 j 是列号,且 j 的上界依赖 i:

for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++)
        cout << j << "*" << i << "=";
    cout << endl;
}

写之前先用一句中文说清每一层的作用,说不清就是还没想明白,直接写一定会乱。

内层执行次数是乘出来的

外层执行 m 次、内层固定执行 n 次时,内层循环体一共执行 m × n 次。如果内层的次数随外层变化,就要把每一轮相加:上例中内层执行 1 + 2 + … + 9 = 45 次。

数「执行多少次」的题,一定要区分问的是内层循环体还是整个内层循环,也一定要区分「循环条件判断次数」和「循环体执行次数」——for (i = 1; i <= n; i++) 的条件判断执行 n + 1 次,循环体执行 n 次,多出来的那一次是退出时的那次判断。这是选择题的高频陷阱。

break 和 continue 只认最内层

在嵌套循环里,break 只跳出当前所在的这一层,外层继续跑。如果确实需要一次跳出所有层,常用做法是设一个标志变量,内层跳出后由外层检查标志再 break;或者把嵌套循环封装成函数,用 return 直接返回。

continue 同理,只跳过最内层的本轮,内层继续下一轮,外层完全不受影响。嵌套结构里出现这两个关键字时,先确定它写在哪一层,再想它影响谁,答案就出来了。

自编例题

用嵌套循环输出乘法表

输出 1 到 5 的乘法表,第 i 行输出 i×1 到 i×i。请说明内外层循环各执行多少次。

for (int i = 1; i <= 5; i++) {
    for (int j = 1; j <= i; j++) cout << i * j << ' ';
    cout << endl;
}

外层 i 从 1 到 5 共执行 5 次,内层 j 从 1 到 i,因此第 i 行输出 i 个数,总共输出 1+2+3+4+5 等于 15 个结果。每行结束要换行,换行语句必须放在内层循环之外、外层循环之内;放错位置会让所有结果挤在一行,或者每输出一个数就换一次行。分析嵌套循环时,先分别写出两层的起止与步长,再相乘或累加,比凭感觉数更可靠。

相关真题

这块内容在整条路线里的位置:GESP C++ 2 级备考路径。

READY TO START

开始练习

先做一套本级别测评,报告会指出哪些知识点需要重点补;再回到本页对照考纲要求逐条核对,把不确定的条目记下来集中练。

常见问题

嵌套循环执行次数怎么算?

内层次数固定时,总次数等于外层次数乘以内层次数;内层次数随外层变化时,把每一轮的内层次数相加。

if 和 else if 有什么区别?

多个独立 if 会逐个判断,可能同时执行多个分支;else if 只有前面条件都不成立时才继续判断,适合互斥的多分支。

break 和 continue 在嵌套里的作用?

两者都只作用于当前这一层循环:break 结束本层循环,continue 跳过本层本次剩余语句,外层循环不受影响。

本级别其他知识点

官方依据