CCF编程能力等级认证GESP---C++2级---20230611
- [单选题(每题 2 分,共 30 分)](#单选题(每题 2 分,共 30 分))
- [判断题(每题 2 分,共 20 分)](#判断题(每题 2 分,共 20 分))
- 编程题 (每题 25 分,共 50 分)
- 答案及解析
单选题(每题 2 分,共 30 分)
1、高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。
cpp
A. 编辑
B. 保存
C. 调试
D. 编译
2、能够实现下面流程图功能的伪代码是( )。
cpp
A. if 条件判断 then 语句块
B. if 条件判断 then 什么也不做 else 语句块
C. while 条件判断 do 语句块
D. while not 条件判断 do 语句块
3、下列关于 C++语言的叙述,正确的是( )。
cpp
A. char 类型变量不能赋值给 int 类型的变量。
B. 两个 int 类型变量相乘,计算结果还是 int 类型。
C. 计算两个 int 类型变量相乘时,如果乘积超出了 int 类型的取值范围,程序会报错崩溃。
D. 计算两个 double 类型变量相除时,如果除数的值为0.0,程序会报错崩溃。
4、下列关于 C++语言的叙述,不正确的是( )。
cpp
A. if 语句中的判断条件必须用小括号'('和')'括起来。
B. for 语句中两个';'之间的循环条件可以省略,表示循环继续执行的条件一直满足。
C. 循环体包含多条语句时,可以用缩进消除二义性。
D. 除了"先乘除、后加减",还有很多运算符优先级。
5、以下哪个是 C++语言的关键字?( )
cpp
A. main
B. max
C. double
D. sqrt
6、以下哪个不是 C++语言的运算符?( )
cpp
A. >=
B. /=
C. ||
D. <>
7、如果 a 为 int 类型的变量,b 为 char 类型的变量,则下列哪个语句不符合C++语法?( )
cpp
A. a = a + 1.0;
B. a = (int)(b - '0');
C. b = (char)(a + '0');
D. (int)b = a;
8、如果用两个 int 类型的变量 a 和 b 分别表达平行四边形的两条边长,用int 类型的变量 h 表达 a 边对应的高,则下列哪个表达式不能用来计算b 边对应的高?( )
cpp
A. a / b * (0.0 + h)
B. (0.0 + a * h) / b
C. a * h / (b + 0.0)
D. (a + 0.0) * h / b
9、以下哪个循环语句会无限次执行?( )
cpp
A. for (int a = 0; a; a++) ;
B. for (bool b = false; b <= true; b++) ;
C. for (char c = 'A'; c < 'z'; c++) ;
D. for (double d = 0.0; d < 10.0; d += 0.001) ;
10、如果 a 为 char 类型的变量,且 a 的值为'C'(已知'C'的ASCII 码为67),则执行 cout << (a + 2);会输出( )。
cpp
A. E
B. C+2
C. C2
D. 69
11、11. 如果 a 和 b 均为 int 类型的变量,下列表达式能正确判断"a 等于1 且b等于1"的是( )。
cpp
A. (a == b) && (b == 1)
B. (a && b)
C. (a == b == 1)
D. (a * b == 1)
12、如果 a 为 char 类型的变量,下列哪个表达式可以正确判断"a 是数字"?()
cpp
A. '0' <= a && a <= '9'
B. '1' <= a && a <= '0'
C. '0' <= a <= '9'
D. '1' <= a <= '0'
13、在下列代码的横线处填写( ),使得输出是 9。
cpp
#include <iostream>
using namespace std;
int main(){
char a = '3', b = '6';
cout << ________; // 在此处填入代码
return 0;
}
cpp
A. (a + b)
B. (a + b - '0')
C. (char)(a + b)
D. (char)(a + b - '0')
14、在下列代码的横线处填写( ),可以使得输出是42。
cpp
#include <iostream>
using namespace std;
int main(){
int sum = 0;
for (int i = 1; i <= 20; i++)
if (________) // 在此处填入代码
sum += i;
cout << sum << endl;
return 0;
}
cpp
A. i % 3 == 0
B. 20 % i == 0
C. i <= 8
D. i >= 18
15、执行以下 C++语言程序后,输出结果是( )。
cpp
#include <iostream>
using namespace std;
int main(){
for (char x = 'A'; x <= 'D'; x++)
if ((x != 'A') + (x == 'C') + (x == 'D') + (x != 'D') == 3)
cout << x;
return 0;
}
cpp
A. A
B. B
C. C
D. D
判断题(每题 2 分,共 20 分)
1、诞生于 1986 年的中华学习机 CEC-I 入选了 2021 年的CCF 计算机历史记忆(一类),它的内存只有 64KB。当时的汉字编码字符集 GB2312 中共有6763 个汉字,假如每个汉字用 2 个字节编码,将整个 GB2312 汉字字符集都放入CEC-I 的内存,也只占用了不超过 1/5 的内存空间。
2、域名是由一串用点分隔的名字来标识互联网上一个计算机或计算机组的名称,CCF 编程能力等级认证官方网站的域名是 gesp.ccf.org.cn,其中顶级域名是gesp。
3、在使用 C++语言编写程序时,不能使用 sqrt、abs 等数学函数,包含或<math.h>头文件后就能够使用了。
4、在 C++语言中,标识符中可以有下划线' _ '。同时,' _ '也是C++语言的运算符。
5、如果 a 是 double 类型的变量,而且值为 3.5,则表达式a * 10 的计算结果为35,且结果类型为 int。
6、在 if 语句中,如果条件成立时需要执行多条语句,可以使用大括号'{'和'}'将这些语句括起来。
7、循环语句的循环体有可能无限制地执行下去。
8、++和==都是 C++语言的运算符,但+=不是。
9、. 如果 a 为 char 类型的变量,且取值为大写字母'F',则执行语句a = a + 1;后,a的值会变为大写字母'G'。
10、表达式 sqrt(9.0)的计算结果为 3,且结果类型为 int。
编程题 (每题 25 分,共 50 分)
找素数
【问题描述】
小明刚刚学习了素数的概念:如果一个大于 1 的正整数,除了1 和它自身外,不能被其他正整数整除,则这个正整数是素数。现在,小明想找到两个正整数A和B之间(包括A和B)有多少个素数?
【输入描述】
输入 2 行,第一行包含正整数A,第二行包含正整数B。约定2 ≤A≤B≤1000。
【输出描述】
输出一行,包含一个整数C,表示找到C个素数。
【样例输入 1】
2
10
【样例输出 1】
4
【样例解释1】
在 2 和 10 之间有 4 个素数,分别为:2、3、5、7。
【样例输入 2】
98
100
【样例输出 2】
0
自幂数判断
【问题描述】
自幂数是指,一个N位数,满足各位数字N次方之和是本身。例如,153是3位数,其每位数的 3 次方之和,1^3^ + 5^3^ + 3^3^ = 153,因此153 是自幂数;1634是 4 位数,其每位数的 4 次方之和,1^4^ + 6^4^ + 3^4^ + 4^4^ = 1634,因此1634 是自幂数。
【输入描述】
输入第一行是一个正整数M,表示有M个待判断的正整数。约定1 ≤M≤100。
从第 2 行开始的M行,每行一个待判断的正整数。约定这些正整数均小于10^8^。
【输出描述】
输出M行,如果对应的待判断正整数为自幂数,则输出英文大写字母'T',否则输出英文大写字母'F'。
提示:不需要等到所有输入结束在依次输出,可以输入一个数就判断一个数并输出,再输入下一个数。
【样例输入 1】
3
152
111
153
【样例输出 1】
F
F
T
【样例输入 2】
5
8208
548834
88593477
12345
5432
【样例输出 2】
T
T
T
F
F
答案及解析
单选题
1、
【答案】D
【考纲知识点】计算机基础(一级)
【解析】本题考察计算机基础知识中编译的概念;编译是把高级语言变成计算机可以识别的二进制语言的过程,所以本题正确答案为 D。
2、
【答案】D
【考纲知识点】流程图的概念与描述(二级),循环语句(一级)【解析】本题考察对流程图的理解,以及循环结构中的while 循环;观察流程图可知,当条件判断不成立时,会执行语句块,并重新进行条件判断,当条件判断成立时,则流程继续往下进行,所以本题正确答案为 D。
3、
【答案】B
【考纲知识点】数据类型的转换(二级)
【解析】本题考察 C++中数据类型转换的规则;A 选项错误在于:char 类型变量可以赋值给 int 类型的变量,赋值结果为 char 类型变量中存放的整数值;C选项
错误在于:如果两个 int 类型变量相乘的乘积超出了 int 类型的取值范围,那么会发生溢出,得到错误的结果,但是程序不会崩溃;D 选项错误在于:两个double类型变量相除时,如果除数的值为 0.0,得到的结果是特殊的double 类型值INF(被除数为正数时,正无穷)、-INF(被除数为负数时,负无穷)或NaN(被除数为 0 时,无意义),但是程序不会崩溃;所以本题正确答案为B。
4、
【答案】C
【考纲知识点】循环结构(一级)
【解析】本题考察循环语句的语法规则;C 选项错误在于:循环体包含多条语句时,需要用花括号把循环体中的所有语句括起来;所以本题正确答案为C。
5、
【答案】C
【考纲知识点】计算机基础与编程环境(一级)
【解析】本题考察 C++语言中"关键字"的概念;关键字就是预先定义好的标识符,C++编译器对其进行特殊处理,它们不能作为常量名、变量名或其他标识符名称;选项中只有 double 是关键字,其余均为函数名,所以本题正确答案为C。
6、
【答案】D
【考纲知识点】基本运算(一级)
【解析】本题考察 C++语言中的运算符;选项 A 为比较运算符:大于等于;选项B 为赋值运算符:除并赋值;选项 C 为逻辑运算符:逻辑或;选项D 不是C++中的运算符;所以本题正确答案为 D。
7、
【答案】D
【考纲知识点】数据类型的转换(二级)
【解析】本题主要考察 C++中数据类型转换的规则;强制类型转换得到的是改变类型的值,不再是能被赋值的变量;所以本题正确答案为D。
8、
【答案】A
【考纲知识点】基本运算(一级),数据类型的转换(二级)【解析】本题主要考察 C++运算中除法的规则以及类型转换规则;在C++中,两个变量进行运算,如果两个变量都是 int 类型,那么结果仍然为int 类型(除法向下取整),如果两个变量中至少一个是 double 类型,那么结果为double 类型;在本题中,需要避免出现两个 int 类型变量相除,导致计算结果错误;只有A选项的除号两边都是 int 类型,所以本题正确答案为 A。
9、
【答案】B
【考纲知识点】基本数据类型(一级)
【解析】本题主要考察bool类型的运算规则;bool类型的取值范围是false和true,分别对应 0 和 1;B 选项中的 b++会使得 false 变为 true,true 依然变为true,导致循环条件始终成立,所以本题正确答案为 B。
10、
【答案】D
【考纲知识点】数据类型的转换(二级)
【解析】本题主要考察数据类型转换中的类型提升;两个不同类型的变量进行运算时,一般会把字节数较小(低精度)的类型自动转换为字节数较大(高精度)的类型,再进行运算;题目中 a 是 char 类型,2 是 int 类型,那么a+2 的结果是int 类型,输出的结果是整数 69,所以本题正确答案为D。
11、
【答案】A
【考纲知识点】基本运算(一级)
【解析】本题主要考察 C++条件判断的语法格式;判断两个条件是否同时成立时,需要把两个条件用&&符号连接起来;B 选项只要 a 和 b 都非0 即成立;C 选项会将(a==b)的结果(0 或 1)与 1 判断相等,于是只要 a 和b 相等,结果就为真;D选项 a 和 b 都是-1 也满足条件;A 选项符合语法规则,所以本题正确答案为A。
12、
【答案】A
【考纲知识点】ASCII 编码(二级),基本运算(一级)【解析】本题考察 C++中的比较运算以及数字字符的 ASCII 码;判断两个条件是否同时成立时,需要把两个条件用&&符号连接起来,C、D 选项不符合要求;数字字符的 ASCII 码最小的是'0',最大的是'9',所以本题正确答案为A。
13、
【答案】D
【考纲知识点】ASCII 编码、数据类型的转换(二级)【解析】本题考察数据类型转换中的类型提升以及数字字符的ASCII 码;字符变量 a 的值是'3',相当于'0'加 3,字符变量 b 的值是'6',相当于'0'加6,因此a+b等于'0'+3+'0'+6,再减掉'0'的结果就是字符'9';由于加减法运算只能处理数值类型,而 char 不是数值类型,因此会把 char 转换成 int 进行计算,结果也是int 类型,最终输出字符时需要强制转换成 char 类型,所以本题正确答案为D。
14、
【答案】B
【考纲知识点】多层分支/循环结构(二级)
【解析】本题主要考察对循环语句和条件判断语句的理解;模拟程序执行过程可知,四个选项对应的输出结果分别是 63、42、36 和 57,所以本题正确答案为B。
15、
【答案】C
【考纲知识点】多层分支/循环结构(二级),基本运算(一级)
【解析】本题主要考察对循环语句和条件判断语句的理解;括号内条件成立时结果为 true,也就是 1,否则为 false,也就是 0;字符 x 取字母A 到D,取到C时,恰好满足四个条件中的三个,总和为 3,所以本题正确答案为C。
判断题
1、
【答案】×
【考纲知识点】基本数据类型(一级)
【解析】本题考察数据类型与内存空间的计算;6763 个汉字,占用6763×2=13526字节,除以 1024 约为 13.21KB,超过了 64KB 的 1/5。所以本题错误。
2、
【答案】×
【考纲知识点】计算机网络(二级)
【解析】本题考察计算机网络中的域名概念;顶级域名是指域名最右边的那个词,gesp.ccf.org.cn 的顶级域名是.cn。所以本题错误。
3、
【答案】√
【考纲知识点】程序设计语言的特点(二级)
【解析】本题考察 C++语言中的头文件;包含或<math.h>头文件后,可以使用 sqrt、abs 等数学函数,所以本题正确。
4、
【答案】×
【考纲知识点】基本运算、变量的定义与使用(一级)
【解析】本题考察 C++中标识符的命名规则,以及 C++基本运算;C++的标识符中可以用下划线,但是下划线不是 C++语言的运算符,所以本题错误。
5、
【答案】×
【考纲知识点】基本运算(一级),数据类型的转换(二级)【解析】本题考察 C++运算中除法的规则以及类型转换规则;在C++中,两个变量进行运算,如果两个变量中至少一个是 double 类型,那么结果为double 类型,所以本题错误。
6、
【答案】√
【考纲知识点】选择结构(一级)
【解析】本题考察控制语句结构中的选择结构;如果条件成立时需要执行多条语句,可以使用大括号将这些语句括起来,所以本题正确。
7、
【答案】√
【考纲知识点】循环结构(一级)
【解析】本题考察控制语句结构中的循环结构;如果每次判断循环条件的结果都为真,那么循环体有可能无限地执行下去,所以本题正确。
8、
【答案】×
【考纲知识点】基本运算(一级)
【解析】本题考察基本运算中的算术运算以及赋值语句;++是自增运算符,==是比较运算符,+=是复合加赋值运算符,三者都是 C++语言的运算符,所以本题错误。
9、
【答案】√
【考纲知识点】ASCII 编码(二级)
【解析】本题考察 ASCII 编码;大写字母'F'的 ASCII 码加1 后,表示的是大写字母'G',所以本题正确。
10、
【答案】×
【考纲知识点】常用数学函数(二级)
【解析】本题考察常用数学函数中的 sqrt 函数,该函数的返回值类型为double,所以本题错误。
编程题1
1、
【题目大意】
统计整数 A 到 B 范围内的素数个数,数据范围不超过1000。
【考纲知识点】
多层分支/循环结构(二级)
【解题思路】
1、 枚举 A 到 B,依次检查每个数是不是素数。
2 、用变量 isPrime 表示当前枚举的数 n 是否为素数,初始化为true,如果找到了除了 1 和 n 以外的因数,则把 isPrime 赋值为 false。
3 、寻找 n 的因数时,只需要枚举 2 到根号 n。因为如果n 有一个大于根号n的因数 k,那么就一定存在一个小于根号 n 的因数 n/k。4. 使用变量 cnt 记录素数的个数,最终输出即可。
cpp
#include <iostream>
using namespace std;
int main(){
int a, b;
cin >> a >> b;
int res = 0;
bool is_p;
for (int i = a; i <= b; i++){
is_p = true;
for (int j = 2; j * j <= i; j++){
if (i % j == 0){
is_p = false;
break;
}
}
if (is_p){
res++;
}
}
cout << res;
return 0;
}
编程题2
2、
【题目大意】
判断 M 个给定的整数是否是自幂数。一个 x 位的整数n 是自幂数的条件是:各位数字的 x 次方之和等于 n。给定的正整数均小于10
8。【考纲知识点】
多层分支/循环结构(二级)
【解题思路】
1、每次输入 n 之后,首先计算 n 的位数 l。可以把 n 赋值给t,然后不断把t 除以 10,直到 t 等于 0 为止,每除一次就把变量 l 加 1。
2、得到位数 l 后,再次把 t 赋值为 n,然后使用 while 循环,每次取t 的个位,计算其 l 次方计入总和 sum,然后把 t 除以 10,直到 t 等于0 为止。
3、如果 sum 等于 n,说明 n 是自幂数,按照题目要求输出即可。
cpp
#include <iostream>
using namespace std;
int main(){
int n, num, sum;
cin >> n;
for (int i = 1; i <= n; i++){
cin >> num;
sum = 0;
int temp = num;
int index = 0;
while (temp){
index++;
temp /= 10;
}
temp = num;
int ji;
for (int j = 1; j <= index; j++){
int ge = temp % 10;
ji = 1;
for (int k = 1; k <= index; k++){
ji *= ge;
}
temp /= 10;
sum += ji;
}
if (sum == num)
cout << 'T' << endl;
else
cout << 'F' << endl;
}
return 0;
}