跳到主要内容 CCF-GESP 2025 年 12 月 C++ 二级真题解析 | 极客日志
C++ 算法
CCF-GESP 2025 年 12 月 C++ 二级真题解析 解析了 CCF-GESP 2025 年 12 月 C++ 二级考试真题,涵盖单选题、判断题及编程题。内容涉及 C++ 基础语法、变量命名、循环控制、逻辑运算、浮点数精度、字符串处理及简单算法实现。提供了详细的解题思路与参考代码,帮助考生掌握考试重点与技巧。
嘘 发布于 2026/3/30 更新于 2026/4/13 1 浏览1 单选题(每题 2 分,共 30 分)
第 1 题 近日,空中客车公司表示,约 6000 架空客 A320 系列飞机需要紧急更换一种易受太阳辐射影响的飞行控制软件。空客表示,在对一起飞行事故分析后的结果显示,强烈的太阳辐射可能会损坏飞行控制系统所需的关键数据,导致判断失误,进而引发飞行异常。那这里的飞行控制系统执行判断的部件最可能是下面的 ( )。
A. 辐射传感器 B. 处理器 C. 内存单元 D. 输出设备
解析: 答案 B。飞行控制系统的核心是处理器,它负责接收传感器数据、执行控制算法并输出指令,是判断和决策的关键部件。辐射传感器用于检测辐射,只提供检测数据,不直接参与判断;内存单元用于存储数据不直接参与判断;输出设备用于执行动作更不直接参与判断。因此,处理器最可能是执行判断的部件。故选 B。
第 2 题 小明最近为了备考 GESP,开始看网络视频。其中提到计算机网络系统有不同的划分标准,那他平时上学所在的教学楼内的网络是一个( )。
A. PAN B. LAN C. MAN D. WAN
解析: 答案 B。PAN(个人区域网,一般短距离 10 米左右)、LAN(局域网,一般距离 100 米~数百米,一幢楼宇或数幢楼宇)、MAN(城域网,一般可以覆盖一个大城市) 和 WAN(广域网,可覆盖全球),根据覆盖范围,教学楼内网络属局域网。故选 B。
第 3 题 下面有关 C++ 变量的说法,正确的是 ( )。
A. 不可以用 for 作为变量名,因为 for 是 C++ 的关键字(保留字)。
B. _tnt 不可以是变量名,因为变量名的第一个字符必须是英文字母。
C. tnt 不可以是变量名,因为最后一个字符容易与减号混淆。
D. 可以用 printf 作为变量名,因为 printf 是关键字,但这不是好习惯,因为 printf 有约定的功能与含义。
解析: 答案 A。C++ 变量名的命名规则是:(1) 只能是字母、数字和下划线(),(2) 不能数字开头,(3) 不能是关键字。for 是关键字,不能用作变量,正确;变量名可以以下划线开头,tnt 是合法的,错误;下划线 ( ) 可以出现在变量任何位置,最后一个字符是下划线 ( ),不会与减号 (-) 混淆,tnt 是合法的,错误;printf 不是 C++ 的关键字,是标准库函数名,可以作为变量名,但不建议用作变量名,否则 printf 将无函数功能。故选 A。
第 4 题 一个小数是 0.123123123……无限循环,其小数点后 1 位是 1,后 2 位是 2,依此类推,求第 N 位的值。横线处应填入的代码是 ( )。
int N; cin >> N; remainder = ______________; if (remainder == 0 ) cout << 1 ; else if (remainder == 1 ) cout << 2 ; else cout << 3 ;
A. N % 3 B. (N - 1) % 3 C. N / 3 D. (N - 1) / 3
解析: 答案 B。题目中小数 0.123123123... 是无限循环小数,循环节为 123,长度为 3。第 N 位的值取决于 N 在循环节中的位置:当选 A(N % 3) N=3 时,值为 0,输出 1,错误。当选 B((N-1) % 3) N=1 时,值为 0,输出 1,N=2 时,值为 1,输出 2,N=3 时,值为 2,输出 3,正确。C、D 结果为浮点数,不符合题目要求。故选 B。
第 5 题 某同学执行 C++ 代码时 printf("%g\n", (3 + 3.1415926535)); 输出 6.14159,其原因最可能是 ( )。
A. C++ 中整数和浮点数相加时,整数会被转换为浮点数,而某些十进制小数无法精确表示为二进制小数,从而产生某些舍入误差。
B. C++ 的 printf 函数在输出浮点数时根据格式有默认小数点位数,因此输出了较少的位数。
C. 3.1415926535 是一个无限循环小数,在计算机中无法精确表示。
D. 由于计算机 CPU 的运算错误导致。
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown 转 HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
HTML 转 Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
解析: 答案 B。常量转浮点数为 double 型,有效数可达 15 位,不会只有 6 位有效数,A 错误。当 printf 以占位符"%f"为固定 6 位小数,以占位符"%g"为固定 6 位有效数,且这 6 位有效数字小于 10⁶时以浮点数或整数输出 (6 位有效数字),大于等于 10⁶时以科学计数法输出 (6 位有效数字),所以 B 正确。3.1415926535 是有限小数,所以 C 错误。CPU 运算错误与本题无关,浮点数精度问题是计算机表示机制导致的,所以 D 错误。故选 B。
第 6 题 某单位工号的编码规则:编码总长 5 位,均为数字,前 4 位依次整除以 3 其值累加之和除以 10 的余数为第 5 位数字。如某工号为 76587,前 4 位分别整除以 3 后,商分别为 2、2、1、2,其累加之和为 7,除以 10 的余数为 7,故第 5 位为 7。下面代码依次输入前 4 位后,两个横线处分别应填的是 ( )。
int rst = 0 , N; for (int i = 0 ; i < 4 ; i++){ cin >> N; rst += ___________;
选项 L1 L2 A N % 3 rst / 10 B N % 3 rst % 10 C N / 3 rst / 10 D N / 3 rst % 10
解析: 答案 D。C++,整数除以整数为整除,整数模整数为余数。根据题目 L1 处要整除,求整除以 3 的累加和,故排除 A、B。和除以 10 的余数,所以 L2 处为求余数,所以 C 错误。故选 D。
第 7 题 下面的 C++ 代码执行后的输出是 ( )。
for (int i = -2 ; i < 2 ; i++) if (i % 2 ) printf ("%d#" ,i);
A. -1#1# B. -1#0#1# C. -2#-1#1# D. -2#-1#1#2#
解析: 答案 A。循环 i 为 -2、-1、0、1,期中 -2 和 0 模 2 为 0,条件不成立,-1 和 1 时 i%2 不等于 0 等价为 True,输出:-1#1#。故选 A。
第 8 题 下面的 C++ 代码执行后其输出是 ( )。
int cnt = 0 , N; for (int i =1 ; i < 10 ; i += 2 ) for (int j =0 ; j < i; j++) cnt += 1 ; cout << cnt;
解析: 答案 D。循环 i 为 1、3、5、7、9,j 循环 i 次,cnt 加 i 次 1,1+3+5+7+9=25。故选 D。
第 9 题 下面 C++ 代码执行后其输出是 ( )。
int i,j; for (i = 1 ; i < 12 ; i++){ if (i % 2 == 0 ) continue ; for (j = 0 ; j < i; j++) if (i * j % 2 == 0 ) break ; if (j >= i) cout << i * j << " " ; }
A. 0 0 B. 11 C. 0 D. 0 11
解析: 答案 C。循环 i 为 111,偶数跳过,j 循环从 0i-1,ij 为偶数跳出内层循环,j>=i 显示 i j。当 j=0 时,ij=0,i j%2==0,而 j>=i 不可能成立,break 跳出内层循环时 j=0,最后外层循环结束时 i=12,故最后输出 i*j 为 0,故选 C。
第 10 题 与下面 C++ 输出效果不一致的代码是 ( )。
int i; for (i = 0 ; i < 10 ; i++) cout << i;
选项 代码片段 A int i = 0; while (i < 10){ cout << i; i += 1; } B int i = 0; while (i < 10){ i += 1; cout << i; } C int i = 0; while (true){ cout << i; i += 1; if (i >= 10) break; } D int i = 0; while (true){ if (i >= 10) break; cout << i; i += 1; }
解析: 答案 B。题目输出从 0 开始到 9,A 的 i 初值为 0,i<10 输出,输出后 i+=1,与题目一致。B 的 i 初值为 0,i<10 输出,但输出前 i+=1,实际输出的是 1 到 10,与题目不一致。C 的 i 初值为 0,采用无限循环输出,输出后 i+=1,i>=10 跳出循环,与题目一致。D 的 i 初值为 0,采用无限循环输出,输出前判 i>=10 跳出循环,输出后 i+=1,与题目一致。故选 B。
第 11 题 下面 C++ 代码执行后输出是 ( )。
int num = 0 ; while (num <= 5 ){ num += 1 ; if (num % 3 ) continue ; printf ("%d#" ,num); }
A. 3#6# B. 3#6#6 C. 1#2#3#4#5#6# D. 1#2#3#4#5#6#6
解析: 答案 B。题目 num 从 0 开始到 5,加 1 后判能否被 3 整除,不能整除则跳过,输出的是 num 能被 3 整除的,输出的是 3#6#,循环结束 num=6>5,最后还会输出 6,合起来输出 3#6#6。故选 B。
第 12 题 下面 C++ 代码执行后,其输出是 ( )。
int cnt = 0 ; for (int i = 0 ; i <5 ; i++) for (int j =i; j < 4 ; j++) cnt += 1 ; cout << cnt;
解析: 答案 B。题目外层循环 i 从 0 开始到 4,内层循环 j 从 i 到 3,对 cnt 计数,i=0 计数 4 次,i=1 计数 3 次,i=2 计数 2 次,i=3 计数 1 次,i=4 不计数,合起来计数 10 次,输出 10。故选 B。
第 13 题 漂亮数的定义是:如果 N 能被 M 整除,或者某位是 M,或者 N 的每位数之和能被 M 整除,则说 N 是 M 的漂亮数。如果三个条件都满足,则是完整漂亮数。123 是 3 的完整漂亮数,因为 123 能被 3 整除,也含有 3,其每位数之和为 6 也能被 3 整除。下面的代码用于判断 N 是否为 M 的完整漂亮数并输出。相关说法正确的是 ( )。
int N, M, Flag, Sum, num; cout << "请输入 N,不等于 0 的正整数:" ; cin >> N; cout << "请输入 M:M 必须大于 1 小于 9:" ; cin >> M; Sum = 0 ;
A. 代码能完成题目设定目标。
B. 在 while 循环中 N 最终将变成 0,因此 L1 行代码中 N % M 将总是满足条件,可以在 while 前增加一行代码 int old_num = N; ,并将 L1 开始这 4 行代码中的 N 都改为 old_num 就可以做出正确的判定。
C. while 循环中 if 判断语句可以增加 else 子句,其内容为 Flag = 0。
D. 如果先后输入 0 和 3,则肯定会输出 0 是 3 的完整漂亮数。
解析: 答案 B。题目中给出的程序,由于循环 N=0,求 N%M==0 恒等,无意义,A 错误。while 循环前记录 N,L1 开始用记录 N 则结果正确,B 正确。不能加 else 子句,否则不是最后等于 M,Flag 将等于 0,C 错误。如果 N=0,则 Flag 不可能等于 1,D 错误。故选 B。
第 14 题 阅读下面的 C++ 代码。执行后如输入 5,其输出的字符图形是 ( )。
int n,i,j,k; cin >> n; for (i = 0 ; i < n; i++){ for (j = 0 ; j < n-i-1 ; j++) cout << " " ; for (k = 0 ; k < 2 *i+1 ; k++) cout << "*" ; cout << endl; }
选项 图形描述 A 正三角形 B 倒三角形 C 左对齐三角形 D 右对齐三角形
解析: 答案 B。外循环 i 从 0 到 n-1,第 1 个内循环,j 从 0 到 n-i-1,打印空格,空格数量随行数增加而减少,形成金字塔形状的一部分。第 2 个内循环循环次数为奇数,所以 B 正确。故选 B。
第 15 题 某学校举办'十佳歌手大奖赛',经过选拔最终参赛选手有 25 人,评委 10 人,最终计分规则去掉一个最高分去掉一个最低分作为该参赛选手的最终得分,并输出该得分。如果单个评委可给满分为 10 分,则相关说法正确的是 ( )。
float total_score, max_score, min_score, now_score; for (int i = 0 ; i < 25 ; i++){ max_score = 0 ; min_score = 10 ; total_score = 0 ; for (int j = 0 ; j < 10 ; j++){ cin >> now_score; max_score = max (max_score, now_score);
A. 程序总体逻辑错误。因为要去掉最高分和最低分,需要排序,而程序没有相关代码。
B. 内层循环和外层循环之间的三行代码也就是 max_score = 0 开始的三行代码应该移动到外层循环外。
C. L1 和 L2 标记的两行代码可以分别改为简单的 if 语句或 ? : 语句。
D. total_score += now_score 不可以更改为 total_score = total_score + now_score。
解析: 答案 C。程序内循环求某位选手 10 位评委的分数,因为评委最高分为 10 分,最低分初始化为 10,最高分初始 0 正确,去掉一个最高分去掉一个最低分无需排序,A 错误。如将内层循环和外层循环之间的三行代码也就是 max_score = 0 开始的三行代码应该移动到外层循环外,则变量初始化只做一次,第 2 位选手起会累加前面所有选手的分数导致结果不正确,B 错误。Max、min 函数可用 if 语句或 ? : 语句替代,C 正确。total_score += now_score 与 total_score = total_score + now_score 等价,D 错误。故选 C。
2 判断题(每题 2 分,共 20 分) 第 1 题 鸿蒙是华为公司开发的一款操作系统,那么它能够将正确的源程序翻译成目标程序,并运行。( )
解析: 答案╳ (错误)。操作系统不是编译系统,源程序翻译成目标程序的软件是编译系统,故错误。
第 2 题 C++ 表达式 5 < 10 && 20 对应的逻辑值为 true 。( )
解析: 答案√ (正确)。C++ 表达式 5 < 10 && 20,5 < 10 结果为 true,20 非零等价为 true,所以 true && true 结果为 true,故正确。
第 3 题 C++ 表达式 10 / 0.333333 == 10 / (1 / 3) 的值为 true 。( )
解析: 答案╳ (错误)。C++ 浮点数常量默认为 double 型,10/0.333333 为 double 型 30,而 1/3 为整除,结果为 0,10/0 出现异常,所以结果不为 true,故错误。
第 4 题 下面 C++ 代码中 N 是整数,执行时无论输入负整数、0 或正整数,其输出都将是 0 。( )
cin >> N; while (N) N /= 10 ; cout << N;
解析: 答案√ (正确)。N /= 10,等价为 N = N / 10,不管 N 是正负整数,还是 0,最终终为 0,故正确。
第 5 题 下面的 C++ 代码执行后,其输出是 4 0 。( )
int a,b; a = 4 ; b = a == 5 ; cout << a << ' ' << b;
解析: 答案√ (正确)。在 C++ 中,赋值运算符=的优先级远低于相等性比较运算符==的优先级。这意味着在表达式中,相等性比较会先于赋值操作执行,b = a == 5 等价为 b = (a == 5),所以 b = false,输出为 0,输出为 4 0,故正确。
第 6 题 C++ 代码中对表达式 ('Z' - 'A') < ('z' - 'A') 的结果输出为 0 。( )
解析: 答案╳ (错误)。ASCII 码小写字母大于大写字母,'A'为 65,'a'为 97,'Z'为 90,'z'为 122,所以'Z' - 'A') < ('z' - 'A'等价为 25 < 57,关系成立,输出为 1,故错误。
第 7 题 下面的 C++ 代码可以用于判断正整数 N 的位数(即几位数,如 123 是 3 位数,12 为 2 位数)。( )
int N, N10, i; cin >> N; N10 = 10 , i = 1 ; while (1 ) { if (N % N10 == N) { printf ("%d 是 %d 位数" , N, i); break ; } i++, N10 *= 10 ; }
解析: 答案√ (正确)。程序 N10 后几个 0 去模 N 会等于 N,那么这个 0 的个数刚好是 N 的位数,N10 初值 10,为 1 后一个 0,N10*=10,相当于 N10 后添了个 0。如 123 % 1000 等于 123,12 % 100 等于 12,故正确。
第 8 题 计算交叉加减的结果,形如 1-2+3-4+5-……。下面 C++ 代码中的变量都是整型,则将 Flag = -Flag 改为 Flag -= Flag 效果相同。( )
cin >> N; Flag = -1 ; tnt = 0 ; for (i = 1 ; i < N + 1 ; i++) { Flag = -Flag; tnt += Flag * i; }
解析: 答案╳ (错误)。因为 Flag 初值为 -1,Flag = -Flag 相当于 Flag 从 -1 变 +1,或 Flag 从 +1 变 -1,实现正负交替。Flag -= Flag,等价为 Flag = Flag – Flag,Flag – Flag 恒为 0,不能实现正负交替。故错误。
第 9 题 下列 C++ 代码段执行后将输出 55 。( )
int cnt = 0 ; for (i = 0 ; i < 10 ; i++) for (j = i; j < 10 ; j++) cnt += 1 ; cout << cnt;
解析: 答案√ (正确)。外层循环 i 从 0 到 9,内层循环 j 从 i 到 9,进行计数。i=0 时,j 从 0 到 9 计数 10 次;i=1 时,最低价 1 到 9 计数 9 次;……;i=9 时,j 从 9 到 9 计数 1 次。10+9+…+1=55,故正确。
第 10 题 下面 C++ 代码执行后输出如下,因为代码 printf("\n") 没有任何可读内容,删除不影响输出效果。( )
for (int i = 1 ; i < 10 ; i++) { for (int j = 1 ; j < 10 ; j++) printf ("%3d" , i * j); printf ("\n" ); }
解析: 答案╳ (错误)。内层循环是连续按 3 位宽打印 i*j,而 printf("\n") 是打印一行后换行 ("\n"是换行符)。删除 printf("\n") 将使这 9 行连在一起打印,得不到题目给出的输出效果,故错误。
3 编程题(每题 25 分,共 50 分)
3.1 编程题 1
试题名称:环保能量球
时间限制:1.0 s
内存限制:512.0 MB
3.1.1 题目描述 小杨最近在玩一个环保主题的游戏。在游戏中,小杨每行走 1 公里就可以获得 1 点'环保能量'。为了激励玩家,游戏设置了'里程奖励':小杨每行走 x 公里,游戏就会额外奖励 1 点能量。现在已知小杨总共行走了 n 公里,请你帮他计算,他一共能获得多少点环保能量?
3.1.2 输入格式
第一行包含一个正整数 t,代表测试数据组数。
对于每组测试数据:
第一行包含一个正整数 n,代表行走的公里数。
第二行包含一个正整数 x,代表奖励触发的间隔。
3.1.3 输出格式
对于每组测试数据,输出一个整数,代表小杨获得的环保能量总数。
样例解释
对于第 1 组数据,n=5, x=2:小杨行走获得 5 点能量。此外,他在第 2 公里和第 4 公里时各获得 1 点额外奖励,总共 7 点。
对于第 2 组数据,n=10, x=3:行走获得 10 点。他在第 3、6、9 公里时各获得 1 点额外奖励,总共 13 点。
对于第 3 组数据,n=2, x=5:行走获得 2 点。由于行走路程不足 5 公里,没有额外奖励,总共 2 点。
3.1.5 数据范围
对于全部数据,保证:1≤t≤100,1≤n, x≤1000。
3.1.6 编写程序
编程思路:
方法一:
(1) t 组数据,每组两个数 n 和 x。根据数据范围,不需要对特殊数据 (如 0,负数等) 进行处理。
(2) 每组的基础能量为 n 点,每满 x 额外奖励 1 点能量,即额外奖励 n 整除 x (n / x) 点能量。
(3) 总能量 = n + n / x。注意 C++ 整数除以整数为整除 (只取商且为整数)。
参考程序代码如下:
#include <iostream>
using namespace std;
int main () {
int t, n, x;
cin >> t;
for (int i=0 ;i<t;i++){
cin >> n >> x;
cout << (n + n / x) << endl;
}
return 0 ;
}
方法二:
(1) t 组数据,每组两个数 n 和 x。根据数据范围,不需要对特殊数据 (如 0,负数等) 进行处理。
(2) 每组从 1 走到 n 公里,每走 1 公里,能量加 1,每满 x 公里 (走过的公里数是 x 的倍数额外加 1 能量。
(3) 计数结果为总能量。
参考程序代码如下:
#include <iostream>
using namespace std;
int main () {
int t, n, x;
cin >> t;
for (int i=0 ;i<t;i++){
cin >> n >> x;
int cnt=0 ;
for (int j=1 ;j<=n;j++){
cnt ++;
if (j % x == 0 )
cnt++;
}
cout << cnt << endl;
}
return 0 ;
}
3.2 编程题 2
试题名称:黄金格
时间限制:1.0 s
内存限制:512.0 MB
3.2.1 题目描述 小杨在探险时发现了一张神奇的矩形地图,地图有 H 行和 W 列。每个格子的坐标是 (r, c),其中 r 表示行号从 1 到 H,c 表示列号 1 到 W。
小杨听说地图中隐藏着一些'黄金格',这些格子满足一个神秘的数学挑战:当格子坐标 (r, c) 代入特定的不等式关系成立时,该格子就是黄金格。具体来说,黄金格的条件是:√(r² + c²) ≤ x + r - c。
例如,如果参数 x=5,那么格子 (4, 3) 就是黄金格。因为左边坐标平方和的平方根 √(4² + 3²) 算出来是 5,而右边 5+4-3 算出来是 6,5 小于等于 6,符合条件。
3.2.2 输入格式
三行,每行一个正整数,分别表示 H, W, x。含义如题面所示。
3.2.3 输出格式
一行一个整数,代表黄金格数量。
样例解释
图中标注为黄色的四个格子是黄金格,坐标分别为 (1, 1),(2, 1),(3, 1),(4, 1)。
3.2.5 数据范围
对于所有测试点,保证给出的正整数不超过 1000。
3.2.6 编写程序
编程思路:
方法一:
根据数据范围,不需要对特殊数据 (如 0,负数等) 进行处理。本方法采用枚举法,遍历所有格子,测试黄金格的条件是:√(r² + c²) ≤ x + r - c,条件成立为黄金格,计数加 1,否则不计数。条件可转化为 r² + c² ≤ (x + r – c)²,避免开平方运算。
参考程序代码如下:
#include <iostream>
using namespace std;
int main () {
int H, W, x, cnt=0 ;
cin >> H >> W >> x;
for (int r=1 ;r<=H;r++){
for (int c=1 ;c<=W;c++)
if (r*r + c*c <= (x + r - c)*(x + r - c))
cnt ++;
}
cout << cnt << endl;
return 0 ;
}
方法二:
根据数据范围,不需要对特殊数据 (如 0,负数等) 进行处理。本方法采用枚举法,遍历所有格子,测试黄金格的条件是:√(r² + c²) ≤ x + r - c,条件成立为黄金格,计数加 1,否则不计数。开平方需 math 库的 sqrt() 函数。
参考程序代码如下:
#include <iostream>
#include <cmath>
using namespace std;
int main () {
int H, W, x, cnt=0 ;
cin >> H >> W >> x;
for (int r=1 ;r<=H;r++){
for (int c=1 ;c<=W;c++)
if (sqrt (r*r + c*c) <= x + r - c)
cnt ++;
}
cout << cnt << endl;
return 0 ;
}