CCF-GESP 2025年3月C++一级真题+解析+知识点拓展
一、单选题(每题2分,共30分)
答案:D
考察知识点:【计算机应用常识(AI 技术的社会应用)、逻辑思维能力。】
【解析】
选项 A :《哪吒 2》被描述为 “贺岁片” 且 “进入全球票房榜”,显然属于影视作品范畴,而非操作系统。
选项 B 分析:“DeepSeek” 是人工智能(AI)领域的技术或产品
选项 C:《哪吒 2》作为电影,其核心功能是通过剧情、画面等内容提供文化娱乐,不具备 “生成软件” 的技术能力。
选项 D :若 “DeepSeek” 是人工智能系统(如 AI 创作工具),则其完全可能具备基于给定场景(如《哪吒 2》的画面、角色设定等)生成剧情脚本的能力。
答案:D
考察知识点:集成开发环境(IDE)对源代码文件编辑操作的理解,区分代码编辑与非代码内容插入。
解析:在编辑源代码文件时,修改变量定义、保存修改、撤销修改都是常规代码编辑操作;插入执行截图不属于代码编辑范畴,无法在源代码编辑时执行,选D。
答案:D
考察知识点:C++变量命名规则(由字母、数字、下划线组成,且不能以数字开头,不能含特殊字符 )。
解析:A含-
非法;B含$
非法;C含%
非法;D由下划线、字母、数字组成,合法,选D。
答案:C
考察知识点:【C++ 语言关键字的识别与区分】
【解析】
A. abs:并非 C++ 关键字,而是 C/C++ 标准库中的函数,用于计算整数的绝对值。
B. cin:不是关键字,而是 C++ 标准输入流对象,用于从标准输入设备读取数据(如cin >> x;)。
C. do:是 C++ 关键字,用于构成do-while循环语句(语法为do { 语句 } while (条件);),属于流程控制关键字。
D. endl:不是关键字,而是 C++ 标准库中的操纵符,用于输出换行并刷新缓冲区(如cout << endl;)。
关键字与标准库元素的区分
C++ 关键字具有固定语法功能(如do、if、while等),而cin、endl、abs等属于标准库提供的工具,本质是类对象或函数,并非语言关键字。
答案:C
考察知识点:break 语句的使用场景(只能在循环语句或 switch 语句中使用 )。
解析:break 用于跳出循环或 switch,A 是 do - while 循环,B 是 for 循环,D 是 switch,都可配合 break;C 是 if 条件判断,break 不能用于 if,会编译报错 。
答案:B
考察知识点:printf格式化输出,包括宽度控制(%2d 占两位宽度 )、补零(%02d 不足两位补零 )及普通字符输出。
答案:C
考察知识点:C++ 字符串字面量的语法规则(双引号用于界定字符串,单引号用于界定字符 )
解析:C++ 中,双引号用于表示字符串字面量,单引号用于字符。原代码中双引号括起的是字符串,不能直接替换为两个单引号(两个单引号是不合法的字符组合形式,无法正确表示字符串 );A、B 是合法修改字符串内容,D 虽然不常规但语法上三个双引号在 C++ 标准里不影响(实际是错误写法,这里按题目逻辑,C 是明确错误 ),所以错误的是 C。
答案:D
考察知识点:C++ 中算术运算符的优先级与结合性(除法 / 和取余 % 同优先级,从左到右计算 )
解析:先算 16 / 4 = 4,再算 4 % 2 = 0,所以结果是 0 ,选 D 。
知识点拓展
以下是 C++ 考试中常考的运算符优先级(从高到低,搭配典型场景速记 ):
一、高频必记(优先级从高到低 )
优先级 | 运算符 | 场景示例 | 结合性 |
---|---|---|---|
1(最高) | () (函数/表达式分组)、[] (数组下标) | a = (3 + 2) * 5; (括号改变顺序) | 左→右 |
2 | ++ (前缀自增)、-- (前缀自减)、! (逻辑非)、~ (按位取反)、* (解引用)、& (取地址) | int b = ++a; (先自增再赋值) | 右→左 |
3 | * (乘法)、/ (除法)、% (取模) | 16 / 4 % 2 (先除后取模) | 左→右 |
4 | + (加法)、- (减法) | a + b * c (先乘后加减) | 左→右 |
5 | << (左移)、>> (右移) | num << 2 (位运算,优先级高于关系运算) | 左→右 |
6 | < 、<= 、> 、>= (关系比较) | a < b + 3 (先算 b+3 再比较) | 左→右 |
7 | == (等于)、!= (不等于) | a == b * 2 (先乘后判断相等) | 左→右 |
8 | && (逻辑与 > 逻辑或) | a > 0 && b < 5 (先算关系运算,再逻辑与) | 左→右 |
9 | = (赋值)、+= 、-= 等复合赋值 | a = b + 3; (先算 b+3 再赋值) | 右→左 |
二、典型易错题对比
-
++
/--
与赋值- 前缀
++a
:先自增,再参与运算(如b = ++a;
→a
先 +1,再赋值给b
)。 - 后缀
a++
:先参与运算,再自增(如b = a++;
→a
先赋值给b
,再 +1 )。
- 前缀
-
逻辑运算 vs 位运算
&&
(逻辑与):短路特性(左边为假,右边不执行 );&
(位与):无短路,逐位运算。- 优先级:
&
高于&&
?不!逻辑运算符&&
/||
优先级低于关系运算,但高于赋值;位运算&
/|
优先级低于关系运算,高于赋值。
-
复合赋值的“陷阱”
a += b * c
:等价于a = a + (b * c)
(先算乘,再复合赋值 ),而非(a + b) * c
。
三、速记口诀(简化版 )
“单算移关与,逻条赋逗低”
(单目→算术→移位→关系→逻辑与→逻辑或→条件→赋值→逗号 ,优先级递减 )
考试遇运算符嵌套,优先看括号,再按优先级拆分,结合性辅助确认方向(如赋值、单目是“右结合”,算术、逻辑是“左结合” ),就能快速解题啦~
答案:D
考察知识点:C++ 整数除法与取余运算的优先级及结果类型
12 % 3 + 12 / 5
→ 0 + 2 // 12%3=0,12/5=2
→ 2
常见误区:
- 混淆整数与浮点数除法:若其中一个操作数为浮点数(如 12.0 / 5),结果会是 2.4,但题目中未明确说明 N为浮点数,默认按整数处理。
- 错误计算优先级:误认为 % 优先级高于 /,但实际上二者同级,按从左到右计算(本题中顺序不影响结果)。
答案:D。
考察知识点:C++ 中printf
格式化输出(格式控制符与普通字符的输出规则,%d
用于输出整数,双引号内普通字符原样输出 )。
解析:printf中{N}*{N}={%d*%d}
里,{N}*{N}={和}
是普通字符原样输出,%d
对应N(值为 10 ),所以输出{N}*{N}={10*10}
,选 D。
答案:D
考察知识点:C++ 整数除法与乘法的运算顺序及结果,整数除法会截断小数部分 。
解析:输入first = 100
,second = 200
,先算first / second
,即100 / 200 = 0
(整数除法截断小数),再乘以second
,0 * 200 = 0
,输出 0 ,选 D 。
答案:C
考察知识点:C++ 中逻辑表达式、取余运算,对“能被 2 整除且除以 7 余数为 2”条件的逻辑转换 。
解析:“能被 2 整除”等价于 i % 2 == 0
、!(i % 2)
、i % 2 != 1
;“除以 7 余数为 2”是 i % 7 == 2
。C 选项中 !(i % 7)
是“除以 7 余数为 0”,不符合需求,不能实现,选 C 。
等价写法对比
表达式 | 含义 | 示例(i=4 ) | 示例(i=5 ) |
---|---|---|---|
i % 2 == 0 | 余数等于0,即能被2整除 | 4 % 2 → 0 ✔️ true | 5 % 2 → 1 ❌ false |
!(i % 2) | 余数取反,即余数为0时为真 | !(0) → ✔️ true | !(1) → ❌ false |
i % 2 != 1 | 余数不等于1,即余数为0 | 4 % 2 → 0 ✔️ true | 5 % 2 → 1 ❌ false |
答案:A
考察知识点:C++ 循环中整数的累加运算,以及对称区间整数求和的规律(从 -n 到 n-1 的和为 -n )。
解析:循环 i
从 -1000 到 999 ,可看作 -1000 到 999 的整数相加,其中 -999 和 999 、 -998 和 998 等对称数相加为 0 ,最后剩下 -1000 ,所以 tnt
最终为 -1000 ,选 A 。
答案:A
考察知识点:C++ 中 for
循环的执行流程、continue
语句的作用(跳过本次循环剩余语句,进入下一次循环判断 )。
解析:
- 循环条件是
i < 100
,每次循环i += 5
。 - 当
i
为 96 时,满足i < 100
,执行continue
,然后i
变为 101 。 - 此时判断
101 < 100
不成立,循环结束,i
的值是 101 。
答案:C
考察知识点:C++循环、条件判断(continue
、break
作用,以及取余运算逻辑 )
解析:ontinue 是一个控制流语句,用于立即跳过当前循环体的剩余部分
i
从5开始,每次+5遍历到95。i
为偶数时continue
跳过tnt +=1
,奇数才执行。同时找i%3==0 && i%7==0
(即i
是21倍数),第一个这样的i
是105(超出循环)?不,循环i<100
,i
最大95,实际循环中i
依次是5、10、15…95 。其中奇数i
有5、15、25、35、45、55、65、75、85、95 ,共10个,执行到这些i
时tnt +=1
,且循环内无break
触发(因无i
同时被3和7整除且小于100 ),所以tnt
最终为10,选C 。
二、判断题(每题2分,共20分)
答案:正确(√)
考察知识点:高级编程语言的执行原理(高级语言需通过编译或解释转换为机器指令执行 )
解析:C++、Python作为高级语言,代码需经编译(C++)或解释(Python)转化为机器指令,由计算机硬件执行,所以该表述正确。
- 答案:错误(×)
- 考察知识点:C++ 算术运算符(
*
、%
)的运算规则,取余运算结果与操作数的关联性。 - 解析:
N * 2 % N
结果取决于N
。如N = 1
时,1*2%1 = 0
;N = 3
时,3*2%3 = 0
,并非恒为2
,结果随N
变化。
- 答案:错误(×)
- 考察知识点:C++ 数据类型(
char
)的存储特性,cin
输入规则及 ASCII 码运算。 - 解析:
char
存字符 ASCII 码,输入10
时,cin
只读首个字符'1'
(ASCII 是49
),计算49 * 2 = 98
,输出不是20
,因类型与输入处理不匹配。
- 答案:正确(√)
- 考察知识点:C++
continue
语句的作用,循环结构中流程控制的逻辑简化。 - 解析:
continue
用于跳过循环剩余代码,但此代码中continue
后无额外逻辑,删除后if-else
正常执行奇偶判断,程序效果不变。
- 答案:错误(×)
- 考察知识点:C++ 标识符(变量名)的命名规则,合法标识符的定义。
- 解析:
_
是 C++ 合法标识符(变量名),可用于循环变量,代码语法合规,能正常输出*
,不会报错。
- 答案:正确(√)
- 考察知识点:
for
循环的执行流程(初始化、条件判断、增量、循环体执行逻辑 )。 - 解析:
i
初始为3
,满足i < 5
,输出3
;i += 2
后i = 5
,不满足i < 5
,循环结束。实际只输出3
? 哦,错了!重新看:for (int i = 3; i < 5; i += 2)
,第一次i=3
,输出3
;然后i += 2
变为5
,5 < 5
不成立,循环结束。所以只输出3
,答案是错误(×) 。之前分析错误,核心是循环条件判断:i < 5
,i=3
执行后,i
变为5
,不满足条件,循环仅执行一次,输出3
,并非3
和5
。
- 答案:错误(×)
- 考察知识点:
for
循环遍历、表达式逻辑判断(i * 2 < i * i
何时为真 ),以及布尔值输出(C++ 中bool
转int
输出特性 )。 - 解析:循环
i
从0
到9
:i=0
:0*2 < 0*0
→0 < 0
→false
(输出0
)i=1
:2 < 1
→false
(输出0
)i=2
:4 < 4
→false
(输出0
)i=3
:6 < 9
→true
(输出1
)i=4
:8 < 16
→true
(输出1
)i=5
到9
:均满足true
。
实际输出0 0 0 1 1 1 1 1 1
,true
(即1
)出现6
次,不是7
次,答案错误(×) 。
- 答案:错误(×)
- 考察知识点:C++ 变量命名规则(合法标识符的构成:字母、数字、下划线,且不能含
-
等特殊字符 )。 - 解析:
user-Name
含非法字符-
,不是合法变量名,答案错误(×) 。
- 答案:错误(×)
- 考察知识点:
continue
与break
的区别(continue
跳过本次循环剩余代码,break
终止整个循环 )。 - 解析:
continue
是跳过当前循环迭代剩余部分,进入下一次迭代;break
才是提前结束循环。答案错误(×) 。
- 答案:错误(×)
- 考察知识点:
scanf
输入规则(%d
只读取整数部分,输入3.6
时N
接收3
),以及整数除法与乘法的运算顺序。 - 解析:
scanf("%d", &N)
输入3.6
,N
实际为3
(%d
截断小数);计算3 / 3 * 5 = 5
,不是6
。答案错误(×) 。
三、编程题(每题 25 分,共50 分)
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n,x,y;
cin>>n>>x>>y;
cout<<n-ceil(y*1.0/x);
return 0;
}
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 读取整数个数
for (int i = 0; i < n; i++) {
int num;
cin >> num; // 读取需要处理的整数
// 核心逻辑:四舍五入到最近整十数
int remainder = num % 10; // 取个位数字
if (remainder < 5) {
num -= remainder; // 小于5则舍去个位(如43 → 40)
} else {
num += (10 - remainder); // 大于等于5则进位到下一个整十(如58 → 60)
}
cout << num << endl; // 输出结果
}
return 0;
}
以下是用 C++ 实现“将整数四舍五入到最近整十数”的代码:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 读取整数个数
for (int i = 0; i < n; i++) {
int num;
cin >> num; // 读取需要处理的整数
// 核心逻辑:四舍五入到最近整十数
int remainder = num % 10; // 取个位数字
if (remainder < 5) {
num -= remainder; // 小于5则舍去个位(如43 → 40)
} else {
num += (10 - remainder); // 大于等于5则进位到下一个整十(如58 → 60)
}
cout << num << endl; // 输出结果
}
return 0;
}
四舍五入核心:
- 用
num % 10
取个位数字remainder
。 - 若
remainder < 5
,直接减去个位(如43 → 43 - 3 = 40
)。 - 若
remainder ≥ 5
,加上10 - remainder
进位(如58 → 58 + 2 = 60
)。
输出:每个数处理完直接输出,符合题目“每行一个结果”的要求。
有问题/建议,欢迎指出~~~