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

GESP认证C++编程真题解析 | 202606 三级
附上汇总帖GESP认证C编程真题解析 | 汇总单选题第1题关于计算机的数据编码下面说法正确的是 。A. 机器数1000 1101B的真值可能是-13如果它是原码或141如果它是无符号数等数这取决于我们如何解释它。B. 计算机中所有数据最终都以二进制、八进制、十六进制的形式存储和运算。C. 字节Byte是计算机中最小的数据单位。位bit是计算机中最小的存储单位。D. 计算机中1k字节是1000字节的意思。【答案】A【解析】机器数10001101B的解释方式取决于约定作为原码时最高位1表示负数数值位000110113真值为-13作为无符号数时所有位均为数值位真值为141。这说明同一个机器数在不同编码约定下可以表示不同的真值A正确。B错在计算机中所有数据最终都以二进制形式存储八进制和十六进制只是书写和阅读的方便表示并非实际存储形式。C把数据单位和存储单位搞反了位bit是最小的数据单位字节Byte是最小的存储单位。D混淆了两种约定在计算机科学中1K1024字节2^10而厂商为了计算方便才用1K1000。第2题计算机厂商为了计算方便一般采用 1000 进制。如果我们买的厂商标注的是 1 TB 的硬盘它实际的存储容量是 。A.1000 × 1000 × 1000 × 1000 ÷ 1024 ÷ 1024 ÷ 1024 b 931 G b 1000\times 1000 \times 1000 \times 1000 \div 1024 \div 1024 \div 1024b 931Gb1000×1000×1000×1000÷1024÷1024÷1024b931GbB.1000 × 1000 × 1000 × 1000 ÷ 1024 ÷ 1024 ÷ 1024 B 931 G B 1000\times 1000 \times 1000 \times 1000 \div 1024 \div 1024 \div 1024B 931GB1000×1000×1000×1000÷1024÷1024÷1024B931GBC.1024 × 1024 × 1024 × 1024 ÷ 1000 ÷ 1000 ÷ 1024 B 1049 G B 1024\times 1024 \times 1024 \times 1024 \div 1000 \div 1000 \div 1024B 1049GB1024×1024×1024×1024÷1000÷1000÷1024B1049GBD.1000 × 1024 × 1024 × 1024 ÷ 1024 ÷ 1024 ÷ 1024 b 977 G b 1000\times 1024 \times 1024 \times 1024 \div 1024 \div 1024 \div 1024b 977Gb1000×1024×1024×1024÷1024÷1024÷1024b977Gb【答案】B【解析】厂商采用1000进制即1T1000G1G1000M1M1000K1K1000。所以厂商标注的1TB 实际容量为1000 × 1000 × 1000 10 9 1000×1000×100010^91000×1000×1000109字节。注意区分操作系统按1024进制计算1024是2 10 2^{10}210所以1KB2 10 2^{10}210字节1MB2 20 2^{20}220字节1GB2 30 2^{30}230字节1TB2 40 2^{40}240字节这就是为什么1TB硬盘在电脑上显示约931GB的原因。第3题低 4 位、高 4 位压缩技术适用于数据仅使用字节的一部分如仅用低 4 位的场景。字节结构一个字节为 8 位分为高 4 位高位和低 4 位低位。当数据是十六进制数0 ∼ 15 0\sim 150∼15即0x0到0xF每个值仅需 4 位表示高 4 位全为0。将两个相邻的 4 位值合并为一个字节。四个数据0x1、0x2、0x3、0x4采用上述压缩技术压缩以后是 。A.12D、34DB.12Q、34QC.12H、34HD.00010011B、00110101B【答案】C【解析】每个十六进制数0x1~0xF只需4位半字节表示。压缩时将两个4位数拼成一个8位字节0x1和0x2合并为一个字节高4位放0x1低4位放0x2即00010010B0x12同理0x3和0x4合并为0x34。所以压缩后为12H、34H用十六进制后缀H表示。选项A用十进制后缀D是错的0x12的十进制是18而非12选项B用八进制后缀为O不是Q选项D给出的是二进制形式但数值错误0x1和0x2合并应为00010010B而非00010011B。第4题关于计算机编码中反码和补码下面说法错误的是 。A. 负数的补码一个快速方法是从右往左扫描正数的二进制形式遇到第一个1之后左边的所有位都取反。B. 对于一个n nn位的二进制数最大表示范围[ − ( 2 n − 1 − 1 , ( 2 n − 1 − 1 ) ] [-(2^{n-1}-1,(2^{n-1}-1)][−(2n−1−1,(2n−1−1)]。C. 反码减法可以统一为加法。符号位可以直接参与运算。D. 反码表示中0 的表示不唯一0000 0000B和1111 1111B。【答案】B【解析】A描述的是求负数补码的快速技巧从右往左扫描正数二进制遇到第一个1保持不变左边各位取反这是正确的方法。C中反码确实可以将减法统一为加法符号位参与运算这是反码的设计初衷之一。D 中反码的0为00000000B-0为11111111B0的表示确实不唯一这是反码的缺陷之一。中8位二进制数最大表示范围-128到127是补码的范围而非反码的范围8位反码的表示范围是-127到127因为反码有0和-0两种0的表示少了一个负数位所以张冠李戴将补码的范围说成了反码的范围是错误的。第5题一种加密方式是字符数组与密钥KEY、运算方式分开传输比如字符数组char text[4] {G, E, S, P};由一种传输方式发送密钥KEY 2026通过另一种发送方式发送运算方式char function[4] {|, -, ^, };又是另一种发送方式发送。三种数据都到达目的地以后分别进行例如G | 6、E - 2、S ^ 0、P 2等计算来得到相应的真实内容上述GESP通过这种加密方式加密以后最终的内容是 。A.GCSRB.RSCGC.GCSAD.BCSR【答案】A【解析】密钥 KEY2026从个位开始取数字6、2、0、2分别对应四个字符的运算。‘G’ 的 ASCII 码为7171|67171的二进制01000111与6的二进制00000110按位或结果仍为0100011171‘G’E’的ASCII码为6969-267‘C’S’的 ASCII码为8383^083‘S’任何数异或0保持不变P’的ASCII码为8080282‘R’。所以加密后的内容为GCSR选A。第6题关于位运算下列说法错误的是 。A. 找唯一数数组中唯一出现一次的数其余出现两次全部异或结果即为该数。例如数组[5, 7, 9, 7, 5]唯一数是9。B. 交换两个数a ^ b; b ^ a; a ^ b;无需临时变量。C. 将二进制位整体左移 n 位高位溢出舍弃低位补0等价于num乘以2 n 2^n2n。D. 对每一个二进制位取反包括符号位简单运算规则是~n -n - 1。【答案】C【解析】A中异或找唯一数是经典应用相同数异或为00异或任何数为本身所以全部异或后剩下的就是唯一数正确。中三步异或交换也是经典技巧正确。C的描述看似正确但关键在于等价于num乘以2”这个说法忽略了溢出的情况——如果左移后高位溢出结果并不等于乘以2 n 2^n2n所以C的说法不严谨是错误的。D中按位取反公式n-n-1是正确的例如6-7~0-1。第7题关于字符串和字符数组下列说法正确的是 。A.charstr[]GESP;intlen1sizeof(str);intlen2strlen(str);上面程序能够正确执行 len1 与 len2 相等。B.charstr1[4]GESP;charstr2[4]{G,E,S,P};这段程序将能够正确执行。C.charstr2[4]{G,E,S,P};strcpy(str2,HELLO,GESP);coutstr2endl;这段程序即使能够运行但是存在覆盖数组以外的内存空间的行为可能会引起严重错误。D.chardest[4]{G,E,S,P};charsrc[]HELLO;strcat(dest,src);coutdestendl;这段程序能够正确执行不存在数组越界行为。【答案】C【解析】A中sizeof(str)包含末尾’\0’对GESP来说sizeof得5strlen 得4两者不相等A错误。B中char str1[4]GESP空间不足字符串字面量GESP需要5字节含’\0’放入4字节数组会越界B错误。C中char str2[4]{‘G’‘E’‘S’‘P’}只有4字节且无’\0’结尾strcpy(str2, “HELLO,GESP”)要写入11字节严重越界覆盖数组以外的内存C正确。中strcat(dest, src)的dest没有’\0’结尾且只有4字节拼接HELLO后必然越界D错误。第8题计算机中的2 KB等于多少bit 。A.16384B.20000C.2000D.2048【答案】A【解析】在计算机科学中1KB1024字节2^10字节1字节8位bit。所以2KB2×1024×816384bit。选项和是按1000进制计算的错误结果选项 D 只算到了字节数2×10242048字节而忘了转换为bit。第9题在 C 中对于 32 位有符号整数int类型数据n关于按位取反运算符~下列说法正确的是 。A.~6的结果是5。B. 按位取反满足公式~n -n - 1。C.~0的结果是1。D.~(-2)的结果是-1。【答案】B【解析】按位取反的公式为n-n-1这是核心规律。只有正确公式n-n-1对所有整数成立。第10题关于计算机中的二进制编码表示下列说法错误的是 。A. 原码是最直观的一种有符号数表示方法。最高位最左边的位为符号位0表示正数1表示负数其余位为数值位真值的绝对值。B. 补码完美解决了原码和反码的缺陷是现代计算机中表示有符号整数的标准方式。正数的补码与其原码、反码相同负数的补码是将其对应正数的原码按位取反得到反码然后加1。C. 计算补码的一个更快的技巧从右往左扫描正数的二进制形式遇到第一个1之后左边的所有位都取反。D. 对于一个 n 位的二进制数补码最大表示范围为[ − 2 n − 1 , 2 n − 1 ] [-2^{n-1},2^{n-1}][−2n−1,2n−1]。【答案】D【解析】A、B、C关于原码和补码的描述都是正确的。说对于一个8位的二进制数补码最大表示范围为-128到127这一表述本身正确。但原题D选项为n位补码范围的具体数值的公式应为[ − 2 n − 1 , 2 n − 1 − 1 ] [-2^{n-1}, 2^{n-1}-1][−2n−1,2n−1−1]。第11题下面选项中提到的变量都是正整数关于位运算下面说法错误的是 。A.num 1结果为1则奇数0则偶数仅看最低位。B.num 0xFF保留低 位。C.num b的结果一定小于等于num。D. 若num左移导致高位溢出如超过整型范围结果符合乘法规律。【答案】D【解析】A中num1只看最低位最低位为1是奇数为0是偶数正确。中0xFF即11111111Bnum 0xFF会将高8位清零保留低8位正确。C中按位与运算的结果不会超过两个操作数中的较小者所以numb的结果一定不超过num正确。中如果左移导致高位溢出超出部分被丢弃结果不再符合乘以2 n 2^n2n的规律所以D是错误的。第12题a7, b3, c14, d15, e8对于运算表达式!a b c ^ d | e的结果是 。A.0B.15C.7D.14【答案】B【解析】C运算符优先级从高到低逻辑非! 移位 按位与 按位异或^ 按位或|。逐步计算!a!700b0300c01400d0151515|e15|815。所以结果为15选B。第13题关于string的成员函数下面说法错误的是 。A.size()返回字符串长度字符个数不含\0。B.length()与size()功能完全一致返回字符串长度。C.empty()判断字符串是否为空非空返回true空返回false。D.s.append(s2, 0, 3);从s2下标0开始截取3个字符。【答案】C【解析】A和B中 size() 和 length() 都返回字符串长度不含’\0’功能完全一致正确。中 append(s2, 0, 3)表示从s2的下标0开始截取3个字符追加到s末尾正确。C的描述说反了empty()在字符串为空时返回true非空时返回false所以C是错误的。第14题以下数组定义符合 C 语法的是 。A.int [10] a;B.int b[];C.int c[*];D.double d[10.0];【答案】B【解析】A的语法错误正确写法是int a[10]类型在前、变量名在后。中’‘是字符常量其ASCII码值为38所以int b[’] 等价于 int b[38]数组大小可以是整型常量表达式字符常量可以隐式转换为整数语法合法。C中数组大小不能用通配符*必须明确指定错误。D中数组大小必须是整型不能用浮点数10.0错误。第15题现在有一个数请你分别判断它们是否可能是二进制、八进制、十进制、十六进制。例如 6AFF 就只可能是十六进制而 1011 则是四种进制皆有可能。输入 N 保证 表示有 N 个数让你进行判断接下来输入 N 个字符串保证所有字符串长度不超过 10 判断可能是四个进制当中的哪个进制数。输出 N 行每行 4 个数用空格隔开分别表示给定的字符串是否可能表示一个二进制数、八进制数、十进制数、十六进制数。使用 1 表示可能使用 0 表示不可能。下面程序横线处可以满足这个要求的是 。#includeiostreamusingnamespacestd;intmain(){intn0;cinn;for(inti0;in;i){charstr[11];cinstr;charmax0;for(inti0;str[i]!\0;i)if(str[i]max)maxstr[i];___________________________________________}return0;}A.cout (max 1) (max 7) (max 9) (max F) endl;B.cout (max 1) (max 7) (max 9) (max F) endl;C.cout (max 1) (max 7) (max 9) (max F) endl;D.cout (max 1) (max 7) (max 9) (max F) endl;【答案】B【解析】程序先找出字符串中最大的字符max。判断一个字符串是否可能是某种进制只需看最大字符是否不超过该进制的最大数码。二进制的最大数码是’1’所以max ‘1’ 时可能是二进制八进制的最大数码是’7’max ‘7’ 时可能是八进制十进制的最大数码是’9’max‘9’ 时可能是十进制十六进制的最大数码是’F’max‘F’时可能是十六进制。选项正好符合这个逻辑。A用判断方向反了用是赋值而非比较D用太严格比如1011的max是’1’‘1’1’为假但1011明明可以是二进制。判断题第1题反码运算时产生的进位需要循环进位即最高位产生的进位要加回到结果的最低位。A. 正确B. 错误【答案】A【解析】反码运算的特点就是循环进位end-around carry。当最高位符号位产生进位时这个进位不能像补码那样直接丢弃而是要加回到结果的最低位。这是因为反码的符号位参与运算后如果产生进位相当于多加了一个全1的值需要通过循环进位来修正。这是反码与补码的重要区别之一。第2题-11的补码的一种计算方式是从右往左扫描正数的二进制形式遇到第一个1之后左边的所有位都取 反。A. 正确B. 错误【答案】A【解析】这是求负数补码的快速技巧。先写出正数11的二进制形式8位00001011。从右往左扫描遇到第一个1最低位的1保持不变其右边的位无和该位本身保持不变左边所有位取反11110101。这就是-11的补码。此方法与取反加1等价但更快捷。第3题一个 8 位的二进制数补码最大的表示范围是从 -128 到 128。A. 正确B. 错误【答案】B【解析】8位补码的表示范围是− 2 7 -2^7−27到2 7 − 1 2^7-127−1即-128到127不是-128到128。正数最大只能到12701111111B因为最高位是符号位正数的符号位为0数值位最大为1111111127。128的二进制需要9位才能在补码中表示正数128超出了8位补码的正数范围所以128不能用8位补码表示。第4题判断某个数是否是质数枚举范围可适当缩小遍历到i \sqrt ii​而非i ii提升效率。A. 正确B. 错误【答案】A【解析】判断n是否为质数时如果n有一个大于1且小于n的因子d那么d和n/d 中至少有一个不超过i \sqrt ii​。因此只需要枚举2到i \sqrt ii​的范围即可判断时间复杂度从 O(i) 降低到O ( i ) O(\sqrt i)O(i​)效率显著提升。第5题如果a为int类型的变量且表达式((a 1) 1)的值为true则说明a是奇数。A. 正确B. 错误【答案】A【解析】a 1 提取 a 的最低位。如果最低位为1说明a是奇数如果最低位为0说明a是偶数。((a 1) 1) 为true 意味着最低位是1所以a是奇数。这是判断奇偶性的经典位运算技巧比取模运算a%2更高效。第6题十六进制数CCF对应的二进制数、八进制数、十进制数分别是110011001111、6317、3269。A. 正确B. 错误【答案】B【解析】十六进制数CCF中1215。转换为二进制11001111所以CCF 110011001111B这部分正确。转换为八进制从右往左每3位一组110011001111B110|011|001|1116317Q这部分也正确。转换为十进制CCF12×25612×16153072192153279而非题目所给的3269所以十进制转换错误。第7题下列程序如果能够正确执行那么输出的结果是GESP。intmain(){string nameGESP;coutname[false]name[true]name[11]name[71]endl;}A. 正确B. 错误【答案】A【解析】false 在 C 中可隐式转换为0true 转换为1112713。所以 name[0]‘G’name[1]‘E’name[2]‘S’name[3]‘P’输出GESP。第8题某个初学 C 的学生在对照参考程序写了一个程序以后信心满满地进行编译他敲进编译器的全部代码如下这个程序能够正常编译运行。#includebits/stdc.husingnamespacestd;intmain(){coutHello world!endl;return0;}A. 正确B. 错误【答案】A【解析】题目描述的关键信息是对照参考程序写了一个程序以及他敲进编译器的全部代码如下。题目代码每一行前面都标注了行号1~6这是试卷排版用于方便定位代码行的编号并非代码本身的一部分。该学生对照参考程序抄写时把行号1、2、3…也一并当作代码敲进了编译器。而行号直接出现在#include、using、int main()等语句之前编译器在第一行1 #includebits/stdc.h处就会报错根本无法通过编译更谈不上正常运行。所以该说法错误。第9题代码逐行复刻手工运算步骤中间不能增加任何判断逻辑否则就不属于模拟算法。A. 正确B. 错误【答案】B【解析】模拟算法的核心是按照题目描述的过程一步步实现但并不意味着不能增加任何判断逻辑。实际上模拟过程中通常需要各种判断如边界判断、条件分支等来正确复刻运算过程。模拟算法强调的是按规则逐步推进中间可以有判断逻辑只要遵循题目给定的运算规则即可。所以中间不能增加任何判断逻辑的说法是错误的。第10题判断一个int型数字s[i]是不是在0和9之间可以是0和9判断条件可以写为if (s[i] 0 s[i] 9)。A. 正确B. 错误【答案】B【解析】题目明确说s[i]是int 型数字即存储的是整数数值。而条件s[i]‘0’ s[i]‘9’中’0’、9’是字符常量其ASCII码值分别为48和57。如果 s[i]是int型整数例如5那么548为false无法正确判断。正确的写法应为if (s[i]0s[i]]9)。如果s是字符串char数组该条件才正确。题目前提是int型因此该判断条件写法错误。编程题题解洛谷 B4555 [GESP202606 三级] 加密题解洛谷 B4556 [GESP202606 三级] 字符转换

最新新闻

日新闻

周新闻

月新闻