CCF编程能力等级认证GESP—C++3级—20230923

发布时间:2023年12月18日

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

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

A.?款操作系统
B.?款应用软件
C.?种通话设备
D.以上都不对

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

A. 60
B. 20
C. 5
D. 1

3、已知?写字符’A’的ASCII编码的?六进制表?为0x41 ,则字符’L’的ASCII编码的?六进制表?为 ( ) 。

A. 4A
B. 4B
C. 4C
D. 52

4、以下哪个不是C++语?中的运算符?( )

A. ~ 
B. ~~ 
C. <
D. <<

5、如果数组定义为long long array[] = {3, 5, 7, 2};,则数组array占?的字节数为( )。

A. 32
B. 16
C. 8
D. 4

6、?个数组定义为 double array[3]; ,则可合理访问这个数组的元素的下标最?为( )。

A. 2
B. 3
C. 23
D. 24

7、以下数组定义 ,符合C++语?语法的是( )。

A. double a[];
B. double b[] = {1, 2 .0, '3'};
C. double c[3.0];
D. double[] d = new double[3];

8、下列关于进制的叙述 ,正确的是( )。

A.只有十进制和二进制能够?来表示?数 ,八进制和十六进制不可以。
B.常用的进制包括二进制、八进制、?进制、十六进制,其他进制在日常?活中很少使用。
C.对任意正整数 ,其二进制表示不会?它的?进制表示更短。
D.正整数的八进制表?中 ,每?位可能出现的最大数字是8

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

A.可以定义 0 个元素的数组。
B.不能定义-1 个元素的数组。
C.数组下标越界访问会产?编译错误。
D.程序运?时发?数组下标的越界访问 ,程序依然可能正常结束。

10、如果 a是int类型的变量 ,下列哪个表达式的值?定为true?( )

A. a + 1000 - 1000 == a
B. a * 2 / 2 == a
C. (a & 1) == 1
D. (a | 1) == a + 1

11、如果 a和b均为int类型的变量 ,下列表达式不能正确判断“a等于b” 的是( )。

A. ((a >= b) && (a <= b))
B. ((a >> 1) == (b >> 1))
C. ((a + b) == (a + a))
D. ((a ^ b) == 0)

12、如果 a为char类型的变量 ,下列哪个表达式可以正确判断“a是?写字母”?( )

A. a - 'A' <= 26
B. 'A' <= a <= 'Z' 
C. 'A' <= 'a' <= 'Z' 
D. ('A' <= a) && (a <= 'Z')

13、在下列代码的横线处填写( ) ,可以使得输出是“20 10”。

#include <iostream>

using namespace std;

int main() {
	int a = 10, b = 20;
	a = (a << 8) | b;
	________; // 在此处填写代码
	cout << a << " " << b << endl; 
	return 0;
}
A. a = a >> 8; b = a & 0xff
B. b = a >> 8; a = a & 0xff;
C. a = b; b = a & 0xff;
D. b = a; a = b;

14、在下列代码的横线处填写( ) ,可以使得输出是“120”。

#include <iostream>

using namespace std;

int main() {
	int array[5] = {1, 2, 3, 4, 5};
	int res = 0;
	for (int i = 0; i < 5; i++)
		________; // 在此处填入代码
	cout << res << endl; 
	return 0;
}
A. res += array[i];
B. res *= array[i]
C. res = array[i]
D. 以上均不对。

15、在下列代码的输出是( )。

#include <iostream>

using namespace std;

int main() {
	int array[10];
	for (int i = 0; i < 10; i++)
		array[i] = i;
	for (int p = 2; p < 10; p++)
		if (array[p] == p)
			for (int n = p; n < 10; n += p)
				array[n] = array[n] / p * (p - 1);
	int res = 0;
	for (int n = 1; n < 10; n++)
		res += array[n];
	cout << res << endl;
	return 0;
}
A. 15
B. 28
C. 45
D. 55

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

