2024年03月 GESP等级认证C++编程(三级)试题解析

【单选题】(每题2分)

1、整数-5的16位补码表示是?( )

A、1005    B、1006    C、FFFA    D、FFFB   

正确答案:D

试题解析:在16位补码表示中,负数的最高位为1。整数-5的绝对值的二进制表示为0000 0000 0000 0101。

取其补码,即将其按位取反再加1,得到1111 1111 1111 1011。

转换为16进制即:FFFB。

2、如果16位短整数 -2 的二进制是"FFFE",则短整数 -4 的十六进制是?( )

A、FF04    B、FFFA    C、FFFC    D、FFFH   

正确答案:C

试题解析:16位短整数 -2 的二进制是"FFFE",则短整数 -4是 -2减去2,FFFE - 2结果为:FFFC。

3、下面C++代码执行后的输出是?( )

int main(){

    cout << (3|16) << endl;

    cout << endl;

    return 0;

}

A、3    B、16    C、19    D、48   

正确答案:C

试题解析:C++ 中的 | 运算符表示按位或操作,将两个操作数的每个对应位进行或运算。

3 的二进制表示为:0000 0011

16 的二进制表示为:0001 0000

按位或运算后得到的结果为:0001 0011 = 19。

4、定义整数 int x=-5 ,则执行C++代码 cout << (x == (x<<1>>1)) 输出是?( )

A、0    B、1    C、-5    D、5   

正确答案:B

试题解析:表达式 (x << 1 >> 1) 先执行左移操作,然后再执行右移操作。在这个过程中,符号位不变,右移时保持符号位不变,因此结果应该与 x 的值相等。

然后再和x的值比较,二者相同结果为真,即输出1。

5、已知字符 '0' 的ASCII编码的十进制表示为48,则执行下面C++代码后,输出是?( )

int main() {

    string s="316";

    int n=s.length();

    int x=0;

    for(int i = 0; i < n; i++)

        x += s[i];

    cout << x << endl;

    cout << endl;

    return 0;

}

A、10    B、58    C、154    D、316   

正确答案:C

试题解析:程序中,使用 int x 来存储字符的 ASCII 值的累加和。在循环中,将字符串 s 中每个字符的 ASCII 值加到 x 上。

根据 ASCII 规则,字符 '3' 的 ASCII 值是 51,字符 '1' 的 ASCII 值是 49,字符 '6' 的 ASCII 值是 54。

累加和则为:154。

6、下面C++代码执行后数组中大于0的数的特征是?( )

int main() {

    int a[20],i;

    for(i = 0; i < 20; i++)

        a[i] = i+1;

    for(int i = 0; i < 20; i++)

        if((a[i]%2)&&(a[i]%3))

            a[i] = 0;

    for(i = 0; i < 20; i++)

        if(a[i])

            cout << a[i] << " ";

    cout << endl;

    return 0;

}

A、2的倍数    B、3的倍数    C、能被2或3整除的数    D、能被2和3同时整除的数   

正确答案:C

试题解析:程序中,首先给数组 a 赋值为 1 到 20。

然后,在第二个循环中,如果数组元素除以 2 和 3 都有余数(即不是 2 的倍数也不是 3 的倍数),那么将该元素置为 0。则数组中剩余的数是2的倍数或者3的倍数。

7、执行下面C++代码后输出的第一个数是?( )

int main() {

    int a[20],i;

    for(i = 0; i < 20; i++)

        a[i] = i+1;

    for( ; i > 0; i--)

        cout << a[i-1] << " ";

    cout << endl;

    return 0;

}

A、20    B、19    C、1    D、不确定   

正确答案:A

试题解析:程序,首先给数组 a 赋值为 1 到 20。然后,通过第一个 for 循环将数组元素逆序输出。

第一个循环执行完成后,i的值为20,所以在第二个 for 循环中,i 的初始值为 20,输出第一个数a[i-1]即a[19],值为20。

8、在下列代码的横线处填写( ),可以使得输出是 GESP IS INTERESTING 。

int main() {

    string str="gEsP is Interesting";

    int x = str.length();

    for(int i = 0; i < x; i++)

        if ((str[i]>='a') && (str[i]<='z'))

            ________________________;

    cout << str << endl;

    cout << endl;

    return 0;

}

A、str[i]+='a'-'A'    B、str[i]+=20    C、str[i]+='A'-'a'    D、无法实现   

正确答案:C

试题解析:为了使输出为 "GESP IS INTERESTING",需要将小写字母转换为大写字母。

小写字母的ASCII码比对应的大写字母的ASCII码大,可以通过将小写字母的ASCII码减去一个数来得到相应的大写字母的ASCII码。

而'A'-'a'是一个负数,加上一个负数相当于减去一个数,因此应该是选项C。

