2025年3月真题

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

在这里插入图片描述
正确答案:A
考察知识点:函数的定义与调用
解析:选项 B:函数声明int multiply(int x, int y);明确指定返回值为int,说法正确。
选项 C:main中a和b作为实参传递给multiply的形参x和y,说法正确。
选项 D:4×5=20,代码运行后输出 “The result is: 20”,说法正确。
选项 A:C++ 中函数可通过 “声明 + 定义” 的方式分离,无需将multiply的定义放到main之前(只要有声明即可),因此该说法错误。答案为A。

在这里插入图片描述
在这里插入图片描述
正确答案:B
考察知识点:函数的定义与调用、形参与实参、作用域
解析:函数func中定义了局部变量x(值为 20),调用func时输出该局部变量x,即 20。
main函数中的x是全局作用域下的变量(值为 10),执行cout << x时输出 10。答案为B。

在这里插入图片描述
正确答案:B
考察知识点:C++指针类型的概念及基本应用
解析:指针p指向变量a的地址,p表示对a的间接访问。
执行
p = 20时,实际是修改a的值为 20。答案为B。

在这里插入图片描述
正确答案:D
考察知识点:函数参数传递的概念
解析:值传递会拷贝整个对象,对于大型对象开销极大。
引用传递和指针传递都是传递对象的 “引用”(或地址),不会拷贝对象本身,因此均可避免拷贝大型对象。答案为 D。

在这里插入图片描述
正确答案:D
考察知识点:函数的定义与调用、函数参数传递的概念
解析:函数swap中,a是值传递(接收x的副本,值为 1),b是引用传递(直接操作y,值为 2)。
主函数调用swap函数,函数内交换a和b后,a变为 2,b(也即y)变为 1;
主函数输出x,y,x因值传递未被修改,仍为 1,y因引用传递变为1。输出为11。答案为D。

在这里插入图片描述
在这里插入图片描述
正确答案:C
考察知识点:结构体
解析:选项 A:结构体变量初始化语法错误,不能直接用Person p(“Yang”, 10);的形式。
选项 B:初始化:定义的同时进行赋值,B不属于初始化。
选项 D:new Person(“Yang”, 10) 是动态内存分配方式,且结构体无对应构造函数,无法操作,语法错误。
选项 C:使用大括号列表初始化结构体变量p,语法正确。答案为C 。

在这里插入图片描述
正确答案:D
考察知识点:结构体
解析:选项 A:Person 结构体中嵌套了 Address 结构体,描述正确。
选项 B:Person 包含 Address 类型的 address 成员,描述正确。
选项 C:通过成员访问运算符逐层初始化嵌套结构体的成员,语法正确。
选项 D:结构嵌套虽能减少命名冲突,但仍需控制嵌套层次(过深会降低代码可读性、增加维护难度),因此 “不必控制嵌套层次” 的描述错误。答案为D。

在这里插入图片描述
在这里插入图片描述
正确答案:D
考察知识点:二维数组与多维数组基本应用
解析:二维数组的下标从 0 开始。arr[1][2]表示第 2 行(索引 1)第 3 列(索引 2)的元素。数组中第 2 行是{4,5,6},第 3 列元素为 6。答案选 D。

在这里插入图片描述
正确答案:B
考察知识点:二维数组与多维数组基本应用
解析:在 C++ 中,二维数组的正确定义格式是 “数据类型 数组名[行数][列数]”。
选项 A:维度之间用逗号分隔,语法错误。
选项 C:用圆括号表示维度,语法错误。
选项 D:维度表达式3-4结果为负数,语法错误。
选项 B:int arr[3][4]; 符合二维数组定义格式,正确。答案为B。

在这里插入图片描述
正确答案:B
考察知识点:递推算法
解析: “爬楼梯” 经典递推问题,递推关系为 f(n)=f(n−1)+f(n−2),类斐波那契数列。
选项 B 中,res = f1 + f2 计算当前阶的方法数,然后 f1 = f2、f2 = res 完成状态转移,符合递推逻辑。答案为B。
其他选项存在状态转移顺序错误或逻辑错误(如 A 的res +=会重复累加,C、D 的状态转移顺序颠倒)。

在这里插入图片描述
在这里插入图片描述
正确答案:B
考察知识点:简单算法复杂度的估算
解析:外层循环次数:1 << n 即 2n2^n2n 次。
内层循环次数:n 次。
总循环次数为:外层循环次数乘以内层循环次数 n∗2nn*2^nn2n,即时间复杂度为 O(n∗2n)O(n*2^n)O(n2n)。答案为B。

