一、单选题(每题2分,共30分)
题目 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
答案 | C | C | D | D | C | C | D | A | C | B | C | C | B | C | C |
1.若函数声明为int f(int &x){ x+=3; return x; } ,则对声明的变量int a=3 ,下⾯哪个调⽤能够改 变 a的值( )。
A.f(&a) ;
B.f(*a) ;
C.f(a) ;
D.f(a-3) ;
【答案】C
【考纲知识点】函数参数传递的概念
【解析】本题属于考察函数引用传递参数,函数的参数为变量的引用,函数f直接传入参数a即可改变a的值。
2.下⾯C++代码执⾏后 ,输出的是( )。
int main()
{
int x[]={2, 0, 2, 4};
char geSP[]="Grade Examination of SP";
cout << geSP[sizeof(x)] << endl;
cout << endl;
return 0;
}
A.G
B.e
C.n
D.P
【答案】C
【考纲知识点】基本数据类型大小、数组
【解析】本题属于考察数据大小的知识。一个int数据的大小通常为4字节,那么x数组的大小为16个字节。数组下标从0开始,故geSP[16] = ‘n’,输出n。
3.下⾯C++代码执⾏后输出是( )。
int foo(float *f)
{
return int(*f*2);
}
int main(){
float fnum[10]={1.1};
fnum[1]=foo(fnum);
cout << fnum[0]+fnum[1] << endl;
cout << endl;
return 0;
}
A.1
B.1.1
C.3
D.3.1
【答案】D
【考纲知识点】指针,函数参数传递
【解析】本题属于考察C++指针知识。foo函数的功能是传入一个float指针f,返回值为f指针指向的内容乘2的整数部分。数组fnum也是指针地址,指向数组第一个元素,fnum[1] = int(2*1.1) = 2, fnum[0] + fnum[1] = 1.1+2 = 3.1, 输出3.1。
4.对⼆维数组int arr[3][16]; ,则arr[1]占⽤内存的⼤⼩为() 字节。
A.4
B.16
C.48
D.64
【答案】D
【考纲知识点】int数据类型,二维数组大小
【解析】本题属于考察int类型数组大小知识,一个int类型的数据通常占4个字节,arr[1]中有16个int数据,总共占16*4 = 64个字节大小。
5.对⼆维数组int arr[3][16]; ,若arr的地址是0x28cbc0,则arr[1]的值是( )。
A.0x28cbc4
B.0x28cbd0
C.0x28cc00
D.不确定
【答案】C
【考纲知识点】二维数组、地址、十六进制计算
【解析】本题属于考察二维数组的地址的转换。arr[1]的地址等于arr[0]的地址加上arr[0]的大小,即0x28cbc0加上10进制的16*4,转换为十六进制答案为0x28cc00。
6.下⾯C++代码执⾏后输出是( )。
int main()
{
char *p="I love GESP!";
cout << p+5 << endl;
cout << endl;
return 0;
}
A. e
B. I lov
C. e GESP!
D. GESP!
【答案】C
【考纲知识点】字符串、指针
【解析】本题属于考察C++字符串知识,将p视为指针,指向字符串第1个字符,(p+5)指向第6个字符,输出(p+5)则输出从第6个字符到字符串结尾。
7.下⾯C++代码执⾏以后输出的是( )。
int rc=5;
int main()
{
int rc;
cout << ++rc << endl;
cout << endl;
return 0;
}
A. 0
B. 1
C. 6
D. 不确定
【答案】D
【考纲知识点】参数作用域
【解析】本题属于考察C++中参数的作用域知识。虽然定义了全局变量rc,但有局部变量时局部变量优先,main函数中的局部变量没有赋初值,所以(++rc)的值不确定。
8.下面C++函数中采用的算法是( )。
int fib(int n)
{
int i, f[n]={0, 1};
for(int i=2; i<=n; i++)
f[i]=f[i-1]+f[i-2];
return f[n];
}
A. 递推
B. 递归
C. 迭代
D. 循环
【答案】A
【考纲知识点】递推算法
【解析】本题属于考察递推算法。递推算法是由已知的条件出发,根据递推关系(本题递推关系是f[i] = f[i-1] + f[i-2],即求斐波那契数列),逐次推算出中间结果及最后结果。
9.插入排序在最好情况下的时间复杂度是( )。
A. O(1)
B. O(N/2)
C. O(N)
D. O(N2)
【答案】C
【考纲知识点】插入排序、时间复杂度
【解析】本题属于考察插入排序的时间复杂度。根据插入排序原理,当数列已经排好序的情况下,时间复杂度是最低的,为O(n)。
10.在如下的C++代码执行后,设第11和12行的输出地址值分别为 X 和 Y ,则下面正确的是( )。
struct pass{
int no;
char name[20];
int level;
};
int main()
{
struct pass XiaoYang;
cout << "&XiaoYang=" << &XiaoYang << endl; //第11行
cout << "&(XiaoYang.no)=" << &(XiaoYang.no) << endl; //第12行
cout << endl;
return 0;
}
A. X>Y
B. X==Y
C. X<Y
D. 不确定
【答案】B
【考纲知识点】结构体
【解析】本题属于考察C++结构体知识。结构体地址与结构体中第一个元素的地址一样,所以X等于Y。
11.如果文件 1.txt 中的内容如下,则执行下面C++代码时,注释了 #### 那行代码所输出的 x 的值为( )。
50 2024 3.16 I
love
GESP!
int main()
{
ifstream fin;
string line;
int x;
fin.open("1.txt",ios::in);
for (int i=0; i< 2; i++){
fin >> line;
cout << line << endl;
}
fin>>x;
cout << x << endl; //####
cout << endl;
return 0;
}
A. 5
B. 2024
C. 3
D. 0
【答案】C
【考纲知识点】文件读写操作,数据类型转换,循环结构
【解析】本题属于考察文件读写操作、数据类型强制转换、循环结构这三个知识点。题中定义的fin每次读入一个数据,读入规则与cin一样,for循环处一共读入输出两个数据,为50和2024,由于x的数据类型是int,所以接下来读入3存入x,输出x答案为3。
12.执行下列C++代码时输出中的第2行是( )。
int main()
{
char *s[]={(char*)"2024",(char*)"3.16",(char*)"GESP"};
for (int i=0; i< 2; i++){
cout << *s+i << endl;
}
cout << endl;
return 0;
}
A. 2024
B. 3.16
C. 024
D. 3
【答案】C
【考纲知识点】字符串、数组、指针
【解析】本题属于考察C++字符串数组和指针地址这两个知识点。将字符串数组变量s视为指针地址,指向数组一个元素,即(char*)“2024”,地址等同,输出*s将输出数组第一个元素,即‘2024’。for循环中,第一行输出*s+0, 即‘2024’,第二行输出*s+1,即‘024’,向后移一位,与字符串的输出规则一样。
13.C++语言中下面哪个关键字能够限定对象的作用域( )。
A. extern
B. static
C. inline
D. public
【答案】B
【考纲知识点】作用域、关键字
【解析】本题属于考察C++中关键字及其作用知识。
extern用于声明一个变量或函数是在其他文件中定义的,即它的定义不在当前文件中。它告诉编译器在其他文件中寻找这个变量或函数的定义
static主要用于限定对象的作用域,使其只能在声明它的文件中可见,而不能在其他文件中使用
inline用于向编译器提出一个请求,将函数体内的代码在调用点处直接展开,而不是像普通函数一样生成函数调用。这样做的目的是减少函数调用的开销。
public用于定义类的访问控制权限,它指定的类成员可以被类外的代码访问。
14.小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是( )。
A. 小程序
B. 计时器
C. 操作系统
D. 神话人物
【答案】C
【考纲知识点】计算机基础知识
【解析】本题属于考察计算机基础知识。鸿蒙为华为研发的操作系统。
15.中国计算机学会(CCF)在2024年1月27日的颁奖典礼上颁布了王选奖,王选先生的重大贡献是( )。
A. 制造自动驾驶汽车
B. 创立培训学校
C. 发明汉字激光照排系统
D. 成立方正公司
【答案】C
【考纲知识点】计算机历史
【解析】本题属于考察计算机历史,CCF中王选先生的重大贡献为发明汉字激光照排系统。
二、判断题(每题2分,共20分)
题目 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
答案 | √ | √ | × | √ | × | × | × | × | √ | √ |
1.对 int a[]={2,0,2,4,3,1,6} ,执行第一趟选择排序处理后 a 中数据变为 {0,2,2,4,3,1,6} 。( )
【答案】正确
【考纲知识点】选择排序
【解析】本题考察选择排序算法。根据选择排序算法逻辑,一趟排序后数据为{0,2,2,4,3,1,6}
2.如果待排序数据不能都装进内存,需要使用外排序算法。( )
【答案】正确
【考纲知识点】排序算法
【解析】本题考察排序算法。如果数据无法都存入内存,就需要使用外部存储空间进行读取和写入。
3.定义变量 int a=5 , 则 cout << &++a 会输出 6 。( )
【答案】错误
【考纲知识点】指针、基本运算
【解析】本题考察C++取址、算符优先级知识点。&++a语句中,“++”操作的优先级更高,所以先执行“++”,然后执行取址操作。由于还是对a进行取址,所以输出a的地址,而不是a的值,故错误。
4.两个函数之间可以使用全局变量来传递数据。 ( )
【答案】正确
【考纲知识点】全局变量
【解析】本题考察C++全局变量知识。全局变量可以进行赋值,故可以用来传递数据。
5.定义数组 int a[2024][3][16]={2,0,2,4,3,1,6} ,则 cout << a[2023][2][15] 的结果不确定。( )
【答案】错误
【考纲知识点】三维数组
【解析】本题考察C++数组的初始化知识点。当对数组进行初始化后,给定的元素存入数组,其他元素全部置0,所以输出a[2023][2][15]的值为0。
6.在C++语言中,函数的参数为指针时,可以在函数内部修改该参数的值。( )
【答案】错误
【考纲知识点】指针
【解析】本题考察C++指针的使用。函数参数为指针时,可以在函数内部修改指针所指向的值,但无法修改该指针的值。
7.在C++语言中 try 子句里抛出的结构体等类型的异常无法被 catch 捕获。( )
【答案】错误
【考纲知识点】异常处理
【解析】本题考察C++中异常处理。try中抛出类型异常可以被catch捕获。
8.C++语言中 cout << 9^2 << endl; 会输出81。( )
【答案】错误
【考纲知识点】基本运算、位运算
【解析】本题考察C++的基本运算和位运算。在C++中,“^”是异或符号,不是指数运算符,根据异或的运算规则,答案输出应为10。
9.小杨今年春节回奶奶家了,奶奶家的数字电视要设置ip地址并接入到WIFI盒子才能收看节目,那这个WIFI盒子具有路由器的功能。( )
【答案】正确
【考纲知识点】计算机网络
【解析】本题考察计算机网络知识。WIFI盒子这里具有路由器的功能,将设备接入网络。
10.任何一个 for 循环都可以转化为等价的 while 循环( )。
【答案】正确
【考纲知识点】循环语句
【解析】本题考察循环语句。for循环和while循环在逻辑上是等价的,只是语法不同。
三、编程题(每题25分,共50分)
1、相似字符串
【问题描述】
对于两个字符串A和B,如果A可以通过删除一个字符,或插入一个字符,或修改一个字符变成B,那么我们说A和B是相似的。
比如apple可以通过插入一个字符变成applee,可以通过删除一个字符变成appe,也可以通过修改一个字符变成bpple,因此apple和applee、appe、bpple都是相似的。但applee并不能通过任意一个操作变成bpple,因此它们并不相似。
特别地,完全相同的两个字符串也是相似的。
给定T组A,B,请你分别判断他们是否相似。
【输入描述】
第一行一个正整数T。
接下来T行,每行两个用空格隔开的字符串A和B。保证T≤100,A,B的长度不超过50。保证A和B只包含小写字母。
【输出描述】
输出T行,对于每组A,B,如果它们相似,则输出similar,否则输出not similar。
【样例输入 1】
5
apple applee
apple appe
apple bpple
applee bpple
apple apple
【样例输出 1】
similar
similar
similar
not similar
similar
【题目大意】
给定T组输入,每组输入有两个单词,判断两个单词能否通过增加、删除或者修改一个字符变得相同,如果可以就是相似。
【考纲知识点】
输入输出语句、循环语句、函数定义及调用、基本运算
【解题思路】
根据题目要求定义需要的变量,并实现输入
输入T行,每行两个字符串,表示两个单词。
判断两个单词是否相似。
如果两个的单词的长度差超过1,就不相似。
当两个单词的长度相同时:如果不同的字母个数大于1个,肯定不相似;如果不同的字母个数等于1个,就可以通过一次操作变成一样
当两个单词长度差为1时:寻找两者不同的字符,如果有多个不同的字符,则不相似;如果只有一个,则相似。比对时,在较长的单词中找到这个字母,跳过该字母后继续比对即可。
调用函数,输出答案。
【参考程序】
#include<bits/stdc++.h>
using namespace std;
bool isSimilar(string A, string B) {
int m = A.size(), n = B.size();
if (abs(m - n) > 1) return false;
if (m == n) {
int diff = 0;
for (int i = 0; i < m; ++i) {
if (A[i] != B[i]) {
if (++diff > 1) return false;
}
}
return diff <= 1;
} else {
string& shorter = (m < n) ? A : B;
string& longer = (m < n) ? B : A;
int i = 0, j = 0;
int diff = 0;
while (i < shorter.size() && j < longer.size()) {
if (shorter[i] != longer[j]) {
if (++diff > 1) return false;
++j;
} else {
++i;
++j;
}
}
return true;
}
}
int main() {
int T;
cin >> T;
while (T--) {
string A, B;
cin >> A >> B;
if (isSimilar(A, B)) {
cout << "similar" << endl;
} else {
cout << "not similar" << endl;
}
}
return 0;
}
2、做题
【问题描述】
小杨同学为了提高自己的实力制定了做题计划,在第 天时,他必须要完成 道题,否则他就会偷懒。
小杨同学现在找到了一个题库,一共有 套题单,每一套题单中有一定数量的题目。但是他十分挑剔,每套题单他
只会使用一次,每一天也只能使用一套题单里的题目,之后那套题单就会被弃之不用。对于每套题单,他不必完成
题单内所有的题。
那么问题来了,小杨同学最多会做题几天才偷懒呢?
【输入描述】
第一行,1个数为n,表示有多少套题单。
第二行,n个整数a1,a2....,an,分别表示每套题单有多少道题。
【输出描述】
输出一行,小杨同学偷懒前最多做题天数。
【样例输入 1】
4
3 1 4 1
【样例输出 1】
3
【题目大意】
给定一个数列,每次选出一个数,要求选出的第k个数的数值大于等于k,直到无法选出。问最多能选出多少个数。
【考纲知识点】
基本运算、输入输出语句、排序算法、循环
【解题思路】
按题目要求
1.定义好需要的变量,并实现输入
2.要尽可能多的选择,那么可以贪心地每次选出最小的数,看是否符号条件,不符合条件就跳过。
3.利用排序算法,从小到大排列,设置变量s,表示当前已经使用的元素下标,第j 天的时候,到数组中从s下标开始寻找,直到找到大于等于j的数组元素,将s更新为该元素的下标,答案加1。直到无法再进行这样的寻找。
【参考程序】
#include<bits/stdc++.h>
#define maxn 1000006
using namespace std;
long long a[maxn];int n;
int main(){
int m,ans=0;
cin>>n;m=n;int s=1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
for(int j=1;j<=m;j++)
{
for(int k=s;k<=n;k++)
{
if(j<=a[k])
{
ans++;
a[k]=j;
s=k;
break;
}
}
}
cout<<ans;
return 0;
}