CCF-GESP 等级考试 2025年6月认证C++二级真题解析

发布于:2025-07-09 ⋅ 阅读:(29) ⋅ 点赞:(0)

1 单选题(每题 2 分,共 30 分)

第1题 2025年4月19日在北京举行了一场颇为瞩目的人形机器人半程马拉松赛。比赛期间,跑动着的机器人会利用身上安装的多个传感器所反馈的数据来调整姿态、保持平衡等,那么这类传感器类似于计算机的( C )。

A. 处理器                           B. 存储器                           C. 输入设备                              D. 输出设备

解析:答案:C。所有传感器都用于采集数据,属于输入设备,故选C

第2题 小明购置的计算机使用一年后觉得内存不够用了,想购置一个容量更大的内存条,这时他需要的内存条是( A )。

A. RAM                           B. ROM                                C. CACHE                                 D. EPROM

解析:答案:A。内存条属于随机存储器(RAM),故选A

第3题 下面C++代码执行后的输出是( C )。

  1. int a=3;
  2. float b = 3.5;
  3. cout << (a *= b);

A. 3                                   B. 3.5                                   C. 10                                         D. 11

解析:答案:Ca*=b, 等价a=a*b, a*b=3*3.5=10.5,为浮点数,因为a为整型变量,10.5赋值给a会隐形转换为整型(0取整)a=10。故选C

第 4 题 下面C++代码用于获得正整数的第3位数,如1234则输出2。如果是一位数或两位数,则输出0。横线处应填 入的代码是( A )。

  1. int N, remainder;
  2. cout << "请输入正整数:";
  3. cin >> N;
  4. cout << _________________;

A. N % 1000 / 100          B. N / 1000 % 100           C. N / 1000 / 100                   D. N % 100 / 100

解析:答案:A。获得正整数的第3位数,可将该数整除100,再取个位数;或取该数的后3位,再整除100N / 100 % 10,或N % 1000 / 100,故选A

第 5 题 下面C++代码执行,其输出是( D )。

  1. int a, b = (6, 28);
  2. b == a;
  3. a = b;
  4. cout << a << ' ' << b;

A. 6 28                             B. 6 6                               C. 28 6                                     D. 28 28

解析:答案:D。第1a没有初始化,其值不确定(为分配内容的原内容)b初值化为逗号表达式(6, 28),逗号表达式返回为最后一个子表达式,由于逗号表达式优先级最低,故赋值要加括号,(6, 28)返回为28,所以b初始化为28。第2行由于表达式b==a既没有赋给别的变量,也没有输出,没有实际意义。第3a=bb赋给aab的值28。故选D

第6题 今天星期六,其后第N天星期几?如果是星期一到星期六输出形如:星期1、星期2等,星期天则输出星期天。下面的C++代码用于完成上述要求,横线处应填上的代码是( D )。

  1. int N, remainder;
  2. cin >> N;
  3. remainder = _____________;
  4. if(remainder == 0)
  5.     printf("星期六后第%d天是星期天\n", N);
  6. else
  7.     printf("星期六后第%d天是星期%d\n", N, remainder);

A. (N + 6) / 7                B. (N + 6) // 7                    C. N % 7                                 D. (N + 6) % 7

解析:答案:D。由第4~7行可知,星期天remainder0,星期一~星期六remainder1~6,故可将星期六后第N表示为“6+N”星期几 % 7求,7 % 7=0(1~6) % 7 = (1~6)。所以完整表达式为(6+N) % 7。故选D。另A. N1~3之间结果都为0,不符要求,B. C++没有//运算符(表示注释)C. 今天是星期六没有关系。

第7题 下面的C++代码执行后其输出是( C )。

  1. int i, Sum = 0;
  2. for (i = 1; i < 10; i++){
  3.     Sum += i;
  4.     if(i % 2) continue;
  5.     if(i % 7) break;
  6. }
  7. cout << Sum;

A. 45                                 B. 28                                  C. 3                                        D. 0

解析:答案:Ci % 2表示i不能整除2(i能整除2i % 2 = 0,等价为false)i % 7表示i不能整除7(i能整除7i % 7 = 0,等价为false)i1时,Sum1Sum=1,第4行条件成立continue到下一循环i=2Sum2Sum=3,第4行条件不成立(i % 2 = 0,等价false),第5行条件成立(i % 7 = 2,非0等价为ture)中断跳出循环,显示Sum,故选C

