2023年9月真题
一、单选题(每题2分,共30分)
正确答案:B
解析:考察知识点:计算机基础
本题属于考察计算机基础知识。APP是英语单词application的简写,代表应用软件的意思。
正确答案:A
解析:考察知识点:流程图和多层循环语句
本题属于考察计算机循环结构嵌套选择结构知识。根据流程图,n<=5时会一直循环,每次循环先判断是否满足m*n>20的条件,然后对m进行不同的赋值。例如:n=1,m=1,m*n不大于20,m会计算,赋值为3,依次类推,最终m的结果是9,选A。
正确答案:C
解析:考察知识点:排序算法
本题属于考察排序算法之冒泡排序的时间复杂度,选C。
正确答案:D
解析:考察知识点:指针的概念及使用
本题属于考察计算机指针知识。可以指向void类型。
正确答案:D
解析:考察知识点:数组
本题属于考察计算机数组知识。世界可以用多维描述,定义四维也有意义。
正确答案:B
解析:考察知识点:函数的概念及使用
本题属于考察计算机函数知识。函数调用时如果缺少实参将不能正确运行。
正确答案:A
解析:考察知识点:函数的概念及使用
本题属于考察计算机函数知识。函数声明时不能相同。
正确答案:B
解析:考察知识点:二维数组
本题属于考察C++二维字符数组知识。内存大小和数组需要用的空间有关。3行10列,需要3*10=30个空间,选B。
正确答案:B
解析:考察知识点:指针
本题属于考察C++指针知识。指针的值保存的是变量的地址,所以选B。
正确答案: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。
正确答案:C
解析:考察知识点:位运算
本题属于考察C++位运算知识。6按位取反运算,注意符号位也取反,呈现的是补码,转换过来就是-7。具体过程:
00000110(取反操作)
11111001(补码)
11111000(补码-1=反码)
10000111(负数的原码,注意此时取反符号位不变)
正确答案:A
解析:考察知识点:指针和数组
本题属于考察C++指针和数组知识。P指针指向的是a[2],将a[1]的值赋值给p指向的变量a[2],数组中a[1]将等于a[2]。
正确答案:A
解析:考察知识点:异常处理
本题属于考察C++处理异常知识。A是正确的。B选项中,得到对应类型中的异常才能catch操作。
正确答案:D
解析:考察知识点:循环和一维数组的基本运用
本题属于考察C++循环结构和一维数组的知识。这是求斐波那契数列的代码,数组的范围是[0,9],所以对fib[10]操作后,越界访问结果无法确定。
正确答案:C
解析:考察知识点:函数和数组的知识
本题属于考察C++函数和数组的知识。题目已知,要求从小到大的冒泡排序,如果前一个比后一个大,就交换位置,外层循环从n开始,判断的区间逐渐减小,判断循环范围C正确。
二、判断题(每题2分,共20分)
正确答案:错误
解析:考察知识点:指针类型的概念
本题是C++指针类型的知识,指针是个变量,占用内存。
正确答案:正确
解析:考察知识点:排序算法
本题是C++排序算法的知识,插入排序常用时间复杂度是 O ( N 2 ) O(N^2) O(N2)
正确答案:正确
解析:考察知识点:变量作用域
本题是C++变量的知识,变量都有作用域。
正确答案:错误
解析:考察知识点:函数
本题是C++函数的知识,传参时函数的参数也会是一个新的变量,占用内存。
正确答案:正确
解析:考察知识点:结构体
本题是C++语言的知识,定义结构体可以认为定义一个新的数据类型。
正确答案:正确
解析:考察知识点:结构体
本题是C++结构体的知识,可以包含数组。
正确答案:正确
解析:考察知识点:数组
本题是C++字符数组的知识,定义长度大于等于要求。
正确答案:错误
解析:考察知识点:函数
本题是C++函数的知识,编译不会报错。
正确答案:错误
解析:考察知识点:运算符
本题是C++语法的知识,==是运算符。
正确答案:正确
解析:考察知识点:文件操作
本题是C++文件操作的知识,正确。
三、编程题(每题25分,共50分)
本题考察 基本运算、输入输出语句、循环、进制转换的知识。
进制转换:其他进制转十进制:按位权展开后求和
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, k;
cin>>n;
string num;
long long res;
while(n--){
cin>>k>>num; //输入进制k和k进制数num
res=0;
for(int i=0; i<num.size(); i++){
int tmp; //当前位的数值
if(num[i]>='0' && num[i]<='9') tmp = num[i]-'0'; //数字字符
else tmp = num[i]-'A'+10; //字母字符
res = res*k + tmp;
}
cout<<res<<endl;
}
return 0;
}
本题考察 基本运算、字符串、进制转换的知识。
cpp
#include<bits/stdc++.h>
using namespace std;
//将8位二进制,每四位转成一个十六进制数
string change(string s){
string res="";
for(int i=0; i<s.size(); i=i+4){
int num = (s[i]-'0')*8+(s[i+1]-'0')*4+(s[i+2]-'0')*2+(s[i+3]-'0');
res += char(num<10? num+'0' : num-10+'A');
}
return res;
}
int main() {
long long n;
cin>>n;
string s="", tmp="";
//将十进制数n转成二进制
while(n){
s=char(n%2+'0') + s;
n/=2;
}
//位数不足7的倍数,前补0凑够7的倍数
int len=7-s.size()%7;
for(int i=0; i<len; i++) s='0'+s;
//从后往前,每7位进行切分,将切分出来的转成两位十六进制
for(int i=s.size()-7; i>=0; i-=7){
if(i!=0) tmp = "1"+s.substr(i,7); //最后一次切分7位前补1
else tmp = "0"+s.substr(i,7); //其余切分7位前补0
cout<<change(tmp)<<" "; //调用函数转换
}
return 0;
}