CCF-GESP 等级考试 2025年9月认证C++二级真题解析
2025年9月真题
一、单选题(每题2分,共30分)
正确答案:D
考察知识点:计算机相关知识
解析:在人工智能领域,“大模型” 最贴切的通常是指大语言模型。大语言模型是基于大规模文本数据训练的,能够理解和生成自然语言等内容,像常见的 ChatGPT 等就属于大语言模型范畴。而选项 A “大电脑模型” 表述不准确;选项 B “大规模智能” 不是对 “大模型” 的准确指代;选项 C “智能的单位” 也不符合 “大模型” 的定义。答案为D。
正确答案:C
考察知识点:计算机的存储与网络
解析:在 TCP 协议中,建立连接需要通过三次握手。第一次握手是客户端向服务器发送连接请求;第二次握手是服务器收到请求后,向客户端发送确认和自己的连接请求;第三次握手是客户端收到服务器的回复后,再向服务器发送确认,这样双方就建立起可靠的连接了。答案为C。
正确答案:C
考察知识点:标识符的命名规则
解析:根据变量的命名规则:只能包含字母、数字和下划线;不能以数字开头;不能和关键字重名。B、D选项包含了其他字符’ ‘,’-',不能作为变量名。A选项,汉语拼音只要符合变量的命名规则,也可以作为变量名。答案为C。
正确答案:D
考察知识点:基本运算符、流程控制语句-循环
解析:首先,div的作用是通过循环乘以 10,得到一个数,使得N / div可以把第M位及更高位的数保留,去掉低位。比如N = 1234,M = 2时,循环后div = 10。然后N / div得到123(整数除法),再对10取余,就得到第2位的数字3。所以横线处应填N / div % 10。答案为D。
正确答案:D
考察知识点:基本运算符
解析:首先这里变量a,b,c没有定义,写法是不合法的。
假定第一行代码之前定义了整形变量a,b,c,则第一行执行结束,a没有赋值,b赋值为3;第二行代码先执行比较运算符==,再执行赋值运算符=,因a没有赋值,其值未知,因此a==b的结果未知,则c的值未知,输出结果当然未知。答案为D。
正确答案:A
考察知识点:基本运算、流程控制语句-选择
解析:第7-10,根据part1的值选择不同的输出格式,XX从00变化到11,即part1,对12取余结果为0~11;Y从0变化到9,即part2,对10取余结果为0~9;答案为A。
正确答案:D
考察知识点:控制语句结构-循环
解析:i 的值为-10~0,内层循环的循环条件不成立,cnt+=1未被执行;i的值为1~9,根据内层循环的循环条件,cnt+=1被执行次数为 i 次,则cnt+=1一个执行了:1+2+…+9=45次,答案为D。
正确答案:B
考察知识点:循环嵌套、流程控制语句、break、continue
解析:外层循环i从1到11(因为i < 12)。当i为偶数时,执行continue,跳过本次循环剩余部分,所以只看i为奇数的情况(i = 1,3,5,7,9,11)。内层循环 j 从0到 i,当 i*j 为奇数时,执行break,终止内层循环。当 i 等于11,j 等于1时,第6行条件成立,终止内层循环,此时i再增大为12,外层循环条件不成立,循环结束。此时i的值为12,j的值为1。答案为B。
正确答案:D
考察知识点:控制语句结构-循环、基本运算符
解析:在 C++ 中,取余运算a % b里,b不能为0,否则会导致运行时错误(除以零错误),但本题中b等于0不会进入循环,也即不会执行到a%b,选项A错误;
a和b的大小关系不影响取余运算的合法性,只是结果不同,选项 B 错误;
a和b可以是负整数,取余运算在 C++ 中有相应规则,并非必须为正整数才合法,选项 C 错误;
选项 D:如果a输入为0,当b为非零值时,第一次循环remainder = 0 % b = 0,然后a = b,b = 0,循环结束,输出a(即b的原始值),
如果b为0,不进入循环,直接输出a(和b的值相等)。答案为D。
正确答案:A
考察知识点:控制语句结构-循环、continue关键字
解析:初始num = 0,进入while循环(num <= 5)。
第一次循环:num += 1后num = 1,num != 3,执行printf,输出1#。
第二次循环:num += 1后num = 2,num != 3,执行printf,输出2#。
第三次循环:num += 1后num = 3,num == 3,执行continue,跳过printf。
第四次循环:num += 1后num = 4,num != 3,执行printf,输出4#。
第五次循环:num += 1后num = 5,num != 3,执行printf,输出5#。
第六次循环:num += 1后num = 6,num != 3,执行printf,输出6#。
最终输出为1#2#4#5#6#。答案为A。
正确答案:D
考察知识点:流程控制语句-循环
解析:选项 A:若第一个数输入-999,min_num和max_num会被赋值为-999,且循环不执行,输出-999 -999,该选项正确。
选项 B:若第一个数不是-999,且后续没有-999,程序会正常比较每个输入数,求出最大和最小数,该选项正确。
选项 C:考试成绩中无-999,程序能正常运行求出最高和最低成绩,该选项正确。
选项 D:D循环有点描述不清,但无论是移动第1行还是第11行,都会出现问题。
移动第一行,则min_num和max_num的初值变为未知值,后续无法比较。
移动第11行,输入的第一个数作为最大、最小值没问题,进入循环即输入下一个数,这个数参与比较,如果这个是-999,会产生错误。
答案为D。
正确答案:C
考察知识点:控制语句结构-循环、循环嵌套、数位分离、break、continue
解析:第3行 if 语句判断是否是5的倍数,如果是则cnt++,执行continue进入下一次循环;否则数位分离判断是否含有5;
A选项,删除continue,对于5这样既是5的倍数,也含有5的数,cnt+=1会被执行2次,不符合要求,A错误。
选项 B:j = i是为了在不改变i的情况下,对i的每一位进行判断。若删除j = i并将while循环内的j改为i,会改变i的值,影响外层循环的次数和逻辑,影响结果,B错误。
选项 D:原while (j > 0)是判断j为正整数时进行位判断。若改为while (j >= 0),当j = 0时还会进入循环,j % 10 == 0,会执行else里的j /= 10(j还是 0),进入死循环,影响结果,D错误。
选项 C:break的作用是当发现数字含 5 时,跳出while循环。将break改为j = 0,也能跳出while循环(因为j > 0不成立了),效果相同,不影响程序执行结果,C正确。答案为C。
正确答案:A
考察知识点:循环嵌套
解析:当N为10时,第1行输出9个空格,第2行输出8个空格,以此类推,第i行输出N-i个空格。
当N为10时,第1行输出1个数字,第2行输出2个数字,以此类推,第i行输出i个数字。
循环条件用的小于号,循环变量从1开始,横线处应该填写:N-i+1,i+1。答案为A。
正确答案:A
考察知识点:基本数据类型、基本运算、ASCII码
解析:a=‘a’+‘b’,字符类型参与运算,实际上是其对应的ASCII参与运算,且a是整数类型,因此 a 的值为97+98=195。
同,b的值为97-98=-1。此时a=a-b=196。答案为A。
正确答案:D
考察知识点:基本运算
解析:代码中G = (N - 1) / 9和R = (N - 1) % 9是对N-1进行九进制相关的分解,后续根据余数R的不同范围计算对应重量。选项 A 中说必须同时修改 L1 和 L2 才能实现功能,没有依据;选项 B 说必须同时修改 L3 和 L4,也无依据;选项 C 说必须同时修改 L3 和 L5,同样无依据。所以其他说法都不对。答案为D。
二、判断题(每题2分,共20分)
正确答案:错误
考察知识点:集成开发环境
解析: 在现代集成开发环境(如 Visual Studio、Eclipse 等)中,调试过程中是可以修改源程序的,很多集成开发环境支持 “编辑并继续” 功能,修改后不需要终止调试、关闭文件再重新打开,能在调试过程中直接应用修改并继续调试。表述错误。
正确答案:正确
考察知识点:基本运算
解析:在 C++ 中,整数除法是取整运算(舍去小数部分)。当 N 是正整数且大于 100 时,比如 N = 1234,1234 / 100 = 12.34,整数除法会舍去小数部分,得到 12,也就是舍弃了个位(4)和十位(3);当 N 小于 100 时,比如 N = 50,50 / 100 = 0.5,整数除法后结果为 0。表述正确。
正确答案:错误
考察知识点:基本运算
解析:上述C++代码执行后输出确实为1,但不是题目描述中的原因。
原因是:a<10 and 20 出现了比较运算符和逻辑运算符,比较运算符的优先级更高,a的值为5,a<10的结果为真,true and 20 结果为真。实际上,只要 a<10 成立,输出即为1。表述错误。
正确答案:正确
考察知识点:基本运算
解析:第1行代码执行完毕,x,y值未知,z赋值为5,x<y<z,先执行x<y,因为x,y值未知,因此x<y结果未知,但不是true就是false,用此结果和z比较,z的值为5,比较结果result是true,输出为1。表述正确。
正确答案:正确
考察知识点:基本数据类型
解析:输入99.99,存入int类型变量score中,score只存储整数部分99,99>=60成立,执行第5行代码,输出 及格,表述正确。
正确答案:错误
考察知识点:基本运算、数据类型转换
解析:当输入123时,进入while循环:
第一次循环:a%10 = 123%10 = 3,‘A’ + 3 = ‘D’,输出D;然后a = 123 / 10 = 12。
第二次循环:a%10 = 12%10 = 2,‘A’ + 2 = ‘C’,输出C;然后a = 12 / 10 = 1。
第三次循环:a%10 = 1%10 = 1,‘A’ + 1 = ‘B’,输出B;然后a = 1 / 10 = 0,循环结束。
最终输出为DCB,所以该判断题答案为正确。表述错误。
正确答案:正确
考察知识点:控制语句结构-循环、continue关键字
解析:执行for循环:
当i = 0时,不满足if条件,执行printf(“+#”),输出+#;
当i = 1时,不满足if条件,执行printf(“+#”),输出+#;
当i = 2时,满足if条件,执行continue,跳过本次循环剩余语句;
循环结束后,i的值为3,执行cout << i << ‘#’,输出3#。
最终输出为+#+#3#,所以该判断题答案为正确。表述正确。
正确答案:正确
考察知识点:控制语句结构-循环
解析:初始化a = 0(对应斐波那契数列第 1 个数),b = 1(对应第 2 个数)。
循环执行n次:
每次先输出a;
然后通过b = b + a计算下一个数的和,再通过a = b - a更新a为原来的b(即下一个斐波那契数)。
例如,若n = 5,输出为0 1 1 2 3,符合斐波那契数列规律,因此该代码能实现功能,判断题答案为正确。表述正确。
正确答案:正确
考察知识点:控制语句结构-循环
解析:原代码中,当i == j时执行continue,会跳过cout << 0;(L1),导致对角线外的位置无法输出0。
若将cout << 0;移到if块外面(或 L2 位置),则无论i和j是否相等,都会执行输出0的操作,只是当i == j时先输出i+1,再输出0(或在循环结构中合理输出),从而实现题目中的矩阵输出格式。因此该判断题答案为正确。 表述正确。
正确答案:错误
考察知识点:基本运算、基本数据类型、数据类型转换
解析:字符类型参与运算,实际上是其对应的ASCII码参与运算,运算结果为整数。‘5’+4=53+4=58。表述错误。
三、编程题(每题25分,共50分)
本题考察循环嵌套、数位分离。
解析:统计不超过n的优美正整数,优美数:十进制下的所有数位都相同。
显然,遍历 1~n 的所有数用一层for循环;判断优美数用while循环数位分离
#include<bits/stdc++.h>
using namespace std;
int main() {int n, cnt=0;cin>>n;for(int i=1; i<=n; i++){ //不超过n的优美正整数,遍历1~n //判断i是否是优美数:十进制下的所有数位都相同,用flag标记是否是优美数bool flag=true; int t=i%10; //t存储i的个位数//数位分离判断i的所有数位是否都等于t int tmp=i; //不能直接对循环变量i操作,使用tmp存储i,操作tmp while(tmp!=0){if(tmp%10!=t){ //当前数位不等于t,不是优美数,终止循环 flag=false;break;}tmp/=10;}if(flag) cnt++; //flag为true意味着i是优美数 }cout<<cnt;return 0;
}
本题考察 循环嵌套输出矩形图形。
循环嵌套输出矩形图案的题目在二级中已经出了非常多次了。方法就是观察符号出现的规律,在本题中,很显然,# 号出现的比较有规律,实际上,# 号组成了一个空心菱形。而输出空心菱形在讲循环嵌套的时候很多老师会作为一个例题来讲
第一版:分上下两部分来写
单看上部分,行编号 i 为:0~n/2,可以观察到 # 号出现的列编号 j 为 n/2-i 以及 n/2+i,可以用行编号表示出来。
再看下部分,和上部分对称,如果从大到小遍历行编号,也即行编号 i 为:n/2~0,则 # 号出现的列编号和行编号的关系同上部分。
#include<bits/stdc++.h>
using namespace std;
int main() {int n;cin>>n;//上部分for(int i=0; i<=n/2; i++){for(int j=0; j<n; j++){if(j==n/2-i || j==n/2+i) cout<<"#";else cout<<".";}cout<<endl;}//下部分for(int i=n/2-1; i>=0; i--){for(int j=0; j<n; j++){if(j==n/2-i || j==n/2+i) cout<<"#";else cout<<".";}cout<<endl;}return 0;
}
第二版:行编号 i :0~n,找 # 号 出现的位置行编号和列编号的关系,下半部分找起来麻烦点。
#include<bits/stdc++.h>
using namespace std;
int main() {int n;cin>>n;for(int i=0; i<n; i++){for(int j=0; j<n; j++){if(i<=n/2 && (j==n/2-i || j==n/2+i)) cout<<"#";else if(i>=n/2 && (j==n/2-(n-1-i) || j==n/2+(n-1-i))) cout<<"#";else cout<<".";}cout<<endl;}return 0;
}