GESP C++ 三级样题卷

一、单选题(每题 2 分,共 30 分)

1. 下列关于负数的原码、反码、补码的描述中,正确的是(   )
A. 原码和反码互为 按位 取反(符号位除外),补码为反码加 1
B. 原码和反码互为 按位 取反(符号位除外),补码为原码加 1
C. 反码和补码互为 按位 取反(符号位除外),原码为反码加 1
D. 补码和原码互为 按位 取反(符号位除外),反码为补码加 1
答案:A
解析:

原码 :最高位是符号位,0代表正数,1代表负数,非符号位为该数字绝对值的二进制。

反码:正数的反码与原码一致,负数的反码是对原码按位取反,只是最高位(符号位)不变。 

补码:正数的补码与原码一致,负数的补码是对原码按位取反加1,符号位不变。

2. 一个 int 类型的值乘以 8,等价于以下哪个位运算?( )
A. 左移 3 位
B. 右移 3 位
C. 左移 8 位
D. 右移 8 位
答案:A
解析:每左移一位,相当于该数乘以2,题目中“一个 int 类型的值乘以 8",相当于左移 3 位

左移运算符(<<)

定义:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

设 a=1010 1110,a = a<< 2 将a的二进制位左移2位、右补0,即得a=1011 1000。

若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。

右移运算符(>>)

定义:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。

操作数每右移一位,相当于该数除以2。

3. 以下哪个属于 C++语言中的位运算符?(  )
A. +
B. -
C. *
D. &
答案:D
解析:略
4. 若有以下代码,则数组 arr 的长度是(  )
int arr[] = {1, 2, 3, 4, 5};
A. 3
B. 4
C. 5
D. 6
答案:C
解析:略
5. 在 C++语言中,可以定义一个一维整型数组的是(  )
A. int array[5];
B. int array[];
C. int[5] array;
D. int[] array;
答案:A
解析:正确的数组定义方式:在声明数组时同时指定数组的大小

6. 枚举算法的主要特点是(   )
A. 以空间换时间
B. 逐个尝试所有可能的解
C. 动态规划
D. 贪心策略
答案:B
解析:略
7. 对于一个十进制数 37,以下哪个是它的二进制表示(  )
A. 10101
B. 100101
C. 101001
D. 1000101
答案:B
解析:37=2^5+2^2+1^2^0,所以就是100101
8. 下列关于十六进制的描述中,正确的是(  )
A. 使用 0-9 和 A-F 表示
B. 使用 0-9 和 A-E 表示 C. 使用 1-9 和 A-F 表示
D. 使用 1-9 和 A-E 表示
答案:B
解析:略
9. 下列哪个是 C++语言中用于获取字符串长度的函数(  )
A. length()
B. len()
C. getLength()
D. strlen()
答案:D
解析:略
10. 通常用下列哪种方式来描述算法?( )
A. 汇编语言
B. 伪代码
C. SQL
D. CSS
答案:B
解析:
汇编语言是一种低级语言,使用简单的助记符号来表示计算机指令和操作码,直接对应底层的机器指令。
伪代码是一种高级语言,使用类似自然语言的语法来描述算法和程序流程,不依赖于具体的底层硬件和指令集。
11. 如果 a b 均为 int 类型的变量,下列表达式能正确判断“ a 等于 0 且 b 等于 0”的是()
A. ((~a) && (~b))
B. ((a & b) == 0)
C. ((a | b) == 0)
D. ((a ^ b) == 0)
答案:C
解析:((~a) && (~b))逻辑非对布尔值取反;逻辑取反,对二进制数进行按位取反。((a & b) == 0)只要a,b其中一个为0,等式就是0。((a ^ b) == 0)a,b同时为1,或者0,都有可能等于0。((a | b) == 0)a,b都是0,才能等于0
12. 如果 a int 类型的变量,下列哪个表达式可以正确求出满足“大于等于 a 且是 4 的倍数”的整数中最小的?
A. (a & (~3))
B. (a / 4 * 4)
C. ((a - 1) | 3) + 1
D. (a << 2)
答案:C
解析:略
13. 下面流程图,输入 1 2 3,会输出(  )

答案:B
解析:流程图是求最小值的,三个数的最小值是1
14. 在下列代码的横线处填写(),可以保证输出是“1357”,不会有多余字符。
A. int i = 0; i < strlen(str); i++
B. int i = 0; str[i] != '\0'; i++
C. int i = 1; i <= 7; i += 2
D. int i = 0; i <= 6; i += 2
答案:D
解析:输出是“1357”,它们之间间隔2,也就是i+=2;注意字符串数组下标[i]是从0开始的,所以答案选D
15. 在下列代码的横线处填写( ),可以使得输出是“17 11”。
A. a + b
B. a - b
C. a ^ b
D. a & b
答案:C
解析:略

