#3494. 赛前模拟训练题2
赛前模拟训练题2
一、单选题(共30题,每题2分)
1. 执行下面程序后,输出为( )。
int mul(int a = 3) {
return a * 5;
}
int main() {
cout << mul() << " " << mul(2);
}
{{ select(1) }}
- 3 2
- 15 10
- 10 15
- 15 2
2. 执行下面代码后,输出为( )。
int main() {
int a = 4;
int* p = &a;
*p += 6;
cout << a << " " << *p;
}
{{ select(2) }}
- 4 4
- 10 10
- 10 4
- 4 10
3. 已知:
int a[3][4] = {
{3,6,9,12},
{15,18,21,24},
{27,30,33,36}
};
int (*p)[4] = a;
则表达式 *(*(p + 2) + 1) 的值为( )。
{{ select(3) }}
- 18
- 30
- 27
- 33
4. 执行下面程序后,输出为( )。
void change(int a, int &b, int *c) {
a += 2;
b += 4;
*c += 6;
}
int main() {
int x = 1, y = 1, z = 1;
change(x, y, &z);
cout << x << " " << y << " " << z;
}
{{ select(4) }}
- 3 5 7
- 1 5 7
- 3 1 7
- 1 1 1
5. 执行下面程序后输出为( )。
int x = 2;
void test(int &x) {
x += 4;
}
int main() {
int x = 7;
test(x);
cout << x << " " << ::x;
}
{{ select(5) }}
- 11 2
- 7 6
- 11 6
- 7 2
6. 下列关于结构体初始化的写法,正确的是( )。 {{ select(6) }}
- struct Student { string name; int age; }; Student s = ("Tom", 18);
- struct Student { string name; int age; }; Student s = {"Tom", 18};
- struct Student { string name; int age; }; Student s = new Student("Tom", 18);
- struct Student { string name; int age; }; Student s = <"Tom", 18>;
7. 执行下面代码后输出为( )。
struct Rect { int w; int h; };
void setW(Rect r) { r.w = 10; }
void setH(Rect &r) { r.h = 10; }
int main() {
Rect r{4, 5};
setW(r);
setH(r);
cout << r.w << " " << r.h;
}
{{ select(7) }}
- 10 10
- 4 10
- 10 5
- 4 5
8. 关于递推算法的描述,正确的是( )。 {{ select(8) }}
- 递推必须使用递归调用实现
- 递推从已知初始条件出发,通过递推关系逐步求解
- 递推只能用于指数复杂度问题
- 递推一定需要回溯
9. 执行 steps(8) 的返回值为( )。
int steps(int n) {
if(n <= 2) return n;
int a = 1, b = 2, c = 0;
for(int i = 3; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
{{ select(9) }}
- 13
- 21
- 8
- 34
10. 已知 int arr[4][3];,下面说法正确的是()
{{ select(10) }}
- 数组一共包含 7 个元素
- 二维数组初始化时允许省略行数,不可省略列数
- arr 代表数组第一个元素的数值
- arr[0] 存储整个二维数组全部数据
11. 下面代码试图把数组按升序进行"插入排序",横线处应填写( )。
void sortInsert(int arr[], int n) {
for(int i = 1; i < n; i++) {
int cur = arr[i];
int j = i - 1;
while(j >= 0 && ______) {
arr[j+1] = arr[j];
j--;
}
arr[j+1] = cur;
}
}
{{ select(11) }}
- arr[j] < cur
- arr[j] > cur
- arr[j+1] > cur
- arr[j] == cur
12. 下列代码段的时间复杂度为( )。
int count = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if((i + j) % 2 == 1) count++;
}
}
{{ select(12) }}
- O(n)
- O(n log n)
- O(n²)
- O(2n)
13. 执行下面程序后,输出结果是( )。
int main() {
int a = 5;
int b = 10;
int* p = &a;
p = &b;
*p = 20;
cout << a << " " << b;
return 0;
}
{{ select(13) }}
- 5 10
- 5 20
- 20 10
- 20 20
14. 执行下面程序,输出结果是( )。
int cal(int a, int b) {
if(b == 0) throw 2;
return a / b;
}
int main() {
try {
cout << cal(6, 0);
} catch(const char* msg) {
cout << "ErrA";
} catch(int) {
cout << "ErrB";
}
}
{{ select(14) }}
- ErrA
- ErrB
- 程序崩溃
- 无输出
15. 下列函数实现数组中元素的向前移动(类似插入排序的相邻搬移)。当某元素值增大需要前移时,while循环的条件应为( )。
void moveFront(int arr[], int n, int idx) {
int cur = arr[idx];
int i = idx;
while(______) {
arr[i] = arr[i - 1];
i--;
}
arr[i] = cur;
}
{{ select(15) }}
- i > 0 && cur > arr[i - 1]
- i > 0 && cur < arr[i - 1]
- i < n - 1 && cur > arr[i + 1]
- i < n - 1 && cur < arr[i + 1]
16. 下列关于指针的说法,正确的是( ) {{ select(16) }}
- 指针变量存储的是变量的值
- 通过指针可以间接访问和修改它指向的变量
- 指针变量只能指向整型变量
- 指针变量一旦定义就不能改变指向
17. 已知:
int a[3][3] = {
{2,4,6},
{8,10,12},
{14,16,18}
};
int (*p)[3] = a;
则表达式 *(*(p + 0) + 2) 的值为( )。
{{ select(17) }}
- 4
- 6
- 8
- 10
18. 执行下面程序后,输出为( )。
void update(int a, int &b, int *c) {
a += 1;
b += 2;
*c += 3;
}
int main() {
int x = 5, y = 5, z = 5;
update(x, y, &z);
cout << x << " " << y << " " << z;
}
{{ select(18) }}
- 6 7 8
- 5 7 8
- 6 5 8
- 5 5 5
19. 执行下面程序后输出为( )。
int x = 6;
void add(int &x) {
x += 5;
}
int main() {
int x = 9;
add(x);
cout << x << " " << ::x;
}
{{ select(19) }}
- 14 6
- 9 11
- 14 11
- 9 6
20. 下列关于结构体初始化的写法,正确的是( )。 {{ select(20) }}
- struct Book { string title; int price; }; Book b = ("C++", 50);
- struct Book { string title; int price; }; Book b = {"C++", 50};
- struct Book { string title; int price; }; Book b = new Book("C++", 50);
- struct Book { string title; int price; }; Book b = <"C++", 50>;
21. 执行下面代码后输出为( )。
struct Score { int math; int eng; };
void changeMath(Score s) { s.math = 100; }
void changeEng(Score &s) { s.eng = 100; }
int main() {
Score s{80, 90};
changeMath(s);
changeEng(s);
cout << s.math << " " << s.eng;
}
{{ select(21) }}
- 100 100
- 80 100
- 100 90
- 80 90
22. 关于递推算法的描述,正确的是( )。 {{ select(22) }}
- 递推必须使用递归调用实现
- 递推从已知边界条件出发,按递推关系逐步推出后续结果
- 递推只能解决指数复杂度问题
- 递推一定需要回溯
23. 下面关于递归与递推的说法,正确的是( )。 {{ select(23) }}
- 递归算法一定比递推算法效率更高
- 递推算法通常使用循环结构实现,从已知条件逐步推导到目标
- 递归算法不需要定义终止条件
- 所有递归算法都可以直接改写为递推算法且复杂度不变
24. 某排序算法对如下数据排序(按value升序),则关于该排序算法稳定性的描述中,说法正确的是( )。
初始: (88, 'A'), (88, 'B'), (76, 'C'), (88, 'D')
排序后: (76, 'C'), (88, 'A'), (88, 'B'), (88, 'D')
{{ select(24) }}
- 不稳定,因为出现了相同value
- 稳定,因为相同value的原始相对顺序得到保持
- 不稳定,因为C被移到了最前面
- 无法判断
25. 下面代码试图把数组按升序进行"插入排序",横线处应填写( )。
void insertionSort(int a[], int n) {
for(int i = 1; i < n; i++) {
int key = a[i];
int j = i - 1;
while(j >= 0 && ______) {
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
{{ select(25) }}
- a[j] < key
- a[j] > key
- a[j+1] > key
- a[j] == key
26. 下列代码段的时间复杂度为( )。
int total = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if((i * j) % 2 == 0) total++;
}
}
{{ select(26) }}
- O(n)
- O(n log n)
- O(n²)
- O(2n)
27. 在 C++ 中,ofstream 以默认方式打开文件时,若文件不存在,则( )。 {{ select(27) }}
- 报错并终止程序
- 自动创建新文件
- 返回空指针
- 跳过该操作
28. 执行下面程序,输出结果是( )。
int divideNum(int a, int b) {
if(b == 0) throw 5;
return a / b;
}
int main() {
try {
cout << divideNum(12, 0);
} catch(const char* msg) {
cout << "ErrorX";
} catch(int) {
cout << "ErrorY";
}
}
{{ select(28) }}
- ErrorX
- ErrorY
- 程序崩溃
- 无输出
29. 下列函数实现数组中元素的向前移动(类似插入排序的相邻搬移)。当某元素值增大需要前移时,while循环的条件应为( )。
void moveUp(int a[], int n, int pos) {
int cur = a[pos];
int i = pos;
while(______) {
a[i] = a[i - 1];
i--;
}
a[i] = cur;
}
{{ select(29) }}
- i > 0 && cur > a[i - 1]
- i > 0 && cur < a[i - 1]
- i < n - 1 && cur > a[i + 1]
- i < n - 1 && cur < a[i + 1]
30. 执行下面代码后,输出为( )。。
int main() {
int a = 9;
int* p = &a;
*p += 5;
cout << a;
}
{{ select(30) }}
- 9
- 11
- 12
- 14
二、多选题(共10题,每题3分)
31. 下列关于C++函数参数传递的说法,正确的有( )。 {{ multiselect(31) }}
- 值传递会在函数内部生成实参的独立副本,修改形参不影响实参
- 引用传递允许函数直接修改实参的值,且无需拷贝开销
- 指针传递可以通过解引用操作修改实参的值
- 引用传递一旦绑定变量后,可以重新绑定到另一个变量
32. 关于二维数组与指针的说法,正确的有( )。 {{ multiselect(32) }}
- 二维数组名本质上是指向第一行的指针
- int (*p)[4]表示p是一个指向包含4个int元素的一维数组的指针
- 指针算术运算p + 1在二维数组中会跳过一整行
- int* p = a[0]可以正确获取二维数组首行首元素的地址
33. 下面关于结构体(struct)的描述,正确的有( )。 {{ multiselect(33) }}
- 结构体可以使用列表初始化{ }进行初始化
- 结构体变量作为函数参数进行值传递时,函数内修改不会影响外部实参
- 结构体变量作为函数参数进行引用传递时,函数内修改会影响外部实参
- 结构体内部不能定义另一个结构体类型
34. 关于递推与迭代的描述,正确的有( )。 {{ multiselect(34) }}
- 递推是从已知初始条件出发,逐步推导出后续结果的过程
- 迭代是重复执行某段代码,通常用循环结构实现
- 所有递归算法都可以转化为递推实现
- 递推算法的时间复杂度一定比递归算法低
35. 关于排序算法及其稳定性,说法正确的有( )。 {{ multiselect(35) }}
- 如果两个相等元素在排序后相对顺序保持不变,则称该排序算法是稳定的
- 冒泡排序在相邻元素相等时不进行交换,可以保证稳定性
- 选择排序通过交换操作将最小值放到前面,可能会破坏稳定性
- 插入排序在相等元素的处理上,不会将它们交换到彼此前面,因此是稳定的
36. 关于插入排序算法的描述,正确的有( )。 {{ multiselect(36) }}
- 插入排序每次将当前元素插入到已排序部分的合适位置
- 插入排序在数组接近有序时效率较高
- 插入排序的时间复杂度始终为O(n²)
- 插入排序的while循环中,条件j >= 0 && a[j] > key用于为升序排序找到插入位置
37. 关于时间复杂度分析,正确的有( )。 {{ multiselect(37) }}
- 单层for循环从0到n-1的时间复杂度为O(n)
- 双层完全嵌套循环的时间复杂度为O(n²)
- 循环体内部的if条件语句不会改变循环整体的时间复杂度量级
- 所有递归算法的时间复杂度都是O(2ⁿ)
38. 关于C++流操作与文件重定向,正确的有( )。 {{ multiselect(38) }}
- freopen("file.txt", "w", stdout)可以将cout的输出重定向到文件
- 使用streambuf可以临时替换cout的缓冲区实现输出重定向
- cout << "text"默认输出到标准输出(屏幕),除非进行了重定向
- ofstream类对象可以通过<<操作符向文件写入数据
39. 关于C++异常处理,正确的有( )。 {{ multiselect(39) }}
- try块中抛出异常后,程序会立即跳出try块并匹配对应的catch
- catch语句可以根据抛出的数据类型进行匹配捕获
- 一个try块可以搭配多个不同类型的catch块
- 如果异常没有被任何catch块捕获,程序会继续正常运行
40. 关于C++指针的操作,正确的有( )。 {{ multiselect(40) }}
- &运算符用于获取变量的内存地址
- *运算符用于解引用指针,访问指向的内容
- 指向指针的指针(如int**)可以用于多级间接访问
- 指针变量必须使用&取地址符才能赋值
三、判断题(共10题,每题1分)
41. 执行下面代码后,变量a的值最终为28。
void modify(int &x) {
x += 13;
}
int main() {
int a = 15;
modify(a);
return 0;
}
{{ select(41) }}
- 正确
- 错误
42. 执行下面代码后,输出结果为7。
int main() {
int a[2][4];
cout << &a[1][2] - &a[0][3] << endl;
return 0;
}
{{ select(42) }}
- 正确
- 错误
43. 执行下面程序后,输出结果为30 8。
int x = 8;
void output() {
int x = 30;
cout << x << " ";
}
int main() {
output();
cout << x;
return 0;
}
{{ select(43) }}
- 正确
- 错误
44. 执行下面程序后,变量num的值最终为25。
void change(int* p) {
*p = 25;
}
int main() {
int num = 10;
change(&num);
return 0;
}
{{ select(44) }}
- 正确
- 错误
45. 执行下面代码后,输出结果为5。
int main() {
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
cout << a[2][1] - a[1][2] << endl;
return 0;
}
{{ select(45) }}
- 正确
- 错误
46. 在C++中,引用一旦绑定到某个变量后,就无法再重新绑定到其他变量。 {{ select(46) }}
- 正确
- 错误
47. 在C++中,值传递方式下,函数内部对形参的修改会影响外部实参的值。 {{ select(47) }}
- 正确
- 错误
48. 在 C++ 中,结构体内部可以定义另一个结构体类型,并声明该类型的成员变量。 {{ select(48) }}
- 正确
- 错误
49. 由于选择排序和插入排序的时间复杂度均为O(n²),因此任何实际场景下两者的性能表现完全相同,可以互相替代。 {{ select(49) }}
- 正确
- 错误
50. 下面程序能够将字符串"CSP Exam"写入到exam.txt文件中。
ofstream fout("exam.txt");
cout << "CSP Exam";
fout.close();
{{ select(50) }}
- 正确
- 错误