GESP认证C++编程真题解析 | 202603 三级

附上汇总帖:GESP认证C++编程真题解析 | 汇总


单选题

第1题

如果字符变量 _1 的值是字符 1 ,那么 (int)_1 的值是?( )。

A. 1

B. -1

C. 49

D. +1 或者 -1

【答案】:C

【解析】

在C++中,字符类型 char 在内存中是以 ASCII 码的整数形式存储的。字符'1'对应的标准ASCII码值为49。当使用(int)对其进行强制类型转换时,得到的是其底层存储的数值,即49。因此选项C正确。

第2题

a,b是整型变量,各自有互不相同的初始值。下列程序实现了什么效果( )。

a=a^b;
b=a^b;
a=a^b;

A. a,b 的值从始至终都没有改变。

B. a,b 的值实现了互换。

C. a,b 的值互换了以后,又还回去了,相当于没有变化。

D. a,b 的值最后和原值不一样,没有任何意义。

【答案】:B

【解析】

这是利用异或运算交换两个变量值的经典算法。第一步a=ab;第二步b=ab相当于b=(ab)^b= a(bb) = a0=a,此时b变成了原a的值;第三步a=ab相当于a=(ab)a=b(aa)=b^0=b,此时a变成了原b的值。经过三次异或,最终实现了a和b值的互换。选项B正确。

第3题

关于下列正确的程序段,说法正确的是( )。

char str1[] = "Hello";
char str2[] ={'H','e','l','l','0'};

A. 字符数组 str1 和 str2 完全相同。

B.

cout<<str1<<endl;
cout<<str2<<endl;

这段程序多次执行将输出不同的结果。

C. 字符数组 str1 和 str2 不相等。

D. 这两个赋值方式完全相同。

【答案】:C

【解析】

str1是由字符串字面量初始化,编译器会在末尾自动添加隐藏的结束符'\0',实际长度为6。而str2是通过字符初始化列表赋值,元素分别为'H','e','l','l','0',注意最后一个元素是字符'0'而非结束符'\0',并且没有自动补充结束符。因为长度和内容都不一致,两数组不相等,故选项C说法正确。由于str2没有结束符,输出时可能产生乱码,结果也不同,并且一个含'o',一个含'0'结果也不一致,所以B选项也对。

第4题

关于以下程序段,说法正确的是( )。

int x=10;
cout<<(x++) + (++x)<<endl;

A. C++11 标准中,这是未定义行为,不同的环境有可能出现不同的结果

B. 22

C. 21

D. 20

【答案】:A

【解析】

这种写法在C++里属于未定义行为,不同环境情况下,理论上确实可能会出现不同结果,大家不要模仿。

第5题

8 位二进制下,十进制数-15 的补码是( )。

A. 11110000

B. 10001111

C. 10010000

D. 11110001

【答案】:D

【解析】

求负数的补码分三步:首先写出其8位二进制原码,-15的原码为10001111;然后除符号位外,将原码按位取反得到反码,即11110000;最后将反码末位加1,得到补码11110001。故选项D正确。

第6题

三进制数 转换成十进制是:( )。

A. 63

B. 65

C. 67

D. 69

【答案】:B

【解析】

将三进制数 \(2102_{(3)}\) 按权展开相加转换为十进制:\(2×3^3+1×3^2+0×3^1+2×3^0=2×27+1×9+0+2=54+9+2=65\)。因此选项B正确。

第7题

二进制数 10110101 是某数的 8 位补码,该数的十进制是( )。

A. -73

B. -75

C. -77

D. 75

【答案】:B

【解析】

最高位为1,说明该数为负数。已知补码为10110101,求原码可以将其减1得到反码10110100,再除符号位外按位取反得到原码11001011。或者对该补码直接再取一次补码(取反后加1):按位取反得11001010,加1得到11001011,其值为64+8+2+1=75。加上负号得出该数为-75,故选B。

