当前位置: 首页 > news >正文

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

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

第1题 执行以下C++代码后, c 的数值是 (   )。

1int a = 10, b = 3;

2double c = a / b;

A. 3.33333                           B. 3.333                             C. 3.0                                  D. 3.3

解析:答案C。因为ab都是整型变量,所以a/b为整除,结果为3c为双精度浮点数,3赋给c后为3.0。故选C

第2题 下列C++表达式的结果为 true 的是 (   )。

A. (5 <= 5) && (7 < 5)        B. !(10 > 5)                        C. (10 != 10) || (5 >= 3)                            D. (5 == 3) && (4 > 2)

解析:答案CA. true && false=falseB. !true=falseC. false || true=trueD. false && true=false。故选C

第3题 以下关于C++数组的说法,错误的是 (   )。

A. 数组的下标通常从 0 开始。

B. int arr[5]; 声明了一个包含5个整数的数组。

C. 数组的大小必须在编译时确定,不能使用变量定义大小。

D. 可以通过 arr[5] 来访问 int arr[5]; 数组的最后一个元素。

解析:答案D。数组的下标通常从0开始,A正确;int arr[5]; 声明了一个包含5个整数的数组,B正确;C++数组的大小一般必须在编译时确定,不能使用变量定义大小,C正确;可以通过 arr[5] 来访问 int arr[5]; 数组元素,因超下标范围,取不到最后一个元素,D错误。故选D

第4题 执行以下C++代码后,变量 sum 的值是 (   )。

1int sum = 0;

2for (int i = 1; i <= 5; i += 2) {

3│    sum += i;

4    int sum=0;

5}

A. 6                                    B. 9                               C. 15                                  D. 死循环

解析:答案B。本题涉及全局变量和局部变量,在for循环外定义的sum是全局变量,在for循环内有效,所以sum += i;用的是全局sum,然后for循环内int sum=0;定义一个局部同名变量sum,并赋初值0,仅在for循环内有效,由于定义在求和之后,故求和用的是全局sumsum=1+3+5=9,故选B

第5题 要正确定义一个返回两个整数中较大值的函数 max ,应该使用 (   )。

A. void max(int a, int b) { return a > b ? a : b; }

B. int max(int a, int b) { if (a > b) return a; else return b; }

C. int max(a, b) { if (a > b) return a; else return b; }

D. void max(a, b) { cout << (a > b ? a : b); }

解析:答案B。题目要求返回较大值,所以不能用void定义,排除ADC函数形式参数没有数据类型,也错,B正确。故选B

第6题 执行以下C++代码后,数组 arr 的内容是 (   )。

1int arr[4] = {1, 2, 3};

2arr[3] = arr[0] + arr[2];

A. {1, 2, 3, 3}                        B. {1, 2, 3, 4}                     C. {1, 2, 3, 5}                                            D. {1, 2, 3, 6}

解析:答案B。程序定义了4个下标的数组,初始化了3个,arr[0]=1, arr[1]=2, arr[2]=3, arr[3]= arr[0]+arr[2]=1+3=4,所以数组 arr 的内容是{1,2,3,4}。故选B

第7题 以下关于C++函数的描述,正确的是 (   )。

A. 函数必须要有参数。

B. 函数通过 return 语句只能返回一个值。但是可以通过很多间接的方式返回多个值。

C. main 函数可以被其他函数调用。

D. 函数的定义可以直接嵌套,即一个函数内部可以真正定义另一个函数。

解析:答案BC++函数的参数可以没有,也可以有,不是必须的,A错误;C++函数只能返回一个值,可通过引用、指针等方式间接返回多全值,B正确;C++main()函数只能由系统调用,作为程序入口,其他函数不能调用main()函数,C错误;C++函数不可以嵌套,但函数的调用可以将函数作为参数使用,D错误。故选B

第8题 以下C++代码 count++ 执行的次数是 (   )。

1int i = 10;

2int count=0;

3while (i > 0) {

4    i -= 3;

5    continue;

6    count++;

7}

A. 2                                      B. 3                                    C. 4                                          D. 0

解析:答案D。尽管程序循环可以运行4(i=10741),但执行continue;则回到循环开始进入下一轮循环,相当于跳过后面语句,所以count++;不肢被 执行,即执行0次,D正确。故选D

第9题 以下C++代码段的输出是 (   )。

1for (int i = 0; i < 4; i++) {

2    for (int j = 0; j <= i; j++) {

3        cout << j;

4    }

5    cout << "#";

6}

