2025年9月真题

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

在这里插入图片描述
正确答案:B
考察知识点:C++指针类型的概念及基本应用
解析:指针p指向变量a,*p = *p + 1等价于a = a + 1,因此a的值从 42 变为 43。答案为B。

在这里插入图片描述
正确答案:C
考察知识点:数组、C++指针类型的概念及基本应用
解析:数组名是指针常量,不能进行自增操作;A、B、D 描述均正确,因此错误的是 C。答案为C。

在这里插入图片描述
正确答案:D
考察知识点:二维数组、C++指针类型的概念及基本应用
解析:arr是二维数组,arr + 1指向第二行首地址,*(arr + 1)是第二行数组名,*(arr + 1) + 2指向第二行第三个元素(值为 6),*(*(arr + 1) + 2)取值为 6。答案为D。

在这里插入图片描述
在这里插入图片描述
正确答案:A
考察知识点:函数的定义、声明与调用
解析:函数add声明时给b设置了默认参数 1,调用add(2)时b取默认值 1,结果为 3;调用add(2,3)时b取 3,结果为 5,因此输出 “3 5”。答案为 A。

在这里插入图片描述
正确答案:D
考察知识点:函数的定义与调用、形参与实参、作用域、
解析:foo函数中定义了局部变量x=10,输出 10;bar函数中访问的是全局变量x=5,输出 5,因此结果为10 5。答案为D。

在这里插入图片描述在这里插入图片描述
正确答案:C
考察知识点:函数、函数参数传递
解析:increaseA是值传递,不会修改a的值,所以第一次输出5;increaseB是指针传递,会修改a的值为6,第二次输出6。答案为C 。

在这里插入图片描述
正确答案:B
考察知识点:结构体
解析:C++ 中结构体初始化需使用大括号{},选项 B 的Point p = {1,2};符合语法规则;A 用小括号、C 用new(语法错误)、D 用尖括号均不正确。答案为B。

在这里插入图片描述
正确答案:B
考察知识点:结构体、函数的定义与调用、函数参数传递
解析:代码中定义了结构体Cat,包含name和age成员。
函数birthday采用引用传递(Cat& c),这意味着函数内部对c.age的修改会直接作用于传入的实参kitty。
在main函数中,kitty初始age为 2,调用birthday后,kitty.age被递增为 3,name仍为 “Mimi”。最终输出Mimi 3。答案选 B。

在这里插入图片描述
正确答案:C
考察知识点:排序算法
解析:排序算法执行后,原始数组中相等元素的相对顺序保持不变,则该算法为稳定排序;反之则为不稳定排序。选择排序是不稳定的排序算法,会改变相等元素的相对位置;而冒泡排序、插入排序是稳定的,A 对稳定排序的定义也正确,因此错误的是 C。答案为C。

在这里插入图片描述
在这里插入图片描述
正确答案:A
考察知识点:排序算法
解析:选择排序,将待排序数组分为「已排序区间」和「未排序区间」,初始时已排序区间为空。每次从未排序区间中找到最小(或最大)元素,将其与未排序区间的第一个元素交换位置,此时该元素加入已排序区间。重复此过程,直到未排序区间为空。
选择排序升序时,需在未排序区间找最小元素,判断条件为nums[j] < nums[minIndex],找到后交换nums[i]与nums[minIndex],选项 A 符合逻辑。答案为A。

在这里插入图片描述
正确答案:A
考察知识点:排序算法
解析:插入排序的算法思想是:将待排序数组分为已排序区间和未排序区间,初始时已排序区间只有第一个元素。然后依次从未排序区间取出元素,插入到已排序区间的合适位置,使已排序区间始终保持有序,重复此过程直到未排序区间元素为空,最终得到有序数组。
插入排序升序时,while 循环条件需判断arr[j] > key(找到插入位置),最后将key放入arr[j+1],选项 A 符合逻辑。答案为A。

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

在这里插入图片描述
在这里插入图片描述
正确答案:B
考察知识点:递推算法、斐波那契数列
解析:该题是斐波那契数列变形,每次的方法数等于前两步方法数之和。循环中需先更新current,再依次更新prev2和prev1,选项 B 的逻辑符合这一递推关系。答案为B。