第8题 下面C++代码执行后其输出是( C )。

  1. int i, j;
  2. for(i = 1; i < 12; i++)
  3.     for(j = 1; j < i; j++)
  4.         if(i * j % 2 == 1)
  5.             break;
  6. cout << i * j;

A. 110                               B. 22                                 C. 12                                      D. 3

解析:答案:Ci =1时内循环不执行(i=1j=1j<i不成立)i=2…10时,i*j为偶数则执行内循环,否则中断内循环。当i=11时,当j=1i * j % 2 == 1成立,此时j=1,中断内循环,i++i=12i<12不成立结束外循环,所以执行第6行时i=12j=1,输出i*j=12,选C

第9题 下面C++代码执行后输出是( B )。

  1. int i, cnt = 0;
  2. for(i = -99; i < 100; i += 2)
  3.     cnt = 1 + cnt;
  4. cout << cnt;

A. 101                               B. 100                              C. 99                                     D. 98

解析:答案:B。循环变量i-99步长为299,共100次。cnt加了1001,故选B

第10题 下面C++代码执行后输出是( A )。

  1. int i;
  2. for(i = 1; i < 10; i++){
  3.     if(i % 3 != 0){
  4.         printf("A#");
  5.         continue;
  6.     }
  7.     else
  8.         break;
  9.     printf("0#");
  10. }
  11. if(i == 10) cout << "1";

A. A#A#                           B. A#0#A#0                    C. A#A#1                           D. A#0#A#0#1

解析:答案:A。虽然第2行循环为9次,但实际,第3(i=3)(i % 3 != 0)不成立,就中断循环。不管是continue还是break,都不会执行第9行printf("0#");i=1时执行printf("A#");输出A#continue直接返回到下一轮循环,此时i=2,执行printf("A#");输出A#continue直接返回到下一轮循环,此时i=3,执行break中断跳出循环,i=3,第11行条件不成立,没有输出。故选A

第11题 下面C++代码执行后的输出是( D )。

  1. int i,j;
  2. for(i = 0; i < 3; i++)
  3.     for(j = 0; j < i; j++)
  4.         printf("%d#%d-", i, j);
  5. printf("END");

A. 0#0-1#0-2#0-2#1-END                                 B. 0#0-1#0-1#1-2#0-2#1-2#2-3#0-3#1-3#2-END

C. 0#0-1#0-1#1-2#0-2#1-2#2-END                  D. 1#0-2#0-2#1-END

解析:答案:Di=0j=0j<i不成立,内循环不执行没有输出,i=1,内循环1次,输出1#0-i=2,内循环2次,输出2#0-2#1-,然后结束循环,输出END,合并输出1#0-2#0-2#1-END。选D

第12题 下面C++代码执行后,将输出不能被3整除且除以5余数为2的数。下列选项不能实现的是( D )。

  1. int i,j;
  2. for(i = 0; i < 100; i++)
  3.     if(______________________)
  4.         cout << i << endl;

A. (i % 3 != 0) && (i % 5 == 2)                                         B. (i % 3) && (i % 5 == 2)

C. (i % 3) && !(i % 5 != 2)                                                D. !(i % 3) && (i % 5 == 2)

解析:答案:Di % 3 != 0表示i不能被3整除,i % 3也表示i不能被3整除(i能被3整除,i%3=0,等价false)!(i % 3) 表示i能被3整除(i能被3整除,i%3=0,等价false!为否,则等价为ture)A. (i % 3 != 0) && (i % 5 == 2)表示i不能被3整除且i除以5余数为2B. (i % 3) && (i % 5 == 2)表示i不能被3整除且i除以5余数为2C. (i % 3) && !(i % 5 != 2)表示i不能被3整除且i除以5余数为2D. !(i % 3) && (i % 5 == 2)表示i能被3整除且i除以5余数为2,所以不能实现输出不能被3整除且除以5余数为2的数的是D。故选D

第13题 下面C++代码用于判断一个大于0的正整数是几位数,横线处应填入代码先后是( D )。

  1. int N, cnt;
  2. cout << "请输入大于0的正整数:";
  3. cin >> N;
  4. cnt = 0;
  5. while (_________){
  6.     cnt += 1;
  7.     ______________;
  8. }
  9. cout << cnt;

A.

  1. N > 1
  2. N = N / 10

B.

  1. N > 1
  2. N /= 10