A. 0#01#012#0123#          B. 1#12#123#1234#       C. 0#1#2#3#        D. 0#01#012#01243#

解析:答案A。模拟程序执行,外循环当i=0时,内循环运行1次,输出“0”,然后输出“#” ,当i=1时,内循环运行2次,输出“01”,然后输出“#”,当i=2时,内循环运行3次,输出“012”,然后输出“#”,当i=3时,内循环运行4次,输出“0123”,然后输出“#”,综合为0#01#012#0123#A正确。故选A

第10题 以下关于C++变量作用域的说法,错误的是 (   )。

A. 在 for 循环语句中声明的变量,其作用域仅限于该循环体内。

B. 在函数内部声明的变量(局部变量),仅在函数内部有效。

C. 在所有函数外部声明的变量,在整个程序中都有效。

D. 不同函数中的局部变量可以同名,它们代表不同的内存单元。

解析:答案Cfor循环中定义的变量为局部变量,仅在循环体内有效,A正确;函数内定义的变量为局部变量,仅函数内有效,B正确;在所有函数外部声明的变量为全局变量,在整个程序中都有效,C正确;在C++中,局部变量(包括函数内的变量)的生命周期仅限于它们被声明的函数内部。这意味着每个函数可以独立地定义同名变量,而这些变量在各自的函数中是完全独立的,它们占据不同的内存单元,D正确。貌似全部正确,但在程序中,局部变量和全局变量的名称可以相同,如在函数内,同名局部变量的值会覆盖全局变量的,此时全局变量无效,故C错误。故选C

第11题 关于以下代码的说法正确的是 (   )。

1int reversed = 0;

2while (x != 0) {

3    int digit = x % 10;

4    x /= 10;

5    reversed = reversed * 10 + digit;

6}

A. 能够反转任何位数的整数

B. 能够反转的最大位数正整数是2147483647

C. 能够反转的最大位数正整数是2147483648

D. 能够反转的最大位数正整数是1463847412

解析:答案D。当整数反转后值超过了该数据类型最大值时,反转得不到正确结果,所以不是任何位数的整数都能反转,A错误;2147483647反转为7463847412>2147483647,故不能反转,B错误;2147483648已超整数范围,溢出为-2147483648C错误;1463847412反转为2147483641<2147483647D正确。故选D

第12题 以下C++代码试图查找数组中的最大值,划线处应填入 (   )。

1#include <iostream>

2using namespace std;

3int findMax(int arr[], int size) {

4    int maxVal = ________; // 划线处

5    for (int i = 1; i < size; i++) {

6        if (arr[i] > maxVal) {

7            maxVal = arr[i];

8        }

9    }

10    return maxVal;

11}

A. 0                                       B. arr[-1]                           C. arr[0]                                 D. size

解析:答案C。求数组中最大值,maxVal的初值必须是数组元素范围内的值,或比所有元素都小的值。取0不能保证在数组元素范围内,如所有元素都是负的,0就是最大值,因此找不到数组中的最大值,A错;arr[-1]越界,结果不确定,B错;arr[0]是数组必定存在的元素值,C正确;size为元素个数,不是元素值,D错。故选C

第13题 以下关于C++函数的说法,正确的是 (   )。

A. 函数参数传递只有值传递一种方式。

B. 函数的形参在函数调用结束后依然占用内存空间

C. 没有返回值的函数必须声明为 void 类型,且不能包含 return 语句

D. C++11 及之后标准要求函数必须显式声明返回类型,不允许默认返回 int。

解析:答案DC++函数参数传递有多种方式,A错;C++函数的参是局部变量,通常在函数调用结束后释放其内存空间,B错;没有返回值的函数,C++声明为void 类型,但可以包含不带返回值的return;语句,用于提前退出函数,C错;C++11及后续版本延续了C++对函数返回类型的严格要求,未保留C语言的默认int规则,D正确。故选D

第14题 以下C++代码中存在几处错误 (   )。

1#include <iostream>

2using namespace std;

3int main() {

4    const int SIZE = 5;

5    int arr[SIZE];

6    for (int i = 0; i <= SIZE; i++) {

7        arr[i] = i * 2;

8    }

9    cout << arr[SIZE] << endl;

10    return 0;

11}

A. 0处                                  B. 1处                               C. 2处                                               D. 3处