在这里插入图片描述
正确答案:C
考察知识点:简单算法复杂度的估算
解析:代码使用三层嵌套循环,时间复杂度由最内层循环的执行次数决定,为O(n3)O(n^3)O(n3)。答案为C。

在这里插入图片描述
在这里插入图片描述
正确答案:D
考察知识点:异常处理
解析:并非所有异常都必须捕获,若未捕获,程序会终止执行但不一定 “崩溃”(是按异常机制终止),A、B、C 说法均正确。答案为D。

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

在这里插入图片描述
正确答案:错误
考察知识点:C++指针类型的概念及基本应用
解析:指针初始化应赋值为变量的地址,正确写法应为int *p = &a;。而代码中int *p = a;是将变量a的值直接赋给指针p,这会导致指针指向非法地址,属于错误的初始化方式。表述错误。

在这里插入图片描述
正确答案:错误
考察知识点:函数的定义与调用、形参与实参、作用域
解析:在函数 f 中,int x = x + 1; 存在逻辑错误,因为定义变量x时直接用自身未初始化的值进行运算,此处 x 属于局部变量,会导致未定义行为,无法确定输出结果。 表述错误。

在这里插入图片描述
正确答案:正确
考察知识点:结构体、C++指针类型的概念及基本应用
解析:这段代码中,先定义了包含string、int、float成员的结构体Student,再通过new动态创建包含 20 个Student对象的数组,语法和逻辑均符合 C++ 规范。表述正确。

在这里插入图片描述
正确答案:正确
考察知识点:函数的定义与调用、函数参数传递的概念
解析:main 函数中定义 int a = 5;
调用 func(&a),把 a 的地址传给指针 p,
在 func 中,*p = 10; 表示将 p 指向的变量(也就是 a)的值改为 10
回到 main,输出 a,此时 a 的值已经是 10,所以输出结果是 10。表述正确。

在这里插入图片描述
正确答案:错误
考察知识点:函数的定义与调用、函数参数传递的概念
解析:在 C 语言中,二维数组作为函数参数时,第二维及以后的维度必须明确指定,第一维可以省略。此代码中函数参数声明int arr[][4]是正确的,因为明确了第二维的大小,能正确计算元素的内存偏移,支持arr[i][j]的访问方式。表述错误。

在这里插入图片描述
正确答案:正确
考察知识点:递推算法
解析:递推算法是一种基于初始条件和递推关系,通过逐步推导求解问题的算法思想。
其核心逻辑是:已知问题的初始状态(初始项),以及相邻项之间的推导规则(递推公式),从初始项出发,依次计算出后续各项,直到得到目标结果。表述正确。

在这里插入图片描述
正确答案:正确
考察知识点:排序算法
解析:插入排序的算法思想是:将待排序数组分为已排序区间和未排序区间,初始时已排序区间只有第一个元素。然后依次从未排序区间取出元素,插入到已排序区间的合适位置,使已排序区间始终保持有序,重复此过程直到未排序区间元素为空,最终得到有序数组。
插入排序时间复杂度为O(n^2),但它的单元操作(如元素比较、移动)相对简单且次数较少。在小数据量场景下,其实际执行效率较高,因此常用于小规模数据的排序任务。表述正确。

在这里插入图片描述
正确答案:错误
考察知识点:排序算法
解析:冒泡排序的核心思想是:通过重复遍历待排序序列,每次比较相邻的两个元素,若顺序错误则交换它们的位置,直到没有元素需要交换为止。
本题需将最大元素放到最后,正确顺序:前边<后边,则一轮排序:
4 和 1 比较,顺序错误,交换→{1, 4, 3, 1, 5, 2}
4 和 3 比较,顺序错误,交换→{1, 3, 4, 1, 5, 2}
4 和 1 比较,顺序错误,交换→{1, 3, 1, 4, 5, 2}
4 和 5 比较,顺序正确,不交换
5 和 2 比较,顺序错误,交换→{1, 3, 1, 4, 2, 5}
所以一轮之后正确结果是{1, 3, 1, 4, 2, 5},而非题目中的{4, 1, 3, 1, 2, 5}。表述错误。

