乔斯等级考试模拟题C++二级全解析

四季读书网 3 0
乔斯等级考试模拟题C++二级全解析
乔斯等级考试模拟题C++二级全解析-第1张图片-四季读书网

一、单选题 每题 2 分,共 30 分

1

答案:B

题干明确指出故障现象是「时序逻辑错误」导致「姿态解算结果异常」。姿态解算是飞行控制计算机中的核心计算任务,由CPU(中央处理器)执行运算与逻辑判断。高温可能引起 CPU 内部晶体管时序偏差、逻辑混乱,从而产生计算错误。A. 温度传感器:只能测量温度,不执行计算或判断,不会直接导致航向计算错误。C. 只读存储器(ROM):存储固定程序或数据,不受高温引起时序逻辑错误(ROM 通常是组合逻辑或存储单元,不参与复杂时序运算),且一般不会导致「计算过程出错」。D. 电动机驱动接口:属于输出/执行部件,不负责航向解算,即便出错也不会直接表现为计算逻辑错误。

2

答案:B

A 错误:变量名不能以数字开头。B 正确:C++变量名可以以下划线或字母开头,后跟字母、数字或下划线,_score 完全合法。C 错误if 是关键字,不能作为变量名。D 错误float 是关键字(基本数据类型),不能作为变量名。

3

答案:C

计算机使用二进制浮点数(如 IEEE 754 标准)存储小数,而 1/3 在二进制中是无限循环小数,无法精确表示,因此存储的是一个近似值。printf("%.10f\n", ...) 只是将这个近似值输出时保留 10 位小数,不会显示更多的位数,但即使输出更多位,也不会变成数学上的无限循环,因为存储本身就不精确。选项 C 准确描述了这一根本原因以及输出格式限制共同导致的现象。其他选项错误原因A:不是 CPU 运算错误,而是浮点数表示方式的固有局限。Bprintf 并不是「默认只输出10位小数」,而是因为格式控制符 %.10f 明确要求输出10位小数;即便输出更多位,底层值依然不精确。D1.0 / 3.0 两个操作数都是浮点数(1.0 是 double3.0 也是 double),不会发生整数除法。

4

答案:D

在流程图中,不同形状的框代表不同的操作:椭圆形框(起止框):表示程序的开始或结束。平行四边形框(输入/输出框):表示输入或输出操作。菱形框(判断框):表示条件判断,根据条件成立与否选择不同的分支。矩形框(处理框):表示赋值、计算等处理操作。代码中标记 L1 的行为是:if(val > max),这是一个条件判断,根据 val > max 的真假决定是否执行 max = val。在流程图中,判断用菱形框表示,因此 L1 对应的图形应是 菱形框

5

答案:B

printf("a+1=%d\n", a+1) 按照格式字符串原样输出,其中 a+1 计算结果为 2027,因此输出为 a+1=2027,注意格式串中没有额外空格。

6

答案:D

输入 2026,2026 % 3 = 1,不等于 0,因此不执行第 4 行。接着判断 else if (2026 % 5 == 0),2026 % 5 = 1,不等于 0,因此不执行第 6 行。条件均不满足,进入 else 分支,执行第 8 行,输出「不能被3和5整除」。第 9 行 cout << endl; 位于 if-else 结构之外,无论哪个分支都会执行。

7

答案:B

输入 2 后,从 case 2 进入,执行 cout << "B ";,然后因为没有 break,会继续执行 case 3 的 cout << "C ";,遇到 break 才退出。所以输出 B C。这是 switch 语句「穿透」效应的典型考题。

8

答案:B

循环从 i = 1 到 i = 10。条件 i % 2 == 0 || i % 5 == 0 表示 i 能被 2 整除  能被 5 整除。满足条件的 i 有:能被 2 整除:2, 4, 6, 8, 10;能被 5 整除:5, 10。合并(去重):2, 4, 5, 6, 8, 10。求和:2 + 4 + 5 + 6 + 8 + 10 = 35

9

答案:D

循环 i 从 -3 到 3(包括 -3 和 3)。条件 i % 2 == -1:在 C++ 中,负数取余的结果符号与被除数相同(或为 0),因此负奇数取余 2 得 -1,正奇数取余 2 得 1。逐个判断:i = -3:-3 % 2 = -1,满足,输出 -3#i = -2:-2 % 2 = 0,不满足i = -1:-1 % 2 = -1,满足,输出 -1#i = 0:0 % 2 = 0,不满足i = 1:1 % 2 = 1,不满足(1 ≠ -1)i = 2:2 % 2 = 0,不满足i = 3:3 % 2 = 1,不满足(1 ≠ -1)最终输出:-3#-1#

10

答案:B

a 是 int,值为 5;b 是 double,值为 2.5;c 是 char,值为 '0',ASCII 码为 48。计算 a + b + c1. a + b:int 提升为 double,5 + 2.5 = 7.5(double)2. 再加 c:c 先整型提升为 int(48),再与 double 相加时转换为 double(48.0)3. 7.5 + 48.0 = 55.5(double)cout 输出浮点数时默认去掉末尾多余的零,输出 55.5