解析:答案C。用SIZE定义的数组,最大下标为SIZE-1,第 6行有错误,i<SIZE,不能等于SIZE;第9行下标越界,有错误。共2处错误,C正确。故选C

第15题 以下关于C++中 string 类和字符数组( char[] )的说法,错误的是 (   )。

A. string 对象可以使用 = 进行赋值,而字符数组需要使用 strcpy 。

B. string 对象的长度可以使用 length() 成员函数获取,而字符数组需要使用 strlen() 函数。

C. string 对象在内存中是动态分配空间的,因此可以自动处理字符串长度的变化。

D. string 对象和字符数组都可以使用 == 运算符来直接比较两个字符串的内容是否相同。

解析:答案Dstring对象可以使用“=”进行赋值,而字符数组需要使用strcpy函数,A正确;string对象的长度用length()成员函数,而字符数组需要使用strlen()函数,B正确;string 对象在内存中是动态分配空间的,可以自动处理字符串长度的变化,C正确;string对象可以使用==运算符比较两个字符串是否相同,字符数组则需用strcmp()函数比较两个字符串是否相同D错误。故选D

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

第1题 表达式 sizeof('a') 的结果总是 1 ,因为 'a' 是一个字符。

解析:答案sizeof() C/C++中用于获取对象或类型所占字节数的编译时运算符,'a'是字符常量,在C++中一般占1字节,但在C语言中,字符常量实际上是一个整数类型(通常是“int”类型),通常占4个字节,所以,在不同C环境中,表达式sizeof('a')的结果不总是 1,故错误。

第2题 在C++中,所有全局变量如果没有显式初始化,都会被自动初始化为0。

解析:答案√。在C++中,所有全局变量如果没有显式初始化,则自动初始化为0,故正确。

第3题 do { ... } while (false); 循环体内的语句至少会被执行一次。

解析:答案√。在C++中,do { ... } while (false);先执行循环体,再判断条件,所以至少会执行一次循环体,故正确。

第4题 在C++中, ++i 是一个左值表达式,而 i++ 是一个右值表达式。

解析:答案√。在C++中,++i(前置递增):返回递增后的变量本身,是左值表达式(可以出现在赋值号左边),效率更高(不需要创建临时对象)i++(后置递增):返回递增前的值副本,是右值表达式(不能出现在赋值号左边),需要创建临时对象保存原值。故正确。

第5题 对于 enum Color { RED, GREEN, BLUE }; ,RED的类型是 int。

解析:答案‌C语言:枚举常量严格视为 int 类型。‌C++11:引入 enum class(强类型枚举),枚举常量作用域受限且不能隐式转换为 int,需显式转换。故错误。

第6题 #define SQUARE(x) x * x 是一个安全的宏定义, SQUARE(2+3) 会正确计算出25。

解析:答案╳。在C语言中,宏定义通过文本替换实现功能,但需注意参数括号的使用。当宏定义包含参数时,必须用括号包围参数。对本题,SQUARE(2+3)等价为2+3 * 2+3 = 11,而不是25。故错误。

第7题 在C++中,char类型的取值范围总是 -128 到 127。

解析:答案。在C++中,char类型的取值范围并非总是-128127,其具体范围取决于编译器的实现和是否显式指定符号属性。C++标准未明确规定其默认符号性,由编译器决定。主流编译器如GCC/x86通常将其视为signed char(-128~127),但ARM架构可能默认视为unsigned char(0~255)。故错误。

第8题 表达式 a > b ? a : b = 10; 一定是合法的C++代码。

解析:答案。在C++语言中,条件运算符(?:)的优先级高于赋值运算符(=),因此表达式会被解析为(a > b ? a : b) = 10,赋值操作要求左操作数为可修改的左值(如变量)。当ab均为非const变量时,表达式可合法执行;当ab均为const变量时,表达式非法。故错误。

第9题 #include "file.h" 和 #include < file.h>在编译器查找头文件时的搜索策略是完全相同的。

解析:答案╳。#include "file.h"#include <file.h>在编译器查找头文件时的搜索策略存在显著差异,主要体现在搜索路径的优先级和范围上。