9、假设英文句子由若干词构成。下面C++代码统计输出的词数是?( )

int main() {

    string str="gEsP is Interesting !";

    int x = str.length();

    int nwords = 0;

    for(int i = 0; i < x; i++)

        if (str[i]==' ') {

            nwords++;

            while(str[++i]==' ') ;

        }

    cout << nwords << endl;

    cout << endl;

    return 0;

}

A、1    B、2    C、3    D、4   

正确答案:C

试题解析:该程序统计字符串中的单词数。通过遍历字符串,当检测到空格时认为是单词的分隔符,并统计单词的个数。

给定的字符串是 "gEsP is Interesting !",在空格处划分单词,有三个单词: "gEsP"、"is" 和 "Interesting"。

因此,输出的词数应该是 3。

10、C++的字符变量的码值是整数,下面字面量形式的字符码值最大的是?( )

A、100    B、075    C、0x70    D、0x60   

正确答案:C

试题解析:选项A的码值为 100。

选项B,八进制075 的码值为 61。

选项C,十六进制0x70 的码值为 112。

选项D,十六进制0x60 的码值为 96。

答案为选项C。

11、下面C++程序执行的结果是?( )

int main() {

    int a[20],i;

    int cnt=0;

    for(i = 0; i < 20; i++)

        a[i] = i+1;

    for( ; i > 1; i--)

        if((a[i-1]+a[i-2])%3)

            cnt++;

    cout << cnt << endl;

    cout << endl;

    return 0;

}

A、5    B、6    C、10    D、12   

正确答案:D

试题解析:首先,数组 a 初始化为 1 到 20 的连续整数。然后,从后向前遍历数组,计算满足条件的元素对数。

满足条件的使连续两个数的和不是 3 的倍数,而满足连续两个数和是3的倍数有[20,19],[17,16],[14,13],[11,10],[8,7],[5,4],[2,1],共七组,1到20共有19组连续的数,所以符合条件的数有19-7=12组。

12、定义字符数组 char str[20] = {'G', 'E', 'S', 'P'}; ,则 str 的字符串长度为?( )

A、4    B、5    C、19    D、20   

正确答案:A

试题解析:数组的长度是20个字符,只初始化了前四个元素为 'G'、'E'、'S'、'P',其余的元素会置0,所以str的长度是4。

13、定义整型变量 int a=3, b=16 ,则 a|b 的值和 a+b 的关系是?( )

A、大于    B、等于    C、小于    D、等于或小于   

正确答案:B

试题解析:a 和 b 的二进制表示分别为 a = 0000 0011,b = 0001 0000。

进行按位或运算符,结果为:0001 0011,转换为十进制为 19,a+b 的值也为 19,二者相等。

14、小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?( )

A、小程序    B、计时器    C、操作系统    D、神话人物   

正确答案:C

试题解析:操作系统是管理计算机硬件与软件资源的计算机程序,它是计算机系统的核心和基础。

鸿蒙系统(HarmonyOS),是华为公司在2019年正式发布的分布式操作系统。

15、中国计算机学会(CCF)在2024年1月27日的颁奖典礼上颁布了王选奖,王选先生的重大贡献是?( )

A、制造自动驾驶汽车    B、创立培训学校    C、发明汉字激光照排系统    D、成立方正公司   

正确答案:C

试题解析:王选是中国计算机领域的杰出科学家,他最为人知的贡献是主持研制了汉字激光照排系统。

这一系统标志着中国印刷业从“铅与火”时代迈向了“光与电”时代,是科技体制改革实践探索的重要成果。

【判断题】(每题2分)

16、任意整数 a 的二进制反码与补码都有1位不同。( )

正确答案:错误

试题解析:一个整数的二进制反码是将其二进制中的每一位取反得到的。而二进制补码是将该数的二进制表示取反然后加1得到的。

所以本题说法是错误的。

17、对整型变量 int a = 3 ,执行C++代码 a<<2 将把2输出到 a 中。( )

正确答案:错误

试题解析:在 C++ 中,<< 运算符是左移位运算符,而不是输出到a中。

18、下面C++代码可以计算1到100的累加和,采用的是穷举法。( )

int main() {

    int i,sum=0;

    for(int i = 1; i <= 100 ; i++)

        sum += i;

    cout << sum << endl;

    cout << endl;

    return 0;

}

正确答案:错误

试题解析:代码使用了一个循环来计算1到100的累加和,但这并不是穷举法。

穷举法通常指的是通过枚举所有可能的情况来解决问题,而不是简单地使用循环进行计算。

19、一个 int 类型变量 a ,执行操作 (a<<2>>2) 后的值一定是 a 。( )

正确答案:错误

试题解析:(a<<2>>2) 是先将 a 左移 2 位,然后将结果右移 2 位。

