CCF编程能力等级认证GESP—C++1级—20230611
单选题(每题 2 分,共 30 分)
1、以下不属于计算机输出设备的有( )。
A. 麦克风
B. 音箱
C. 打印机
D. 显示器
正确答案:A
A选项:这个选项不属于计算机输出设备。麦克风是一种输入设备,它用于捕捉声音并将其转换成电信号输入到计算机中。
B选项:这个选项属于计算机输出设备。音箱用于播放计算机中的音频信号,将电信号转换成声音,是从计算机内部向外输出。
C选项:这个选项属于计算机输出设备。打印机用于将计算机中的文档或图像打印到纸张上,是从计算机内部向外输出。
D选项:这个选项属于计算机输出设备。显示器用于显示计算机的图形界面和视频内容,是从计算机内部向外输出。
2、ChatGPT 是 OpenAI 研发的聊天机器人程序,它能通过理解和学习人类的语言来进行对话,还能根据聊天的上下文进行互动,完成很多工作。请你猜猜看,下面任务中,ChatGPT 不能完成的是( )。
A. 改邮件
B. 编剧本
C. 擦地板
D. 写代码
正确答案:C
A选项:ChatGPT可以协助修改邮件内容,提供语言上的建议和编辑帮助。
B选项:ChatGPT能够根据给定的指令或提示来创作或编辑剧本,这是其语言理解和生成能力的应用之一。
C选项:ChatGPT是一款聊天机器人程序,它没有物理形态,因此无法执行实际的物理任务,如擦地板。
D选项:ChatGPT可以帮助编写代码,提供编程建议和代码示例。
3、常量’3’的数据类型是( )。
A. double
B. float
C. char
D. int
正确答案:C
A选项:这个选项不正确。double类型用于表示双精度浮点数,通常带有小数部分,例如3.0或3.14。
B选项:这个选项不正确。float类型用于表示单精度浮点数,也是用于带有小数部分的数值。
C选项:这个选项正确。在C++中,单引号括起来的单个字符,如’3’,表示一个char类型的字符常量。它代表的是字符’3’在ASCII码表中的数值。
D选项:这个选项不正确。int类型用于表示整数,不带引号的数字3会被识别为int类型,但’3’是一个字符常量,不是整数。
4、下列关于 C++语言变量的叙述,正确的是( )。
A. 变量可以没有定义
B. 对一个没有定义的变量赋值,相当于定义了一个新变量
C. 执行赋值语句后,变量的类型可能会变化
D. 执行赋值语句后,变量的值可能不会变化
正确答案:D
A选项:这个选项不正确。在C++中,变量必须先定义后使用,否则编译器会报错。
B选项:这个选项不正确。在C++中,不能对未定义的变量赋值,这样的代码会导致编译错误。
C选项:这个选项不正确。在C++中,一旦变量被声明为某种类型,它的类型就固定了,不会因赋值而改变。
D选项:这个选项是正确的。如果赋值语句将变量原来的值重新赋给了它自己,那么变量的值就不会变化。例如:int a = 5; a = 5; 在这里,变量a的值在赋值后并没有变化。
5、以下可以作为 C++标识符的是( )。
A. number_of_Chinese_people_in_millions
B. 360AntiVirus
C. Man&Woman
D. break
正确答案:A
A选项:这个选项是正确的。这是一个合法的C++标识符,因为它只包含字母、数字和下划线,并且以字母开头。
B选项:这个选项是不正确的。虽然这个标识符只包含字母和数字,但它以数字开头,违反了C++标识符的命名规则。
C选项:这个选项是不正确的。C++标识符不能包含特殊字符,如&。
D选项:这个选项是不正确的。break是C++语言中的一个关键字,不能用作标识符。
6、以下哪个不是 C++语言的关键字?( )
A. double
B. else
C. while
D. endl
正确答案:D
A选项:这个选项是C++语言的关键字,用于声明双精度浮点型变量。
B选项:这个选项是C++语言的关键字,用于条件语句中,与if配合使用。
C选项:这个选项是C++语言的关键字,用于创建一个循环,该循环会一直执行,直到指定的条件不再为真。
D选项:这个选项不是C++语言的关键字,而是一个由C++标准库中的I/O流操作定义的操纵符。endl用于输出一个换行符,并刷新输出缓冲区,但它不是语言的关键字。
7、如果 a、b 和 c 都是 int 类型的变量,下列哪个语句不符合C++语法?( )
A. a = (b == c);
B. b = 5.5;
C. c = a + b + c;
D. a + c = b + c;
正确答案:D
【考纲知识点】基本运算(一级)
A选项:这是符合C++语法的语句,(b == c)是一个比较表达式,结果为bool类型,a被赋值为true或false。
B选项:这是符合C++语法的语句,5.5是一个浮点数,但在赋值给int类型的变量b时,会发生隐式类型转换,5.5会被转换为int类型的5。
C选项:这是符合C++语法的语句,a + b + c是一个算术表达式,结果为int类型,c被赋值为a、b和c的和。
D选项:这是不符合C++语法的语句,因为左边的a + c是一个表达式,而不是一个变量,不能将值赋给一个表达式。在C++中,赋值运算符左边必须是可以存储值的变量。
8、如果用一个 int 类型的变量 a 表达正方形的边长,则下列哪个表达式不能用来计算正方形的面积?( )
A. a * a
B. 1 * a * a
C. a ^ 2
D. a * 2 * a / 2
正确答案:C
A选项:这是计算正方形面积的正确表达式,a * a表示边长乘以边长。
B选项:这也是计算正方形面积的正确表达式,1 * a * a等同于a * a,只是乘以了一个无意义的1,不影响结果。
C选项:这是不能用来计算正方形面积的表达式,a ^ 2在C++中表示按位异或操作,不是数学上的指数运算。因此,这个表达式计算的是a与2进行异或操作的结果,而不是a的平方。
D选项:这是计算正方形面积的正确表达式,a * 2 * a / 2等同于a * a,因为乘以2后紧接着除以2,结果不变。
9、表达式(4 * (11 + 12) / 4)的计算结果为( )。
A. 47
B. 20
C. 23
D. 56
选项:C
首先,我们按照运算顺序来计算表达式:
- 计算括号内的加法:11+12=23
- 然后,将结果乘以4:4∗23=92
- 最后,将结果除以4:92/4=23
因此,表达式4∗(11+12)/4的计算结果为23。
10、如果 a 为 int 类型的变量,且 a 的值为 6,则执行 a %= 4;之后,a 的值会是( )。
A. 1
B. 2
C. 3
D. 4
正确答案:B
- 分析复合赋值运算符%=的含义
复合赋值运算符%=的作用是先进行取余运算,然后将取余的结果再赋值给左边的变量。其等效于a = a % 4这样的操作。- 计算取余运算的值
已知变量a的值初始为6,进行a % 4的运算,也就是计算6除以4的余数。
在 C++ 中,取余运算(%)的规则是:对于整数a和b(b不为0),a % b得到的结果是a除以b后的余数。
6除以4,商为1,余数为2,即6 % 4 = 2。- 完成复合赋值操作
按照a %= 4等价于a = a % 4的规则,经过前面计算得到余数为2,那么最终变量a的值就被更新为2。
11、如果 a 和 b 均为 int 类型的变量,下列表达式能正确判断“a 等于0 且b等于0”的是( )。
A. (a == b == 0)
B. !(a || b)
C. (a + b == 0)
D. (a == 0) + (b == 0)
正确答案:B
A选项:这是不正确的表达式,因为a == b == 0在C++中不是有效的语法。它不能正确判断“a等于0且b等于0”。
B选项:这是正确的表达式,!(a || b)等价于!a && !b,即“a不为真且b不为真”,对于int类型的变量,这等价于“a等于0且b等于0”。
C选项:这是不正确的表达式,因为a + b == 0只在a和b互为相反数时为真,例如a = 1, b = -1,但并不一定意味着a和b都等于0。
D选项:这是不正确的表达式,因为(a == 0) + (b == 0)的结果是一个整数,而不是一个布尔值。它不能正确判断“a等于0且b等于0”。
12、如果 a 和 b 为 int 类型的变量,且值分别为 7 和 2,则下列哪个表达式的计算结果不是 3.5?( )
A. 0.0 + a / b
B. (a + 0.0) / b
C. (0.0 + a) / b
D. a / (0.0 + b)
正确答案:A
A选项:这是不正确的表达式,因为0.0 + a / b首先计算a / b,由于a和b都是int类型,所以a / b的结果是整数除法,即3。然后加上0.0,结果是3.0,而不是3.5。
B选项:这是正确的表达式,因为(a + 0.0) / b首先计算a + 0.0,结果是7.0,然后除以b,即7.0 / 2,结果是3.5。
C选项:这是正确的表达式,因为(0.0 + a) / b首先计算0.0 + a,结果是7.0,然后除以b,即7.0 / 2,结果是3.5。
D选项:这是正确的表达式,因为a / (0.0 + b)首先计算0.0 + b,结果是2.0,然后a除以2.0,即7 / 2.0,结果是3.5。
13、在下列代码的横线处填写( ),使得输出是"20 10"。
#include <iostream>
using namespace std;
int main(){
int a = 10, b = 20;
a = ________; //在此处填入代码
b = a + b;
a = b - a;
cout << a << " " << b << endl;
return 0;
}
A. a + b
B. b
C. a - b
D. b - a
正确答案:C
A选项:如果填入 a + b ,那么 a 的值会立即变为 10 + 20 = 30 。后续执行 b = a + b 时, b 的值就变成了 30 + 20 = 50 ,再执行 a = b - a ,结果就不符合期望输出的 “20 10” 了,所以选项 A 错误。
B选项:若填入 b , a 的值会变为 20 ,接着 b = a + b 时, b 就变成了 20 + 20 = 40 ,再执行 a = b - a ,同样得不到期望的输出结果,所以选项 B 错误。
C选项:当填入 a - b 时, a 的初始值 10 减去 b 的初始值 20 , a 就变为 -10 。然后执行 b = a + b ,即 b = -10 + 20 = 10 ,再执行 a = b - a ,此时 a = 10 - (-10) = 20 ,正好符合输出 “20 10” 的要求,所以选项 C 正确。
D选项:若填入 b - a , a 的值会变为 20 - 10 = 10 ,后续执行 b = a + b 以及 a = b - a 操作后,也不能得到期望的输出结果,所以选项 D 错误。
14、. 在下列代码的横线处填写( ),可以使得输出是"147"。
#include <iostream>
using namespace std;
int main(){
for (int i = 1; i <= 8; i++)
if (________) // 在此处填入代码
cout << i;
return 0;
}
A. i % 2 == 1
B. i % 3 == 1
C. i = i + 3
D. i + 3
正确答案:B
A选项:这个条件检查i是否为奇数。在1到8的范围内,奇数有1、3、5、7,因此这个条件会输出"13579",不符合要求。
B选项:这个条件检查i除以3的余数是否为1。在1到8的范围内,满足这个条件的数有1、4、7,因此这个条件会输出"147",符合要求。
C选项:这不是一个有效的条件表达式,而是一个赋值语句。即使忽略这一点,这个赋值语句会导致i的值在每次循环时增加3,而不是检查任何条件。
D选项:这是一个算术表达式,不是布尔表达式,不能用于if语句的条件判断。
15、执行以下 C++语言程序后,输出结果是( )。
#include <iostream>
using namespace std;
int main(){
int sum;
for (int i = 1; i <= 20; i++)
if (i % 3 == 0 || i % 5 == 0)
sum += i;
cout << sum << endl;
return 0;
}
A. 63
B. 98
C. 113
D. 无法确定
正确答案:D
由于sum变量在循环开始之前没有初始化,其值是未定义的。在C++中,未初始化的局部变量包含垃圾值,这意味着sum的初始值是不确定的。因此,即使循环逻辑是正确的,但由于sum的初始值是不确定的,最终的输出结果也是不确定的。
判断题(每题 2 分,共 20 分)
1、计算机硬件主要包括运算器、控制器、存储器、输入设备和输出设备。
正确答案:正确
计算机硬件主要由以下几个部分组成:
运算器:负责执行算术和逻辑运算。
- 控制器:控制数据的流动和计算机中其他组件的操作。
- 存储器:包括内存(RAM)和非易失性存储(如硬盘、固态硬盘等),用于存储程序和数据。
- 输入设备:如键盘、鼠标、扫描仪等,用于将用户输入的数据和指令输入到计算机中。
- 输出设备:如显示器、打印机、扬声器等,用于将计算机处理的结果输出给用户。
这些组件共同协作,使计算机能够执行各种任务和操作。因此,题目中的陈述是正确的。
2、诞生于 1958 年的 103 机是中国第一台通用数字电子计算机,比1946 年在美国诞生的第一台通用电子计算机 ENIAC 晚了十多年。
正确答案:正确
中国的103机,也被称为“长城203”,是中国自行设计和制造的第一台大型通用数字电子计算机,诞生于1958年。而世界上第一台通用电子计算机ENIAC(Electronic Numerical Integrator and Computer)是在1946年在美国诞生的。因此,103机比ENIAC晚了大约12年。所以,题目中的陈述是正确的。
3、在 C++语言中,计算结果必须存储在变量中才能输出。
正确答案:错误
在C++语言中,计算结果可以直接输出,而不必非得存储在变量中。可以直接使用输出语句输出表达式的结果。
4、在 C++语言中,标识符的命名不能完全由数字组成,至少有一个字母就可以。
正确答案:错误
【考纲知识点】变量的定义与使用(一级)
在C++语言中,标识符的命名规则要求必须以字母(大写或小写)或下划线(_)开头,不能以数字开头。标识符可以包含数字,但至少需要一个字母或下划线作为第一个字符。因此,标识符不能完全由数字组成,必须包含至少一个字母或下划线。
5、10 是一个 int 类型常量。
正确答案:正确
在C++语言中,不带小数部分的数字默认为整型常量,其类型为int。因此,数值10是一个int类型的常量。这个常量在程序中可以像其他整型值一样使用,且其值在程序执行期间不会改变。所以,题目中的陈述是正确的。
6、if 语句可以没有 else 子句。
正确答案:正确
在C++语言中,if语句用于根据条件的真假来决定是否执行一段代码。其中,else子句是可选的。如果不需要在条件为假时执行任何操作,可以省略else子句,只保留if部分。这样,当条件不满足时,程序将简单地跳过if块中的代码,继续执行后续的代码。
7、do … while 语句的循环体至少会执行一次。
正确答案:正确
do…while循环的基本结构如下:
do {
// 循环体,至少执行一次
} while (条件);
程序执行流程:
- 程序首先执行do代码块内的循环体。
- 执行完毕后,程序会检查while后面的条件表达式。
- 如果条件为真(非零),则重新执行do代码块中的循环体。
- 如果条件为假(零),则退出循环,继续执行后续的代码。
由于条件的检查是在循环体执行之后进行的,所以循环体至少会被执行一次,无论条件最终是否满足。
8、如果 a 和 b 为 int 类型的变量,则表达式 a = b 可以判断a 和b 是否相等。
正确答案:错误
- 赋值操作:a = b意味着将b的值复制到a中。这是一个单向操作,只改变a的值,不会返回任何值(特别是,它不返回一个表示真假的布尔值)。
- 比较操作:要比较两个变量是否相等,应该使用比较运算符,如==。例如,a == b会检查a和b的值是否相等,并返回一个布尔值(true或false)。
表达式a = b不能用于判断a和b是否相等,因为它是一个赋值操作,而不是比较操作。因此,题目中的陈述是错误的。正确的比较操作应该使用a == b。
9、如果 a 为 int 类型的变量,则表达式(a % 4 == 2)可以判断a 的值是否为偶数。
正确答案:错误
表达式a % 4 == 2不能用来判断a的值是否为偶数,因为它仅在a是形如4k + 2的数时为真。因此,题目中的陈述是错误的。正确的判断方法是使用a % 2 == 0。
10、表达式(37 / 4)的计算结果为 9,且结果类型为 int。
正确答案:正确
在C++语言中,当两个整数相除时,结果是整数除法,即结果会向下取整到最接近的整数。因此,37 / 4的结果是9,且结果类型为int。
编程题 (每题 25 分,共 50 分)
时间规划
【问题描述】
小明在为自己规划学习时间。现在他想知道两个时刻之间有多少分钟,你能通过编程帮他做到吗?
【输入描述】
输入 4 行,第一行为开始时刻的小时,第二行为开始时刻的分钟,第三行为结束时刻的小时,第四行为结束时刻的分钟。
输入保证两个时刻是同一天,开始时刻一定在结束时刻之前。时刻使用24小时制,即小时在 0 到 23 之间,分钟在 0 到 59 之间。
【输出描述】
输出一行,包含一个整数,从开始时刻到结束时刻之间有多少分钟。
【样例输入 1】
9
5
9
6
【样例输出 1】
1
【样例输入 2】
9
5
10
0
【样例输出 2】
55
#include <iostream>
using namespace std;
int main() {
int h1, m1, h2, m2; // 定义需要的变量
cin >> h1 >> m1; // 输入开始时刻的小时 h1,开始时刻的分钟m1
cin >> h2 >> m2; // 输入结束时刻的小时 h2,结束时刻的分钟m2
cout << (h2 - h1) * 60 + (m2 - m1) << endl;
return 0;
}
累计相加
【问题描述】
输入一个正整数n,求形如:1 + (1 + 2) + (1 + 2 + 3) + (1 +2 +3 +4)+…⋯(1 + 2 + 3 + 4 + 5 + …⋯n)的累计相加。
【输入描述】
输入一个正整数。约定 1 ≤ n ≤ 100。
【输出描述】
输出累计相加的结果。
【样例输入 1】
3
【样例输出 1】
10
【样例输入 2】
4
【样例输出 2】
20
【样例输入 3】
10
【样例输出 3】
220
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int sum = 0; // 定义计数变量 sum 初始化为 0,用于累加求和
for (int i = 1; i <= n; i++) // 遍历每一项,i 表示当前项数
sum += (i + 1) * i / 2; // 把每个多项式的值累加到sum 中求和
cout << sum << endl; // 输出结果
return 0;
}