双引号形式(#include "file.h")‌优先搜索当前源文件所在目录,若未找到则继续后续路径;接着查找通过-I参数指定的用户自定义路径;最后回退到标准系统目录搜索。

尖括号形式(#include <file.h>)‌直接跳过当前目录,优先在编译器预设的系统标准路径中搜索;仅当存在-I参数时才会扩展搜索到指定目录;最终定位到编译器内定目录。

关键区别:双引号形式包含了对用户工作目录的主动搜索,而尖括号形式默认排除该路径;环境变量对两种形式的生效阶段不同;标准建议:尖括号用于系统/库头文件,双引号用于项目自定义头文件。故错误。

第10题 在同一个作用域内,extern声明的变量可以多次定义。

解析:答案╳。在C/C++中,extern声明的变量不能在同一作用域内多次定义。extern关键字用于声明变量而非定义,声明可以多次出现,但定义只能有一次。故错误。

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

3.1 编程题1

  • 试题名称:数组清零
  • 时间限制:1.0 s
  • 内存限制:512.0 MB

3.1.1题目描述

小A有一个由𝑛个非负整数构成的数组𝑎=[ 𝑎₁,𝑎₂,...,𝑎ₙ]。他会对数组𝑎重复进行以下操作,直到数组𝑎只包含0。在一次操作中,小A会依次完成以下三个步骤:

 1. 在数组𝑎中找到最大的整数,记其下标为𝑘。如果有多个最大值,那么选择其中下标最大的。

 2. 从数组𝑎所有不为零的整数中找到最小的整数𝑎ⱼ。

 3. 将第一步找出的𝑎ₖ减去𝑎ⱼ。

例如,数组𝑎=[2,3,4]需要7次操作变成[0,0,0]:

[2,3,4] → [2,3,2] → [2,1,2] → [2,1,1] → [1,1,1] → [1,1,0] → [1,0,0] → [0,0,0]

小A想知道,对于给定的数组𝑎,需要多少次操作才能使得𝑎中的整数全部变成0。可以证明,𝑎中整数必然可以在有限次操作后全部变成0。你能帮他计算出答案吗?

3.1.2 输入格式

第一行,一个正整数𝑛,表示数组𝑎的长度。

第二行,𝑎个非负整数𝑎₁,𝑎₂,...,𝑎ₙ,表示数组𝑎中的整数。

3.1.3 输出格式

一行,一个正整数,表示𝑎中整数全部变成0所需要的操作次数。

3.1.4 样例

3.1.4.1 输入样例1

13

22 3 4

3.1.4.2 输出样例1

17

3.1.4.3 输入样例2

15

21 3 2 2 5

3.1.4.4 输出样例2

3

3.1.5 数据范围

对于所有测试点,保证1≤𝑛≤100,1≤𝑎ᵢ≤100。

3.1.6 编写程序

编程思路:题目规定的一次操作就是:1. 在当前数组中找到—个最大值所在的最大下标k2. 在数组中找到所有大子0的元素中的最小值mn3. a[k]减去mn(a[k]-=mn),操作次数加1。重复做上述操作直到数组中所有元素都为0。题目保证在有限步内可以全部变为0

最简单、可靠的做法是模拟操作:每次线性扫描找最大下标和最小数,更新并计数,直到结束。由于题目限制1n1000a[i]100,直接模拟不会超时。

复杂度:每步需要O(n)来找最大值所在最大下标和最小数;最多操作次数≤总和sua(a[i]) (因为每次至少减少1),在最坏情况sum(a[i])100*100=10000;故总复杂度在最坏也约O(n*sum),对于本题目数据范围完全可行(大约10⁶级别操作)。完整参考程序代码如下:

#include<iostream>
using namespace std;int a[105]; // 题目给定n≤100int main() {int n;cin >> n;for (int i = 0; i < n; ++i) cin >> a[i];int cnt = 0;while (true) {//按题目的规则:选取最后出现的最大值下标int mx = 0; // 初始最大值位置可在0~n-1之间for (int i = 0; i < n; ++i) {if (a[i] >= a[mx]) mx = i;}if (a[mx] == 0)break; // 全为0了结束// 找到所有正数中的非0最小值int mn = INT_MAX; // int类型最大值for (int i = 0; i < n; ++i) {if (a[i] > 0)mn = min(mn, a[i]); // 不为零的整数中找到最小的整数}// 对选定的最大元素减去mna[mx] -= mn;++cnt;}cout << cnt << endl;return 0;
}

3.2 编程题2

  • 试题名称:日历制作
  • 时间限制:1.0 s
  • 内存限制:512.0 MB

3.2.1题目描述

小A想制作2025年每个月的日历。他希望你能编写一个程序,按照格式输出给定月份的日历。具体来说,第一行需要输出 MON TUE WED THU FRI SAT SUN ,分别表示星期一到星期日。接下来若干行中依次输出这个月所包含的日期,日期的个位需要和对应星期几的缩写最后一个字母对齐。例如,2025 年 9 月 1 日是星期 一,在输出九月的日历时,1号的个位 1 就需要与星期一 MON 的最后一个字母 N 对齐。九月的日历输出效果如下:

你能帮助小A完成日历的制作吗?

3.2.2 输入格式

一行,一个正整数𝑚,表示需要按照格式输出2025年𝑚月的日历。

3.2.3 输出格式

输出包含若干行,表示2025年𝑚月的日历。

3.2.4 样例

3.2.4.1 输入样例1

19

3.2.4.2 输出样例1

3.2.4.3 输入样例2

16

3.2.4.4 输出样例2

3.2.5 数据范围

对于所有测试点,保证1≤𝑚≤12。

3.2.6 编写程序

编程思路:题目给定星期排列从星期一开始到星期日,要打印日历需计算每月的第1天为星期几?每月的第1天打印在打指定星期位置(不是星期一,之前的星期位置用3个空格打印),日期用3位不满3位前置空格,日期为星期一~星期六日期后加空格,日期为星期日则换行。星期用0~6表示表示,已知9月第1天为星期一,则11日的星期为91日星期减前8个月的天数%7的余数,为防止出现负数,可+7%7(同余)1~8月共5个大月,2个小月,1个平月,91日为周一(0)

(7+0 - (31 * 5 + 30 * 2 + 28) % 7) % 7 ←→ (7 - (31 * 5 + 30 * 2 + 28) % 7) % 7

完整参考程序代码如下:

#include<iostream>
using namespace std;int main() {int m;cin >> m;int a[13], b[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};a[0] = (7 - (31 * 5 + 30 * 2 + 28) % 7) % 7; // 已知9月第1天为周一,求1月第1天星期for (int i = 1; i < 13; i++) a[i] = (a[i - 1] + b[i]) % 7; // 求每月第1天星期cout << "MON TUE WED THU FRI SAT SUN" << endl;int n = a[m - 1];                     // m月第1天为星期for (int i = 1; i <= n + b[m]; i++) { // 打印天数=第1天为星期+本月天数if (i <= n) cout << "   ";        // m月第1天前用空格输出else printf("% 3d", i - n);       // 3位输出日期,不足3位前部添空格if (i % 7 == 0) cout << endl;     // i为7的倍数(星期日)换行else cout << " ";                 // 否则加一空格}return 0;
}

http://www.dtcms.com/a/465814.html

相关文章:

  • Wireshark 过滤器命令大汇总:从入门到精通
  • 网站软件免费下载wordpress 插件漏洞
  • 【Java数据结构】HashMap 的深入解析与优化实践
  • 免费网站个人注册网页设计教程与实训
  • 仿搜狐视频网站源码品牌营销策划方案报价
  • MySQLEXPLAIN命令详解从执行计划读懂SQL性能瓶颈
  • 【FastAPI】学习笔记
  • 商丘网站制作电话企业网站 三合一
  • 海东高端网站建设大连网页
  • 数据科学与回归模型相关试卷
  • 深度学习之YOLO系列YOLOv1
  • 生成式 AI 冲击下,网络安全如何破局?
  • 网站建设的3个基本原则做网站需要多少
  • 免费的作文网站cloudfare wordpress
  • 开源 java android app 开发(十八)最新编译器Android Studio 2025.1.3.7
  • 网络模型训练完整代码
  • 部署k8s集群+containerd+dashboard
  • PHP网站建设的课后笔记wordpress divi主题
  • 网站开发相关文献广州 深圳 外贸网站建设公司
  • 从零起步学习Redis || 第十二章:Redis Cluster集群如何解决Redis单机模式的性能瓶颈及高可用分布式部署方案详解
  • 【Day 73】Linux-自动化工具-Ansible
  • 网站做英文版有用吗网站建设后如何检测
  • Color Wheel for Mac:一键解锁专业配色,设计效率翻倍
  • 五合一自助建站网站套用别人产品图片做网站
  • 注册公司在哪个网站宝塔搭建wordpress博客
  • Redis-哈希(Hash)类型
  • 无需登录!无限制轻松体验Claude4.5智能答疑
  • 3.5.1 抹灰工程施工
  • 建站软件可以不通过网络建设吗代发关键词包收录
  • 编程题:递归与分治练习题3道(C语言实现)