1、二进制数101.101在?进制下是5.005。

2、在C++语?中,位运算符也有类似“先乘除、后加减”的优先级规则。因此,使?时应注意合理使?括号。

3、字符常量’3’的值和int类型常量3的值是相同的,只是占?的字节数不同。

4、在C++语?中,长度为 的数组,访问下标为 的元素会引起编译错误。

5、在C++语?中,所有int类型的值,经过若?次左移操作(<<)后,它们的值总会变为0。

6、在C++语?中,数组下标的??决定元素在逻辑上的先后顺序,与元素在内存中位置的先后顺序?关。

7、在C++语?中,定义数组时,[]中必须指定元素个数。

8、著名的哥德巴赫猜想:任??于2的偶数都可写成两个素数之和。我们可以通过枚举法来证明它。

9、在C++语?中,表达式(0xff == 255) 的值为true。

10、如果a为int类型的变量,且表达式((a & 1) == 0) 的值为true,则说明a是偶数。

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

?杨的储蓄

【问题描述】
?杨共有 N个储蓄罐,编号从0到N-1。从第1天开始,?杨每天都会往存钱罐里存钱。具体来说,第i天他会挑选一个存钱罐ɑi,并存?i元钱。过了D天后,他已经忘记每个储蓄罐里都存了多少钱了,你能帮帮他吗?
【输入描述】
输?2?,第一行两个整数N,D;第二行D个整数,其中第i个整数为ɑi(保证0≤ɑi≤N-1)。
每?的各个整数之间?单个空格分隔。
保证1≤N≤1000 ;1≤D≤1000
【输出描述】
输出N个用单个空格隔开的整数,其中第i个整数表示编号为i-1的存钱罐中有多少钱(i = 1,…,N)。
【样例输入 1】
2 3
0 1 0
【样例输出 1】
4 2
【样例解释1】
小杨在第1天、第2天、第3天分别向0号、1号、0号存钱罐存了1元钱、2元钱、3元钱,因此0号存钱罐有1+3=4元钱,而1号存钱罐有2元钱。
【样例输入 2】
3 5
0 0 0 2 0
【样例输出 2】
11 0 4

进制判断

【问题描述】
N进制数指的是逢N进一的计数制。例如,人们日常生活中大多使用十进制计数,而计算机底层则一般使用二进制。除此之外,八进制和十六进制在一些场合也是常用的计数制(十六进制中,一般使用字母A至F表示十至十五)。现在有N个数,请你分别判断他们是否可能是二进制、八进制、十进制、十六进制。例如,15A6F就只可能是十六进制,而1011则是四种进制皆有可能
【输入描述】
输入的第一行为一个十进制表示的整数N。接下来 N行,每行一个字符串,表示需要判断的数。保证所有字符串均由数字和大写字母组成,且不以0 开头。保证不会出现空行。
保证 1≤N≤1000,保证所有字符串长度不超过10。
【输出描述】
输出N行,每行4个数,用空格隔开,分别表示给定的字符串是否可能表示一个二进制数、八进制数、十进制数十六进制数。使用 1 表示可能,使用0 表示不可能。
例如,对于只可能是十六进制数的 15A6F,就需要输出0001;而对于四者皆有可能的 1011,则需要输出1111。
【样例输入 1】
2
15A6F
1011
【样例输出 1】
0 0 0 1
1 1 1 1
【样例输入 2】
4
1234567
12345678
FF
GG
【样例输出 2】
0 1 1 1
0 0 1 1
0 0 0 1
0 0 0 0

答案及解析

单选题

1、
【答案】B
【考纲知识点】 计算机基础知识
【解析】本题属于考察计算机基础知识。APP是英语单词application的简写,代表应用软件的意思。

2、
【答案】B
【考纲知识点】 流程图的概念与描述
【解析】本题属于考察计算机流程图知识,只要满足条件,就执行“是”后面的语句,是个循环结构。a=5和4的时候执行s=sa,结果是5*4=20。