第8题

已知 unsigned char c = 0x0F; (十六进制 0F = 二进制 00001111 ),执行 c = c << 3;后,c 的 十进制值是:( )。

A. 64

B. 72

C. 80

D. 120

【答案】:D

【解析】

无符号字符变量c的初始值为十六进制0x0F,即二进制的00001111。执行左移3位操作c<<3后,二进制位整体向左移动3位,低位补0,结果变为二进制的 01111000。将其转换为十进制为 \(2^6+2^5+2^4+2^3=64+32+16+8=120\)。故选项D正确。

第9题

补码的情况下,关于按位取反运算,用笔计算的情况下,以下说法错误的是:( )

A. ~5 的结果是 -6( int 类型,32 位)

B. ~0 的结果是 0( int 类型,32 位)

C. ~(-3)的结果是 2( int 类型,32 位)

D. ~8 的结果是 -9( int 类型,32 位)

【答案】:B

【解析】

在计算机的补码表示体系中,按位取反操作x等价于数学上的-(x+1)。由此可以快速计算:5=-(5+1)=-6;(-3)=-(-3+1)=2;8=-(8+1)=-9。而对于0,~0=-(0+1)=-1。选项B称结果为0是错误的,故本题选B。

第10题

执行以下 C++ 代码后,sub 的值是( )。

string str = "GESP2026";
string sub = str.substr(4, 2);

A. 20

B. 02

C. 2026

D. 026

【答案】:A

【解析】

C++标准库中字符串提取函数 substr(pos, count)的作用是从给定索引 pos 开始截取最多count个字符组成子串。字符串"GESP2026"索引从0开始编号,索引4处对应的字符是'2'。从此位置开始截取长度为2的子串,得到的是"20"。故选项A正确。

第11题

执行以下代码后,输出结果是:( )。

int arr[] = {5, 10, 15, 20, 25, 30};
int count = sizeof(arr) / sizeof(arr[0]);
cout << count;

A. 4

B. 6

C. 24

D. 30

【答案】:B

【解析】

代码中arr数组被初始化列表赋予了6个整型元素。sizeof(arr)用于求取整个数组在内存中占用的总字节数,而 sizeof(arr[0])用于求取数组单个元素占用的字节数。两者相除 sizeof(arr)/ sizeof(arr[0])是C++中求静态数组元素个数的标准做法。结果即为数组长度6。故选B。

第12题

执行以下代码后,输出结果是:( )。

char s[10] = "abcde";
int a = sizeof(s) / sizeof(s[0]);
int b = strlen(s);
cout << a - b;

A. 4

B. 5

C. 6

D. 10

【答案】:B

【解析】

char s[10]="abcde";定义并初始化了一个长度为10的字符数组,故整个数组占用10个字节,单个字符占1字节,a = sizeof(s) / sizeof(s[0])的结果为10。strlen(s)用于计算字符串的实际长度,它遇到结束符 '\0' 停止计数,不包含结束符,"abcde"实际长度为5,故b为5。输出a-b的值为10-5=5。选B。

第13题

以下问题中,最不适合用枚举法解决的是:( )

A. 找出 1~100 之间所有能被 7 整除的数

B. 找出 100~200 之间的所有质数

C. 计算 1+2+3+…+1000 的和

D. 找出三位数中个位、十位、百位数字之和等于 10 的数

【答案】:C

【解析】

枚举法(穷举法)的核心思想是系统地遍历所有可能的情况,通过条件判断寻找符合要求的问题解。选项A、B、D均属于在一个明确的空间内筛选出符合特定特征的数据,是枚举法的经典应用场景。而选项C属于等差数列求和,最佳解法是直接使用求和公式 \(S = \displaystyle\frac{n(a_1+a_n)}{2}\),或使用累加循环去模拟,不属于"筛选求可能解"的枚举范畴,最不适合枚举法。故选C。

第14题