二、判断题(每题 2 分,共 20 分)

1. 二进制数据编码中,负数的补码是通过对原码按位取反并加 1 得到的。( )
答案:正确
解析:略
2. 在 C++语言中,数组的下标从 1 开始计数。( )
答案:错误
解析:数组的下标从 0开始计数
3. 在 C++ 语言 中,字符串是以 '\0' 结尾的字符数组。( )
答案:正确
解析:略
4. 在 C++ 语言 中,可以使用浮点数(如 3.0 )作为数组下标。( )
答案:错误
解析:在 C++ 中,数组下标必须是整数类型,不能使用浮点数作为数组下标
5. 枚举算法是一种暴力求解方法,逐个尝试所有可能的解。( )
答案:正确
解析:略
6. C++ 语言 中数字的符号位是不参与位运算的。( )
答案:错误
解析:对于有符号整数类型,进行位运算可能会导致符号位的变化
7. C++ 语言 中的数组可以根据需要自动调整大小。( )
答案:错误
解析:略
8. 在 C++语言中, 表达式 (0xff == 255) 的值为 true 。( )
答案:正确
解析:15*16^1+15*16^0=255
9. 如果 a int 类型的变量,且表达式 ((a & 1) == 0) 的值为 true ,则说明 a 是偶数。( )
答案:正确
解析:略
10. 表达式 (7 >> 2) 的计算结果为 1.75 ,且结果类型为 double ( )
答案:错误
解析:

将数字 7 转换为二进制表示:0111

然后,对二进制数 0111 进行右移 2 位,将得到 0001

所以,表达式 (7 >> 2) 的计算结果是 1

三、编程题 (每题 25 分,共 50 分)

1. 逛商场
小明是个不太有计划的孩子。这不,刚到手的零花钱,就全部拿着逛商场去
了。小明的原则很简单,只要见到想买的物品而且能买得起,就一定会买下来之
后才会继续往前走。一天下来,小明到底买了多少物品呢?
【输入格式】
输入共 3 行:
第一行是一个整数 N,表示商场中共有 N 种小明想买的物品(1≤N≤100);
第二行共有 N 个整数,分别表示小明先后见到想买的物品的价格;
第三行是一个整数 X,表示开始时小明共有 X 元零花钱。
【输出格式】
输出 1 行,包含一个整数,表示小明买到的物品数。
【样例输入】
6
7 5 9 10 7 4
30
【样例输出】
4
【参考代码】
#include <bits/stdc++.h>
using namespace std;
int price[100];
int main() {
int n = 0, x = 0, cnt = 0;
cin >> n;
for (int i = 0; i < n; i++)
cin >> price[i];
cin >> x;
for (int i = 0; i < n; i++) {
if (x >= price[i]) { // 买得起就买
x -= price[i];
cnt++;
}
}
cout << cnt;
return 0;
}
2. 进制转换
【题目描述】
小美刚刚学习了十六进制,她觉得很有趣,想到是不是还有更大的进制呢?
在十六进制中,用‘A’表示 10、‘F’表示 15。如果扩展到用‘Z’表示 35,岂
不是可以表示 36 进制数了嘛!
【输入格式】
输入 2 行,第一行包含一个正整数 N,第二行包含一个正整数 R。
保证 1≤N≤1000000,2≤R≤36
【输出格式】
输出 1 行,为 N 的 R 进制表示。
【样例输入】
123
25
【样例输出】
4N
【参考代码】
#include <bits/stdc++.h>
using namespace std;

char res[30]; // 用于存储转换结果的字符数组
int len = 0; // 字符数组长度

// 将十进制数转换为指定进制的字符
char trans(int d) {
    if (d < 10)
        return (char)(d + '0');
    return (char)(d + 'A' - 10);
}

int main() {
    int n = 0, r = 0;
    
    // 输入待转换的十进制数和目标进制
    cin >> n >> r;
    
    // 将十进制数转换为目标进制的表示,存储在字符数组 res 中
    while (n > 0) {
        res[len] = trans(n % r);
        n /= r;
        len++;
    }
    
    // 输出转换结果
    for (int i = len - 1; i >= 0; i--)
        cout << res[i];
    cout << endl;
    
    return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值