3、
【答案】C
【考纲知识点】 计算机字符编码知识
【解析】本题属于考察计算机字符编码知识。‘A’的ASCII值是65,可以推出‘L’是76,将其转换成二进制,答案是C。

4、
【答案】B
【考纲知识点】C++语言基础
【解析】本题属于考察C++语言基础知识。B运算符不存在。

5、
【答案】A
【考纲知识点】 数组和数据类型
【解析】本题属于考察C ++语言知识,包括数组和数据类型。一维数组中有4个元素,long long类型每个数字占8个字节,4*8=32。选A。

6、
【答案】A
【考纲知识点】 数组知识
【解析】本题属于考察C ++语言数组知识,数组下标从0开始,3个元素的下标分别是0/1/2.选A。

7、
【答案】B
【考纲知识点】 数组知识
【解析】本题属于考察C ++语言的数组知识,A的写法需要明确数组大小;C中数组大小必须是整数;D需要用指针类型指向一个new的数组。选B。

8、
【答案】C
【考纲知识点】 进制知识
【解析】本题属于考察C ++语言的进制知识,日常生活中,十进制最常用;A中进制都可以表示小数;D中数字8不能出现,选C。

9、
【答案】C
【考纲知识点】 数组知识
【解析】本题属于考察C ++语言的数组知识,选择不正确的,在不同编译器下,数组越界不一定会产生编译错误,选C。

10、
【答案】A
【考纲知识点】 表达式及位运算
【解析】本题属于考察C ++语言的计算表达式和位运算知识,A选项中,先计算a+1000-1000=a,a==a成立;B中a如果导致a*2越界就不成立;C中a是偶数,和1做与位运算结果是0;D中a是奇数的时候,和1做或运算不等于a+1,选A。

11、
【答案】B
【考纲知识点】 表达式
【解析】本题属于考察C ++语言的表达式知识,注意是找不能正确判断的条件,B选项中,例如a=4,b=5,(a>>1)是等于(b>>1)的,因此选B。

12、
【答案】D
【考纲知识点】 字符知识
【解析】本题属于考察C ++语言的字符知识,大写字符是从‘A’到‘Z’,在这个区间内,就是大写字符。注意B选项,如果a=‘b’,根据ASCII码,’A’<=a成立,返回值是1,1<=’Z’,所以B选项不正确,通过判断,选D。

13、
【答案】B
【考纲知识点】 基本运算
【解析】本题属于考察C ++语言的运算知识,程序的目的是实现a和b的数据交换,用a的低8位保留b的值,原来的数值保存在a的高八位,因此b=a>>8即得到a原来的值。将a的高8位清空,与0xff做与运算即可,0xff的高八位是0,得到b之前的结果,选B。

14、
【答案】D
【考纲知识点】 循环语句,复合赋值运算符
【解析】本题属于考察C ++语言的for循环语句和复合赋值运算符知识,简单将选项A、B、C代入到代码段,都不能达到预期结果。所以前3个选项都不正确,通过判断,选D。

15、
【答案】B
【考纲知识点】 多层循环结构,数组
【解析】本题属于考察C ++语言的数组知识,array数组赋值分别是0到9,然后注意里面的双重循环。p是从2到9,对array数组重新赋值。例如,p=2时,array[2]=2,条件成立,进入第2重循环,n的范围是2到9,注意步长是2,对每个数组元素重新赋值,数组重新变为0 1 1 3 2 5 3 7 4 9。一直到循环完成,累加array数组,结果是B。

判断题

1、
【答案】错误
【考纲知识点】 进制转换
【解析】本题是计算机二进制和转换十进制的知识,整数部分是5,小数部分是0.625。

2、
【答案】正确
【考纲知识点】 位运算符知识
【解析】本题是计算机运算符的知识。

3、
【答案】错误
【考纲知识点】 计算机字符
【解析】本题是计算机字符和数字的知识,字符‘3’用整数51表示,不等于3。