在这里插入图片描述
正确答案:B
考察知识点:排序算法
解析:排序算法的稳定性是指排序后,数组中相等元素的相对顺序保持不变 。答案为B。
选择排序是不稳定排序、插入排序是稳定排序。

在这里插入图片描述
正确答案:A
考察知识点:排序算法
解析:冒泡排序的核心思想是:通过重复遍历待排序序列,每次比较相邻的两个元素,若顺序错误则交换它们的位置,直到没有元素需要交换为止
冒泡排序(升序)第一轮的逻辑是:相邻元素两两比较,逆序则交换。对数组{5, 3, 8, 1},第一轮比较交换后:
5和3交换 → {3, 5, 8, 1};
5和8不交换;
8和1交换 → {3, 5, 1, 8}。答案为A。

在这里插入图片描述
在这里插入图片描述
正确答案:A
考察知识点:异常处理
解析:代码中x=10、y=-10,满足a == -b的条件,会抛出runtime_error异常。catch块中存在对runtime_error的捕获,因此会输出 “Caught: Runtime error occurred.”。答案为A。

在这里插入图片描述
正确答案:C
考察知识点:文件重定向与文件读写操作
解析:选项 A:通过freopen重定向stdout到文件,可实现输出重定向。
选项 B:直接用ofstream对象outfile写入文件,能输出内容到log.txt。
选项 D:通过rdbuf替换cout的缓冲区,实现输出重定向到文件。
选项 C:仅创建ofstream对象但未将cout与该文件关联,cout仍输出到控制台,无法实现重定向。答案为C。

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

在这里插入图片描述
正确答案:正确
考察知识点:函数的定义与调用
解析:在 C++ 中,函数是核心概念之一,其作用就是封装可重复使用的代码块,实现功能的模块化与复用。表述正确。

在这里插入图片描述
正确答案:错误
考察知识点:函数的定义与调用
解析:在 C++ 中,函数的返回类型不能省略,必须显式声明(仅在早期 C 语言的特定场景下存在默认int的规则,C++ 无此规定)。 表述错误。

在这里插入图片描述
正确答案:正确
考察知识点:结构体
解析:在 C++ 中,结构体(struct)的成员默认访问权限为public(与类class默认private不同)。表述正确。

在这里插入图片描述
正确答案:错误
考察知识点:数组、C++指针类型的概念及基本应用
解析:指针p初始指向数组arr的首地址(0x7ffee4065820),p += 1后,指针移动一个int的字节长度(通常为 4 字节),因此p的值应为0x7ffee4065824,而非1。表述错误。

在这里插入图片描述
正确答案:错误
考察知识点:二维数组与多维数组基本应用
解析:在 C++ 语言中,二维数组作为函数参数时,第二维及以后的维度必须明确指定,第一维可以省略。表述错误。

在这里插入图片描述
正确答案:正确
考察知识点:递推算法
解析:递推算法是一种基于初始条件和递推关系,通过逐步推导求解问题的算法思想。表述正确。

在这里插入图片描述
正确答案:正确
考察知识点:排序算法、简单算法复杂度的估算
解析:冒泡排序的核心思想是:通过重复遍历待排序序列,每次比较相邻的两个元素,若顺序错误则交换它们的位置,直到没有元素需要交换为止。

如果用 T(n)T(n)T(n) 表示对 nnn 个元素进行冒泡排序的最坏时间(或基本操作次数),那么操作步骤为:
1、先进行 n−1n-1n1 次交换将最大值(最小值) 移动到最后;
2、再对 n−1n-1n1 个元素进行冒泡排序,时间为 T(n−1)T(n-1)T(n1)
因此:递推关系式应为 T(n)=T(n−1)+(n−1)T(n) = T(n-1)+(n-1)T(n)=T(n1)+(n1)T(0)=0T(0)=0T(0)=0T(1)=0T(1)=0T(1)=0,0个、1个元素无需排序,用时0。

严格来说,本题表述错误。但官方答案为正确,题目中的递推关系式和实际的递推关系式 对应的时间复杂度都为O(n2)O(n^2)O(n2),从这个方面来算,也可以说表述正确。

