GESP 客观题评测系统
2023-12-Level-4
2023-12-Level-4
试卷解析总览,可直接查看每题答案与解析。
第 1 题(单选题)
下面有关函数参数的说法,正确的是()。
正确答案A
解析详情
【答案】A
【考点】函数参数传递、值传递与引用传递
【解析】 在C++中,采用值传递方式将参数传递给子函数时,子函数会创建参数的副本,对副本的修改不会影响主函数中的原始变量。选项B错误。若传递的是地址(指针)且在子函数中修改了指向的内容,主函数中的值会改变,选项C错误。函数调用必须匹配参数个数,选项D错误。
【易错点】 误以为值传递会改变原变量,或混淆值传递与指针/引用传递的区别。
第 2 题(单选题)
下面C++代码执行后,输出的是()。
int arr[10]={1};
string strArr="chen a dai";
cout<<strArr[arr[1]]<<endl;正确答案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;
}正确答案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;
}1 2 3
4 5 6
7 8 93 2 1
6 5 4
9 8 7正确答案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;正确答案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;正确答案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
解析详情
【答案】A
【考点】指针传参、变量间接修改
【解析】 `point(p)` 接收 `a` 的地址,返回 `*p * *p` 即 `20 * 20 = 400`。主函数中 `*p = point(p)` 即将返回的结果赋值给 `p` 指向的内存(即变量 `a`)。最终输出 `*p` 即变量 `a` 的新值 400。
【易错点】 计算错误或误以为 `*p` 指向了不同的地址。
第 8 题(单选题)
下列C++语句执行以后结果是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
解析详情
【答案】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
解析详情
【答案】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<< "#";
}
}正确答案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
解析详情
【答案】A
【考点】取模运算、因数定义
【解析】 若 `i` 是 `n` 的因数,则 `n` 除以 `i` 的余数应为 0。对应的 C++ 表达式为 `n % i == 0`。因此横线处应填入 `if(n % i == 0)` 以过滤出因数。
【易错点】 误用除法运算符 `/` 或不等于运算符 `!=`。
第 13 题(单选题)
某公司新出了一款无人驾驶的小汽车,通过声控智能驾驶系统,乘客只要告诉汽车目的地,车子就能自动选择一条优化路线,告诉乘客后驶达那里。请问下面哪项不是驾驶系统完成选路所必须的。()
正确答案C
解析详情
【答案】C
【考点】计算机系统构成、传感器应用
【解析】 智能驾驶系统选路需要:麦克风(接收指令)、传感器(感知路况和地理位置)、扬声器(反馈路线信息)。油量表仅监控能源状态,与“完成选路”逻辑计算无关。
【易错点】 误以为所有汽车组件都是系统“选路”所必须的。
第 14 题(单选题)
现代计算机是指电子计算机,它所基于的是()体系结构。
正确答案B
解析详情
【答案】B
【考点】计算机体系结构、冯·诺依曼架构
【解析】 现代电子计算机的基础是冯·诺依曼体系结构,其核心特征是“存储程序控制”,即将程序和数据共同存储在内存中。艾伦·图灵提出了图灵机模型,是计算机科学的理论基石,但现代物理实现的体系结构以冯·诺依曼命名。
【易错点】 混淆图灵模型与冯·诺依曼体系结构。
第 15 题(单选题)
输入一个正整数N(N>=7),想找出它所有相邻的因数对,比如,输入12,因数对有(1,2)、(2,3)、(3,4)。下面哪段代码找不到所有的因数对?()
正确答案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 的阶乘,时间复杂度是。
正确答案正确
解析详情
【答案】正确
【考点】递归算法、时间复杂度分析
【解析】 递归求阶乘需要执行 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; ) { ... }`。两者在逻辑表达能力上是完全等价的,只是书写格式和适用场景偏好不同。
【易错点】 误以为某些特定的循环结构只能由一种关键字实现。