佛大附属信奥 在线评测 · 分级学习
登录

GESP C++ 五级 · 2023 年 9 月认证理论卷

登录 后作答才能记录成绩

一、单选题(每题 2 分)

1. 近年来,线上授课变得普遍,很多有助于改善教学效果的设备也逐渐流行,其中包括比较常用的手写板,那么它属于哪类设备?( )。
2. 如果a和b均为int类型的变量,且b的值不为0,那么下列能正确判断"a是b的3倍"的表达式是( )。
3. 如果变量a和b分别为double类型和int类型,则表达式(a = 6, b = 3 * (7 + 8) / 2, b += a)的计算结果为( )。
4. 有关下面C++代码说法错误的是( )。 ```cpp int sumA(int N) { int sum = 0; for (int i = 1; i <= N; i++) sum += i; return sum; } int sumB(int N) { if (N == 1) return 1; return N + sumB(N - 1); } ```
5. 下面C++代码以递归方式实现字符串反序,横线处应填上代码是( )。 ```cpp string sReverse(string sIn) { if (sIn.length() <= 1) return sIn; return ________________________; } ```
6. 印度古老的汉诺塔传说:创世时有三根金刚柱,其中一柱从下往上按照大小顺序摞着64片黄金圆盘,当圆盘逐一从一柱借助另外一柱全部移动到另外一柱时,宇宙毁灭。移动规则:在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。下面的C++代码以递归方式实现汉诺塔,横线处应填入代码是( )。 ```cpp void Hanoi(char A, char B, char C, int N) { if (N == 1) { cout << A << " -> " << C << endl; return; } Hanoi(A, C, B, N - 1); cout << A << " -> " << C << endl; ______________________; } ```
7. 根据下面C++代码的注释,两个横线处应分别填入( )。 ```cpp // 判断x是否为奇数 bool isOdd(int x) { return x % 2 != 0; } // 比较两个数的大小 int compare(int x, int y) { return x - y; } int main() { int lstA[] = {1, 2, 3, 4, 5}; int len = sizeof(lstA) / sizeof(lstA[0]); // 使用函数指针 int (*cmp)(int, int) = ______; bool (*chk)(int) = ______; for (int i = 0; i < len; i++) { if (chk(lstA[i])) cout << lstA[i] << " "; } return 0; } ```
8. 有关下面代码正确的是( )。 ```cpp bool isEven(int x) { return x % 2 == 0; } void checkNum(bool (*func)(int), int n) { if (func(n)) cout << 1; else cout << 0; } int main() { checkNum(isEven, 3); return 0; } ```
9. 有关下面C++代码正确的是( )。 ```cpp int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int main() { int (*ops[2])(int, int) = {add, sub}; cout << ops[0](3, 2) << endl; // 输出行A cout << ops[1](3, 2) << endl; // 输出行B return 0; } ```
10. 下面代码执行后的输出是( )。 ```cpp void func(int n) { if (n <= 0) return; cout << n << "#"; func(n - 1); cout << n << "#"; } int main() { func(4); return 0; } ```
11. 下面代码中的isPrimeA()和isPrimeB()都用于判断参数N是否素数,有关其时间复杂度的正确说法是( )。 ```cpp bool isPrimeA(int N) { if (N < 2) return false; for (int i = 2; i < N; i++) { if (N % i == 0) return false; } return true; } bool isPrimeB(int N) { if (N < 2) return false; for (int i = 2; i * i <= N; i++) { if (N % i == 0) return false; } return true; } ```
12. 下面代码用于归并排序,其中merge()函数被调用次数为( )。 ```cpp void merge(int arr[], int left, int mid, int right) { int n1 = mid - left + 1; int n2 = right - mid; int L[n1], R[n2]; for (int i = 0; i < n1; i++) L[i] = arr[left + i]; for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j]; int i = 0, j = 0, k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) arr[k++] = L[i++]; else arr[k++] = R[j++]; } while (i < n1) arr[k++] = L[i++]; while (j < n2) arr[k++] = R[j++]; } void mergeSort(int arr[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); merge(arr, left, mid, right); } } int main() { int arr[] = {38, 27, 43, 3, 9, 82, 10}; int n = sizeof(arr) / sizeof(arr[0]); mergeSort(arr, 0, n - 1); return 0; } ```
13. 在上题的归并排序算法中,mergeSort(listData, start, middle);和mergeSort(listData, middle + 1, end);涉及到的算法为( )。
14. 归并排序算法的基本思想是( )。
15. 有关下面代码的说法正确的是( )。 ```cpp struct Node { int data; Node* next; }; int main() { Node* head = new Node{1, nullptr}; Node* second = new Node{2, nullptr}; Node* third = new Node{3, nullptr}; head->next = second; second->next = third; third->next = head; return 0; } ```

二、判断题(每题 2 分)

1. TCP/IP的传输层的两个不同的协议分别是UDP和TCP。 ( )
2. 在特殊情况下流程图中可以出现三角框和圆形框。 ( )
3. 找出自然数N以内的所有质数,常用算法有埃氏筛法和线性筛法,其中埃氏筛法效率更高。 ( )
4. 在C++中,可以使用二分法查找链表中的元素。 ( )
5. 在C++中,通过恰当的实现,可以将链表首尾相接,形成循环链表。 ( )
6. 贪心算法的解可能不是最优解。 ( )
7. 一般说来,冒泡排序算法优于归并排序。 ( )
8. C++语言中的qsort库函数是不稳定排序。 ( )
9. 质数的判定和筛法的目的并不相同,质数判定旨在判断特定的正整数是否为质数,而质数筛法意在筛选出范围内的所有质数。 ( )
10. 下面的C++代码执行后将输出0 5 1 6 2 3 4 。 ( ) ```cpp #include <iostream> #include <queue> using namespace std; int main() { queue<int> q; q.push(0); q.push(5); q.push(1); q.push(6); q.push(2); q.push(3); q.push(4); while (!q.empty()) { cout << q.front() << " "; q.pop(); } return 0; } ```