如果 a 的值大于 int 类型的最大值,左移操作可能会导致溢出,结果也会不同于 a。

20、在C++语言中, (010<<1) 执行结果是 100 。( )

正确答案:错误

试题解析:010 为八进制数,其十进制值为 8,左移位操作1位,所以 (010<<1) 的结果是 16。

21、执行下面C++代码后将输出 2 。( )

int main() {

    string str="gEsP is Interesting";

    int x = str.find("s");

    cout << x << endl;

    cout << endl;

    return 0;

}

正确答案:正确

试题解析:C++ 中的 string::find 函数用于在字符串中搜索指定的子字符串,并返回第一次出现的位置索引。

字符 's' 在字符串 "gEsP is Interesting" 中出现在索引 2 的位置,故返回2。

22、在C++语言中,字符数组被定义时,它的大小可以调整。( )

正确答案:错误

试题解析:在 C++ 中,字符数组的大小一旦确定就不能调整。当定义一个字符数组时,需要指定它的大小。

23、对定义的数组 int a[7]={2,0,2,4,3,1,6} ,可以用简单循环就找到其中最小的整数。( )

正确答案:正确

试题解析:说法正确,循环遍历数组的元素就可以找到最小值。

24、小杨今年春节回奶奶家了,奶奶家的数字电视要设置 ip 地址并接入到 WIFI 盒子才能收看节目,那这个 WIFI 盒子具有路由器的功能。( )

正确答案:正确

试题解析:根据题目描述,数字电视需要设置IP地址并接入到WIFI盒子才能收看节目。意味着WIFI盒子具有提供网络接入和分配IP地址的功能,这是路由器的基本功能之一。

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

正确答案:正确

试题解析:在 C++ 中,任何一个 for 循环都可以转化为等价的 while 循环,反之亦然。for 循环和 while 循环在功能上是等价的,只是表达形式不同而已。

【编程题】

26、字母求和

【问题描述】

小杨同学发明了一种新型密码,对于每一个小写英文字母,该小写字母代表了一个正整数,即该字母在字母顺序中的位置。例如字母 a 代表了正整数 1,字母 b 代表了正整数 2;

对于每一个大写英文字母,该大写字母代表了一个负整数,即该字母的 ASCII 码的相反数。例如字母 A 代表了正整数 -65。

小杨同学利用这种方式对一个整数进行了加密并得到了一个由大写字母和小写字母组成的字符串,该字符串中每个字母所代表数字的总和即为加密前的整数,例如 aAc 对应的加密前的整数为 1+(-65)+3=-61。

对于给定的字符串,请你计算出它对应的加密前的整数是多少。

【输入描述】

第一行一个正整数 n ,表示字符串中字母的个数。

第二行一个由大写字母和小写字母的字符串 T,代表加密后得到的字符串。

【输出描述】

输出一行一个整数,代表加密前的整数。

【样例输入1】

3

aAc

【样例输出1】

-61

对于全部数据,保证有 1 ≤ n ≤ 100000。

【参考程序】

#include <iostream>

using namespace std;

char str[100005];

int main() {

    int n;

    cin >> n;

    cin >> str;

    int ans = 0;

    for (int i = 0; i < n; i ++) {

        if (str[i] >= 'a' && str[i] <= 'z')

            ans += str[i] - 'a' + 1;

        else if (str[i] >= 'A' && str[i] <= 'Z')

            ans -= str[i];

    }

    cout << ans << endl;

    return 0;

}

27、完全平方数

【问题描述】

小杨同学有一个包含 n 个非负整数的序列 A,他想要知道其中有多少对下标组合 <i, j>( 1 ≤ i、j ≤n,i < j),使得 Ai + Aj 是完全平方数。

如果 x 是完全平方数,则存在非负整数 y 使得 y × y = x。

【输入描述】

第一行一个非负整数 n ,表示非负整数个数。

第二行包含 n 个非负整数 A1、A2、……、An,表示序列 A 包含的非负整数。

【输出描述】

输出一个非负整数,表示和是完全平方数的非负整数对数。

【样例输入1】

5

1 4 3 3 5

【样例输出1】

3

对于全部数据,保证有 1 ≤ n ≤ 10000,0 ≤ Ai ≤ 100000。

【参考程序】

#include <math.h>

#include <iostream>

using namespace std;

int n, a[10001];

int main() {

    cin >> n;

    for(int i=1; i<=n; i++) {

        cin>>a[i];

    }

    int ans=0;

    for(int i=1; i<=n; i++) {

        for(int j=i+1; j<=n; j++) {

            int m = a[i] + a[j];

            int t = sqrt(m);

            if(t * t == m)

                ans++;

        }

    }

    cout<<ans<<"\n";

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小伙伴测评网

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值