用枚举法解决 “鸡兔同笼问题:头共 35 个,脚共 94 只,求鸡和兔的数量”,以下枚举逻辑最合理的是:( )

A. 枚举鸡的数量 x (0~35),兔的数量 y=35-x ,判断 2*x + 4*y == 94

B. 枚举兔的数量 y (0~94),鸡的数量 x=35-y ,判断 2*x + 4*y == 94

C. 枚举所有整数 x (0-100)和 y (0-100),判断 x+y==35 && 2*x+4*y==94

D. 枚举脚的总数 sum (0~94),判断 sum == 94

【答案】:A

【解析】

在使用枚举法解决问题时,应尽量缩小解的枚举空间以提高效率。对于鸡兔同笼,已知头共35个,因此只需要一层循环枚举鸡的数量x(范围0到35)。此时兔子的数量y必定是35-x。只需验证限制条件—―脚的数量方程2 * x + 4 * y == 94即可。选项B兔的数量范围过大;选项C采用了双重循环遍历,产生大量无效尝试,效率低下;选项D逻辑本身就是错误的。故选A。

第15题

模拟 “字符串加密”:规则为 “每个字符 ASCII 码 + 3,若超过 z (122)则从 a 重新开始”,以下代码中正确 的条件判断是:( )

for (int i = 0; i < str.length(); i++) {
	// 需补充条件:
	_______________________
	else {
		str[i] += 3;
	}
}

A. if (str[i]> 122) str[i] = str[i] + 3 - 26;

B. if (str[i] > 122) str[i] = str[i] - 26;

C. if (str[i] + 3 > 122) str[i] = str[i] - 26;

D. if (str[i] + 3 > 'z') str[i] = 'a' + (str[i] + 3 - 'z') - 1;

【答案】:D

【解析】

按照加密规则,对于每一个字符,如果加3后的ASCII 码超过了小写字母z的边界(即122),需要折返循环。因此,判定条件应该是对加3后的值进行判定:str[i]+3>'z'。当发生越界时,超出边界的量为 str[i] + 3-'z',需要从 'a' 重新开始累加,对应公式为 'a'+超出量-1。只有选项 D 的逻辑与题意中的模拟过程完全一致。选项A和B的判断条件均未包含+3,会导致判断失效。若无意外,C和D是等价的,都对。

判断题

第1题

定义 int arr[5] = {1,2,3}; ,则 arr[3] 的值为 0,arr[5] 是合法下标。

第2题

定义 double arr[10]; ,未手动初始化时,数组中所有元素的默认值为 0.0。

第3题

定义 int arr[] = {1,2,3}; ,则 sizeof(arr)的结果为 12( int 占 4 字节)。

第4题

下面的流程图是用来求 1+2+3+…+10 的和。

请判断:这个流程图的逻辑正确还是错误?

在这里插入图片描述

第5题

下面流程图的功能是计算 5 对 2 取余数,输出结果为 1。

在这里插入图片描述

第7题

已知大写字符 A 的ASCII编码的十六进制表示为 0x41 ,计算字符 m 的ASCII编码的八进制表示为 155 (八进制)。

第8题

在 C++ 位运算中,各种不同的运算符有优先级的区分,使用括号能够解决优先级的问题。

第9题

由于在 0~255 范围内,char 类型和 int 类型可以互换,因此在这里 x 和 y 相等。

char x='1';
int y=1;

第10题

在C++语言中,表达式((0xf0 + 0x15) == 255)的值为 true。

第26题

如果 a 为 int 类型的变量,且 a 的二进制最低位为 0 ,则表达式((a & 3 & 1) == 0)的值为 true。

编程题

题解:洛谷 B4499 [GESP202603 三级] 二进制回文串

题解:洛谷 B4500 [GESP202603 三级] 凯撒密码

posted @ 2026-03-18 15:01  团爸讲算法  阅读(259)  评论(0)    收藏  举报