CCF编程能力等级认证GESP—C++4级—20240907

CCF编程能力等级认证GESP—C++4级—20240907

  • 单选题(每题 2 分,共 30 分)
  • 判断题(每题 2 分,共 20 分)
  • 编程题 (每题 25 分,共 50 分)
    • 黑白方块
    • 区间排序

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

1、在 C++ 中,( )正确定义了一个返回整数值并接受两个整数参数的函数。

A. int add(int a, int b) { return a + b; }
B. void add(int a, int b) { return a + b; }
C. int add(a, b) { return a + b; }
D. void add(int a, int b) { return a - b; }

正确答案:A

2、在C++中,形参与实参的关系描述正确的是( )。

A. 形参在函数调用时指定,实参在函数定义时传递
B. 形参在函数定义时指定,实参在函数调用时传递
C. 形参和实参可以互换
D. 形参和实参必须是完全相同的类型,不能有任何差异。

正确答案:B

3、运行以下代码,屏幕上将输出( )。

#include 
using namespace std;
int var = 100;
void function() {
    int var = 200;
    cout << var <<  " ";
    cout << ::var <<  " ";
}
int main() {
    cout << var << " ";
	function();
    var += 100;
    cout << var << " ";
    return 0;
   }
A. 100 200 100 200 
B. 100 200 100 300 
C. 100 200 200 200 
D. 100 200 200 300

正确答案:A

4、运行下面代码,屏幕上输出是( )。

int arr[3] = {24, 9, 7};
int* p = arr;
p++;
cout << *p << endl;
A. 24
B. 9
C. 7
D. 不确定

正确答案:B

5、运行下面代码片段的结果是( )。

int x = 20;
int y = 24;
int*p = &x;
int*q = &y;

p = q;
A. 将x赋值为24
B. 将y赋值为20
C. 将q指向x的地址 
D. 将p指向y的地址

正确答案:D

6、在 C++ 中,( )正确定义一个名为 student 的结构体,其中包含一个 name 字符数组和一个 age 整数?

A. struct student { char name[20]; int age; };
B. student struct { char name[20]; int age; };
C. student struct { string name; int age; };
D. struct student { char[20] name; int age; };

正确答案:A

7、在C++中,()正确声明了一个3行4列的二维数组。

A. int arr[3, 4];
B. int arr[3][4]
C. int arr[4][3]; 
D. int arr(3, 4);

正确答案:B

8、一个二维数组定义为 int arr[3][4]; (假设一个int变量占4个字节),则 int arr[0] 占用( )个字节 的内存。

A. 3 
B. 4 
C. 12 
D. 16

正确答案:D

9、下面代码采用递推算法来实现整数 的阶乘 ( n ! = n ∗ ( n − 1 ) ∗ . . . ∗ 2 ∗ 1 ) (n! = n * (n - 1) * ...* 2 * 1) (n!=n(n1)...21),则横线上应填写( )。

int factorial(int n){
	int result = 1;
	for (int i = 2; i <= n; i++){
		________ //在此处填入代码
	}
	return result;
}
A. result *= i;
B. result += i;
C. result *= result; 
D. result += result;

正确答案:A

10、在排序算法中,稳定性指的是( )。

A. 排序后数据不会丢失
B. 排序后相同元素的相对顺序保持不变 
C. 排序后数据不会被修改
D. 排序后数据的时间复杂度不变

正确答案:B

11、下面代码实现了冒泡排序函数,则横线上应填写( )。

//交换数组arr的第i个元素和第j个元素
void swap(vector<int> &arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
int bubble_sort(vector<int> &arr) {
    for (int i = arr.size() - 1; i > 0; i--) {
		bool flag = false; // 标志位 
		________________________________ { // 在此处填入代码
            if (arr[j] > arr[j + 1]) {
                swap(arr, i, j);
                flag = true;
			} 
		}
	if (!flag)
		break; // 此轮“冒泡”未交换任何元素
	}
}
A. for (int j = 0; j < arr.size() - 1; j++) 
B. for (int j = arr.size() - 1; j > 0; j--) 
C. for (int j = 0; j < i; j++)
D. for (int j = i-1; j <=0; j--)

正确答案:C

12、上一题算法的时间复杂度为( )。

A. O ( n 2 ) O(n^2) O(n2)
B. O ( 2 n ) O(2^n) O(2n)
C. O ( 1 ) O(1) O(1)
D. O ( n ) O(n) O(n)

正确答案:A

13、下面代码实现了插入排序函数(升序),则横线上应填写( )。

void insertion_sort(vector<int> &nums){
	for (int i = 1; i < nums.size(); i++){
		int base = nums[i], j = i - 1;
		________ // 在此处填入代码
			nums[j + 1] = nums[j];
			j--;
		}
		nums[j + 1] = base;
	}
}
A. while (j >= 0 && nums[j] > base) 
B. while (j > 0 && nums[j] > base) 
C. while (j >= 0 && nums[j] < base) 
D. while (j > 0 && nums[j] < base)

正确答案:A

14、小杨用文件重定向实现在 log.txt 文件中输出日志,则下面横线上应填写( )。

#include 
#include 
#include 
using namespace std;
int main() {
	ofstream log_file("log.txt");
    streambuf* original_cout = cout.rdbuf();
    cout.rdbuf(log_file.rdbuf());
	___________________________________ // 在此处填入代码
	cout.rdbuf(original_cout); // 恢复原始的标准输出缓冲区
	return 0; 
}
A. cout << "This output will go to the log file." << endl;
B. log_file << "This output will go to the log file." << endl; 
C. cout >> "This output will go to the log file." >> endl;
D. log_file >> "This output will go to the log file." >> endl;