11

答案:B

循环中 num 从 0 开始,每次先 +1。num % 3 != 0 时 continue 跳过输出。只有当 num 是 3 的倍数时才输出 num#循环内 num 依次为 1,2,3,4,5,6,输出 3#6#循环结束后 num=6>5,再输出一个 6最终输出:3#6#6

12

答案:C

A 错误:除以 6 写在输出中完全正确,不需要提前计算。B 错误:每位选手需重新初始化最高分、最低分和总分,因此这三行必须在每位选手的外层循环内,不能移出。C 正确max 函数与 if 判断等价,可以替换。D 错误total += score; 与 total = total + score; 在此处完全等价,可以互换。

13

答案:A

循环条件 i * i < 100,即 i < 10,i 从 0 开始增加,所以 i ≤ 9 时循环继续。i 每次增加 2,取值依次为:0, 2, 4, 6, 8。当 i = 10 时,10 × 10 = 100,不满足 < 100,循环结束。共循环 5 次,cnt = 5

14

答案:C

本题中循环变量 i 从 0 开始,每次 +1,判断是否为偶数并累加,循环结束后 i 为 N+1。A 正确:输入 10,偶数 0+2+4+6+8+10 = 30,循环结束时 i = 11,输出 11 30B 正确:输入 5,偶数 0+2+4 = 6,i 从 0 到 6 退出循环,输出 6 6C 错误:将 i += 1 移到 if 之前,会导致判断时 i 已经自增,如 i=0 时先加 1 变为 1 才判断偶数,会漏掉 0、2 等偶数的判断,结果错误。D 正确:删除 if,并将 i += 1 改为 i += 2,则 i 直接取 0,2,4,... 所有值均为偶数,直接累加即可。

15

答案:C

王选院士是计算机文字信息处理专家,最突出的贡献是发明汉字激光照排系统,推动了中国出版印刷事业从铅字排版向数字化排版的革命。A 自动驾驶汽车与王选无关。B 创立培训学校不是其主要贡献。D 成立方正公司是在其技术成果基础上创办的企业,但最核心的贡献是技术发明本身(激光照排系统)。

二、判断题 每题 2 分,共 20 分

1

错误

平板电脑可能运行 iOS、Android、HarmonyOS 等多种操作系统,不一定装有 Windows。

2

错误

printf("%d*%d#", 2, 6) 中 %d 分别对应输出数字 2 和 6,* 和 # 按原样输出,所以输出结果是 2*6#,而不是 12#。

3

正确

cin >> N; 可以输入正负整数或浮点数给 double 类型变量 N。double(N) 将 N 显式转换为 double 类型(虽然是多余的,因为 N 已经是 double)。int(...) 将浮点数转换为整型,会直接截断小数部分(不是四舍五入)。

4

错误

5 % 2 的结果是 1(真),5 % 3 的结果是 2(真),1 && 2 的结果是 true(逻辑真)。但是 cout << true 在 C++ 中默认输出 1,而不是 true。除非使用了 boolalpha,否则布尔值输出为 0 或 1。

5

正确

外层循环 i 从 0 到 9,共执行 10 次。内层循环 j 从 0 开始,执行 cnt++(此时 cnt 增加 1),然后遇到 break立即退出内层循环。因此每次外层循环中,内层循环只执行 1 次,cnt 增加 1。总共 cnt = 10 × 1 = 10

6

错误

break 用于跳出当前循环,并非终止整个程序。说法不准确。

7

错误

3.0 是 double 类型,通常占 8 字节;3 是 int 类型,通常占 4 字节,存储空间不同。虽然值相等,但类型和内存占用不同。

8

错误

scanf 是 C++ 标准库中的一个函数(来自 C 标准库),不是 C++ 的关键字。C++ 的关键字包括 int、if、while、return、class 等,不包括 scanf。虽然技术上可以将变量命名为 scanf,但这样做会导致标准库函数被隐藏,强烈不推荐

9

错误

输入 2026,代码执行过程:第1轮:flag=0,!flag 为真,输出 2026%10=6;N=202;flag=1第2轮:flag=1,!flag 为假,不输出;N=20;flag=0第3轮:flag=0,输出 20%10=0;N=2;flag=1第4轮:flag=1,不输出;N=0;flag=0最终输出 60,不是 6202。

10

正确

初始:x=1,y=1。i=1(奇数):y += x → y=2i=2(偶数):x += y → x=3i=3(奇数):y += x → y=5i=4(偶数):x += y → x=8最终:x + y = 8+5=13,不是 8。所以原命题说输出是 8 是错误的

三、编程题

题目 A  ·  小杨的幸运数字

小杨有两个幸运数字 a 和 b(1≤a,b≤9),以及一个正整数 n。定义一个整数 x 是「幸运数」,当且仅当:x 的个位数字等于 a 或等于 b;并且 x 的十位数字(如果存在)不等于 a 且不等于 b。注意:如果 x 的十位数字不存在(即 x<10),则只判断条件1。输入:第一行一个整数 T(1≤T≤10),表示有 T 组数据。接下来 T 行,每行三个整数 n,a,b。输出:对于每组数据,输出一行一个整数,表示从 1 到 n 中幸运数的个数。