C.

  1. N == 0
  2. N /= 10

D.

  1. N > 0
  2. N /= 10

解析:答案:D。判断一个大于0的正整数是几位数,可以将此数整除10,结果再整除10,直到整除的结果为0时能整除的次数就是该正整数的位数。AB是相同的(N/=10等价N=N/10)C6行填N==0,循环不会执行。D正确。选D

第14题 判断一个数是否为自守数。自守数的定义是如果一个数的平方其尾数与该数相同,则为自守数,如25的平方是625,其尾数是25,所以25是自守数。相关说法错误的是( D )。

  1. int N, N1, M1;
  2. cout << "输入一个正整数:";
  3. cin >> N;
  4. N1 = N, M1 = N * N;
  5. bool Flag = true;
  6. while (N1 > 0){
  7.     if (N1 % 10 != M1 % 10){
  8.         Flag = false;
  9.         break;
  10.     }
  11.     else{
  12.         N1 = N1 / 10, M1 = M1 / 10;
  13.     }
  14. }
  15. if (Flag == true)
  16.     printf("%d的平方是%d,是自守数", N, N * N);
  17. else
  18.     printf("%d的平方是%d,不是自守数", N, N * N);

A. 如果Flag在循环中不被改为false,则说明该数是自守数

B. 代码 if (N1 % 10 != M1 % 10) 用于判断其个位数是否相等,如果不等,则表明不是自守数

C. 代码 N1 = N1 / 10, M1 = M1 / 10 将个位数去掉

D. 将 N1 > 0 改为 N > 0 效果相同

解析:答案:D。程序通过Flag=tureFlag=false来表示是否是自守数,先默认Flag=true,当判断不是自守数时将Flag置为falseA.循环N1的每一位与M1对应每一位是否不相等,如到循环结束仍不成立,Flag在循环中不被改为false,则说明该数是自守数,所以A正确;B. if (N1 % 10 != M1 % 10)用于判断其个位数是否相等,如果不等,则表明不是自守数,正确;C.N1 = N1 / 10, M1 = M1 / 10 将N1和M1的个位数去掉,正确;D. 如将N1 > 0改为N > 0,由于循环中没有修改N的语句,所以循环将成为无限循环,得不到结果。所以D判断一个数是否为自守数不能实现。故选D

第15题 下面C++代码实现输出如下图形,相关说法错误的是( A )。

  1. 请输入层数: 10
  2. 0
  3. 12
  4. 345
  5. 6789
  6. 01234
  7. 567890
  8. 1234567
  9. 89012345
  10. 678901234
  11. 5678901234

  1. int line_number, now_number;
  2. int i,row;
  3. cout << "请输入行数: ";
  4. cin >> line_number;
  5. now_number = 0;
  6. for (row = 1; row < line_number + 1; row++){ // L1
  7.     for (i = 0; i < row; i++){ // L2
  8.         cout << now_number;
  9.         now_number += 1;
  10.         if (now_number == 10) now_number = 0; // L3
  11.     }
  12.     cout << endl;
  13. }

A. 代码 now_number = 0 移动到 L1 和 L2 标记的两行代码之间,效果维持不变

B. 代码 now_number += 1 修改为 now_number = 1 + now_number 效果维持不变

C. 将代码 now_number == 10 调整为 now_number > 9 效果维持不变

D. 将最后一行的 cout << endl 修改为 cout << "\n" ,效果维持不变

解析:答案:AA. 如将now_number = 0移动到L1L2标记的两行代码之间,则每行都将从重新从0开始计数,得不到题目给出的图形,故错误;B. now_number += 1修改为now_number = 1 + now_number,两者等价,效果维持不变;C. now_number == 10调整为now_number > 9,由于now_number=10之后就改为0,now_number不可能超过10,所以now_number == 10now_number > 9等价;D. cout << endl修改为cout << "\n"endl"\n"加刷新,输出效果等价。故选A

2 判断题(每题 2 分,共 20 分)

第1题 人们现在参加很多闭卷考试时通常都不允许带智能手机、平板电脑等,此外很多种智能手表同样因为具有嵌入操作系统及通信等功能,所以也不允许随身携带。( √ )

