当前位置:   article > 正文

CCF编程能力等级认证GESP—C++4级—20230923_下列关于c++语 中指针的叙述 ,不正确的是( )。 可以定义指向int类型的指针。

下列关于c++语 中指针的叙述 ,不正确的是( )。 可以定义指向int类型的指针。

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

1、⼈们所使用的手机上安装的App通常指的是( )。

A.⼀款操作系统
B.⼀款应用软件
C.⼀种通话设备
D.以上都不对
  • 1
  • 2
  • 3
  • 4

2、下列流程图的输出结果是?( )
在这里插入图片描述

A. 9
B. 7
C. 5
D. 11
  • 1
  • 2
  • 3
  • 4

3、对包含n个元素的数组进⾏冒泡排序 ,平均时间复杂度一般为( )。

A. O ( n ) O(n) O(n)
B. O ( n l o g n ) O(n log n) O(nlogn
C. O ( n 2 ) O(n^2) O(n2)
D.以上都不正确

4、下列关于C++语⾔中指针的叙述 ,不正确的是( )。

A.可以定义指向int类型的指针。
B.可以定义指向⾃定义结构体类型的指针。
C.⾃定义结构体类型可以包含指针类型的元素。
D.不能定义指向void类型的指针 ,那没有意义。
  • 1
  • 2
  • 3
  • 4

5、下列关于C++语⾔中数组的叙述 ,不正确的是( )。

A.一维数组可以用来表示数列。
B.二维数组可以用来表示矩阵。
C.三维数组可以用来表示空间中物体的形状。
D.世界是三维的 ,所以定义四维数组没有意义。
  • 1
  • 2
  • 3
  • 4

6、下列关于C++语⾔中函数的叙述 ,正确的是( )。

A.函数调用前必须定义。
B.函数调用时必须提供足够的实际参数。
C.函数定义前必须声明。
D.函数声明只能写在函数调用前。
  • 1
  • 2
  • 3
  • 4

7、下列关于C++语⾔中函数的叙述 ,不正确的是( )。

A.两个函数的声明可以相同。
B.两个函数的局部变量可以重名。
C.两个函数的参数可以重名。
D.两个函数可以重名。
  • 1
  • 2
  • 3
  • 4

8、⼀个二维数组定义为 char array[3][10]; ,则这个二维数组占用内存的大小为( )。

A. 10
B. 30
C. 32
D. 48
  • 1
  • 2
  • 3
  • 4

9、如果n为int类型的变量,⼀个指针变量定义为int *p=&n; ,则下列说法正确的是( )。

A.指针变量p的值与变量n是相同
B.指针变量p的值与变量n的地址是相同的。
C.指针变量p指向的值为 'n'。
D.指针变量p指向的值与变量n的地址是相同的。
  • 1
  • 2
  • 3
  • 4

10、⼀个三维数组定义为 long long array[6][6][6]; ,则array[1][2][3]和array[3][2][1]在内存中的 位置相差多少字节?( )

A. 70字节
B. 198字节
C. 560字节
D.无法确定
  • 1
  • 2
  • 3
  • 4

11、如果 a 为 int 类型的变量,且 a 的值为6,则执⾏a = ~a; 之后,a的值会是( )。

A. -6
B. 6
C. -7
D. 7
  • 1
  • 2
  • 3
  • 4

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}
  • 1
  • 2
  • 3
  • 4

13、下列关于C++语言中异常处理的叙述,正确的是( )。

A.⼀个try⼦句可以有多个catch⼦句与之对应。
B.如果try⼦句在执⾏时发⽣异常 ,就⼀定会进⼊某⼀个catch⼦句执⾏。
C.如果try⼦句中没有可能发⽣异常的语句 ,会产⽣编译错误。
D. catch ⼦句处理异常后 ,会重新执⾏与之对应的try⼦句。
  • 1
  • 2
  • 3
  • 4

14、执⾏以下C++语⾔程序后,输出结果是( )。

#include <iostream>

using namespace std;