解题思路:

直接枚举法(因为 n ≤ 10000,完全可行)

对于 1 到 n 的每个数 i:

    1. 取出个位数字 ge = i % 10

    2. 取出十位数字 shi = (i / 10) % 10

    3. 判断两个条件是否同时成立

    4. 成立则计数器 +1

参考代码:

#include <bits/stdc++.h>

using namespace std;

int main() {

    int T;  // 数据组数

    cin >> T;

    while (T--) {

        int n, a, b;

        cin >> n >> a >> b;

        int count = 0;  // 幸运数计数器

        // 遍历 1 到 n 的所有整数

        for (int i = 1; i <= n; i++) {

            int ge = i % 10;           // 个位数字

            int shi = (i / 10) % 10;   // 十位数字(i<10 时为 0)

            // 条件1:个位等于 a 或 b

            // 条件2:十位不等于 a 且不等于 b(i<10 时 shi=0,自动满足)

            if ((ge == a || ge == b) && (shi != a && shi != b)) {

                count++;

            }

        }

        cout << count << endl;  // 输出当前组结果

    }

    return 0;

}

1

枚举每个数:遍历 1 到 n 的所有整数,对每个数分别判断是否满足幸运数条件。

2

提取个位和十位:个位 = i % 10,十位 = (i / 10) % 10。对于 i<10 的情况,十位自动为 0。

3

双条件判断:条件1:个位等于 a 或 b;条件2:十位不等于 a 且不等于 b。两个条件同时成立时计数器加1。

4

多组数据处理:外层 while(T--) 循环处理每组数据,每组独立计算并输出结果。

题目 B  ·  小杨的边框矩阵

小杨想要构造一个 m × m 的字符矩阵(m 为奇数,且 m ≥ 5)。共有三种模式:模式 1:矩阵的四条边框、中间行、中间列输出 +,其余输出 -。模式 2:矩阵的四条边框、主对角线输出 +,其余输出 -。模式 3:矩阵的四条边框、副对角线输出 +,其余输出 -。输入:第一行一个正整数 m(5 ≤ m ≤ 49,且 m 为奇数),第二行一个整数 mode(1 ≤ mode ≤ 3)。输出:输出 m 行,每行 m 个字符,字符之间没有空格。

核心思路:

1. 边框的判断:四条边框分别是第一行、最后一行、第一列、最后一列,用逻辑或连接。

2. 主对角线:行号等于列号,即 i == j。

3. 副对角线:行号加列号等于 m+1,即 i + j == m + 1。

4. 中间行/列:由于 m 是奇数,中间行和中间列是同一个位置,计算方式为 (m+1)/2。

5. 注意模式 1 的特殊性:模式 1 中,中间行和中间列是两条完整的线,中间行整行都是 +,中间列整列都是 +。

参考代码:

#include <bits/stdc++.h>

using namespace std;

int main() {

    int m, mode;

    cin >> m >> mode;                     // 输入矩阵大小和模式

    int mid = (m + 1) / 2;                // 中间行/列的位置

    for (int i = 1; i <= m; i++) {        // 遍历每一行

        for (int j = 1; j <= m; j++) {    // 遍历每一列

            // 四条边框上的位置输出 +

            bool ok = (i == 1 || i == m || j == 1 || j == m);

            if (mode == 1) {              // 模式1:加上中间行和中间列

                if (i == mid || j == mid) ok = true;

            } else if (mode == 2) {       // 模式2:加上主对角线

                if (i == j) ok = true;

            } else {                      // 模式3:加上副对角线

                if (i + j == m + 1) ok = true;

            }

            if (ok) {

                cout << +;

            } else {

                cout << -;

            }

        }

        cout << endl;                     // 每行结束后换行

    }

    return 0;

}

1

边框优先:无论哪种模式,四条边框(第一行、最后一行、第一列、最后一列)始终输出 +。这是基础规则。

2

模式分支:模式1额外标记中间行和中间列(i==mid 或 j==mid);模式2额外标记主对角线(i==j);模式3额外标记副对角线(i+j==m+1)。

3

双重循环遍历:外层循环 i 遍历行,内层循环 j 遍历列,对每个位置 (i,j) 判断是否满足当前模式的 + 条件。

4

输出格式:每行字符之间无空格,每行结束后输出换行。注意字符用单引号。

备考提示

本次 GESP 二级模拟题涵盖:计算机基础(CPU/ROM/流程图)、C++ 变量命名规则、浮点数精度与 printf 格式、switch 穿透效应、负数取余规则、类型转换与 ASCII 码、循环与条件判断、数组与矩阵图形输出等核心考点。建议重点掌握:负数取余的结果符号规则、switch 语句中 break 的作用、字符型数据参与运算时的隐式类型转换,以及双重循环处理矩阵问题的方法。

乔斯等级考试模拟题C++二级全解析-第2张图片-四季读书网

抱歉,评论功能暂时关闭!