解析:正确。智能手表因为具有嵌入操作系统及通信等功能,通讯功能风险:1.智能手表普遍具备蓝牙、Wi-Fi或蜂窝网络功能,可实现实时信息收发(如接收答案、传输试题),即使关机或断网,其硬件模块仍存在作弊隐患。2.‌信息存储与计算能力:可存储公式、文档、图片等考试相关资料,或内置计算器、单位换算等工具,违反"仅依靠知识储备答题"的原则。3.‌隐蔽性高,监管困难:部分智能手表外观与普通手表相似,监考人员难以快速甄别功能;其屏幕切换、震动提醒等特性可能用于传递作弊信号,所以也不允许随身携带。

第2题 在C++代码中,假设N为正整数,则 N / 10 舍弃个位数。如果 N 小于10,则其值为0,大于10则是舍弃个位数的数。( √ )

解析:正确。C++对正整数NN/10为整除,即去除个位数(不计余数只保留商),如N<10N/100,故正确

第3题 下列C++代码执行后,其输出为10 20,即a == b和b == a对a和b的值没有任何影响。( × )

  1. int a = 10, b = 20;
  2. a == b;
  3. b == a;
  4. cout << (a, b);

解析:错误。第4行中(a,b)为逗号表达式,输出为b的值20,虽然a == bb == aab的值没有任何影响,也不会输出10 20。故错误。

第4题a和b分别是C++的整型变量,如果表达式max(a, b) == min(a, b)的值为真,则说明a和b相等。( √ )

  • 解析:正确。两个整数a,b的最大值和最小值相等,当且仅当a=b时成立,故正确。证明:若a>b,则max(a,b)=amin(a,b)=b,此时要求a=b,矛盾。若a<b,则max(a,b)=bmin(a,b)=a,此时要求b=a,矛盾。唯一可能性a=b

第5题 下面C++代码编译时将报错,因为字符变量a被赋值了浮点值。( × )

  1. char a = '1';
  2. a = 45.6;
  3. cout << a;

解析:错误。第245.6赋给a,因为a是字符变量,等价单字节整型变量,会隐式转换为整型45,输出为“-”

第6题 下面C++代码执行时如输入59.99,将输出 及格 两个汉字。( × )

  1. int score;
  2. cout << "请输入学生成绩: ";
  3. cin >> score;
  4. if (score < 60)
  5.     cout << "不及格";
  6. else
  7.     cout << "及格";

解析:错误。score为整型变量,cin只能接受数字,score=59,输出为不及格。即使score为浮点型变量,score=59.99,仍因为score=59.99<60成立,而输出为不及格

第7题 在下面的C++代码中,因为 continue 将被执行,因此不会有输出。( × )

  1. int i;
  2. for (i = 1; i < 10; i++)
  3.     if (i % 2 == 0)
  4.         continue;
  5. if(i == 10)
  6.     cout << "END";

解析:错误。题目所示程序的输出与continue无关,有没有continue循环都执行9次,i=10,第5行在循环体外,i=10条件成立,输出END

第8题 下面的C++代码执行后将输出15。( × )

  1. int Sum = 0;
  2. for (int i = 0; i < 5; i++)
  3.     Sum += i;
  4. cout << Sum;

解析:错误。题目所示程序的输出为0+1+2+3+4=10

第9题 将下面C++代码中的 (int i = 5; i > 1; i--) 调整为 (int i = 1; i < 5; i++) 输出结果相同,因为5到1 与1到5的求和相同。( × )

  1. int tnt;
  2. tnt = 0;
  3. for (int i = 5; i > 1; i--)
  4.     tnt += i;
  5. cout << tnt;
  6.     cout << endl;

解析:错误。题目所示程序的输出为5+4+3+2=14(不含1)。调整后程序的输出为1+2+3+4=10(不含5),两者和不相同。

第10题 为实现如下效果,即N行N列字符。当输入是奇数时,中间列为 * ,其他是-;当输入是偶数时,则中间两列是 * ,其他是-。字符阵列后的代码能实现其效果。( √ )

  1. /*
  2. 5
  3. --*--
  4. --*--
  5. --*--
  6. --*--
  7. --*--
  8. */

  1. int N;
  2. cin >> N;
  3. int i,j;
  4. for (i = 0; i < N; i++){
  5.     for (j = 0; j < N; j++)
  6.         if ((j == N / 2) || (j == (N-1) / 2))
  7.             cout << "*";
  8.         else
  9.             cout << "-";
  10.     cout << endl;
  11. }