int main(){
	int fib[10];
	fib[0] = 0;
	fib[1] = 1;
	for (int i = 2; i < 10; i++)
		fib[i] = fib[i - 1] + fib[i - 2];
	cout << fib[10] << endl;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
A. 0
B. 5
C. 55
D. ⽆法确定。
  • 1
  • 2
  • 3
  • 4

15、在下列代码的横线处填写( ),完成对有 n个int类型元素的数组array 由⼩到⼤排序。

void BubbleSort(int array[], int n){
	for (int i = n; i >= 2; i--)
		for (_________) // 在此处填写代码
			if (array[j] > array[j + 1]){
				int t = array[j];
				array[j] = array[j + 1];
				array[j + 1] = t;
			} 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
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++
  • 1
  • 2
  • 3
  • 4

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

1、在C++语言中 ,指针变量在逻辑上指向另⼀个变量在内存中的位置,指针变量本身不占用内存。

2、对N个元素的数组执⾏插⼊排序算法 ,通常的时间复杂度是 O ( N 2 ) O(N^2) O(N2)

3、在C++语⾔中 ,每个变量都有其作用域。

4、在C++语⾔中 ,在函数调用时 ,通过引用传递的参数不会复制实际参数,因此不会额外占用内存。

5、在C++语⾔中,可以通过定义结构体,定义⼀个新的数据类型。

6、在C++语⾔中 ,可以定义结构体类型的数组变量 ,定义结构体时也可以包含数组成员。

7、如果希望记录10个最长为99字节的字符串,可以将字符串数组定义为 char s[10][100]; 。

8、一个可能抛出异常的函数,调用它的位置没有在try⼦句中,会引起编译错误。

9、==和:=都是C++语⾔的运算符。

10、通过使用文件重定向操作,可以将程序中输出到cout的内容输出到文件中,这是常用的记录程序运⾏日志的方法之⼀。

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

进制转换

【问题描述】
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 1 × 8^3+3 × 8^2+6 × 8^1+2 × 8^0= 754 1×833×826×812×80=754
2.⼗六进制数3F0 对应的⼗进制数为 3 × 1 6 2 + 15 × 1 6 1 + 0 × 1 6 0 = 1008 3 × 16^2+15 × 16^1+ 0 × 16^0= 1008 3×16215×161+0×160=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

变长编码

【问题描述】
小明刚刚学习了三种整数编码方式:原码、反码、补码,并了解到计算机存储整数通常使用补码。但他总是觉得生活中很少用到231-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 01101101001011 1110100 0100110 1001000 0010110 1001110){2}于是它的变长编码为(十六进制表示) CE 96 C8 A6 F4 CB B6 DA OD,共9个字节。
你能通过编写程序,找到一个正整数的变长编码吗?
【输入描述】
输⼊第⼀⾏ ,包含⼀个正整数N。约定0≤N≤1018
【输出描述】
输出⼀⾏ ,输出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、
【答案】B
【考纲知识点】 计算机基础
【解析】本题属于考察计算机基础知识。APP是英语单词application的简写,代表应用软件的意思。

2、
【答案】A
【考纲知识点】 流程图和多层循环语句
【解析】本题属于考察计算机循环结构嵌套选择结构知识。根据流程图,n<=5时会一直循环,每次循环先判断是否满足mn>20的条件,然后对m进行不同的赋值。例如:n=1,m=1,mn不大于20,m会计算,赋值为3,依次类推,最终m的结果是9,选A。

3、
【答案】C
【考纲知识点】 冒泡排序
【解析】本题属于考察简单排序算法的时间复杂度,选C。

4、
【答案】D
【考纲知识点】 指针的概念及使用
【解析】本题属于考察计算机指针知识。可以指向void类型。

5、
【答案】D
【考纲知识点】 数组
【解析】本题属于考察计算机数组知识。世界可以用多维描述,定义四维也有意义。

6、
【答案】B
【考纲知识点】 函数的概念及使用
【解析】本题属于考察计算机函数知识。函数调用时如果缺少实参将不能正确运行。

7、
【答案】A
【考纲知识点】 函数的概念及使用
【解析】本题属于考察计算机函数知识。函数声明时不能相同。

8、
【答案】B
【考纲知识点】 二维数组知识
【解析】本题属于考察C++二维字符数组知识。内存大小和数组需要用的空间有关。3行10列,需要3*10=30个空间,选B。

9、
【答案】B
【考纲知识点】 指针
【解析】本题属于考察C++指针知识。指针的值保存的是变量的地址,所以选B。

10、
【答案】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、
【答案】C
【考纲知识点】 位运算
【解析】本题属于考察C++位运算知识。6按位取反运算,注意符号位也取反,呈现的是补码,转换过来就是-7。具体过程:
00000110(取反操作)
11111001(补码)
11111000(补码-1=反码)
10000111(负数的原码,注意此时取反符号位不变)

12、
【答案】A
【考纲知识点】 指针和数组
【解析】本题属于考察C++指针和数组知识。P指针指向的是a[2],将a[1]的值赋值给p指向的变量a[2],数组中a[1]将等于a[2]。

13、
【答案】A
【考纲知识点】 异常处理
【解析】本题属于考察C++处理异常知识。A是正确的。B选项中,得到对应类型中的异常才能catch操作。

14、
【答案】D
【考纲知识点】 循环和一维数组的基本运用
【解析】本题属于考察C++循环结构和一维数组的知识。这是求斐波那契数列的代码,数组的范围是[0,9],所以对fib[10]操作后,越界访问结果无法确定。

15、
【答案】C
【考纲知识点】 函数和数组的知识
【解析】本题属于考察C++函数和数组的知识。题目已知,要求从小到大的冒泡排序,如果前一个比后一个大,就交换位置,外层循环从n开始,判断的区间逐渐减小,判断循环范围C正确。

判断题

1、
【答案】错误
【考纲知识点】 指针类型的概念
【解析】本题是C++指针类型的知识,指针是个变量,占用内存。

2、
【答案】正确
【考纲知识点】 排序算法
【解析】本题是C++排序算法的知识,插入排序常用时间复杂度是O(N2)

3、
【答案】正确
【考纲知识点】 变量
【解析】本题是C++变量的知识,变量都有作用域。

4、
【答案】错误
【考纲知识点】 函数
【解析】本题是C++函数的知识,传参时函数的参数也会是一个新的变量,占用内存。

5、
【答案】正确
【考纲知识点】 结构体
【解析】本题是C++语言的知识,定义结构体可以认为定义一个新的数据类型。

6、
【答案】正确
【考纲知识点】 结构体
【解析】本题是C++结构体的知识,可以包含数组。

7、
【答案】正确
【考纲知识点】 数组
【解析】本题是C++字符数组的知识,定义长度大于等于要求。

8、
【答案】错误
【考纲知识点】 函数
【解析】本题是C++函数的知识,编译不会报错。

9、
【答案】错误
【考纲知识点】 运算符
【解析】本题是C++语法的知识,==是运算符。

10、
【答案】正确
【考纲知识点】 文件操作
【解析】本题是C++文件操作的知识,正确。

编程题1

1、
【题目大意】
1.有n个k进制的整数,将它们分别转换成对应的十进制。
【考纲知识点】
1.基本运算、输入输出语句、循环、进制转换的知识。
【解题思路】
1.按题目要求定义好需要的变量,并实现输入;
2.输入n行,每行2个整数,分别表示进制和要转换的数字;3.按求进制方法求即可。例如: ( a b c ) 2 = a ∗ 2 2 + b ∗ 2 1 + c ∗ 2 0 (abc)_2=a*2^2+b*2^1+c*2^0 (abc)2=a22+b21+c20

#include <iostream>
#include <cstring>
using namespace std;

int trans_digit(int k, char c){
	if (c <= '9')
		return (c - '0');
	return (c - 'A' + 10);
}

long long trans (int k, char str[]) {
	int l = strlen(str);
	long long res = 0, pw = 1;
	for (int i = l - 1; i >= 0; i--){
		res += pw * trans_digit(k, str[i]);
		pw *= k; 
	}
	return res;
}
int main(){
	int n = 0;
	cin >> n;
	for (int t = 0; t < n; t++){
		int k = 0;
		char str[10];
		cin >> k >> str;
		cout << trans(k, str) << endl;
	}
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

编程题2

2、
【题目大意】
1.给一个正整数,根据题目要求找它的变长编码,变长编码用16进制表示。
【考纲知识点】
1.基本运算、输入输出语句、一维数组、位运算的知识。【解题思路】
1.按题目要求定义好需要的变量,并实现输入;
2.根据题意,1、将n对应的二进制,每7位1组,保存起来;3.除了包含最高位那组,其他组最前面都增加1,例如中间一组是0001111,最前面加1变成10001111;
4.注意输出是先输出低位的数组,输出内容用16进制表示即可。

#include <iostream>

using namespace std;

void output_digit(int d){
	if (d >= 10)
		cout << char('A' + d - 10);
	else
		cout << char('0' + d);
}
void output_code (int s){
	output_digit(s >> 4);
	output_digit(s & 0x0f);
}
int main(){
	long long n = 0;
	cin >> n;
	int split[10];
	int l = 0;
	while (n > 0){
		split[l] = int(n & 0x7f);
		n >>= 7;
		l++; 
	}
	for (int i = 0; i < l - 1; i++)
		split[i] |= 0x80;
	output_code(split[0]);
	for (int i = 1; i < l; i++){
		cout << " ";
		output_code(split[i]);
	}
	cout << endl;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/397203
推荐阅读
相关标签
  

闽ICP备14008679号