GESP 二级 · GESP 202503 C++ 二级 第 13 题

选择题 · 答案 B · 考点:循环控制、输入输出

← 整套速查表 GESP 二级 全部真题

题目

已知 C++ 代码和执行后的期望输出如下,相关说法正确的是( )。

int i, j;
int last, N;

cout << "请输入层数N: ";
cin >> N;

last = 1;
for (i = 1; i < N; i++){
    for (j = 1; j < i + 1; j++){ // L1
        if (last > 9)
            last = 1;

        cout << last << " ";

        last += 1;
    }
    printf("\n");
}
请输入层数N: 10
1
2 3
4 5 6
7 8 9 1
2 3 4 5 6
7 8 9 1 2 3
4 5 6 7 8 9 1
2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
答案:B

考点

循环控制输入输出

解题思维

答案B。追踪程序输出时注意整数除法截断和循环条件的边界值。变量初始值对结果影响很大。

常见错误

整数除法截断容易忽略!if(n%i==0)中%是取余运算不是除法。

详细解析(节选)

【考点】循环控制|复合赋值运算符|输入输出

本题考查 GESP 二级 C++ 循环控制与表达式求值。命题人卡住的是考生对复合赋值运算符与常规赋值语句等价性的认知盲区,常出现在二级第 4 模块的循环嵌套题中。

解题关键在于识别 last += 1 与 last = last + 1 完全等价。+= 是语言定义的复合赋值运算符,语义上等同于先计算右侧再赋值左侧,因此 B 选项正确。外层循环控制每行输出个数,内层递增 last 并重置,整体形成 1-9 循环序列。

A 错在绝对化表述:printf 是 C 标准库函数,cout 是 C++ 流,两者都能输出换行,A 的“不能”是绝对化陷阱。C 若改为 j < i,每行少输出一个数字,破坏递增序列。D 若初值改为 0,整体序列偏移一位,输出不再匹配,但题目要求的是从 1 开始的序列。

命题人若把 L1 改为 j <= i,每行少一个数字;若把 printf("\n") 换成 cout << endl;,换行逻辑不变。刷到类似题先问自己:改的是循环边界、输出设备还是初值?

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断