4、
【答案】错误
【考纲知识点】 数组
【解析】本题是计算机数组知识,不会引起编译错误,使用时可能会产生错误。

5、
【答案】正确
【考纲知识点】 位运算
【解析】本题是计算机位运算知识,左移后,后面的位数用0补充,所以移动若干次,都会变成0。

6、
【答案】错误
【考纲知识点】 数组
【解析】本题是计算机数组知识,下标的大小和两者都有关系。

7、
【答案】错误
【考纲知识点】 数组的定义
【解析】本题是计算机数组知识,数组定义方式有很多,正确的也包括:int d[]={1,2,3};这种格式。

8、
【答案】错误
【考纲知识点】 枚举算法
【解析】本题是计算机算法知识,枚举法是枚举所有的可能,枚举不出所有的偶数,所以不能用枚举法证明哥德巴赫猜想。

9、
【答案】正确
【考纲知识点】 进制和比较运算符
【解析】本题是计算机十六进制和比较运算符的知识,0xff的十进制是255。

10、
【答案】正确
【考纲知识点】 位运算和比较运算符
【解析】本题是计算机位运算和比较运算符知识,a是整数,只有是偶数和1做与运算的结果才等于0。

编程题1

1、
【题目大意】
1.小杨有n个存钱罐,存钱罐的编号是0~n-1。例如他有5天,每天向某个存钱罐存放i元钱,即:第1天,i=1;第2天,i=2,依次类推。
【考纲知识点】
1.基本运算、输入输出语句、一维数组的知识。
【解题思路】
1、按题目要求定义好需要的变量,并实现输入;
2、根据题意,最多有1000个存钱罐,建立存钱数组,数组大小大于等于1000即可。要存d天,存的元数分别是1~d元,循环范围最好写成i=1;i<=d;
3、每次存钱前,先读入要存的存钱罐编号,然后将i累加到该存钱罐中;
4、最后,输出每个存钱罐中的元数。注意存钱罐的编号是0~n-1。

#include <iostream>

using namespace std;
int jar[1000];
int main() {
	int n = 0, d = 0;
	cin >> n >> d;
	for (int i = 0; i < n; i++)
		jar[i] = 0;
	for (int i = 1; i <= d; i++){
		int a = 0;
		cin >> a;
		jar[a] += i;
	}
	cout << jar[0];
	for (int i = 1; i < n; i++)
		cout << " " << jar[i];
	cout << endl;
	return 0;
}

编程题2

2、
【题目大意】
1.输入多个字符串,每个字符串包括09、‘A’‘Z’这些字符构成,判断能否可能是二进制、八进制、十进制和十六进制,有可能哪个进制都不是。
【考纲知识点】
1.多层循环结构、基本运算、输入输出语句、字符。
【解题思路】
1.根据进制知识,二进制由0和1,构成;八进制由07构成;十进制由09构成;十六进制由09和AF构成。如果字符中有大于1的字符,肯定不能用二进制表示;大于7的,不能用二进制和八进制表示;大于9的,不能用二进制、八进制和十进制表示;大于F的,不能用二进制、八进制、十进制和十六进制表示;
2.找出字符串中最大的那个字符,分别和1,8,9,F比较,如果小于等于,就可以用二进制、八进制、十进制或十六进制表示,否则不能表示。

#include <iostream>

using namespace std;

int main() {
	int n = 0;
	cin >> n;
	for (int i = 0; i < n; i++){
		char str[11];
		cin >> str;
		char max = '0';
		for (int i = 0; str[i] != '\0'; i++)
			if (str[i] > max)
				max = str[i];
		cout << (max <= '1') << " " << (max <= '7') << " " << (max <= '9') << " " << (max <= 'F') << endl; 
	}	
	return 0;
}
文章来源:https://blog.csdn.net/QD_Jason/article/details/135070723
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。