- 分享
==dd
- 2025-3-23 17:15:12 @
题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 A B B D D C D D B B B B A A C C++ 四级 2025 年 03 月 1 单选题(每题 2 分,共 30 分) 第 1 题 关于下述代码,说法错误的是( )。 A. 函数 multiply 的定义应该放到函数 main 之前。 B. 函数声明 int multiply(int x, int y); 中明确指定了函数 multiply() 的返回值为整数类型。 C. 在 main 函数中,函数 multiply 通过 multiply(a, b) 被调用,其中 a 和 b 是定义在 main 函数中的变 量,它们作为实参传递给了 multiply 函数的形参 x 和 y 。 D. 运行上述代码,将输出 The result is: 20 。 第 2 题 执行下述代码将输出( )。 A. 2020 B. 2010 C. 1010 int multiply(int x, int y); int main() { int a = 4; int b = 5; int result = multiply(a, b); std::cout << "The result is: " << result << std::endl; return 0; } int multiply(int x, int y) { return x * y; } 1 2 3 4 5 6 7 8 9 10 11 12 13 int x = 10; void func() { int x = 20; std::cout << x; } int main() { func(); std::cout << x; return 0; } 1 2 3 4 5 6 7 D. 编译错误 第 3 题 执行下述代码后,变量 a 的值为( )。 A. 10 B. 20 C. 随机值 D. 编译错误 第 4 题 以下哪种参数传递方式可以避免拷贝大型对象? A. 只能用值传递 B. 只能用引用传递 C. 只能用指针传递 D. 引用传递和指针传递均可 第 5 题 执行下述代码,将输出( )。 A. 12 B. 21 C. 22 D. 11 第 6 题 下面的描述中,( )正确定义一个名为 Person 的结构体并正确初始化了一个 Person 结构体的变量 p 。 A. int a = 10; int* p = &a; p = 20 1 2 3 void swap(int a, int &b) { int temp = a; a = b; b = temp; } int main() { int x = 1, y = 2; swap(x, y); std::cout << x << y; return 0; } 1 2 3 4 5 6 7 8 9 10 11 struct Person { string name; int age; }; Person p("Yang", 10); 1 2 3 4 5 B. C. D. 第 7 题 给定如下代码, 下面描述错误的是( )。 A. 结构 Person 内嵌套结构 Address B. Person 有一个 Address 类型的 address 成员 C. 一个 Person 类型的变量 p 的 address 的初始化可以写成: p.address.street = "123 Main St"; p.address.city = "Anytown"; D. 结构的嵌套可以减少命名冲突,因此可以不必控制嵌套层次 第 8 题 假设 int arr[2][3] = {{1,2,3},{4,5,6}}; ,则 arr[1][2] 的值是( )。 A. 2 B. 3 C. 5 struct Person { string name, int age; }; Person p; p.name = "Yang"; p.age = 10; 1 2 3 4 5 6 7 struct Person { string name; int age; }; Person p = { "Yang", 10 }; 1 2 3 4 5 struct Person { string name; int age; }; Person p = new Person("Yang", 10); 1 2 3 4 5 struct Person { std::string name; int age; struct Address { std::string street; std::string city; }; Address address; }; 1 2 3 4 5 6 7 8 9 D. 6 第 9 题 下面( )正确定义了二维数组。 A. int arr[3,4]; B. int arr[3][4]; C. int arr(3,4); D. int a[3-4]; 第 10 题 小杨正在爬楼梯,需要爬 阶才能到达楼顶。如果每次可以爬 个或 个台阶,下面代码采用递推算法来计算 一共有多少种不同的方法可以爬到楼顶,则横线上应填写( )。 A. B. C. D. 第 11 题 给定如下算法,其时间复杂度为( )。 int f(int n) { if (n == 1 || n == 2) return n; int f1 = 1; int f2 = 2; int res = 0; for (int i = 3; i <= n; i++) { ________________________________ // 在此处填入代码 } return res; } 1 2 3 4 5 6 7 8 9 10 11 12 res += f1 + f2; f1 = f2; f2 = res; 1 2 3 res = f1 + f2; f1 = f2; f2 = res; 1 2 3 res += f1 + f2; f2 = res; f1 = f2; 1 2 3 res = f1 + f2; f2 = res; f1 = f2; 1 2 3 A. B. C. D. 第 12 题 下面关于排序稳定性的描述,正确的是( )。 A. 稳定性指算法的时间复杂度恒定 B. 稳定排序保证相同元素的相对顺序不变 C. 选择排序是稳定排序 D. 插入排序不是稳定排序 第 13 题 对数组 arr[]={5, 3, 8, 1} 进行升序排序,执行第一轮冒泡排序后数组 arr 中的内容为( )。 A. 3, 5, 1, 8 B. 3, 1, 5, 8 C. 3, 5, 8, 1 D. 5, 3, 8, 1 第 14 题 运行下面的代码,将出现( )。 bool f(int arr[], int n, int target) { for (int i = 0; i < (1 << 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; } 1 2 3 4 5 6 7 8 9 10 11 12 double hmean(double a, double b) { if (a == -b ) throw runtime_error("Runtime error occurred."); return 2.0ab/(a + b); } int main() { double x = 10; double y = -10; try { int result = hmean(x, y); cout << "hmean: " << result << endl; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 题号 1 2 3 4 5 6 7 8 9 10 答案 A. 屏幕上输出 Caught: Runtime error occurred. B. 屏幕上输出 Caught an unknown exception. C. 程序调用 std::terminate() D. 编译错误 第 15 题 下面哪种方式不能实现将字符串 "Happy Spring!" 输出重定向到文件 log.txt ( )。 A. B. C. D. 2 判断题(每题 2 分,共 20 分) 第 1 题 函数是C++中的核心概念,用于封装可重用的代码块。 第 2 题 在C++中,函数的返回类型可以省略,默认为 int 。 第 3 题 结构体的成员默认是 public 访问权限。 catch (const runtime_error& e) { cout << "Caught: " << e.what() << endl; } catch (...) { cout << "Caught an unknown exception." << endl; } return 0; } 15 16 17 18 19 20 21 freopen("log.txt", "w", stdout); cout << "Happy Spring!" << endl; fclose(stdout); 1 2 3 std::ofstream outFile("log.txt"); outFile << "Happy Spring!" << endl; outFile.close(); 1 2 3 std::ofstream outFile("log.txt"); cout << "Happy Spring!" << endl; outFile.close(); 1 2 3 ofstream log_file("log.txt"); streambuf org_cout = cout.rdbuf(); cout.rdbuf(log_file.rdbuf()); cout << "Happy Spring!" << endl; cout.rdbuf(org_cout); 1 2 3 4 5 第 4 题 假设整数数组 arr[4]= {0, 1, 2, 3}; 的第一个元素在内存中的地址为 0x7ffee4065820 , 经过 int* p = arr; p += 1; 后,指针 p 的值是1。 第 5 题 二维数组作为函数参数时,必须显式指定所有维度的大小。 第 6 题 递推是一种通过已知的初始值和递推公式,逐步求解目标值的算法。 第 7 题 考虑最坏情况下冒泡排序算法的时间复杂度, 为待排序数字的数目为 的复杂度,则其递推关系式为 , 。 第 8 题 插入排序在最好情况(已有序)下的时间复杂度是 。 第 9 题 对数组 arr[]={4, 3, 1, 5, 2} 进行升序排序,执行第一轮选择排序后数组arr中的内容是 {1, 4, 3, 5, 2} 。 第 10 题 未捕获异常会调用std::terminate终止程序。 3 编程题(每题 25 分,共 50 分) 3.1 编程题 1 试题名称:荒地开垦 时间限制:1.0 s 内存限制:512.0 MB 3.1.1 题面描述 小杨有一大片荒地,可以表示为一个 行 列的网格图。 小杨想要开垦这块荒地,但荒地中一些位置存在杂物,对于一块不存在杂物的荒地,该荒地可以开垦当且仅当其上 下左右四个方向相邻的格子均不存在杂物。 小杨可以选择至多一个位置,清除该位置的杂物,移除杂物后该位置变为荒地。小杨想知道在清除至多一个位置的 杂物的情况下,最多能够开垦多少块荒地。 3.1.2 输入格式 第一行包含两个正整数 ,含义如题面所示。 之后 行,每行包含一个长度为 且仅包含字符 . 和 # 的字符串。如果为 . ,代表该位置为荒地,如果为 # , 代表该位置为杂物。 3.1.3 输出格式 输出一个整数,代表在清除至多一个位置的杂物的情况下,最多能够开垦的荒地块数。 3.1.4 样例 3.1.5 输入样例1 3 5 ..... .#..# ..... 1 2 3 4 3.1.6 输出样例1 3.1.7 样例解释 移除第二行从左数第二块空地的杂物后: 第一行从左数前 块荒地,第二行从左数前 块荒地,第三行从左数前 块荒地,均可开垦, 。 3.1.8 数据范围 对于全部数据,保证有 。 3.1.9 参考程序 1 11 ..... ....# ..... 1 2 3 #include<bits/stdc++.h> using namespace std; const int N = 1005; char mat[N][N]; int a[N][N]; const int d[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int main() { int n, m, ans = 0; scanf("%d%d", &n, &m); assert(1 <= n && n <= 1000); assert(1 <= m && m <= 1000); for (int i = 1; i <= n; i ++) scanf("%s", mat[i] + 1); for (int i = 1; i <= n; i ++) for (int j = 1; j <= m; j ++) { int num = 0, p = -1; for (int k = 0; k < 4; k ++) if (mat[i + d[k][0]][j + d[k][1]] == '#') num ++, p = k; if (mat[i][j] == '.' && num == 1) a[i + d[p][0]][j + d[p][1]] ++; else if (mat[i][j] == '.' && num == 0) ans ++; else if (mat[i][j] == '#' && num == 0) a[i][j] ++; } int mx = 0; for (int i = 1; i <= n; i ++) for (int j = 0; j <= m; j ++) mx = max(mx, a[i][j]); cout << ans + mx << endl; return 0; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 3.2 编程题 2 时间限制:1.0 s 内存限制:512.0 MB 3.2.10 二阶矩阵 3.2.11 题目描述 小 A 有一个 行 列的矩阵 。 小 A 认为一个 的矩阵 是好的,当且仅当 。其中 表示矩阵 的第 行第 列 的元素。 小 A 想知道 中有多少个好的子矩阵。 3.2.12 输入格式 第一行,两个正整数 。 接下来 行,每行 个整数 。 3.2.13 输出格式 一行,一个整数,表示 中好的子矩阵的数量。 3.2.14 样例 3.2.14.1 输入样例 1 3.2.14.2 输出样例 1 3.2.14.3 样例解释 样例中的好的子矩阵如下: 3.2.15 数据范围 对于所有测试点,保证 , , 。 3 4 1 2 1 0 2 4 2 1 0 3 3 0 1 2 3 4 1 2 3.2.16 参考程序 #include <bits/stdc++.h> using namespace std; const int N = 505; int n, m; int a[N][N]; int ans; int main() { scanf("%d%d", &n, &m); assert(1 <= n && n <= 500 && 1 <= m && m <= 500); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { scanf("%d", &a[i][j]); assert(-100 <= a[i][j] && a[i][j] <= 100); } for (int i = 1; i < n; i++) for (int j = 1; j < m; j++) if (a[i][j] * a[i + 1][j + 1] == a[i + 1][j] * a[i][j + 1]) ans++; printf("%d\n", ans); return 0; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24