2024年12月 GESP C++ 4级
2024年12月 GESP C++ 4级认证考试真题(含编程操作题部分)
// questions
题目预览
下面的语句中,( )正确定义了一个计算浮点数的平方的函数,并成功调用该函数。
float square(float x) {
return x * x;
}
float area = square(2);
square(float x) {
return x * x;
}
float area = square(2);
void square(float x) {
return x * x;
}
area = square(2.0);
void square(float x) {
x * x;
return;
}
area = square(2);
下面代码的描述中,正确的是( )。
void n_chars(char c, int n) {
while (n-- > 0)
cout << c;
}
char my_char = 'w';
int times = 5;
n_chars(my_char, times);
代码执行结束后,times 的值为 000
n 是形参,times 是实参
n 是实参,times 是形参
代码最后一行换成 n_chars(times, my_char); 也可以
给定以下代码,
void func(int& x) {
x = x * 2;
}
int a = 5;
func(a);
执行上述代码后,变量 aaa 的值为( )。
555
101010
151515
202020
运行下面代码,屏幕上输出是( )。
double* p_arr = new double [3];
p_arr[0] = 0.2;
p_arr[1] = 0.5;
p_arr[2] = 0.8;
p_arr += 1;
cout << p_arr[0] << endl;
p_arr -= 1;
delete p_arr;
0.20.20.2
0.50.50.5
1.21.21.2
1.51.51.5
运行下面代码片段后,xxx 和 *p 的结果分别是( )。
int x = 20;
int* p = &x;
*p = *p + 2;
202020 202020
202020 222222
222222 202020
222222 222222
下面的描述中,( )不能正确定义一个名为 Student 的结构体以及一个包含 202020 个元素的结构数组。
struct Student {
string name;
int age;
float score;
};
struct Student students[20];
struct Student {
string name;
int age;
float score;
};
Student students[20];
struct Student {
string name;
int age;
float score;
};
Student* students = new Student[20];
struct Student {
string name;
int age;
float score;
};
Student students = new Student[20];
假定整型是 323232 位,对一个 222 行 333 列的二维整数数组 array,假设数组第一个元素在内存中的地址为 0x7ffee40658200x7ffee40658200x7ffee4065820,则第 222 行第 222 个元素的地址 &array[1][1] 为( )。
int array[2][3] = {
{0, 1, 2},
{3, 4, 5}
};
0x7ffee40658240x7ffee40658240x7ffee4065824
0x7ffee40658280x7ffee40658280x7ffee4065828
0x7ffee406582c0x7ffee406582c0x7ffee406582c
0x7ffee40658300x7ffee40658300x7ffee4065830
下面( )正确定义二维数组。
int a[3][];
int a[][];
int a[][4];
int a[][2] = {{1,2},{1,2},{3,4}};
下面代码采用递推算法来计算斐波那契数列,则横线上应填写( )。
int fib(int n) {
if (n == 0 || n == 1)
return n;
int f1 = 0;
int f2 = 1;
int result = 0;
for (int i = 2; i <= n; i++) {
________________________________ // 在此处填入代码
}
return result;
}
result = f1 + f2;
f1 = f2;
f2 = result;
result += f1 + f2;
f1 = f2;
f2 = result;
result += f1 + f2;
f2 = result;
f1 = f2;
result = f1 + f2;
f2 = result;
f1 = f2;
下面关于排序算法(冒泡排序、插入排序和选择排序)的描述中,不正确的是( )。
冒泡排序基于元素交换实现,需借助临时变量,共涉及 333 个单元操作;而插入排序基于元素赋值实现,仅需 111 个单元操作。因此冒泡排序的计算开销通常比插入排序更高。
选择排序在任何情况下的时间复杂度都为 O(n2)O(n^2)O(n2)。
冒泡排序在任何情况下的时间复杂度都为 O(n2)O(n^2)O(n2)。
如果给定数据部分有序,插入排序通常比选择排序效率更高。
冒泡排序的第一轮操作是从左到右遍历数组,通过两两比较相邻元素,将当前最大的元素移动到末尾。给定数组 arr[]={4,1,3,1,5,2}arr[] = \{4, 1, 3, 1, 5, 2\}arr[]={4,1,3,1,5,2},执行第一轮冒泡排序后数组 arrarrarr 中的内容为( )。
1,4,3,1,5,21, 4, 3, 1, 5, 21,4,3,1,5,2
1,3,1,4,2,51, 3, 1, 4, 2, 51,3,1,4,2,5
1,4,3,1,2,51, 4, 3, 1, 2, 51,4,3,1,2,5
4,1,3,1,5,24, 1, 3, 1, 5, 24,1,3,1,5,2
给定如下代码,其时间复杂度为( )。
int cellRecur(int n) {
if (n == 1)
return 1;
return cellRecur(n - 1) + cellRecur(n - 1) + 1;
}
下面代码实现了插入排序函数,则横线上应填写( )。
void insertion_sort(vector<int> &nums) {
for (int i = 1; i < nums.size(); i++) {
________________________________ { // 在此处填入代码
while (j >= 0 && nums[j] > base)
nums[j + 1] = nums[j];
j--;
}
nums[j + 1] = base;
}
}
int base = nums[i], j = i - 1;
int base = nums[i], j = i;
int base = nums[0], j = i - 1;
int base = nums[0], j = i;
下面哪种方式不能实现将字符串 "Welcome to GESP!" 输出重定向到文件 log.txt( )。
freopen("log.txt", "w", stdout);
cout << "Welcome to GESP!" << endl;
fclose(stdout);
std::ofstream outFile("log.txt");
outFile << "Welcome to GESP!" << endl;
outFile.close();
std::ofstream outFile("log.txt");
cout << "Welcome to GESP!" << endl;
outFile.close();
ofstream log_file("log.txt");
streambuf* org_cout = cout.rdbuf();
cout.rdbuf(log_file.rdbuf());
cout << "This output will go to the log file." << endl;
cout.rdbuf(org_cout);
运行下面的代码,将出现什么情况?( )
double hmean(double a, double b) {
if (a == -b)
throw runtime_error("Runtime error occurred");
return 2.0 * a * b / (a + b);
}
int main() {
double x = 10;
double y = -10;
try {
int result = hmean(x, y);
cout << "hmean: " << result << endl;
}
catch (const runtime_error& e) {
cout << "Caught: " << e.what() << endl;
} catch (...) {
cout << "Caught an unknown exception." << endl;
}
return 0;
}
屏幕上输出 Caught: Runtime error occurred
屏幕上输出 Caught an unknown exception
程序调用 std::terminate()
编译错误
在 C++ 中,下面代码可以正确定义指针和初始化指针。
int* ptr;
*ptr = 10;
一个函数必须在调用之前既声明又定义。
函数参数可以通过值传递、引用传递和指针传递,这样函数内对参数的修改可以直接修改传入变量的值。
int arr[3][] 是一个正确的二维数组的声明。
递推是一种通过已知的初始值和递推公式,逐步求解目标值的算法。
某算法的递推关系式为 T(n)=2T(n−1)+1T(n) = 2T(n-1) + 1T(n)=2T(n−1)+1(nnn 为正整数)及 T(1)=1T(1) = 1T(1)=1,则该算法的时间复杂度为 O(2n)O(2^n)O(2n)。
冒泡排序的平均时间复杂度为 O(n2)O(n^2)O(n2) ,但最优情况下为 O(n)O(n)O(n) 。
冒泡排序和插入排序都是稳定的排序算法。
选择排序是稳定的排序算法。
在 C++ 语言中,如果一个函数可能抛出异常,那么一定要在 try 子句里调用这个函数。
试题名称:Recamán
时间限制:1.0 s | 内存限制:512.0 MB
题目描述
小杨最近发现了有趣的 Recamán 数列,这个数列是这样生成的:
- 数列的第一项 a1a_1a1 是 111;
- 如果 ak−1−ka_{k-1}-kak−1−k 是正整数并且没有在数列中出现过,那么数列的第 kkk 项 aka_kak 为 ak−1−ka_{k-1}-kak−1−k,否则为 ak−1+ka_{k-1}+kak−1+k。
小杨想知道 Recamán 数列的前 nnn 项从小到大排序后的结果。手动计算非常困难,小杨希望你能帮他解决这个问题。
输入格式
第一行,一个正整数 nnn。
输出格式
一行,nnn 个空格分隔的整数,表示 Recamán 数列的前 nnn 项从小到大排序后的结果。
样例输入 #1
5
样例输出 #1
1 2 3 6 7
样例输入 #2
8
样例输出 #2
1 2 3 6 7 12 13 20
说明/提示
样例解释
对于样例 1,n=5n=5n=5:
- a1=1a_1=1a1=1;
- a1−2=−1a_1-2=-1a1−2=−1,不是正整数,因此 a2=a1+2=3a_2=a_1+2=3a2=a1+2=3;
- a2−3=0a_2-3=0a2−3=0,不是正整数,因此 a3=a2+3=6a_3=a_2+3=6a3=a2+3=6;
- a3−4=2a_3-4=2a3−4=2,是正整数,且没有在数列中出现过,因此 a4=a3−4=2a_4=a_3-4=2a4=a3−4=2;
- a4−5=−3a_4-5=-3a4−5=−3,不是正整数,因此 a5=a4+5=7a_5=a_4+5=7a5=a4+5=7。
a1,a2,a3,a4,a5a_1,a_2,a_3,a_4,a_5a1,a2,a3,a4,a5 从小到大排序的结果为 1,2,3,6,71,2,3,6,71,2,3,6,7。
数据范围
对于所有数据点,保证 1≤n≤3 0001\le n\le 3\, 0001≤n≤3000。
试题名称:字符排序
时间限制:1.0 s | 内存限制:512.0 MB
题目描述
小杨有 nnn 个仅包含小写字母的字符串 s1,s2,…,sns_1,s_2,\ldots,s_ns1,s2,…,sn,小杨想将这些字符串按一定顺序排列后拼接到一起构成字符串 ttt。小杨希望最后构成的字符串 ttt 满足:
- 假设 tit_iti 为字符串 ttt 的第 iii 个字符,对于所有的 j<ij\lt ij<i 均有 tj≤tit_j\le t_itj≤ti。两个字符的大小关系与其在字母表中的顺序一致,例如 e<g<p<s\texttt{e}\lt \texttt{g}\lt \texttt{p} \lt \texttt{s}e<g<p<s。
小杨想知道是否存在满足条件的字符串排列顺序。
输入格式
第一行包含一个正整数 TTT,代表测试数据组数。
对于每组测试数据,第一行包含一个正整数 nnn,含义如题面所示。
之后 nnn 行,每行包含一个字符串 sis_isi。
输出格式
对于每组测试数据,如果存在满足条件的排列顺序,输出(一行一个)1\texttt{1}1,否则输出(一行一个) 0\texttt{0}0。
样例输入 #1
3
3
aa
ac
de
2
aac
bc
1
gesp
样例输出 #1
1
0
0
说明/提示
样例解释
对于第一组测试数据,一种可行的排列顺序为 aa+ac+de\texttt{aa}+\texttt{ac}+\texttt{de}aa+ac+de,构成的字符串 ttt 为 aaacde\texttt{aaacde}aaacde,满足条件。
对于全部数据,保证有 1≤T,n≤1001\le T,n\le 1001≤T,n≤100,每个字符串的长度不超过 101010。