一、选择题
1.参数x默认为2,无实参调用时结果为6。
答案为B
2.a *p **q
5 变量a的地址 二级指针(p的地址:a的地址)
12 12
答案为B
3.(*p)[4]:定义数组指针,指针4个一维数组
*(*(p + 2) + 1)等价于a[2][1]=10。
答案为B
4.函数传参的三种方式:
a拷贝传参不能修改实参的值;
b引用传参修改为+2;
c指针传参修改为+3
x y z
1 1 1
1 3 4
答案为B
5.f(x)局部变量x=10通过引用传参方式修改为12
::x:作用域解析符,强制访问全局作用域的 x,值为 3。
答案为D
6.结构体初始化的语法格式为:
struct 结构体名{
属性1;
......
};
结构体名 结构体变量={属性值1,......};
答案为B
7.函数g(S s):值传递是拷贝传参,
函数h(S &s):引用传递是别名,会修改实参的值
s.a s.b
1 12
答案为B
8.选项A:递归是自己调用自己
选项B:说法正确的
选项C:递推的核心是 “逐步推导”,和问题的复杂度类型无关,既可以解决简单的线性问题,也可以处理复杂问题。
选项D:递推是正向推导:从初值开始,一步步算到目标结果,全程单向推进,不需要回溯。
答案为B
9.i a b c n
1 2 0 6
3 2 3 3
4 3 5 5
5 5 8 8
6 8 13 13
答案为B
10.排序稳定性指的是相同元素的相对位置不变,只有这一个评判指标,所以选项A错误,选项B正确。
答案为B
11.升序插入排序的核心条件:当已排序元素a[j] > 待插入元素key时,说明a[j]需要向后移动(给 key 腾出位置),直到a[j] <= key或 j 越界,此时j+1就是 key 的正确插入位置。
答案为B
12.注意:时间复杂度关注的是增长趋势,而非具体次数!
答案为C
13.输出重定向到文件中:
选项A:可以实现√
freopen("log.txt", "w", stdout):将标准输出流(stdout)重定向到 log.txt("w" 表示写入模式);
cout 底层依赖 stdout,因此 cout 的输出会被重定向到文件;
选项B:不能实现×
ofstream outFile("log.txt")仅创建了一个指向 log.txt 的文件输出流,但没有将 cout 和这个流关联;
cout << ...仍会输出到控制台(默认标准输出),而非 log.txt;
这个代码只是 “创建了文件但没往里面写内容”,cout 的输出完全没定向到文件。
选项C:可以实现√
cout.rdbuf(log_file.rdbuf())是 C++ 风格的核心重定向方式:替换 cout 的输出缓冲区为文件流的缓冲区;
此时 cout 的所有输出都会写入 log.txt,而非控制台;
选项D:可以实现√
这是最直接的文件写入方式:不依赖 cout 重定向,直接通过ofstream对象outFile将字符串写入 log.txt;
答案为B
14.异常处理:
当b=0时,抛出了int类型异常,所以捕获时对应int类型异常,输出B
答案为B
15.排行榜时分数越高,排名越靠前,所以分数增加后,前一位玩家分数更低时,当前玩家需要继续向前挪,对应代码是:
cur.score > players[i-1].score
而边界条件i>0是必须要限制的
答案为A
二、判断题
1.引用传参会修改实参的值,所以变量a的值变成了15。
答案为√
2.引用的核心原理:变量的别名,绑定后不可更改。
答案为√
3.&a[1][2]-&a[0][1]表示的是元素差,也就是3。
答案为×
4.函数发生了重载,因为在calc(int x, int y = 10)和calc(int x)中,函数名一样,参数个数不同,所以编译失败。
答案为×
5.调用函数f,所以先输出了局部变量x的值20;
接下来输出的就是全局变量x的值10。
答案为√
6.局部未初始化指针是野指针,而非 nullptr。
答案为×
7.这里写的代码是结构体的嵌套,Equipment和Skill作为GameCharacter的内部结构体,定义和成员声没有语法错误。
答案为√
8.ofstream fout("data.txt")仅完成 “打开文件” 的操作,但没有将任何内容写入这个文件流;
cout << "Hello"是将字符串输出到控制台(标准输出),和fout文件流毫无关联。
答案为×
9.适用场景是不同的:
插入排序适用于数据接近有序、数据量小,有稳定性要求;
选择排序适用于交换成本高,不在乎稳定性,注意不适合接近有序的数据(因为不管有序无序,选择都会比较所有数据)。
答案为×
10.这里斐波那契数列的实现方式是迭代,所以时间复杂度是O(n)。
答案为×
三、编程题
小提醒:编程题我这边想了想,最好是你们要先有自己的思考和思路,当然可以参考我的思路,具体代码如果有同学需要,我会看情况发在评论里
1.山之谷
题目描述
现有一片山地,可以视为一个 N 行 M 列的网格图,第 i 行 j 列的海拔为 hi,j。
如果一个单元格的海拔不高于其所有相邻单元格(相邻包括上、下、左、右、左上、右上、左下、右下,最多 8 个方向)的海拔,则称该单元格为山谷。
请你数一数该片山地中有多少山谷。
输入格式
第一行包含 2 个整数 N, M,表示山地的大小。
之后 N 行,每行包含 M 个整数 hi,1, hi,2,...,hi,M,表示海拔。
输出格式
输出 1 行,包含 1 个整数 ,表示山谷的数量。
样例
输入样例
3 5
7 6 6 7 9
6 5 6 7 6
6 5 7 8 9
输出样例
3
数据范围
保证 1≤n,m≤100, 1≤hi,j≤10^5。
【解题思路】
方法1:暴力枚举
逐一遍历每个单元格,逐个检查其 8 个方向的相邻单元格:
初始化标记 f = true(默认当前单元格是山谷);
对每个方向,先判断边界合法性(如i-1≥1),再检查 “相邻格海拔 < 当前格海拔”:
若存在任意一个合法相邻格海拔 < 当前格 → 不是山谷(f = false);
利用f短路判断,提前终止无效检查;
若所有合法相邻格海拔 ≥ 当前格(f保持true),则计数 + 1。
方法2:方向数组优化
将 “单元格是否为山谷” 的判断封装为 check 函数,遍历每个单元格调用 check 验证:
定义 8 方向偏移数组dx/dy,统一枚举所有相邻方向;
check 函数逻辑:
遍历 8 个方向,跳过越界单元格;
若存在任意相邻格海拔 ≤ 当前格 → 返回false(不是山谷);
所有合法相邻格都满足条件 → 返回true(是山谷);
遍历所有单元格,统计 check 返回true的数量。
【考纲知识点】二维数组操作、枚举思想
2.礼盒排序
题目描述
商店推出了许多礼盒,每个礼盒中包含 k 件商品,每件商品都有一个价格。
现在需要对这些礼盒进行排序,排序规则如下:
1. 先按礼盒总价格从小到大排序;
2. 如果总价格相同,按礼盒中最贵商品的价格从小到大排序;
3. 如果仍然相同,按礼盒中最便宜商品的价格从小到大排序;
4. 如果仍然相同,按礼盒编号从小到大排序。
请输出排序后的礼盒编号。
输入格式
第一行包含两个整数 n 和 k,分别表示礼盒数量和每个礼盒中商品的数量。
接下来 n 行,每行包含 k 个整数,第 i 行表示第 i 个礼盒中各商品的价格。
输出格式
输出一行,包含排序后的礼盒编号(编号从 1 开始),用空格分隔。
样例
输入样例
4 3
3 5 2
4 1 5
2 2 4
3 4 3
输出样例
3 4 2 1
数据范围
保证 1≤n≤10^3,1≤k≤10 ,商品价格≤10^4 。
【解题思路】
按照题意进行结构体排序,输出排序后的id
【考纲知识点】结构体排序
写在最后