正确答案:A

15、运行下面的代码,屏幕上将输出( )。

#include 
using namespace std;

int divide(int a, int b) {
    if (b == 0) {
		throw runtime_error("division by zero error ");
	}
	return a / b; 
}

int main() {
    int x = 10;
	int y = 0; //设为0会导致除零错误
    try {
        int result = divide(x, y);
        cout << "result: " << result << endl;
    } catch (const runtime_error& e) {
        cout << "caught an exception: " << e.what() << endl;
	}
	return 0; 
}
A. division by zero error result: caught an exception:
B. result: caught an exception: division by zero error
C. caught an exception: division by zero error
D. division by zero error caught an exception: division by zero error

正确答案:C

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

1、代码 int a = 10; int* p = &a; 可以正确定义指针和初始化指针。

正确答案:正确

2、在 C++ 中,引用传递允许函数修改传递给它的参数的值。

正确答案:正确

3、指针的大小与其所指向的变量的数据类型的大小相同。

正确答案:错误

4、二维数组的行的大小的必须在定义时确定,列的大小可以动态变化。

正确答案:错误

5、递推算法通过逐步求解当前状态和前一个或几个状态之间的关系来解决问题。

正确答案:正确

6、选择排序是稳定的排序算法。

正确答案:错误

7、插入排序的时间复杂度总是比冒泡排序低。

正确答案:错误

8、在 C++ 中,如果没有捕获到异常(没有匹配的 catch 块),程序会继续执行而不会终止。

正确答案:错误

9、以下代码用递推法求斐波那契数列的第 项,时间复杂度为指数级。

int fibonacci(int n) {
	if (n == 0) return 0;
	if (n == 1) return 1;
	int f0=0;//F(0)
	int f1=1;//F(1)
	int current;

	for(int i = 2; i <= n; i++){
		current = f1 + f2; // F(n) = F(n-1) + F(n-2)
		f0 = f1;
		f1 = current;
	}
	
	return current;
}

正确答案:错误

10、执行下面C++代码后,输出的是20。

int point(int* p){
	return *p * 2;
}
int main() {
	int a = 10;
	int*p = &a;
	*p = point(p);
	cout << *p << endl;
}

正确答案:正确

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

黑白方块

【问题描述】
小杨有一个n行m列的网格图,其中每个格子要么是白色,要么是黑色。
小杨想知道网格图中是否存在一个满足如下条件的子矩形:
子矩形由4行4列组成;
子矩形的第1行 和第4行只包含白色格子;
对于子矩形的第2行 和第3行,只有第1个和第4个格子是白色的,其余格子都是黑色的;
请你编写程序帮助小杨判断。

【输入描述】
第一行包含一个正整数t ,代表测试用例组数。
接下来是t组测试用例。对于每组测试用例,一共n + 1行。
第一行包含两个正整数n, m,含义如题面所示。
之后n行,每行一个长度为m的01串,代表网格图第i行格子的颜色,如果为0,则对应格子为白色,否则为黑 色。
【输出描述】
对于每组测试用例,如果存在,输出 Yes,否则输出 No。
【样例输入 1】
3
1 4
0110
5 5
00000
01100
01100
00001
01100
5 5
00000
01100
01110
00001
01100
【样例输出 1】
No
Yes
No

满足条件的子矩形形如:
0000
0110
0110
0000

对于全部数据,保证有 1 < = t < = 10 , 1 < = n , m < = 100 1 <= t <= 10, 1 <= n, m <= 100 1<=t<=10,1<=n,m<=100

区间排序

【问题描述】
小杨有一个包含n个正整数的序列a。
小杨计划对序列进行多次升序排序,每次升序排序小杨会选择一个区间 [ l , r ] ( l < = r ) [l,r](l<=r) [l,r](l<=r)并对区间内所有数字,即 a l , a l + 1 , . . . , a r a_l,a_{l+1}, ..., a_r al,al+1,...,ar进行升序排序。每次升序排序会在上一次升序排序的结果上进行。
小杨想请你计算出多次升序排序后的序列。
【输入描述】
第一行包含一个正整数n,含义如题面所示。
第二行包含n个正整数 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1,a2,...,an,代表序列。
第三行包含一个正整数q,代表排序次数。
之后q行,每行包含两个正整数 l i , r i l_i, r_i li,ri,代表将区间 [ l i , r i ] [l_i, r_i] [li,ri]内所有数字进行升序排序。
【输出描述】
输出一行包含n个正整数,代表多次升序排序后的序列。
【样例输入 1】
5
3 4 5 2 1
3
4 5
3 4
1 3
【样例输出 1】
1 3 4 5 2

第一次升序排序后,序列为[3,4,5,1,2];
第二次升序排序后,序列为[3,4,1,5,2];
第三次升序排序后,序列为[1,3,4,5,2];
对于全部数据,保证有 1 < = n < = 100 , 1 < = a i < = 100 , 1 < = q < = 100 , 1 < = l i < = r i < = n 1 <= n <= 100, 1 <= a_i <= 100, 1 <= q <= 100, 1 <= l_i <= r_i <= n 1<=n<=100,1<=ai<=100,1<=q<=100,1<=li<=ri<=n

你可能感兴趣的:(#,C++,-,4级,c++,算法,数据结构,青少年编程)