CCF编程能力等级认证GESP—C++4级—20251227

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

1、小杨想让指针 p 指向整数变量 x ,正确写法是( )。

A. int* p = x;
B. int* p = &x;
C. int& p = x;
D. int p = &x;

正确答案:B

2、小杨写了如下的指针接力程序,程序执行完后变量 a 、 *p1 和 *p2 的值分别是( )。

int a = 5;
int* p1 = &a;
int* p2 = p1;
*p2 = 10;
A. 5 10 10
B. 5 10 15
C. 10 10 10
D. 5 5 10

正确答案:C

3、小杨用一个二维数组表示棋盘,其中 1表示有棋子,0表示没有棋子。他想知道第 2行第 3列有没有棋子,可采用的代码是:( )。

int a[3][4] = { 
	{1, 0, 1, 0}, 
	{0, 1, 0, 1}, 
	{1, 1, 0, 0} 
};
A. cout << a[1, 2] << endl;
B. cout << a[1][2] << endl;
C. cout << a(1, 2) << endl;
D. cout << a{1}{2} << endl;

正确答案:B

4、执行完下面的代码后, *(p + 5) 和 arr[1][1] 的值分别是( )。

int arr[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
int* p = &arr[0][0];
A. 5 6
B. 6 5
C. 5 5
D. 6 6

正确答案:D

5、执行完下面的代码后, sum 的值是( )。

int arr[2][3][2] = { {{1,2}, {3,4}, {5,6}}, {{7,8}, {9,10}, {11,12}} };
int sum = 0;
for(int i = 0; i < 2; i++)
    for(int j = 0; j < 3; j++)
        for(int k = 0; k < 2; k++)
            if((i+j+k) % 2 == 0)
                sum += arr[i][j][k];
A. 36
B. 39
C. 78
D. 30

正确答案:B

6、执行完下面的代码后,输出是( )。

int a = 1;
void test() {
	int a = 2;
	{
		int a = 3;
		a++;
	}
	a++;
	cout << a << " ";
}
int main() {
	test();
	cout << a;
	return 0;
}
A. 3 1
B. 4 1
C. 3 2
D. 4 2

正确答案:D

7、执行完下面的代码后, a 、 b 和 c 的值分别是( )。

void byValue(int x) { x = 100; }
void byRef(int& x) { x = 200; }
void byPointer(int* x) { *x = 300; }
int main() {
    int a = 1, b = 2, c = 3;
    byValue(a);
    byRef(b);
    byPointer(&c);
    return 0;
}
A. 100 200 300
B. 1 2 3
C. 1 200 300
D. 1 2 300

正确答案:C

8、运行如下代码会输出( )。

struct Point {
	int x, y;
};
struct Rectangle {
	Point topLeft;
	Point bottomRight;
};
int main() {
	Rectangle rect = {{10, 10}, {20, 20}};
	rect.topLeft.x = 5;
	Point* p = &rect.bottomRight;
	p->y = 5;
	cout << rect.topLeft.x + rect.bottomRight.y;
	return 0;
}
A. 10
B. 30
C. 15
D. 20

正确答案:B

9、给定函数 climbStairs(int n) 的定义如下,则 climbStairs(5) 的返回的值是( )。

int climbStairs(int n) {
    if(n <= 2) return n;
    int a = 1, b = 2;
    for(int i = 3; i <= n; i++) {
        int temp = a + b;
        a = b;
        b = temp;
    }
    return b;
}
A. 5
B. 8
C. 13
D. 10

正确答案:B

10、对如下4个扑克牌进行排序,使用某排序算法按value排序后,结果为: {3,‘D’}, {3,‘B’}, {5,‘A’}, {5,‘C’} ,则这个排序算法是稳定的吗?

struct Card {
	int value;
	char suit; // 花色
};
Card cards[4] = {{5,'A'}, {3,'B'}, {5,'C'}, {3,'D'}};
A.稳定,因为相同 value 的元素相对顺序保持不变
B.不稳定,因为 {3,'D'} 出现在 {3,'B'} 之前
C.无法判断
D.稳定,因为结果是有序的

正确答案:B

11、下面的函数 selectTopK() 实现从 n 个学生中选出前 k 名成绩最好的学生颁发奖学金(不需要对所有学生完全排序,只需要找出前 k 名),则横线上应填写( )。

struct Student {
    string name;
    int score;
};
void selectTopK(Student students[], int n, int k) {
    for (int i = 0; i < k; i++) {
        int maxIdx = i;
        for (____________________) {    // 在此处填入代码
            if (students[j].score > students[maxIdx].score) {
                maxIdx = j;
            }
        }
        if (maxIdx != i) {
            Student temp = students[i];
            students[i] = students[maxIdx];
            students[maxIdx] = temp;
        }
    }
}
A. int j = 0; j < n; j++
B. int j = i + 1; j < n; j++
C. int j = i; j < n; j++
D. int j = 1; j <= n; j++

正确答案:B

12、某游戏的排行榜系统需要实时更新玩家分数。每次只有一个玩家的分数发生变化,排行榜已经是按分数降序排列的。现在需要将更新后的玩家调整到正确位置。下面的函数 updateRanking() 要实现上述功能,则两处横线上应分别填写( )。

struct Player {
    string name;
    int score;
};
// 玩家索引playerIdx的分数刚刚更新,需要调整位置
void updateRanking(Player players[], int size, int playerIdx) {
    Player updatedPlayer = players[playerIdx];
    if (playerIdx > 0 && updatedPlayer.score > players[playerIdx-1].score) {
        int i = playerIdx;
        while (____________________) {  // 在此处填入代码
            players[i] = players[i-1];
            i--;
        }
        players[i] = updatedPlayer;
    } else if (playerIdx < size-1 && updatedPlayer.score < players[playerIdx + 1].score) {
        int i = playerIdx;
        while (____________________) {  // 在此处填入代码
            players[i] = players[i + 1];
            i++;
        }
        players[i] = updatedPlayer;
    }
}
A. 
i > 0 && updatedPlayer.score > players[i-1].score; 
i < size-1 && updatedPlayer.score < players[i+1].score
B. 
i < size-1 && updatedPlayer.score < players[i+1].score; 
i > 0 && updatedPlayer.score > players[i-1].score
C. 
i > 0 && updatedPlayer.score < players[i-1].score; 
i < size-1 && updatedPlayer.score < players[i+1].score
D. 
i > 0 && updatedPlayer.score < players[i-1].score; 
i < size-1 && updatedPlayer.score > players[i+1].score

正确答案:A

13、给定如下算法,其时间复杂度为( )。

bool f(int arr[], int n, int target) {
    for (int i = 0; i < n; i++) {
        int sum = 0;
        for (int j = 0; j < n; j++) {
            if (i & (1 << j)) {
                sum += arr[j];
            }
        }
        if (sum == target) return true;
    }
    return false;
}

A . O ( n ) A. O(n) A.O(n)
B . O ( n 2 ) B. O(n^2) B.O(n2)
C . O ( n 3 ) C. O(n^3) C.O(n3)
D . O ( 2 n ) D. O(2^n) D.O(2n)

正确答案:C

14、执行下面 C++程序,会输出( )。

int main() {
	ofstream fout("test.txt");
	fout << "Happy" << endl;
	fout << "New Year";
	fout.close();
	ifstream fin("test.txt");
	string s1, s2;
	fin >> s1;
	getline(fin, s2);
	fin.close();
	cout << s1 << "|" << s2;
	return 0;
}
A. Happy|New Year
B. Happy| New Year
C. HappyNew Year|
D. Happy|

正确答案:A

15、执行下面C++代码,会输出( )。

int divide(int a, int b) {
    if(b == 0) throw "Division by zero";
    return a / b;
}
int main() {
    int result = 0;
    try {
        result = divide(10, 0);
        cout << "A";
    } catch(const char* msg) {
        cout << "B";
        result = -1;
    }
    cout << result;
    return 0;
}
A. A0
B. B-1
C. A10
D.程序崩溃

正确答案:B

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

1、小杨正在调试他的温度传感器程序,其中变量 x 保存当前温度。下面这段代码运行后,变量 x 的值变成了 8 。

int x = 5;
int *p = &x;
*p = *p + 3;

正确答案:正确

2、一个结构体不能包含另一个结构体。

正确答案:错误

3、在 C++中,定义如下二维数组: int a[3][4]; ,数组 a 在内存中是按行优先连续存放的,即 a[0][0] 、 a[0][1] 、 a[0][2] 、 a[0][3] 在内存中是连续的。

正确答案:正确

4、执行下面程序后,变量 a 的值会变成 15 。

void add(int &x){ 
	x += 10; 
}

int a = 5;
add(a);

正确答案:正确

5、执行下面的C++代码,会输出 8 ,因为两个指针地址相差 8 个字节(假设 int 占 4 字节)。

int arr[5] = {1, 2, 3, 4, 5};
int* p1 = arr;
int* p2 = arr + 2;
cout << p2 - p1 << endl;  // 输出结果

正确答案:错误

6、考虑用如下递推方式计算斐波那契数列,时间复杂度是 O(n) 。

int n = 10;
int f[20];
f[0] = 0;
f[1] = 1;
for (int i = 2; i <= n; i++)
    f[i] = f[i-1] + f[i-2];

正确答案:正确

7、冒泡排序和插入排序都是稳定排序算法。

正确答案:正确

8、下面这段代码实现了选择排序算法。

void sort(int a[], int n) {
    for (int i = 1; i < n; i++) {
        int x = a[i];
        int j = i-1;
        while (j >= 0 && a[j] > x) {
            a[j + 1] = a[j];
            j--;
        }
        a[j + 1] = x;
    }
}

正确答案:错误

9、下面代码可以正常编译并输出 10 。

#include <iostream>
using namespace std;
int calculate(int x, int y = 10);
int main() {
    cout << calculate(5);  // 调用1
    return 0;
}
int calculate(int x, int y) {
    return x * y;
}
int calculate(int x) {  // 重载函数
    return x * 2;
}

正确答案:错误

10、执行下面代码会输出 100 。

int main() {
	ofstream fout("data.txt");
	fout << 10 << " " << 20 << endl;
	fout << 30 << " " << 40;
	fout.close();
	ifstream fin("data.txt");
	int a, b, c, d;
	fin >> a >> b >> c >> d;
	fin.close();
	cout << a + b + c + d;
	return 0;
}

正确答案:正确

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

建造

【问题描述】
小 A有一张M行N列的地形图,其中第i行第j列的数字H[i][j]代表坐标(i,j)的海拔高度。
停机坪为一个3×3的区域且内部所有9个点的最大高度和最小高度之差不超过H。
小 A想请你计算出,在所有适合建造停机坪的区域中,区域内部9个点海拔之和最大是多少。

【输入格式】
第一行三个正整数M, N, H,含义如题面所示。
之后M行,第i行包含N个整数H[i][j],代表坐标(i,j)的高度。
数据保证总存在一个适合建造停机坪的区域。

【输出格式】
输出一行,代表最大的海拔之和。

【样例输入】

5 5 3
5 5 5 5 5
1 5 1 5 1
5 5 5 5 5
2 5 2 5 2
5 5 5 2 5

【样例输出】

40

【数据范围】
对于所有测试点,保证3 ≤ M,N ≤ 1000,0 ≤ H[i][j] ≤ 1000。

优先购买

【问题描述】
小 A有M元预算。商店有N个商品,每个商品有商品名name、价格price和优先级priority三种属性,其中priority为正整数,且priority越小代表商品的优先级越高。
小 A的购物策略为:

  1. 总是优先买优先级最高的东西;
  2. 如果有多个最高优先级商品,购买价格最低的;
  3. 如果有多个优先级最高且价格最低的商品,购买商品名字典序最小的。
    小 A想知道能购买哪些商品。

【输入格式】
第一行两个正整数M, N,代表预算和商品数。
之后N行,每行一个商品,依次为name, price, priority,代表第i个商品的商品名、价格、优先级。数据保证不存在两个名字相同的商品。

【输出格式】
按照字典序从小到大的顺序,输出所有购买商品的商品名。

【样例输入】

20 4
apple 6 8
bus 15 1
cab 1 10
water 4 8

【样例输出】

bus
cab
water

【数据范围】
对于所有测试点,保证1 ≤ M ≤ 1000,1 ≤ N ≤ 1000,1 ≤ price ≤ 1000,1 ≤ priority ≤ 1000。商品名仅由小写字母组成且不存在两个相同的商品名。

### 关于CCF GESP C++ 5编程能力等级认证模拟题解析 #### 模拟题目一:多态机制的理解与应用 当定义基类指针指向派生类对象并调用虚函数时,实际会调用派生类中的版本。因此,在给定的代码片段中创建了一个`base`类型的指针`b`以及一个`derived`实例`d`,接着让`b`指向`d`,最后通过`b->show()`来触发成员方法调用。由于存在继承关系且`show`被声明为虚拟函数,所以最终输出将是“derived class”[^1]。 ```cpp #include <iostream> using namespace std; class base { public: virtual void show() { cout << "base class" << endl; } }; class derived : public base { public: void show() override { cout << "derived class" << endl; } }; int main() { base* b; derived d; b = &d; b->show(); return 0; } ``` #### 模拟题目二:数组越界访问风险分析 对于第二个例子而言,程序试图打印字符数组`geSP`中位于索引位置等于整型数组`x`大小处的那个元素。考虑到`sizeof(x)`返回的是整个数组占用字节数而非元素数量,并且假设每个整形占四个字节,则该表达式的计算结果应为16(即4 * sizeof(int)),这显然超出了字符串的实际长度范围。这种情况下可能会导致未定义行为的发生,具体表现为可能显示随机内存内容或引发异常终止等问题[^2]。 ```cpp int main() { int x[] = {2, 0, 2, 4}; char geSP[] = "Grade Examination of SP"; cout << geSP[sizeof(x)] << endl; cout << endl; return 0; } ``` #### 模拟题目三:不常见调试技巧的选择 面对复杂逻辑错误或者难以定位的问题时,通常建议采用多种方式相结合来进行排查工作。选项A至C均属于较为常规有效的做法;然而D项涉及到了汇编层面的操作,除非开发者具备深厚底层知识背景并且确实有必要深入探究指令集细节外,一般不会作为首选方案考虑。故而最不可能成为常用解决办法的就是跟踪汇编码[^3]。 #### 模拟题目四:位运算符特性考察 针对给出的选择题,可以逐一验证各个选项: - `2>>1=1`, `1>>1=0`: 不相同; - `(2>>2)=0`, `(1>>1)=0`: 相同; - `(11^00)=(11)_bin=(3)_dec`, `(1^0)=1`: 不相同; - `~0=-1`(补码表示法下),不是正数1。 综上所述,只有B选项描述成立[(2>>2)和(1>>1)的结果相等][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青岛少儿编程-王老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值