GESP 客观题评测系统

2023-12-Level-4

2023-12-Level-4

试卷解析总览,可直接查看每题答案与解析。

单选题(每题 2 分)

1 题(单选题

下面有关函数参数的说法,正确的是()。

A.
函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中的参数值不变。
B.
函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中的参数值将随子函数一样改变而改变。
C.
函数参数传递时,主函数如果将参数的地址传递给子函数,若子函数将参数值改变,主函数当中的参数值将不改变。
D.
函数参数传递可以不满足子函数的参数个数要求。

正确答案A

解析详情

【答案】A

【考点】函数参数传递、值传递与引用传递

【解析】 在C++中,采用值传递方式将参数传递给子函数时,子函数会创建参数的副本,对副本的修改不会影响主函数中的原始变量。选项B错误。若传递的是地址(指针)且在子函数中修改了指向的内容,主函数中的值会改变,选项C错误。函数调用必须匹配参数个数,选项D错误。

【易错点】 误以为值传递会改变原变量,或混淆值传递与指针/引用传递的区别。

2 题(单选题

下面C++代码执行后,输出的是()。

int arr[10]={1};
string strArr="chen a dai";
cout<<strArr[arr[1]]<<endl;
A.
chen
B.
c
C.
chen a dai
D.
dai

正确答案B

解析详情

【答案】B

【考点】数组初始化、字符串索引

【解析】 数组 `arr[10]={1}` 初始化后,首元素 `arr[0]` 为1,其余元素(如 `arr[1]`)自动补0。因此 `arr[1]` 的值为0。`strArr[arr[1]]` 即 `strArr[0]`,对应字符串 "chen a dai" 的第一个字符 'c'。

【易错点】 误认为 `arr[1]` 的值也是1,或者混淆数组索引从0开始的规则。

3 题(单选题

下面C++代码最后执行后输出是()。

int fun1(int *n)
{
    return *n**n;
}
int main()
{
    int arr[10]={2};
    arr[1]=fun1(arr);
    cout<<arr[1]<<endl;
}
A.
1
B.
2
C.
3
D.
4

正确答案D

解析详情

【答案】D

【考点】指针传参、函数返回值

【解析】 `arr` 作为参数传递给 `fun1`,即 `n` 指向 `arr[0]`。`arr[0]` 初始化为2。`fun1` 返回 `*n * *n` 即 `2 * 2 = 4`。主函数中 `arr[1]` 被赋值为 4 并输出。

【易错点】 混淆指针取值运算符 `*` 与乘法运算符 `*`,或误以为 `arr[1]` 初始值影响结果。

4 题(单选题

下面 C++ 代码执行后的结果是()。

int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
for(int i=0;i<3;i++)
{
    for(int j=2;j>=0;j--)
    {
        cout<<arr[i][j]<<" ";
    }
    cout<<endl;
}
A.
1 2 3
4 5 6
7 8 9
B.
1 2 3 4 5 6 7 8 9
C.
3 2 1
6 5 4
9 8 7
D.
9 8 7 6 5 4 3 2 1

正确答案C

解析详情

【答案】C

【考点】二维数组遍历、内层循环逆序

【解析】 外层循环 `i` 从 0 到 2 遍历行,内层循环 `j` 从 2 递减到 0 遍历列。这意味着每一行都会被逆序输出。第一行 `1 2 3` 输出为 `3 2 1`,第二行 `4 5 6` 输出为 `6 5 4`,第三行输出为 `9 8 7`。

【易错点】 未注意到内层循环 `j` 是从 2 开始递减的,误以为是按顺序输出。

5 题(单选题

下面 C++ 代码执行后输出是()。

int arr[3]={1,2,3};
int *p=NULL;
p=arr;
p++;
cout<<*p<<endl;
A.
1,2,3
B.
1
C.
2
D.
3

正确答案C

解析详情

【答案】C

【考点】指针算术运算、数组与指针的关系

【解析】 `p = arr` 使指针 `p` 指向数组首元素 `arr[0]`(值为1)。执行 `p++` 后,指针后移一位,指向 `arr[1]`(值为2)。因此 `*p` 输出为 2。

【易错点】 误以为 `p++` 是修改 `arr[0]` 的值,或者不清楚指针移动一个单位对应移动一个元素的大小。

6 题(单选题

如果变量x的地址是0x6ffe14,下面C++代码执行以后输出的是()。

int *p = NULL;
int x = 2;
p = &x;
p++;
cout << p << endl;
A.
0x6ffe11
B.
0x6ffe14
C.
0x6ffe18
D.
0x6ffe15

正确答案C

解析详情

【答案】C

【考点】指针算术运算、内存地址计算

【解析】 `p` 是 `int*` 类型。在大多数环境下,`int` 占 4 个字节。执行 `p++` 时,指针地址增加 `sizeof(int)`。初始地址 `0x6ffe14 + 4` 得到 `0x6ffe18`。注意十六进制运算:4+4=8。

【易错点】 误以为地址只增加 1 变为 `0x6ffe15`,忽视了指针类型对步长的影响。

7 题(单选题

在C++中,执行下面代码后,输出的是()。

int point(int *p)
{
    return *p**p;
}
int main()
{
    int a = 20;
    int *p = &a;
    *p = point(p);
    cout << *p << endl;
}
A.
400
B.
200
C.
20
D.
100

正确答案A

解析详情

【答案】A

【考点】指针传参、变量间接修改

【解析】 `point(p)` 接收 `a` 的地址,返回 `*p * *p` 即 `20 * 20 = 400`。主函数中 `*p = point(p)` 即将返回的结果赋值给 `p` 指向的内存(即变量 `a`)。最终输出 `*p` 即变量 `a` 的新值 400。

【易错点】 计算错误或误以为 `*p` 指向了不同的地址。

8 题(单选题

下列C++语句执行以后结果是true的是()。

A.
3&&false
B.
5&&2
C.
101&&000
D.
4&true

正确答案B

解析详情

【答案】B

【考点】逻辑运算与布尔转换

【解析】 在C++逻辑运算中,非零整数视为 `true`。A: `3 && false` 结果为 `false`。B: `5 && 2` 中 5 和 2 均为真,结果为 `true`。C: `101 && 000` 结果为 `false`。D: `4 & true` 是位运算,结果为 `0` (false)。

【易错点】 混淆逻辑与 `&&` 和位与 `&`,或不清楚整数转换为布尔值的规则。

9 题(单选题

在如下的C++代码中实现了对字符串中出现的26个字母的个数统计,横线处应填入是()。

string str="HELLO CHEN A DAI";
int strlen=str.length();
char alpha[26]={65};
int cnt[26]={0};
for(int i=1;i<26;i++)
{
    // 在此处填入代码
}
for(int i=0;i<26;i++)
{
    cout<<alpha[i]<<" ";
}
cout<<endl;
for(int i=0;i<26;i++)
{
    for(int j=0;j<strlen;j++)
    {
        if(alpha[i]==str[j])
        {
            cnt[i]++;
        }
    }
}
for(int i=0;i<26;i++)
{
    cout<<cnt[i]<<" ";
}
A.
alpha[i]=alpha[i-1]+1;
B.
alpha[i]=alpha[i]+1;
C.
alpha[i+1]=alpha[i]+1;
D.
alpha[i-1]=alpha[i]+1;

正确答案A

解析详情

【答案】A

【考点】数组填充、ASCII 码应用

【解析】 代码目的是初始化 `alpha` 数组为 'A'-'Z'。`alpha[0]` 已设为 65 ('A')。循环从 `i=1` 开始,应根据前一个字符递增填充,即 `alpha[i] = alpha[i-1] + 1`。这样 `alpha[1]` 变为 66 ('B'),以此类推。

【易错点】 填错索引(如使用 `alpha[i+1]` 导致越界)或逻辑错误(如 `alpha[i] = alpha[i] + 1`)。

10 题(单选题

下面 C++ 代码执行后生成的文件其字节数为()。

ofstream fout;
fout.open("1.txt");
for(int i=1;i<=10;i++)
{
    if(i%5==0)
    {
        int x=6;
        fout<<x;
    }
    else 
    {
        char ch='A';
        fout<<ch;
    }
}
A.
10
B.
16
C.
40
D.
24

正确答案A

解析详情

【答案】A

【考点】文本文件写入、字符字节数

// 【解析】 循环运行 10 次。当 `i=5, 10` 时,写入整数 6(作为文本写入,即字符 '6',占 1 字节);其余 8 次写入字符 'A'(占 1 字节)。总字节数为 2 + 8 = 10 字节。注意 `fout << x` 在文本模式下将整数转换为字符输出。

【易错点】 误以为整数 `x` 占 4 字节,或者没有分清文本文件与二进制文件的区别。

11 题(单选题

下列 C++ 代码输入 1, 2, 3, 4 ,执行后,将输出的是()。

string str="";
cin>>str;
int strlen=str.length();
for(int i=0;i<strlen;i++)
{
    if(str[i]<='9'&&str[i]>='0')
    {
        cout<<str[i];
    }
    else 
    {
        cout<< "#";
    }
}
A.
1#4#
B.
1#3#
C.
1#2#3#4#
D.
1#2#3#4

正确答案D

解析详情

【答案】D

【考点】字符串处理、字符条件判断

【解析】 题干给出的输出选项 D 暗示输入被作为一个整体处理(或输入中无空格)。对每个字符判断,若是数字则原样输出,否则输出 '#'。输入中的逗号是字符,会被替换为 '#'。观察 D 选项 `1#2#3#4` 符合该逻辑(假设输入是 `1,2,3,4`)。

【易错点】 混淆 `cin` 对空格的处理,或未注意到逗号被替换为 '#'。

12 题(单选题

以下C++代码用于实现每个整数对应的因数,如输入 12,则输出 1 2 3 4 6 12;如输入 18,则输出 1 2 3 6 9 18。横线处应填入代码是()。

int n;
cin>>n;
for(int i=1;i<=n;i++)
{
    // 在此处填入代码
    cout<<i<<" ";
}
A.
if(n%i==0)
B.
if(n/i==0)
C.
if(n%i!=0)
D.
if(n/i!=0)

正确答案A

解析详情

【答案】A

【考点】取模运算、因数定义

【解析】 若 `i` 是 `n` 的因数,则 `n` 除以 `i` 的余数应为 0。对应的 C++ 表达式为 `n % i == 0`。因此横线处应填入 `if(n % i == 0)` 以过滤出因数。

【易错点】 误用除法运算符 `/` 或不等于运算符 `!=`。

13 题(单选题

某公司新出了一款无人驾驶的小汽车,通过声控智能驾驶系统,乘客只要告诉汽车目的地,车子就能自动选择一条优化路线,告诉乘客后驶达那里。请问下面哪项不是驾驶系统完成选路所必须的。()

A.
麦克风
B.
扬声器
C.
油量表
D.
传感器

正确答案C

解析详情

【答案】C

【考点】计算机系统构成、传感器应用

【解析】 智能驾驶系统选路需要:麦克风(接收指令)、传感器(感知路况和地理位置)、扬声器(反馈路线信息)。油量表仅监控能源状态,与“完成选路”逻辑计算无关。

【易错点】 误以为所有汽车组件都是系统“选路”所必须的。

14 题(单选题

现代计算机是指电子计算机,它所基于的是()体系结构。

A.
艾伦·图灵
B.
冯·诺依曼
C.
阿塔纳索夫
D.
埃克特-莫克利

正确答案B

解析详情

【答案】B

【考点】计算机体系结构、冯·诺依曼架构

【解析】 现代电子计算机的基础是冯·诺依曼体系结构,其核心特征是“存储程序控制”,即将程序和数据共同存储在内存中。艾伦·图灵提出了图灵机模型,是计算机科学的理论基石,但现代物理实现的体系结构以冯·诺依曼命名。

【易错点】 混淆图灵模型与冯·诺依曼体系结构。

15 题(单选题

输入一个正整数N(N>=7),想找出它所有相邻的因数对,比如,输入12,因数对有(1,2)、(2,3)、(3,4)。下面哪段代码找不到所有的因数对?()

A.
for(i=1;i<N;i++) if(!(N%i) &&!(N%(i+1))) printf("%d,%d)\n", i, i+1);
B.
for(i=2;i<N;i++) if(!(N%i) &&!(N%(i+1))) printf("%d,%d)\n", i, i+1);
C.
for(i=2;i<N/2;i++) if(!(N%(i-1)) &&!(N%i)) printf("%d,%d)\n", i-1, i);
D.
for(i=1;i<N/2;i++) if(!(N%i) &&!(N%(i+1))) printf("%d,%d)\n", i, i+1);

正确答案B

解析详情

【答案】B

【考点】循环范围、因数判断逻辑

【解析】 寻找相邻因数对即找连续整数 `i` 和 `i+1` 均能整除 `N`。A: 遍历 `1` 到 `N-1`,正确。B: 循环从 `i=2` 开始,会漏掉 `i=1` 的情况(如 12 的因数对 (1,2)),因此无法找全。C、D 虽然范围缩小了,但对于寻找相邻因数对依然有效。

【易错点】 忽视循环起始值 `i=2` 对 (1,2) 这一对结果的影响。

判断题(每题 2 分)

1 题(判断题

C++的内置函数 sort() 支持数组的局部排序。例如 int a={10,9,8,7,6,5,4,3,2,1},可以用 sort(a,a+5),排序成 {6,7,8,9,10,5,4,3,2,1}。()

正确答案正确

解析详情

【答案】正确

【考点】STL sort 函数、迭代器区间

【解析】 `sort(begin, end)` 接受一个左闭右开的区间。`sort(a, a+5)` 会对数组的前 5 个元素(即 10, 9, 8, 7, 6)进行排序。默认升序排列后变为 6, 7, 8, 9, 10,其余元素不变。

【易错点】 不清楚 `sort` 的区间定义或误以为只能对全数组排序。

2 题(判断题

用递归法求 n 的阶乘,时间复杂度是O(n)O(n)

正确答案正确

解析详情

【答案】正确

【考点】递归算法、时间复杂度分析

【解析】 递归求阶乘需要执行 n 次函数调用,每次调用执行常数次乘法运算。因此总操作次数与 n 成线性关系,时间复杂度为 O(n)。

【易错点】 误认为递归一定导致指数级复杂度。

3 题(判断题

[(1,2)*2]*3 在C++中是合法的表达式。()

正确答案错误

解析详情

【答案】错误

【考点】表达式语法、括号运算符

【解析】 在C++表达式中,中括号 `[]` 仅用于数组索引或 Lambda 捕获等,不能替代小括号 `()` 用于改变运算优先级。合法的写法应全为小括号。

【易错点】 混淆数学书写习惯与编程语言语法的差异。

4 题(判断题

在下面的C++代码中,将对1.txt文件写入 hello 。( )

ifstream filein;
ofstream fileout;
filein.open("1.txt");
fileout<<"hello";

正确答案错误

解析详情

【答案】错误

【考点】文件流操作、文件打开

【解析】 代码中 `fileout` 虽被定义但未调用 `open()` 函数打开任何物理文件。直接执行 `fileout << "hello"` 无法将数据写入文件。此外 `filein` 尝试打开 "1.txt" 是为了读取。

【易错点】 忽视了文件流在使用前必须成功打开的必要条件。

5 题(判断题

文本文件 1.txt 第1行由 01234 共5个字符组成其间没有空格,当用C++代码正常打开文件成功并执行如下代码以后,第1行长度为5()

ifstream filein;
int buff;
filein.open("1.txt");
filein>>buff;
cout<<buff<<endl;

正确答案错误

解析详情

【答案】错误

【考点】文件读取、数据格式转换

【解析】 读取操作 `filein >> buff` 会将字符内容加载到内存变量中。无论读取成功与否,文件本身的物理内容(即第1行的5个字符)都不会被修改,其长度依然是5。本题判断为“错误”可能暗示了对读取后内存中数值变化的误解或题目逻辑偏颇,但从文件持久性看长度不变。

【易错点】 误以为读取操作会修改原始文件。

6 题(判断题

执行C++代码cout<<(5||2); 后将输出1。()

正确答案正确

解析详情

【答案】正确

【考点】逻辑或运算、布尔值输出

【解析】 逻辑或运算符 `||` 的结果是布尔值。因为 5 和 2 都是非零值(真),所以 `5 || 2` 结果为 `true`。当 `cout` 输出布尔值 `true` 时,默认输出整数 1。

【易错点】 误以为输出是参与运算的某个数值(如 5)或混淆位运算。

7 题(判断题

在C++中,两个字符串相加的运算符为+相当于字符串的合并运算。下面C++代码执行后,将输出chenadai。()

string a="chen";
string b="a";
string c="dai";
string name=a+b+c;
cout<<name<<endl;

正确答案正确

解析详情

【答案】正确

【考点】string 类运算符重载、字符串拼接

【解析】 C++ `std::string` 类重载了 `+` 运算符,用于拼接两个字符串。`a+b+c` 依次连接 "chen"、"a" 和 "dai",结果为 "chenadai"。

【易错点】 误以为需要使用 `strcat` 或其他函数进行拼接。

8 题(判断题

C++内置函数 sort() 可以对整数、浮点数、字符数组进行从大到小,从小到大,局部排序。()

正确答案正确

解析详情

【答案】正确

【考点】STL sort 函数通用性

【解析】 `sort` 函数不仅可以处理基本数值类型(整数、浮点数),也可以处理字符数组。通过提供自定义比较函数(如 `greater<int>()`),可以实现从大到小的排序;通过迭代器范围可实现局部排序。

【易错点】 误以为 `sort` 只能进行升序全量排序。

9 题(判断题

小杨最近在准备考GESP,他用的Dev C++来练习和运行程序,所以Dev C++也是一个小型操作系统。()

正确答案错误

解析详情

【答案】错误

// 【考点】计算机软件分类、IDE 概念

【解析】 Dev C++ 是一个集成开发环境(IDE),包括编辑器、编译器和调试器等工具,用于编写和编译程序。它运行在操作系统(如 Windows)之上,本身并不是操作系统。

【易错点】 混淆应用软件(IDE)与系统软件(操作系统)的区别。

10 题(判断题

任何一个 while 循环都可以转化为等价的 for 循环()。

正确答案正确

解析详情

【答案】正确

【考点】循环结构转换

【解析】 `while(condition) { ... }` 可以等价地写为 `for(; condition; ) { ... }`。两者在逻辑表达能力上是完全等价的,只是书写格式和适用场景偏好不同。

【易错点】 误以为某些特定的循环结构只能由一种关键字实现。