解析:正确。如果N为奇数,i0N-1,中间列编号为int(N/2),即N整除2,也就是如N=5,中间列i=2,此时N/2(N-1)/2都等于2。如果N为偶数,i0N-1,中间两列编号除int(N/2),即N整除2外,还有其前一列,也就是如N=6,中间两列i=2i=3,此时N/2=3(N-1)/2=2。所以题目给出的程序第7行能满足“当输入是奇数时,中间列为 * ,其他是-;当输入是偶数时,则中间两列是 * ,其他是-”的要求。故正确。

3 编程题(每题 25 分,共 50 分)

3.1 编程题1

  • 试题名称:数三角形
  • 时间限制:1.0 s
  • 内存限制:512.0 MB

3.1.1 题目描述

直角三角形有两条直角边与一条斜边,设两条直角边的长度分别为a,b,则直角三角形的面积为\frac{ab}{2}。请你计算当直角边长a,b均取不超过n的正整数时,有多少个不同的面积为整数的直角三角形。直角边长分别为a,b和a’,b’的两个直角三角形相同,当且仅当a=a’,b=b’或者b=a’,a=b’。

3.1.2 输入格式

一行,一个整数 ,表示直角边长的最大值。

3.1.3 输出格式

输出一行,一个整数,表示不同的直角三角形数量。

3.1.4 样例

3.1.4.1 输入样例1

  • 3

3.1.4.2 输出样例1

  • 3

3.1.4.3 输入样例2

  • 5

3.1.4.4 输出样例2

  • 9

3.1.5 数据范围

对于所有测试点,保证1≤n≤1000。

3.1.6 编写程序思路

分析:a,b为不超过n的正整数,即1a≤n1b≤n,但如果1a≤n1b≤n,则会使部分三角形重复(相同),要使产生的三角形不重复(不相同),a≤b≤n。面积为整数的直角三角形的判定式为a*b/2为整数,即a*b % 2 == 0。完整程序如下:

#include<iostream>
using namespace std;

int main() {
    int n, a, b, cnt = 0;
    cin >> n;
    for (a = 1; a <= n; a++) {
        for (b = a; b <= n; b++) {
            if (a * b % 2 == 0) cnt++;
        }
    }
    cout << cnt << endl;
    return 0;
}

3.2 编程题2

  • 试题名称:幂和数
  • 时间限制:1.0 s
  • 内存限制:512.0 MB

3.2.1 题目描述

对于正整数n,如果n可以表为两个2的次幂之和,即n=2^{x}+2^{y}(x,y均为非负整数),那么称n为幂和数。 给定正整数l,r,请你求出满足l≤n≤r的整数n中有多少个幂和数。

3.2.2 输入格式

一行,两个正整数l,r,含义如上。

3.2.3 输出格式

输出一行,一个整数,表示l,r之间幂和数的数量。

3.2.4 样例

3.2.4.1 输入样例1

  • 2 8

3.2.4.2 输出样例1

  • 6

3.2.4.3 输入样例2

  • 10 100

3.2.4.4 输出样例2

  • 20

3.2.5 数据范围

对于所有测试点,保证1\leq l\leq r\leq 10^{4}

3.2.6 编写程序思路

分析:二级认证标准中未要求数学幂次方函数pow(),故不用pow()2^{x}=1×2×2×⋯×2,即x2相乘,可用1循环乘x2实现。1≤a≤b≤rnl循环到r。设a=2^{x},可用a=1; for i=1;i<=x; i++) a*=2; 求得,b=2^{y},可用b=a; for i=1;i<=y; i++) b*=2; 求得。nl循环到r,循环求ab,当a+b<=n时判n==a+b,如成立计数,并n循环到下一轮。完整程序如下:

#include <iostream>
using namespace std;

int main() {
    int l, r, a, b, tot = 0;
    cin >> l >> r;
    for (int n = l; n <= r; n++) {
        a = 1;
        bool Flag = false;
        while (a <= n) { //求a=2^x
            b = a;
            while (a + b <= n) { //求b=2^y, 当a+b>n结束
                if (n == a + b) { //找到了符合条件的2^x(a)和2^y(b)
                    Flag == true; //设置标志
                    tot++; //并计数加1
                    break;
                }
                b *= 2; //增加2的一次方,相当于2^y中的y=y+1
            }
            if (Flag) break; //找到了符合条件的a和b, 进入下一轮n循环
            a *= 2; //增加2的一次方,相当于2^x中的x=x+1
        }
    }
    cout << tot << endl;
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到