一、单选题(每题2分,共30分)
1
、
⼈
们所使用的手机上安装的
App
通常指的是( )。
A.
⼀
款操作系统
B.
⼀
款应用软件
C.
⼀
种通话设备
D.
以上都不对
【答案】
B
【考纲知识点】 计算机基础
【解析】本题属于考察计算机基础知识。APP是英语单词application的简写,代表应用软件的意思。
2
、下列流程图的输出结果是?
( )
A. 9
B. 7
C. 5
D. 11
【答案】A
【考纲知识点】 流程图和多层循环语句
【解析】本题属于考察计算机循环结构嵌套选择结构知识。根据流程图,n<=5 时会一直循环,每次循环先判断是否满足m*n>20的条件,然后对m进行不同的赋 值。例如:n=1,m=1,m*n不大于20,m会计算,赋值为3,依次类推,最终m的结 果是9,选A。
3
、对包含
n
个元素的数组进
⾏冒泡排序 ,平均时间复杂度一般为( )。
A.O(n
)
B.O(n log n
)
C.O(n
2
)
D.
以上都不正确
【答案】
C
【考纲知识点】 冒泡排序
【解析】本题属于考察简单排序算法的时间复杂度,选
C
。
4
、下列关于
C++
语
⾔中指针的叙述 ,不正确的是( )。
A.
可以定义指向
int
类型的指针。
B.
可以定义指向
⾃
定义结构体类型的指针。
C.
⾃
定义结构体类型可以包含指针类型的元素。
D.
不能定义指向
void
类型的指针 ,那没有意义。
【答案】
D
【考纲知识点】 指针的概念及使用
【解析】本题属于考察计算机指针知识。可以指向
void
类型。
5
、下列关于
C++
语
⾔中数组的叙述 ,不正确的是( )。
A.
一维数组可以用来表示数列。
B.
二维数组可以用来表示矩阵。
C.
三维数组可以用来表示空间中物体的形状。
D.
世界是三维的 ,所以定义四维数组没有意义。
【答案】
D
【考纲知识点】 数组
【解析】本题属于考察计算机数组知识。世界可以用多维描述,定义四维也有 意义。
6
、下列关于
C++
语
⾔中函数的叙述 ,正确的是( )。
A.
函数调用前必须定义。
B.
函数调用时必须提供足够的实际参数。
C.
函数定义前必须声明。
D.
函数声明只能写在函数调用前。
【答案】
B
【考纲知识点】 函数的概念及使用
【解析】本题属于考察计算机函数知识。函数调用时如果缺少实参将不能正确 运行。
7
、下列关于
C++
语
⾔中函数的叙述 ,不正确的是( )。
A.
两个函数的声明可以相同。
B.
两个函数的局部变量可以重名。
C.
两个函数的参数可以重名。
D.
两个函数可以重名。
【答案】
A
【考纲知识点】 函数的概念及使用
【解析】本题属于考察计算机函数知识。函数声明时不能相同。
8
、
⼀
个二维数组定义为
char array[3][10];
,则这个二维数组占用内存的大⼩ 为( )。
A. 10
B. 30
C. 32
D. 48
【答案】
B
【考纲知识点】 二维数组知识
【解析】本题属于考察
C++二维字符数组知识。内存大小和数组需要用的空间 有关。
3
行
10
列,需要
3*10=30
个空间,选
B
。
9
、如果
n
为
int
类型的变量,
⼀
个指针变量定义为
int *p=&n; ,则下列说法正确的 是( )。
A.
指针变量
p
的值与变量
n
是相同
B.
指针变量
p
的值与变量
n
的地址是相同的。
C.
指针变量
p
指向的值为
'n'
。
D.
指针变量
p
指向的值与变量
n
的地址是相同的。
【答案】
B
【考纲知识点】 指针
【解析】本题属于考察
C++
指针知识。指针的值保存的是变量的地址,所以选
B
。
10
、
⼀
个三维数组定义为
long long array[6][6][6];
,则
array[1][2][3]
和
array[3][2][1]
在内存中的 位置相差多少字节?
( )
A. 70
字节
B. 198
字节
C. 560
字节
D.
无法确定
【答案】
C
【考纲知识点】 三维数组
【解析】本题属于考察
C++
三维数组知识。数组是
long long类型,每间隔一下 数字就间隔
8
个字节,假设三维数组用长宽高来描述,
array[0][0][0]到 array[0][5][5]
有
36
个元素,
array[1][2][3]
包含
36+12+4=52
个元素;到长度
3宽度 2
高度
1
,包括
36*3+12+2=122
个元素,隔离
70
个元素,因此长度是
560
,选
C
。
11
、如果
a
为
int
类型的变量,且
a
的值为
6
,则执
⾏
a = ~a;
之后,
a的值会 是( )。
A. -6
B. 6
C. -7
D. 7
【答案】
C
【考纲知识点】 位运算
【解析】本题属于考察
C++
位运算知识。
6按位取反运算,注意符号位也取反, 呈现的是补码,转换过来就是
-7
。具体过程:
00000110
(取反操作)
11111001
(补码)
11111000
(补码
-1=
反码)
10000111
(负数的原码,注意此时取反符号位不变)
12
、
⼀
个数组定义为
int a[5] = {1, 2, 3, 4, 5};
,
⼀
个指针定义为int * p = &a[2];
,则执
⾏
*p = a[1];
后 ,数组
a
中的值会变为( )。
A. {1, 2, 2, 4, 5}
B. {1, 3, 3, 4, 5}
C. {1, 2, 3, 3, 5}
D. {1, 2, 4, 4, 5}
【答案】
A
【考纲知识点】 指针和数组
【解析】本题属于考察
C++
指针和数组知识。
P
指针指向的是
a[2]
,将
a[1]的值 赋值给
p
指向的变量
a[2]
,数组中
a[1]
将等于
a[2]
。
13
、下列关于
C++语言中异常处理的叙述,正确的是( )。
A.
⼀
个
try
⼦
句可以有多个
catch
⼦
句与之对应。
B.
如果
try
⼦
句在执
⾏
时发
⽣
异常 ,就
⼀
定会进
⼊
某
⼀
个
catch
⼦
句执
⾏
。
C.
如果
try
⼦
句中没有可能发
⽣
异常的语句 ,会产
⽣
编译错误。
D. catch
⼦
句处理异常后 ,会重新执
⾏
与之对应的
try
⼦
句。
【答案】
A
【考纲知识点】 异常处理
【解析】本题属于考察
C++
处理异常知识。
A
是正确的。
B选项中,得到对应类 型中的异常才能
catch
操作。
14
、执
⾏
以下
C++
语
⾔程序后,输出结果是( )。
A. 0
B. 5
C. 55
D.
⽆
法确定。
【答案】
D
【考纲知识点】 循环和一维数组的基本运用
【解析】本题属于考察
C++循环结构和一维数组的知识。这是求斐波那契数列 的代码,数组的范围是
[0,9]
,所以对
fib[10]
操作后,越界访问结果无法确定。
15
、在下列代码的横线处填写( ),完成对有
n
个
int类型元素的数组 array
由
⼩
到
⼤
排序。
A. int j = 1; j < n; j++
B. int j = 0; j < n; j++
C. int j = 0; j < i - 1; j++
D. int j = 0; j < i; j++
【答案】
C
【考纲知识点】 函数和数组的知识
【解析】本题属于考察
C++函数和数组的知识。题目已知,要求从小到大的冒 泡排序,如果前一个比后一个大,就交换位置,外层循环从
n开始,判断的区间 逐渐减小,判断循环范围
C正确。
二、判断题(每题2分,共20分)
1
、在
C++
语言中 ,指针变量在逻辑上指向另
⼀个变量在内存中的位置 ,指针 变量本身不占用内存。
【答案】错误
【考纲知识点】 指针类型的概念
【解析】本题是
C++
指针类型的知识,指针是个变量,占用内存。
2
、对
N
个元素的数组执
⾏
插
⼊排序算法 ,通常的时间复杂度是O(N^2)。
【答案】正确
【考纲知识点】 排序算法
【解析】本题是
C++
排序算法的知识,插入排序常用时间复杂度是
O(N^2)
3
、在
C++
语
⾔
中 ,每个变量都有其作用域。
【答案】正确
【考纲知识点】 变量
【解析】本题是C++变量的知识,变量都有作用域。
4
、在
C++
语
⾔中 ,在函数调用时 ,通过引用传递的参数不会复制实际参数, 因此不会额外占用内存。
【答案】错误
【考纲知识点】 函数
【解析】本题是C++函数的知识,传参时函数的参数也会是一个新的变量,占用 内存。
5
、在
C++
语
⾔
中,可以通过定义结构体,定义
⼀
个新的数据类型。
【答案】正确
【考纲知识点】 结构体
【解析】本题是
C++
语言的知识,定义结构体可以认为定义一个新的数据类型。
6
、在
C++
语
⾔中 ,可以定义结构体类型的数组变量 ,定义结构体时也可以包 含数组成员。
【答案】正确
【考纲知识点】 结构体
【解析】本题是
C++
结构体的知识,可以包含数组。
7
、如果希望记录
10
个最长为
99字节的字符串,可以将字符串数组定义 为
char s[10][100];
。
【答案】正确
【考纲知识点】 数组
【解析】本题是
C++
字符数组的知识,定义长度大于等于要求。
8
、一个可能抛出异常的函数,调用它的位置没有在
try
⼦句中,会引起编译错 误。
【答案】错误
【考纲知识点】 函数
【解析】本题是
C++
函数的知识,编译不会报错。
9
、
==
和
:=
都是
C++
语
⾔
的运算符。
【答案】错误
【考纲知识点】 运算符
【解析】本题是
C++
语法的知识,
==
是运算符。
10
、通过使用文件重定向操作,可以将程序中输出到
cout的内容输出到文件中, 这是常用的记录程序运
⾏
日志的方法之
⼀
。
【答案】正确
【考纲知识点】 文件操作
【解析】本题是
C++
文件操作的知识,正确。
三、编程题 (每题 25 分,共 50 分)
1
、进制转换
问题描述
N
进制数指的是逢
N
进
⼀
的计数制。例如,
⼈
们日常
⽣
活中
⼤
多使用
⼗进制计数 ,而计算机底层则
⼀
般使用二进制。除此之外,
⼋
进制和
⼗
六进制在
⼀些场合 也是常
⽤
的计数制(
⼗
六进制中,
⼀
般使用字母A 至F表
⽰⼗⾄⼗五;本题中, ⼗⼀
进制到
⼗
五进制也是类似的)。
在本题中,我们将给出
N
个不同进制的数。你需要分别把它们转换成
⼗进制 数。
提示
对于任意
⼀
个
L
位
K
进制数,假设其最右边的数位为第
0位,最左边的数位为 第
L - 1
位,我们只需要将其第
i
位的数码乘以权值
K
i,再将每位的结果相加 ,即可得到原
K
进制数对应的
⼗
进制数。下
⾯
是两个例
⼦
:
1.
⼋
进制数
1362
对应的
⼗
进制数为
1 × 8 ^
3
+
3 × 8^
2
+
6 × 8 ^
1
+
2 × 8^
0
= 754
;
2.
⼗
六进制数
3F0
对应的
⼗
进制数为
3 × 16 ^
2
+
15 × 16^
1
+ 0 × 16^
0
= 1008
。
输入描述
输
⼊
的第
⼀⾏
为
⼀
个
⼗
进制表示的整数
N
。接下来
N
⾏
,每
⾏⼀
个整数
K,随后 是
⼀
个空格,紧接着是
⼀
个
K
进制数,表示需要转换的数。保证所有
K进制数均 由数字和
⼤
写字母组成,且不以
0
开头 。保证
K
进制数合法。
保证
N ≤ 1000
;保证
2 ≤ K ≤ 16
。
保证所有
K
进制数的位数不超过
9
。
输出描述
输出
N
行,每
⼀
个十进制数,表
⽰
对应
K
进制数的十进制数值。
样例输入
1
2
8 1362
16 3F0
样例输出
1
754
1008
样例输入
2
2
2 11011
10 123456789
样例输出
2
27
123456789
【题目大意】
1.有
n
个
k
进制的整数,将它们分别转换成对应的十进制。
【考纲知识点】
1.基本运算、输入输出语句、循环、进制转换的知识。
【解题思路】
1.按题目要求定义好需要的变量,并实现输入;
2.输入
n
行,每行
2
个整数,分别表示进制和要转换的数字;
3.按求进制方法求即可。例如:
(abc)
2
=a*2 ^
2
+b*2 ^
1
+c*2 ^
0
注意:转成十进制的时候要开long long
直接模拟
【参考程序】
#include<iostream>
using namespace std;
//n进制转十进制
long long n_to_ten(int n,string s){
long long sum=0,a=1;
for(int i=s.size()-1;i>=0;i--){
if(s[i]>='0'&&s[i]<='9'){
sum+=(s[i]-'0')*a;
}else {
sum+=(s[i]-'A'+10)*a;
}
a*=n;
}
return sum;
}
int main(){
int n,x;
string s;
cin>>n;
while(n--){
cin>>x>>s;
cout<<n_to_ten(x,s)<<endl;
}
return 0;
}
2、变长编码
问题描述
小明刚刚学习了三种整数编码方式
:原码、反码、补码,并了解到计算机存储整 数通常使用补码。但他总是觉得生活中很少用到2^31-1这么大的数,生活中常用 的
0 ~ 100
这种数也同样需要用
4个字节的补码表示,太浪费了些。热爱学习的小 明通过搜索,发现了一种正整数的变长编码方式。这种编码方式的规则如下
:
1.
对于给定的正整数,首先将其表达为二进制形式。例如,
(0){10} =(0){2}, (926){10}=(1110011110){2}
。
2.
将二进制数从低位到高位切分成每组
7 bit
,不足
7bit
的在高位用
0填补。例如 ,
(0){2}
变为
0000000
的一组
,(1110011110){2}
变为
0011110
和
0000111的两组。
3.由代表低位的组开始,为其加入最高位。如果这组是最后一组,则在最高位 填上
0
,否则在最高位填上
1
。于是,
0
的变长编码为
00000000
一个字节,
926的 变长编码为
10011110
和
00000111
两个字节。
这种编码方式可以用更少的字节表达比较小的数,也可以用很多的字节表达非 常大的数。例如,
987654321012345678
的二讲制为(0001101 1011010 0110110 1001011 1110100 0100110 1001000 0010110 1001110){2}
于是它的变长编码为
(十 六进制表示
) CE 96 C8 A6 F4 CB B6 DA OD
,共
9
个字节。
你能通过编写程序,找到一个正整数的变长编码吗
?
输入描述
输
⼊
第
⼀⾏
,包含
⼀
个正整数
N
。约定
0
≤
N≤10^18。
输出描述
输出
⼀⾏
,输出
N
对应的变长编码的每个字节 ,每个字节均以
2
位
⼗六进制表 示(其中,
A-F
使
⽤⼤
写字母表
⽰
) , 两个字节间以空格分隔。
样例输入
1
0
样例输出
1
00
样例输入
2
926
样例输出
2
9E 07
样例输入
3
987654321012345678
样例输出
3
CE 96 C8 A6 F4 CB B6 DA 0D
【题目大意】
1.给一个正整数,根据题目要求找它的变长编码,变长编码用
16
进制表示。
【考纲知识点】
1.基本运算、输入输出语句、一维数组、位运算的知识。
【解题思路】
1.按题目要求定义好需要的变量,并实现输入;
2.根据题意,
1
、将
n
对应的二进制,每
7
位
1
组,保存起来;
3.除了包含最高位那组,其他组最前面都增加
1
,例如中间一组是
0001111, 最前面加
1
变成
10001111
;
4.注意输出是先输出低位的数组,输出内容用
16
进制表示即可。
【参考程序】
#include <iostream>
using namespace std;
long long n;
//数字转16进制字符
char to_Hex(int x){
if (x>9){
return x-10+'A';
}else{
return x+'0';
}
}
int main() {
cin>>n;
while (n>0){
int t=n&0x7f;//取最后7位
if (n>0x7f){//不是最高组
t|=0x80;//首位加1
}
//t>>4获取t的高4位,t&0xf获取t的低4位
cout<<to_Hex(t>>4)<<to_Hex(t&0x0f)<<" ";
n=(n>>7);//去掉最后7位
}
return 0;
}