在这里插入图片描述
正确答案:错误
考察知识点:异常处理
解析:在 C++ 中,catch(…) 是捕获所有类型异常的通配符,并非只能捕获int类型异常。此代码中throw 42(int类型)会被catch(…)捕获,但若抛出其他类型(如double、自定义异常类等),也会被该catch块捕获。表述错误。

在这里插入图片描述
正确答案:错误
考察知识点:文件重定向与文件读写操作
解析:这段代码的问题在于:第 2 行是向cout(控制台)输出 “Hello”,而不是向文件data.txt输出。正确的应该是file << “Hello” << endl; ,这样才能将 “Hello” 写入文件。表述错误。

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

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

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

解析:通过枚举子矩阵的左上角、右下角下标,将所有子矩阵枚举出来,根据条件(矩形区域内不能包含不适合排兵的网格)判断符合条件的子矩阵,然后记录最大网格数的子矩阵。

#include<bits/stdc++.h>
using namespace std;
int n, m, arr[15][15], ans;
int main() {
	cin>>n>>m;
	for(int i=0; i<n; i++) {
		for(int j=0; j<m; j++) {
			cin>>arr[i][j];
		}
	}
	//枚举子矩形:左上(x1, y1),右下(x2, y2) ,x2>=x1, y2>=y1
	for(int x1=0; x1<n; x1++) {
		for(int y1=0; y1<m; y1++) {
			for(int x2=x1; x2<n; x2++) {
				for(int y2=y1; y2<m; y2++) {
					int flag=true; //矩形内是否包含0,flag为true表示不包含
					for(int i=x1; i<=x2; i++){
						for(int j=y1; j<=y2; j++){
							if(arr[i][j]==0){ //包含0,将flag置为false,终止循环
								flag=false;
								break;
							}
						}
						if(flag==false) break; //flag为false,包含0,终止循环
					} 
					if(flag) ans = max(ans, (x2-x1+1)*(y2-y1+1)); //flag为true,不包含0,更新子矩阵的最大网格数
				}
			}
		}
	}
	cout<<ans;
	return 0;
}

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

本题考察 数组、排序。

这道题难在思考出来解决问题的方案,代码难度并不大,不要害怕哦!!!

题意:给定由 n 个整数构成的数组 [a1a_1a1, a2a_2a2, …, ana_nan],你可以任意重排数组 a 中元素顺序。求在重排顺序之后,a 中最长的连续子数组长度是多少?连续子数组:数组中连续 k 个整数构成的子数组 [b1b_1b1, b2b_2b2, …, bnb_nbn],如果对 1≤i<k 都有 bi+1b_{i+1}bi+1 = bi+1b_i+1bi+1,那么称数组 b 是一个连续子数组。

解析:满足条件:bi+1b_{i+1}bi+1 = bi+1b_i+1bi+1,构成最长连续子数组,显然需要后边元素大于前边元素,且连续正好大1越多,长度越长。可以通过任意重排原数组达成目标,既然如此,升序排序即可。

升序排序后,如果当前元素正好比前一个元素大1,则连续子数组长度增加1;如果当前元素和前一个元素相等,则忽略此元素(可以认为这个元素未排在这个位置),连续子数组长度不变,考虑下一个元素;如果当前元素比前一个元素更大,则连续子数组中断,开启新的连续子数组,并更新最长连续子数组的长度。

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n, arr[N];
int main() {
	cin>>n;
	for(int i=0; i<n; i++) cin>>arr[i];
	sort(arr, arr+n);  //升序排序
	int len=1, ans=0;
	for(int i=1; i<n; i++){
		if(arr[i]==arr[i-1]+1) len++; //如果当前比前一个正好大1,长度加1
		else if(arr[i]>arr[i-1]){ //如果比前一个大更多,重新计算 
			ans = max(ans, len); //更新最长的子数组的长度 
			len=1;
		}
		//如果当前和前一个相等,长度不变,继续
	}
	ans = max(ans, len); //考虑最后一个连续段的长度 
	cout<<ans;
	return 0;
}
Logo

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

更多推荐