2023 年 3 月 GESP C++ 一级真题解析
2023 年 3 月 GESP C++ 一级真题解析
CCF 编 程 能 力 等 级 认 证 , 英 文 名 Grade Examination of Software Programming(以下简称 GESP),由中国计算机学会发起并主办,是为青少年计算机和编程学习者提供学业能力验证的平台。GESP 覆盖中小学全学段,符合条件的青少年均可参加认证。GESP 旨在提升青少年计算机和编程教育水平,推广和普及青少年计算机和编程教育。
GESP 考察语言为图形化(Scratch)编程、Python 编程及 C++编程,主要考 察学生掌握相关编程知识和操作能力,熟悉编程各项基础知识和理论框架,通过 设定不同等级的考试目标,让学生具备编程从简单的程序到复杂程序设计的编程 能力,为后期专业化编程学习打下良好基础。
本次为大家带来的是 2023 年 3 月份,C++ 一级考试真题解析。
一、单选题(每题 2 分,共 30 分)
-
以下不属于计算机输入设备的有( )。
A. 键盘 B.音箱 C.鼠标 D.传感器
【答案】B
【考纲知识点】计算机基础(一级)
【解析】本题属于考察计算机基础知识中的“输入”和“输出”概念;“输入”指外界向机器内部传递信息,“输出”指计算机内部信息向外界展示。此题中,“音箱”属于向外部播放声音,故属于输出概念,所以本题正确答案为 B。 -
计算机系统中存储的基本单位用 B 来表示,它代表的是( )。
A. Byte
B. Block C.Bulk D.Bit
【答案】A
【考纲知识点】计算机基础(一级)
【解析】本题属于考察计算机基础知识中,关于存储的基本单位;计算机中,表示存储大小的最小单位为“字节”,英文为“Byte”,表示一个字节存储空间大小的单位,用大写字母 B 表示,所以本题正确答案为 A。
-
常量 7.0 的数据类型是()。
A. double
B. float
C. void
D. int
【答案】A
【考纲知识点】基本数据类型(一级)
【解析】本题考察考生对于 C++基本数据类型的了解:关于基本数据类型,有整型 int,浮点型 double、float,字符型 char,布尔型 bool,本题中 7.0 是小数形式,属于浮点型,C++中浮点型默认是 double,所以本题正确答案为 A。 -
下列关于 C++语言的叙述,不正确的是()。
A. 变量定义时可以不初始化
B. 变量被赋值之后的类型不变
C. 变量没有定义也能够使用
D. 变量名必须是合法的标识符
【答案】C
【考纲知识点】变量的定义与使用(一级)
【解析】本题考察 C++语言中变量的定义与使用;关于变量的定义与使用,变量在定义时可以不初始化,变量名必须是合法的标识符,并且变量被赋值之后的类型不变,均不符合题意,故 A、B、D 排除;选项 C 变量必须定义才能使用,没有定义变量就使用会造成编译错误,所以本题正确答案为 C。
-
以下不可以作为 C++标识符的是()。
A. x321
B. 0x321
C. x321_
D. _x321
【答案】B
【考纲知识点】变量的定义与使用(一级)
【解析】本题察 C++语言中变量的定义与使用;根据变量的命名规则:1.只能包含大小写字母、数字、下划线;2.必须以大小写字母或者下划线开头;3.不能使用 C++的指令或关键字。选项 B 为 0x321,以数字开头,违反变量的命名规则,所以本题正确答案为 B。 -
以下哪个不是 C++语言的关键字?
A. int
B. for
C. do
D. cout
【答案】D
【考纲知识点】计算机基础与编程环境(一级)
【解析】本题考察输入输出语句及变量的定义与使用两部分内容;输入输出的
cin 和 cout 都是 C++的常对象,但不是关键字。C++的关键字如下图所示:
所以本题正确答案为 D。
- 如果 a、b 和 c 都是 int 类型的变量,下列哪个语句不符合 C++语法?
A. c = a + b;
B. c += a + b;
C. c = a = b;
D. c = a ++ b;
【答案】D
【考纲知识点】基本运算(一级)
【解析】本题属于考察 C++基本运算中的算术运算;选项 A 是将 a 加 b 的和赋值给 c;选项 B 等价于 c=c+(a+b),将 a 和 b 的值相加,再加上 c 的值之后,赋给 c;选项 C 是将 b 赋给 a,再将 a 赋给 c;选项 D 中++是自增运算符,a++表示的是 a在原本的值上自增 1,后面跟上 b 不符合 C++语法,所以本题正确答案为 D。
-
如果用两个 int 类型的变量 a 和 b 分别表达长方形的长和宽,则下列哪个表达式不能用来计算长方形的周长?
A. a + b * 2
B. 2 * a + 2 * b
C. a + b + a + b
D. b + a * 2 + b
【答案】A
【考纲知识点】基本运算(一级)
【解析】本题主要考察基本运算中的算术运算;长方形的周长公式是(长+宽)
2 或者长2+宽2 或四条边相加;选项 A 根据运算规则,先算乘法 b2,后算加法 a+b*2,不能用来计算长方形的周长,所以本题正确答案为 A。 -
表达式((3 == 0) + ‘A’ + 1 + 3.0)的结果类型为()。
A. double
B. int
C. char
D. bool
【答案】A
【考纲知识点】基本运算(一级)
【解析】本题考察 C++基本运算过程中的隐式类型转换;算式中,(3==0)的计算结果为 bool 类型、’A’为 char 类型常量、1 为 int 类型常量、3.0 为 double 类型常
量,将它们相加时会从低精度的高精度的进行类型转换,最终结果为 double 类型,所以本题正确答案为 A。
-
如果 a 为 int 类型的变量,且 a 的值为 6,则执行 a = 3;之后,a 的值会是()。
A. 3
B. 6
C. 9
D. 18
【答案】D
【考纲知识点】基本运算(一级)
【解析】本题考察 C++基本运算;a=3 相当于 a=a3,a 的值一开始是 6,所以 63=18,将这个结果再赋给 a,a 的值变为 18,所以本题正确答案为 D。 -
如果 a 和 b 均为 int 类型的变量,下列表达式不能正确判断“a 等于 0 且 b 等于 0”的是()
A. (a == 0) && (b == 0)
B. (a == b == 0)
C. (!a) && (!b)
D. (a == 0) + (b == 0) == 2
【答案】B
【考纲知识点】基本运算(一级)
【解析】本题主要考察 C++基本运算中的逻辑运算;
选项 A 条件 1 是 a0,条件 2 是 b0,两个条件之间用逻辑与&&,两个条件都满足,整个条件就满足,符合 a 等于 0 且 b 等于 0;
选项 B 是先判断 a 和 b 是否相等,若相等表达式 a==b 的值为 1,若不相等 a==b的值为 0,再判断表达式 a==b 的值是否等于 0,只有 a 和 b 不相等时,整个表达式成立;
选项 C 条件 1 是!a,a 为 0 时,!a 为 1,条件成立,条件 2 是!b,b 为 0 时,!b为 1,条件成立,两个条件之间是逻辑与&&关系,两个条件都满足,整个条件就满足,符合 a 等于 0 且 b 等于 0;
选项 D 中 a==0 条件满足为 1,b==0 条件满足也为 1,两个都满足相加结果为 2,两个条件有任意不满足则相加结果可能为 0 或 1。因此,判断相加结果是否等于 2,符合 a 等于 0 且 b 等于 0;
所以本题正确答案为 B。
- 如果 a 为 int 类型的变量,下列哪个表达式可以正确求出满足“大于等于 a 且是 4 的倍数”的整数中最小的?
A. a * 4
B. a / 4 * 4
C. (a + 3) / 4 * 4
D. a - a % 4 + 4
【答案】C
【考纲知识点】基本运算(一级)
【解析】本题考察 C++基本运算中的算术运算;
选项 A,假设 a 为 3,a4 即为 34=12,12 虽然满足大于等于 a 且是 4 的倍数,但不是满足条件的整数中最小的,排除 A;
选项 B,假设 a 为 3,a/3 结果为 0,因为 a 为 int 类型,int 类型进行计算,结果还是 int,会把小数部分舍去,故 a/34 结果为 0,不满足条件,排除 B;
选项 C,令 a=4k+t,k 是一个整数,0<=t<=3,则(a+3)/4=(4k+t+3)/4=k+(t+3)/4。如果 a 是 4 的倍数,则 t=0 , (a+3)/44=k*4=a,等于 a 且是 4 的倍数;否则 t>=1,
(4k+4)/44 <= (a+3) /44 <= (4k+6)/44,即(4k+4) <= (a+3) /44 <= (4k+4),结果为 4k+4,大于 a 且是 4 的倍数的整数中最小的,满足题意;
选项 D,假设 a 为 4,4%4=0,a-a%4+4=8,8 虽然满足大于等于 a 且是 4 的倍数,但不是满足条件的整数中最小的,排除 D;
所以本题正确答案为 C。
- 在下列代码的横线处填写(),可以使得输出是“20 10”。
A. a + b
B. (a + b) * 100
C. b * 100 + a
D. a * 100 + b
【答案】D
【考纲知识点】基本运算(一级)
【解析】由于题目中没有分支、循环语句,可以尝试由结果反推。已知在第 8行,输出“20 10”,因此此时 a 为 20、b 为 10。第 7 行对 a 赋值后得到的就是第 8 行时 a 的值 20,可知第 7 行语句执行前 a 除以 100 的余数为 20。由于第 7行未改变 b 的值,第 6 行对 b 赋值后得到的就是第 8 行时 b 的值 10,可知第 6行语句执行前 a 除以 100 的商为 10。由于第 6 行未改变 a 的值,综合第 7 行得
到的线索,可知第 6 行语句执行前,a 应为 1020。第 5 行语句执行前,a 为 10、
b 为 20,四个选项中,只有选项 D 的表达式的计算结果为 1020。所以本题正确答案为 D。
- 在下列代码的横线处填写(),可以使得输出是“1248”。
A. i++
B. i = 2
C. i += 2
D. i * 2
【答案】B
【考纲知识点】控制语句结构(一级)
【解析】本题考察控制语句结构中的循环结构。变量 i 的初始值是 1,循环条件是 i 小于等于 8,循环范围是从 1 到 8,循环体中输出 i,得到的输出是 1248,规律是在前一个的基础上乘 2,每次 i2 之后赋给 i,所以本题正确答案为 B。
- 执行以下 C++语言程序后,输出结果是()。
A. 210
B. 113
C. 98
D. 15
【答案】C
【考纲知识点】控制语句结构(一级)
【解析】本题考察循环结构和选择结构。循环范围是从 1 到 20,每次循环结束后 i++,i 自增 1;循环内判断当前数是 3 或者是 5 的倍数,就将 i 累加到 sum 当中,故从 1 到 20,满足条件的数有 3 5 6 9 10 12 15 18 20,相加结果为 98,所以本题正确答案为 C。
二、判断题(每题 2 分,共 20 分)
-
在 Windows 系统中通过键盘完成对选定文本移动的按键组合是先 Ctrl+X,移动到目标位置后按 Ctrl+V。
【答案】√
【考纲知识点】计算机基础(一级)
【解析】本题考察计算机基础中快捷键的使用。Ctrl+X 表示剪切文件(复制并从原位置删除),Ctrl+V 表示粘贴所剪切的文件。所以本题正确。 -
程序员用 C、C++、Python、Scratch 等编写的程序能在 CPU 上直接执行。
【答案】×
【考纲知识点】计算机基础(一级)
【解析】本题属于对编程语言特点的考察。题目中所列举的编程语言,均无法在 CPU 上直接执行,而是需要通过各自的方式,转换成机器语言后才能被 CPU 识别和执行,所以本题错误。 -
在 C++语言中,注释不宜写得过多,否则会使得程序运行速度变慢。
【答案】×
【考纲知识点】计算机编程环境(一级)
【解析】本题考察计算机的编程环境。注释信息是写在代码当中方便程序阅读者理解代码的,养成书写注释的好习惯能够为编写更大规模的程序及团队合作打好基础。注释信息会在编译过程中被去掉,不会产生机器指令,也就不会影响程序运行速度,所以本题错误。
-
在 C++语言中,标识符中可以有数字,但不能以数字开头。
【答案】√
【考纲知识点】变量的定义与使用(一级)
【解析】本题考察 C++语言中变量的定义与使用。根据变量的命名规则:1.只能包含大小写字母、数字、下划线;2.必须以大小写字母或者下划线开头;3.不能使用 C++的关键字。故标识符中可以有数字,但不能以数字开头,所以本题正确。 -
'3’是一个 int 类型常量。
【答案】×
【考纲知识点】基本数据类型(一级)
【解析】本题主要考察基本数据类型。int 是整型,例如 3 是一个 int 类型常量。但 3 加上单引号之后’3’在 C++语言中表示字符,它是 char 类型常量。所以本题错误。 -
if 语句中的条件表达式的结果必须为 bool 类型。
【答案】×
【考纲知识点】控制语句结构(一级)
【解析】本题主要考察控制语句结构。if 语句的条件表达式不一定是 bool 类型,也可能是其他类型,任何非零值都会被视为真,而零值会被视为假。例如,如果 a 为 int 类型变量,则 if (a) ; 是否符合 C++语法的 if 语句,表示判断 a 是否为 0:
a 不等于 0 时,则视为真,if 条件成立;反之,如果 a 等于 0,则视为假,if 条件不成立。但 a 的类型为 int 类型,并不是 bool 类型,所以本题错误。
-
for 语句的循环体至少会执行一次。
【答案】×
【考纲知识点】控制语句结构(一级)
【解析】本题主要考察 for 循环结构,for 循环分四步走:1. 执行第一个分号前的初始表达式;2. 判断两个分号之间的循环条件表达式结果是否为真;3. 执行循环体;4. 执行第二个分号后的步进表达式,并回到第 2 步重新判断。其中第 2步,如果执行初始表达式后的状态循环条件表达式为假,则不会执行循环体。此时循环体一次也没有执行就结束了循环,所以本题错误。 -
如果 a 为 int 类型的变量,则赋值语句 a = a + 3;是错误的,因为这条语句会导致 a 无意义。
【答案】×
【考纲知识点】变量的定义与使用(一级)
【解析】本题主要考察变量的定义与使用。尽管数学上 a=a+3 是无解的,但在 C++语言中 a=a+3 并不表示方程或恒等式。a 为 int 类型的变量,执行 a=a+3;,会让 a 的值变为在原值的基础上增加 3,不会导致 a 无意义。所以本题错误。 -
如果 a 为 int 类型的变量,则表达式(a / 4 == 2)和表达式(a >= 8 && a <= 11)的结果总是相同的。
【答案】√
【考纲知识点】基本运算(一级)
【解析】本题考察基本运算。由于 a 为 int 类型,表达式 a/4 中的除号/为整除运算。因此表达式(a/4==2)表示 a 除以 4 的商为 2,于是 a 的值从 8 到 11 时表达式
结果为真,否则为假。这与表达式(a >= 8 && a <= 11)的结果总是相同的,所以本题正确。
- 表达式(3.5 * 2)的计算结果为 7.0,且结果类型为 double。
【答案】√
【考纲知识点】基本运算(一级)
【解析】本题考察了基本运算中的算术运算,在 C++语言中,3.5 为 double 类型常量,2 为 int 类型的常量,double 类型与 int 类型做乘法运算的结果是 double类型,结果为 7.0,所以本题正确。
三、编程题(每题 25 分,共 50 分)
- 每月天数
【问题描述】
小明刚刚学习了每月有多少天,以及如何判断平年和闰年,想到可以使用编程方法求出给定的月份有多少天。你能做到吗?
【输入描述】
输入一行,包含两个整数,分别表示一个日期的年、月。
【输出描述】
输出一行,包含一个整数,表示输入月份有多少天。
【样例输入 1】
【样例输出 1】
【样例输入 2】
【样例输出 2】
【题目大意】条件判断问题,主要分清平年和闰年,平年 2 月 28 天,闰年 2 月
29 天,其余按照大小月取分,输出对应的天数。
【考纲知识点】基本数据类型、控制语句结构、输入输出语句、变量的定义与使用(一级)
【解题思路】
-
定义变量:年份 y、月份 m 为 int 类型、判断是否为闰年的 bool 类型 leap 并赋值为 false(一开始让它为平年);
-
输入年份、月份;
-
判断是否为闰年,如果是 400 的倍数,或者是 4 的倍数但不是 100 的倍数,就是闰年,将 leap 改为 true;
-
判断是否为大月:1、3、5、7、8、10、12 月为大月,输出 31;小月:4、6、
9、11 月为小月,输出 30;如果不是大月也不是小月,看下是否为闰年,闰年输出 29,否则输出 28。
【参考程序】 -
长方形面积
【问题描述】
小明刚刚学习了如何计算长方形面积。他发现,如果一个长方形的长和宽都是整数,它的面积一定也是整数。现在,小明想知道如果给定长方形的面积,有多少种可能的长方形,满足长和宽都是整数?
如果两个长方形的长相等、宽也相等,则认为是同一种长方形。约定长方形的长大于等于宽。正方形是长方形的特例,即长方形的长和宽可以相等。
【输入描述】
输入一行,包含一个整数,表示长方形的面积。约定 2 ≤ A ≤ 1000。
【输出描述】
输出一行,包含一个整数,表示有种可能的长方形。
【样例输入 1】
【样例输出 1】
【样例解释 1】
2 种长方形面积为 4,它们的长宽分别为 2 x 2,4 x 1。
【样例输入 2】
【样例输出 2】
【样例解释 2】
2 种长方形面积为 6,它们的长宽分别为 3 x 2,6 x 1。
【题目大意】统计长方形的个数。两个长方形的长和宽相等算一种情况,所以规定长大于宽;长和宽相等是正方形,是长方形的特例,算一种情况。统计完个数之后输出。
【考纲知识点】变量的定义与使用、控制语句、基本运算、输入输出语句(一级)
【解题思路】
- 定义变量:面积 area、计数变量 cnt、宽 w;
- 利用循环列举所有宽的可能性,从 1 开始,到宽*宽小于等于面积即可,后面大于宽的就是长了,和前面统计过的算一种情况,所以不用往后遍历。
- 每次循环判断面积对宽取余是不是为 0,如果为 0,说明长、宽都是整数,满足题意,计数变量 cnt++;
- for 循环结束后输出计数变量 cnt。
【参考程序】