C++ ⼀级 2023 年03⽉
GESP CCF 编程能力等级认证 C++ 一级试卷
(满分:100 分 考试时间:90 分钟)学校:__________ 姓名:__________
| 题目 | 一 | 二 | 三 | 总分 |
|---|---|---|---|---|
| 得分 |
一、单选题(每题 2 分,共 30 分)
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | B | A | A | C | B | D | D | A | A | D | B | C | D | B | C |
第 1 题
以下不属于计算机输入设备的有( )。
A. 键盘
B. 音箱
C. 鼠标
D. 传感器
【解析】本题属于考察计算机基础知识中的“输入”和“输出”概念;“输入”指外界 向机器内部传递信息,“输出”指计算机内部信息向外界展示。此题中,“音箱”属 于向外部播放声音,故属于输出概念,所以本题正确答案为B。
第 2 题
计算机系统中存储的基本单位用 B 来表示,它代表的是( )。
A. Byte
B. Block
C. Bulk
D. Bit
【解析】本题属于考察计算机基础知识中,关于存储的基本单位;计算机中,表 示存储大小的最小单位为“字节”,英文为“Byte”,表示一个字节存储空间大小的 单位,用大写字母B 表示,所以本题正确答案为A。
第 3 题
常量 7.0 的数据类型是( )。
A. double
B. float
C. void
D. int
【解析】本题考察考生对于C++基本数据类型的了解:关于基本数据类型,有整 型int,浮点型double、float,字符型char,布尔型bool,本题中7.0 是小数形 式,属于浮点型,C++中浮点型默认是double,所以本题正确答案为A。
第 4 题
下列关于 C++ 语言的叙述,不正确的是( )。
A. 变量定义时可以不初始化
B. 变量被赋值之后的类型不变
C. 变量没有定义也能够使用
D. 变量名必须是合法的标识符
【解析】本题考察C++语言中变量的定义与使用;关于变量的定义与使用,变量 在定义时可以不初始化,变量名必须是合法的标识符,并且变量被赋值之后的类 型不变,均不符合题意,故A、B、D 排除;选项C 变量必须定义才能使用,没 有定义变量就使用会造成编译错误,所以本题正确答案为C。
第 5 题
以下不可以作为 C++ 标识符的是( )。
A. x321
B. 0x321
C. x321_
D. _x321
【解析】本题察C++语言中变量的定义与使用;根据变量的命名规则:1.只能包 含大小写字母、数字、下划线;2.必须以大小写字母或者下划线开头;3.不能使 用C++的指令或关键字。选项B 为0x321,以数字开头,违反变量的命名规则, 所以本题正确答案为B。
第 6 题
以下哪个不是 C++ 语言的关键字?( )
A. int
B. for
C. do
D. cout
【解析】本题考察输入输出语句及变量的定义与使用两部分内容;输入输出的 cin 和cout 都是C++的常对象,但不是关键字。C++的关键字如下图所示:所以本题正确答案为D。
| auto | false | static | using | $ if $ | goto | static_cast |
|---|---|---|---|---|---|---|
| bool | true | public | namespace | else | and | const_cast |
| char | enum | protected | inline | for | not | dynamic_cast |
| int | union | private | new | while | $ or $ | reinterpret_cast |
| short | struct | virtual | delete | $ do $ | xor | static_assert |
| long | class | override | this | switch | return | register |
| float | wchar_t | final | nullptr | case | try | explicit |
| double | sizeof | operator | void | default | catch | extern |
| signed | typeid | const | friend | break | throw | |
| unsigned | typedef | constexpr | template | continue | noexcept |
第 7 题
如果 a、b 和 c 都是 int 类型的变量,下列哪个语句不符合 C++ 语法?( )
A.c = a + b;
B.c += a + b;
C.c = a = b;
D.c = a++b;
【解析】本题属于考察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。
第 8 题
如果用两个 int 类型的变量 a 和 b 分别表达长方形的长和宽,则下列哪个表达式不能用来计算长方形的周长?( )
A.2 * (a + b)
B.2 * a + 2 * b
C.a + b + a + b
D.b + a * 2 + b
【解析】本题主要考察基本运算中的算术运算;长方形的周长公式是(长+宽)2 或者长2+宽2 或四条边相加;选项A 根据运算规则,先算乘法 (b2) ,后算加 法a+b*2,不能用来计算长方形的周长,所以本题正确答案为A。
第 9 题
表达式(((3 == 0) + 'A' + 1 + 3.0))的结果类型为( )。
A. double
B. int
C. char
D. bool
【解析】本题考察C++基本运算过程中的隐式类型转换;算式中, ((3==0)) 的计算 结果为bool 类型、 (‘A’) 为char 类型常量、1 为int 类型常量、3.0 为double 类型常量,将它们相加时会从低精度的高精度的进行类型转换,最终结果为double 类 型,所以本题正确答案为A。
第 10 题
如果 a 为 int 类型的变量,且 a 的值为 6,则执行a *= 3;之后,a 的值会是( )。
A. 3
B. 6
C. 9
D. 18
【解析】本题考察C++基本运算; (a*=3) 相当于 (a=a * 3) ,a 的值一开始是6,所以 (6*3=18) ,将这个结果再赋给a,a 的值变为18,所以本题正确答案为D
第 11 题
如果 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
选项A 条件1 是 (a0) ,条件2 是 (b0) ,两个条件之间用逻辑与&&,两个条件都 满足,整个条件就满足,符合a 等于0 且b 等于0;
选项B 是先判断a 和b 是否相等,若相等表达式 (ab) 的值为1,若不相等 (ab) 的值为0,再判断表达式 (a==b) 的值是否等于0,只有a 和b 不相等时,整个表达 式成立;
选项C 条件1 是!a,a 为0 时,!a 为1,条件成立,条件2 是!b,b 为0 时,!b 为1,条件成立,两个条件之间是逻辑与&&关系,两个条件都满足,整个条件 就满足,符合a 等于0 且b 等于0;
选项D 中 (a0) 条件满足为1, (b0) 条件满足也为1,两个都满足相加结果为2 两个条件有任意不满足则相加结果可能为0 或 (1 。) 。因此,判断相加结果是否等于 2,符合a 等于0 且b 等于0;
第 12 题
如果 a 为 int 类型的变量,下列哪个表达式可以正确求出满足 “大于等于 a 且是 4 的倍数” 的整数中最小的?( )A.a * 4
B.a / 4 * 4
C.(a + 3) / 4 * 4
D.a - a % 4 + 4
选项A,假设a 为3,a4 即为 (34=12,12) 虽然满足大于等于a 且是4 的倍数,但 不是满足条件的整数中最小的,排除A;
选项B,假设a 为3,a/3 结果为0,因为a 为int 类型,int 类型进行计算,结果 还是int,会把小数部分舍去,故 (a/3*4) 结果为0,不满足条件,排除B
选项C,令 (a=4k+t) ,k 是一个整数, (0<=t<=3) ,则 ((a+3) / 4=(4 k+t+3) / 4=k+(t+3) / 4) 。如 果a 是4 的倍数,则 (t=0) , ((a+3) / 4 * 4=k^{} 4=a) ,等于a 且是4 的倍数;否则 (t>=1) ,((4 k+4) / 4^{} 4<=(a+3) / 4^{} 4<=(4 k+6) / 4^{} 4) ,即 ((4 k+4)<=(a+3) / 4^{*} 4<=(4 k+4)) ,结果为 4k+4,大于a 且是4 的倍数的整数中最小的,满足题意;
选项D,假设a 为 (4,4%4=0) (a-a%4+4=8) ,8 虽然满足大于等于a 且是4 的倍数, 但不是满足条件的整数中最小的,排除D;
第 13 题
在下列代码的横线处填写( ),可以使得输出是 “20 10”。
#include<iostream>usingnamespacestd;intmain(){inta=10,b=20;a=;// 在此处填入代码b=a/100;a=a%100;cout<<a<<" "<<b<<endl;return0;}A.a + b
B.(a + b) * 100
C.b * 100 + a
D.a * 100 + b
【解析】由于题目中没有分支、循环语句,可以尝试由结果反推。已知在第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。
第 14 题
在下列代码的横线处填写( ),可以使得输出是 “1248”。
#include<iostream>usingnamespacestd;intmain(){for(inti=1;i<=8;)// 在此处填入代码cout<<i;return0;}A.i++
B.i *= 2
C.i += 2
D.i * 2
【解析】本题考察控制语句结构中的循环结构。变量i 的初始值是1,循环条件 是i 小于等于8,循环范围是从1 到8,循环体中输出i,得到的输出是1248,规 律是在前一个的基础上乘2,每次i*2 之后赋给i,所以本题正确答案为B。【解析】本题考察循环结构和选择结构。循环范围是从1 到20,每次循环结束 后i++,i 自增1;循环内判断当前数是3 或者是5 的倍数,就将i 累加到sum 当 中,故从1 到20,满足条件的数有3 5 6 9 10 12 15 18 20,相加结果为98,所以 本题正确答案为C。
第 15 题
执行以下 C++ 语言程序后,输出结果是( )。
#include<iostream>usingnamespacestd;intmain(){intsum=0;for(inti=1;i<=20;i++)if(i%3==0||i%5==0)sum+=i;cout<<sum<<endl;return0;}A. 210
B. 113
C. 98
D. 15
【解析】本题考察计算机基础中快捷键的使用。Ctrl+X 表示剪切文件(复制并从原 位置删除),Ctrl+V 表示粘贴所剪切的文件。所以本题正确。
二、判断题(每题 2 分,共 20 分)
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | √ | × | × | √ | × | × | × | × | √ | √ |
在 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
2022 1样例输出 1
31样例输入 2
2020 2样例输出 2
29【题目大意】条件判断问题,主要分清平年和闰年,平年2 月28 天,闰年2 月 29 天,其余按照大小月取分,输出对应的天数。
1.定义变量:年份y、月份m 为int 类型、判断是否为闰年的bool 类型leap 并赋 值为false(一开始让它为平年);
2.输入年份、月份;
3.判断是否为闰年,如果是400 的倍数,或者是4 的倍数但不是100 的倍数,就 是闰年,将leap 改为true;
4.判断是否为大月:1、3、5、7、8、10、12 月为大月,输出31;小月:4、6、 9、11 月为小月,输出30;如果不是大月也不是小月,看下是否为闰年,闰年输 出29,否则输出28。
参考程序
#include<iostream>usingnamespacestd;intmain(){inty=0,m=0;cin>>y>>m;boolleap=false;// 判断闰年if(y%400==0)leap=true;if(y%4==0&&y%100!=0)leap=true;if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)cout<<31<<endl;// 大月elseif(m==4||m==6||m==9||m==11)cout<<30<<endl;// 小月elseif(leap)cout<<29<<endl;// 闰年2月elsecout<<28<<endl;// 平年2月return0;}2. 长方形面积
问题描述
小明刚刚学习了如何计算长方形面积。他发现,如果一个长方形的长和宽都是整数,它的面积一定也是整数。现在,小明想知道如果给定长方形的面积,有多少种可能的长方形,满足长和宽都是整数?
如果两个长方形的长相等、宽也相等,则认为是同一种长方形。约定长方形的长大于等于宽。正方形是长方形的特例,即长方形的长和宽可以相等。
输入描述
输入一行,包含一个整数 A,表示长方形的面积。约定 2 ≤ A ≤ 1000。
输出描述
输出一行,包含一个整数 c,表示有 c 种可能的长方形。
样例输入 1
4样例输出 1
2样例解释 1
2 种长方形面积为 4,它们的长宽分别为 2×2、4×1。
样例输入 2
6样例输出 2
2样例解释 2
2 种长方形面积为 6,它们的长宽分别为 3×2、6×1。
【题目大意】统计长方形的个数。两个长方形的长和宽相等算一种情况,所以规 定长大于宽;长和宽相等是正方形,是长方形的特例,算一种情况。统计完个数 之后输出。
1.定义变量:面积area、计数变量cnt、宽w;
2.利用循环列举所有宽的可能性,从1 开始,到宽*宽小于等于面积即可,后面 大于宽的就是长了,和前面统计过的算一种情况,所以不用往后遍历。
3.每次循环判断面积对宽取余是不是为0,如果为0,说明长、宽都是整数,满 足题意,计数变量cnt++;
4.for 循环结束后输出计数变量cnt。
【解题思路】
参考程序
#include <iostream> using namespace std; int main() { int area = 0, cnt = 0; //面积area、计数变量cnt cin >> area; //输入面积 for (int w = 1; w * w <= area; w++) { //宽从1 开始到宽*宽<=面积 if (area % w == 0) //如果面积是宽的倍数,说明满足题意,cnt++ cnt++; } cout << cnt << endl; //输出cnt return 0; } 用循环列举所有宽的可能性,从1 开始,到宽*宽小于等于面积即可,后面 大于宽的就是长了,和前面统计过的算一种情况,所以不用往后遍历。 3.每次循环判断面积对宽取余是不是为0,如果为0,说明长、宽都是整数,满 足题意,计数变量cnt++; 4.for 循环结束后输出计数变量cnt。 【解题思路】 #### 参考程序 ```c++ #include <iostream> using namespace std; int main() { int area = 0, cnt = 0; //面积area、计数变量cnt cin >> area; //输入面积 for (int w = 1; w * w <= area; w++) { //宽从1 开始到宽*宽<=面积 if (area % w == 0) //如果面积是宽的倍数,说明满足题意,cnt++ cnt++; } cout << cnt << endl; //输出cnt return 0; }