在这里插入图片描述
正确答案:错误
考察知识点:排序算法
解析:插入排序的算法思想是:将待排序数组分为已排序区间和未排序区间,初始时已排序区间只有第一个元素。然后依次从未排序区间取出元素,插入到已排序区间的合适位置,使已排序区间始终保持有序,重复此过程直到未排序区间元素为空,最终得到有序数组。
插入排序在最好情况(数组已完全有序)下,只需遍历数组一次,无需移动元素,时间复杂度为 O(n)O(n)O(n),而非 O(n2)O(n^2)O(n2)。表述错误。

在这里插入图片描述
正确答案:错误
考察知识点:排序算法
解析:选择排序,将待排序数组分为「已排序区间」和「未排序区间」,初始时已排序区间为空。每次从未排序区间中找到最小(或最大)元素,将其与未排序区间的第一个元素交换位置,此时该元素加入已排序区间。重复此过程,直到未排序区间为空。
选择排序(升序)第一轮的逻辑是:找到数组中最小的元素(值为1),与第一个元素(4)交换位置。交换后数组变为{1, 3, 4, 5, 2}。表述错误。

在这里插入图片描述
正确答案:正确
考察知识点:异常处理
解析:在 C++ 中,若异常被抛出后未被任何catch块捕获,系统会自动调用std::terminate函数终止程序执行。表述正确。

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本题考察:二维数组、枚举算法、模拟算法。

问题分析:网格由荒地(.)和杂物(#)组成,开垦规则为:荒地无周边杂物可直接开垦;荒地仅 1 个周边杂物,清理该杂物即可开垦;孤立杂物(无周边杂物)清理后可变为荒地。

解析:

1、遍历每个格子,统计其 4 个方向的杂物数量及方向。

2、直接统计无周边杂物的荒地数量(ans)。

3、对需清理单块杂物才能开垦的情况,记录对应杂物被清理后可新增的开垦数(数组 a)。

4、找到 a 数组最大值(清理单块杂物的最大收益),总答案为 ans + mx。。

#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
char mp[N][N];
int a[N][N]; //记录清理此处后可开垦的荒地数
int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
int main() {
	int n, m, ans = 0;
	cin>>n>>m;
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= m; j ++) {
			cin>>mp[i][j];
		}
	}
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= m; j ++) {
			int num = 0, p = -1; // num:(i,j)周边杂物数量, p记录杂物方向 
			for (int k = 0; k < 4; k ++) {
				int nx= i + dirs[k][0], ny=j + dirs[k][1];
				if (mp[nx][ny] == '#') {
					num ++;
					p = k;
				}
			}
			if (mp[i][j] == '.' && num == 0){ // (i,j) 为荒地且周围无杂物,可直接开垦 
				ans ++;
			}else if(mp[i][j] == '.' && num == 1){ //(i,j) 为荒地,且周围只有1块杂物,杂物在(px,py),则移走(px,py)上杂物可开垦此处荒地 
				int px= i + dirs[p][0], py=j + dirs[p][1]; 
				a[px][py] ++; 
			}else if(mp[i][j] == '#' && num == 0){//杂物,且周围无杂物,移走杂物此处可开垦 
				a[i][j] ++;
			} 	
		}
	}
	int mx = 0;
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= m; j ++) {
			mx = max(mx, a[i][j]);
		}
	}
	cout << ans + mx << endl;
	return 0;
}

在这里插入图片描述
在这里插入图片描述

本题考察:二维数组、枚举算法。

解题思路:枚举所有的22子矩阵,左上角(x1,y1),右下角(x2,y2) ,根据好矩阵的条件:D1,1D_{1,1}D1,1D2,2D_{2,2}D2,2==D1,2D_{1,2}D1,2*D2,1D_{2,1}D2,1 进行判断,Di,jD_{i,j}Di,j表示矩阵D的第iii行第jjj列的元素,记录好矩阵的个数。

#include<iostream>
using namespace std;
int n, m, arr[505][505]; 
int main() {
	cin>>n>>m;
	for(int i=1; i<=n; i++){
		for(int j=1; j<=m; j++){
			cin>>arr[i][j];
		}
	}
	int cnt=0;
	//枚举所有的2*2子矩阵,左上角(x1,y1),右下角(x2,y2) 
	for(int x1=1; x1<n; x1++){
		for(int y1=1; y1<m; y1++){
			int x2=i+1, y2=j+1;
			//根据好矩阵的条件:D11*D22==D12*D21 进行判断,Dij表示矩阵D的第i行第j列的元素。 
			if(arr[x1][y1]*arr[x2][y2] == arr[x1][y2]*arr[x2][y1]) cnt++;
		}
	}
	cout<<cnt;
	return 0;
}
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