GESP认证C++编程真题解析 | 202409 三级
附上汇总帖:GESP认证C++编程真题解析 | 汇总
单选题
第1题
下列代码中,输出结果是( )
#include <iostream>
using namespace std;
int main()
{
double a = 0.9;
double b = 1.0;
if ((b-a) == 0.1))
{
cout << "Equal" << endl;
}
else
{
cout << "Not equal" << endl;
}
}
A. Equal
B. Not equal
C. 程序不能正确执行
D. 没有输出
【答案】:B
【解析】
浮点数在计算机中由于精度限制,直接比较可能会导致预期外的结果。例如,b-a 实际上可能并不完全等于0.1,而是一个非常接近但略有不同的值。因此,使
用==比较浮点数通常是不可靠的,通常说来,只要这个小数没法被二进制表示的话,就没法用计算精确表示,只能用一个误差很小到可以忽略的近似值来表示。
第2题
关于计算机中的编码,下列说法中正确的是( )
A. 机器数的形式值和真值是一致的
B. 原码就是符号位加上真值
C. 机器数是带符号的
D. [-1]=[1000 0001]原=[1111 1111]反
【答案】:C
【解析】
A选项说法不正确。机器数是指计算机内部表示数据的二进制形式,而真值是人类理解的数据值(通常是指十进制),两者不一定一致。
B选项说法是不对的。原码二进制,表示法是在最高位作为符号位(0表示正数,1表示负数),其余位表示数值本身。真值是指十进制。、
C选项正确。如原码、反码和补码都是带符号的表示方式。
D选项错误。对于8位二进制数:-1的原码是[1000 0001],-1的反码应该是对原码取反(除了符号位):即[1111 1110],-1的补码则是在反码基础上加1,即[1111 1111]
第3题
8进制数3703转换成16进制数是( )。
A. 7C3
B. 7A3
C. 7B3
D. 7D3
【答案】:A
【解析】
可以以2进制作为桥梁来转换:8=>2=>16
将8进制数3703每一位分别转换成对应的3位二进制表示:011 111 000 011
然后,从右往左每四位分组,若最后一组不足4位则在左侧补零,接着:0111 1100 0011依次逐个转换成16进制:7C3
第4题
0.8125变成二进制是( )。
A. 0.1110
B. 0.1 1111 1011 1101
C. 0.1 1111 1011 1100
D. 0.1101
【答案】:D
【解析】
我们可以通过逐步乘以2依次取出整数部分正向排列的方法进行转换:0.1101
第5题
下面说法正确的是( )。
A. (22&01) == (22&&01)成立
B. (23|11) == 30
C. (23|10) == 31
D. (23|01) == 31
【答案】:C
【解析】
A选项错误,22&01的值为0,22&&01的值为true,不相等
B选项错误,23|11等于31
C选项正确,23|10等于31
D选项错误,23|01等于23
第6题
下列说法正确的是( )。
A. 2>>1和1>>1的值是一样的
B. (2>>2)和(1>>1)的值是一样的
C. (1100)和(10)的值是一样的
D. (~0的输出值是1)
【答案】:B
【解析】
A选项错误,2>>1为1,1>>1为0。
B选项正确,2>>2为0,1>>1为0。
C选项错误,1100为11,10为1。
D选项错误,~0为1111111,代表-1,不是1。
第7题
下列代码实现的是( )。
void Swap(int &a, int &b) {
if (a != b) {
a ^= b;
b ^= a;
a ^= b;
}
}
A. a和b的异或
B. a和b的同或
C. a和b的值交换
D. a和b的高低位互换
【答案】:C
【解析】
代码的作用是实现变量变换,将a和b的值进行了交换。
第8题
a&~1运算实现的是( )。
A. 使a的最低位为1
B. 使a的最高位为1
C. 使a的最低位为0
D. 使a的最高位为0
【答案】:C
【解析】
a&~1是将a的最低位清零,而保持其他位不变。
第9题
a=10101110,a<<2,下面关于这个说法正确的是( )。
A. a的值变为10111000
B. a的值变为10111010
C. a的值变为01011101
D. a的值变为01011100
【答案】:A
【解析】
位移运算a<<2表示将二进制数a左移两位。左移操作会把所有位向左移动指定的位数,并在右边补上相应数量的0。
第10题
下列程序中,result 和 result2 输出分别是( )。
long a = 123;
int b = 1;
long result = a & b;
cout << result << endl;
long a2 = -123;
unsigned int b2 = -1;
long result2 = a2 & b2;
cout << result2 << endl;
A. 123 -1
B. 123 -123
C. 1 -1
D. 1 -123
【答案】:D
【解析】
第一段执行result = 123 & 1,为1。第二段-123 & -1,因为-1表示为11111111,所以result = -123
第11题
陈A歹种植一批农作物,第一天需要浇水一次,随后的两天(第2、第3天),每天需要浇水2次,再随后的3天(第4、第5、第6天),需要每天浇水3次,这样持续下去,随后的n天,每天需要浇水n次。请问在1100天里,总共浇了多少次水( )。
A. 994
B. 996
C. 995
D. 945
【答案】:D
【解析】
第k组有k天,一共需要浇水次。
前13组,一共1+4+9+16+25+36+49+64+81+100+121+144+169次。到这里已经用了91天,还剩余9天,这些天属于第14组,每天需要浇水14次,14 * 9 = 126次。
1+4+9+16+25+36+49+64+81+100+121+144+169+126 = 945
第12题
关于一维数组,下列程序能够正确执行的是( )。
A.
int a[10];
int sum=0;
for (int i=0; i<10; i++) {
sum = sum + a[i];
}
B.
int a[10]={1,2,3,4,5,6,7,8,9,10};
int sum=0;
for (int i=0; i<=10; i++) {
sum = sum + a[i];
}
C.
int a[10]={1,2,3,4,5,6,7,8,9,10};
int sum=0;
for (int i=0; i<10; i++) {
sum = sum + a[i];
}
D.
int a[10]={0};
int sum=0;
for (int i=0; i<=10; i++) {
sum = sum + a[i];
}
【答案】:C
【解析】
选项A的问题:循环条件i<=10会导致访问越界,因为合法索引范围是0到9,另外此程序的数组 a 的初值没有初始化会导致计算结果未知。
选项B、D的问题:虽然数组a被初始化,但循环条件i<=10会导致访问越界。
第13题
下面的程序中,会输出( )。
int a[10]={1,2,3,4,5,6,7,8,9,10};
cout << a[10] << endl;
A. 1
B. 0
C. 10
D. 不确定的值
【答案】:D
【解析】
定义了一个长度为10的整数数组a,数组下标从0到9。
a[10]尝试访问数组第11个元素(因为数组下标从0开始),此时发生了下标越界,所以其结果是不确定的,可能会导致程序崩溃或输出任意值。
第14题
有ABCD4个人,其中一个是小偷,每个人说一句话,只有小偷说的是假话,其中A说:不是我。B说:是C。C说:是D。D说:C瞎说,请问谁是小偷( )。
A. A
B. B
C. C
D. D
【答案】:C
【解析】
假设A是小偷:A的话是假话,所以“不是我”是假话,说明A就是小偷。B说“是C”,是假话。C说“是D”,是假话。D 说“C撒谎”,是真话(因为C确实撒谎)。共有3人说假话,不符合题意(只有小偷一个人说假话),所以选项A错。
假设B是小偷:B的话是假话,所以“是C”是假话,说明C不是小偷。A说“不是我”,是真话。C说“是D”,是假话。D 说“C撒谎”,也是真话。共有两人说假话,不符合题意,所以选项B错。
假设C是小偷:C的话是假话,所以“是D”是假话,说明D不是小偷。A说“不是我”,是真话。B说“是C”,是真话。D说“C撒谎”,也是真话。符合题意,所以选项C 为正确答案。
假设D是小偷:D的话是假话,所以“C撒谎”是假话,说明C没有撒谎。A说“不是我”,是是真话。B说“是C",是假话。C说“是D”,是真话。共有两人说假话,不符合题意,所以选项D错。
第15题
下列程序输出的是( )。
string str = "Hello,陈A歹";
cout << str.find("A") << "\n";
A. 9
B. 8
C. 7
D. 6
【答案】:B
【解析】
str.find('A')会返回字符 'A' 在字符串中的下标(从0开始计数)。
| H | e | l | l | o | , | 陈 | A | 歹 | ||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
所以,字符'A'的索引是8,选B。
注意:在Linux/MacOS系统中,默认是utf-8编码,在此编码中,一个汉字是3个字节,在简体中文的 Windows系统中,默认是GBK编码,在此编码中,一个汉字是两个字节,由于GESP 考点默认采用的是 Windows系统,所以本题官方给的答案是按照GBK编码(一个汉字占两个位置)来算的。
判断题
第1题
+1和-1的原码进行1+(-1)计算的结果是-2。( )
A. 正确
B. 错误
【答案】:A
【解析】
+1的原码为00000001,-1的原码为10000001。它们相加的结果为10000010,转成十进制是-2,所以此题正确。
第2题
~1的输出值是-2。( )
A. 正确
B. 错误
【答案】:A
【解析】
1补码为00000001,~表示按位取反:1变0,0变1。
~00000001=11111110=-2,所以本题结论正确。
第3题
~1=11111110。( )
A. 正确
B. 错误
【答案】:A
【解析】
分析如上题所示。
第4题
取 X 的低四位,可以用 Y=00001111,用 X&Y 获取 X 的低四位。( )
A. 正确
B. 错误
【答案】:A
【解析】
此题用到了按位与的一个性质,0&任何二进制数码 x 结果都是0,1&任何二进制数码 x 结果都是 x 本身。所以 X&Y 的结果为清空Ⅹ高4位,保留X的低四位,所以本题正确。
第5题
下列程序输出的是A。( )
char x = 65;
x++;
cout << x++ << endl;
A. 正确
B. 错误
【答案】:B
【解析】
初始化 x 为ASCII 值65,对应的字符是'A'。
x++; 后,x增加到66,对应的字符是'B'
cout << x++ << endl;
由于是后置自增,所以输出的值是x本行自增之前的结果,也就是'B',所以本题题面结论有误。
第6题
下列程序输出的是3。( )
string str="陈ADai";
size_t pos = str.find('D');
cout << pos << endl;
A. 正确
B. 错误
【答案】:A
【解析】
str.find('D')会返回字符 'D' 在字符串中的下标(从0开始计数)。"陈ADai"的下标关系如下:
| 陈 | A | D | a | i | |
|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 |
所以上述代码输出结果为3。
注意:在Linux/MacOS系统中,默认是utf-8编码,在此编码中,一个汉字是3个字节,在简体中文的 Windows 系统中,默认是GBK编码,在此编码中,一个汉字是两个字节,由于 GESP 考点默认采用的是 Windows 系统,所以本题官方给的答案是按照GBK编码(一个汉字占两个位置)来算的。
第7题
下列程序将输出-1。( )
int a[10]={1};
cout << a[1] << endl;
A. 正确
B. 错误
【答案】:B
【解析】
代码第一行给a数组使用大括号进行了初始化,提供了一个初值为1。所以此时a的第一个格子a[0]为1,此后的格子由于没有更多的初值,所以会被大括号默认初始为0。所以a[1]的值为0。
第8题
下列程序将输出A。( )
int a = 65;
cout << (char)a << endl;
A. 正确
B. 错误
【答案】:A
【解析】
'A'的ASCII码为65。
第9题
16进制数AB,表示成2进制数是110101011。( )
A. 正确
B. 错误
【答案】:A
【解析】
一位16进制数可以转化成四位2进制数,所以A是1010,B是1011(注意16进制的A在10进制下是10,16进制的B在10进制下是11)。所以16进制AB表示成2进制为10101011。
第10题
def(十六进制)=103231(五进制)。
A. 正确
B. 错误
【答案】:B
【解析】
可以通过中间进制作为桥梁来方便转换,16进制def转成10进制为:。将10进制的3567变成5进制可以采用短除法:不断除以5然后倒取余数,得到103232。
浙公网安备 33010602011771号