CCF编程能力等级认证GESP—C++1级—20231209
单选题(每题 2 分,共 30 分)
1、以下C++不可以作为变量的名称的是( )。
A. CCF GESP
B. ccfGESP
C. CCFgesp
D. CCF_GESP
正确答案:A
在C++中,变量名是由一系列字符组成的,这些字符可以是字母、数字或下划线。但是,变量名不能包含空格。
2、 C++表达式 10 - 3 * (2 + 1) % 10 的值是( )。
A. 0
B. 1
C. 2
D. 3
正确答案:B
10 − 3 ∗ ( 2 + 1 ) % 10 10 - 3 * (2 + 1) \% 10 10−3∗(2+1)%10
= 10 − 3 ∗ 3 % 10 =10 - 3 * 3 \% 10 =10−3∗3%10
= 10 − 9 % 10 = 10 - 9 \% 10 =10−9%10
= 10 − 9 = 10 - 9 =10−9
= 1 = 1 =1
3、假设现在是上午十点,求出N小时(正整数)后是第几天几时,如输入20小时则为第2天6点,如N输入4则为今天14点。为实现相应功能,应在横线处填写代码是( )。
int N, dayX, hourX;
cin >> N;
dayX = ____, hourX = ____;
if (dayX == 0)
cout << "今天" << hourX << "点";
else
cout << "第" << (dayX + 1) << "天" << hourX << "点";
A. (10 + N) % 24 , (10 + N) / 24
B. (10 + N) / 24 , (10 + N) % 24
C. N % 24 , N / 24
D. 10 / 24 , 10 % 24
正确答案:B
首先通过除以24来找出天数,然后通过模24来找出剩余的小时数。注意,这里我们不需要考虑日期的实际天数(例如2月可能只有28或29天),因为我们只关心小时数如何影响天数,并且这个计算是基于24小时制的。
4、下面的程序用于判断N是否为偶数,横线处应填写代码是( )。
cin >> N;
if (____)
cout << "偶数";
else
cout << "奇数";
A. N % 2 == 0
B. N % 2 = 0
C. N % 2
D. N % 2 != 0
正确答案:A
要判断一个整数N是否为偶数,我们可以通过检查N除以2的余数是否为0来实现。
在C++中,我们使用模运算符%来获取余数,并使用==来比较两个值是否相等。
5、下面对C++代码执行后输出的描述,正确的是( )。
cin >> N;
cnt = 0;
for (int i = 1; i < N; i++)
cnt += 1;
cout << cnt;
A. 如果输⼊的N是⼩于等于2整数,第5⾏将输出0。
B. 如果输⼊的N是⼤于等于2整数,第5⾏将输出N-1。
C. 如果输⼊的N是⼤于等于2整数,第5⾏将输出N。
D. 以上说法均不正确。
正确答案:B
A选项:这个选项是不正确的。因为当N大于等于2时,循环至少会执行一次(当i等于1时),所以cnt至少会被加1,因此输出不会是0。
B选项:这个选项是正确的。因为循环从1迭代到N-1,所以cnt会被加N-1次(从i=1到i=N-1),因此输出将是N-1。
C选项:这个选项是不正确的。如之前所述,cnt只会被加N-1次,所以输出不会是N。
D选项:由于B选项是正确的,所以这个选项也是不正确的。
6、下面C++代码执行后的输出是( )。
cnt = 0;
for (int i = 1; i < 10; i++){
cnt += 1;
i += 2;
}
cout << cnt;
A. 10
B. 9
C. 3
D. 1
正确答案:C
| i < 10 | cnt | i += 2 | i++ |
|---|---|---|---|
| true | 1 | 3 | 4 |
| true | 2 | 6 | 7 |
| true | 3 | 9 | 10 |
| false |
7、下面C++代码执行后的输出是( )。
cnt = 0;
for (int i = 1; i < 20; i++){
if (i % 2)
continue;
else if (i % 3 == 0 && i % 5 == 0)
break;
cnt += i;
}
cout << cnt;
A. 90
B. 44
C. 20
D. 10
正确答案:A
| i | i < 20 | i % 2 | i % 3 == 0 && i % 5 == 0 | cnt | 备注 |
|---|---|---|---|---|---|
| 1 | true | true | i为奇数时均continue | ||
| 2 | true | false | false | 2 | |
| 4 | true | false | i为偶数时,该条件不可能成立 | 6 | |
| 6 | true | false | false | 12 | |
| 8 | true | false | false | 20 | |
| 10 | true | false | false | 30 | |
| 12 | true | false | false | 42 | |
| 14 | true | false | false | 56 | |
| 16 | true | false | false | 72 | |
| 18 | true | false | false | 90 | |
| 20 | false |
8、下面C++代码执行后的输出是( )。
N = 10;
cnt = 0;
while (1){
if (N == 0) break;
cnt += 1;
N -= 2;
}
cout << cnt;
A. 11
B. 10
C. 5
D. 4
正确答案:C
| N == 0 | cnt | N |
|---|---|---|
| false | 1 | 8 |
| false | 2 | 6 |
| false | 3 | 4 |
| false | 4 | 2 |
| false | 5 | 0 |
| true |
9、下面C++代码用于判断一个数是否为质数(素数),在横线处应填入代码是( )。
cin >> N;
cnt = 0;
for (int i = 1; i < N + 1; i++)
if (N % i == 0)
____;
if (cnt == 2)
cout << N << "是质数。";
else
cout << N << "不是质数。";
A. cnt = 1
B. cnt = 2
C. cnt =+ 1
D. cnt += 1
正确答案:D
在C++代码中,要判断一个数是否为质数,我们需要遍历从2到该数(不包括该数本身)的所有整数,并检查它们是否能被该数整除。如果能被整除,那么该数就不是质数。在本题遍历的过程中,我们用一个计数器cnt来记录能整除该数的整数的个数。如果cnt等于2(即该数只能被1和它本身整除),那么该数是质数;否则,不是质数。
10、对下面的代码,描述正确的是( )。
#include <stdlib.h>
using namespace std;
int main(){
int arr[] = {2, 6, 3, 5, 4, 8, 1, 0, 9, 10};
for (int i = 0; i < 10; i++)
cout << arr[i] << " ";
cout << i << endl;
cout << endl;
return 0;
}
A. 输出 2 6 3 5 4 8 1 0 9 10 10
B. 输出 2 6 3 5 4 8 1 0 9 9
C. 输出 2 6 3 5 4 8 1 0 9 10
D. 提示有编译错误
正确答案:D
11、执行下面C++代码后输出是( )。
cnt = 0;
for (i = 10; i > 3; i -= 3)
cnt = cnt + i;
cout << cnt;
A. 3
B. 21
C. 27
D. 49
正确答案:B
| i > 3 | cnt | i |
|---|---|---|
| true | 10 | 7 |
| true | 17 | 4 |
| true | 21 | 1 |
| false |
12、定义变量 char c ,下面对 c 赋值的语句,不符合语法的是( )。
A. c = (char)66;
B. c = (char)(66);
C. c = char(66);
D. c = char 66;
正确答案:D
强制类型转换的三种方法:
1)(数据类型) 变量名/操作数
2)(数据类型) (变量名/操作数)
3)数据类型 (变量名/操作数)
13、以下C++代码对大写字母 ‘A’ 到 ‘Z’ 分组,对每个字母输出所属的组号,那么输入 ‘C’ 时将输出的组号是?( )。
char c;
while (1){
cin >> c;
if (c == 'q') break;
switch(c){
case 'A': cout << "1 "; break;
case 'B': cout << "3 ";
case 'C': cout << "3 ";
case 'D': cout << "5 "; break;
case 'E': cout << "5 "; break;
default: cout << "9 ";
}
cout << endl;
}
A. 3
B. 3 5
C. 3 5 9
D. 以上都不对
正确答案:B
当输入字符’C’时,代码将执行switch语句,并匹配到case ‘C’:。然而,在case ‘C’:后面并没有break;语句,这会导致代码继续执行下一个case,即case ‘D’:。因此,对于字符’C’,代码会输出"3 "(对应case ‘C’:)然后继续执行到case ‘D’:输出"5 "(虽然实际上并没有匹配到’D’)。
14、某公司新出了一款无人驾驶的小汽车,通过声控智能驾驶系统,乘客只要告诉汽车目的地,车子就能自动选择一条优化路线,告诉乘客后驶达那里。请问下面哪项不是驾驶系统完成选路所必须的。( )
A. 麦克风
B. 扬声器
C. 油量表
D. 传感器
正确答案:C
在无人驾驶小汽车的声控智能驾驶系统中,麦克风用于接收乘客的语音指令,扬声器用于向乘客提供信息(如选择的路线或到达目的地的通知等),传感器(如GPS、雷达、摄像头等)用于环境感知和定位,以便选择优化路线并安全驾驶。而油量表是显示车辆燃油剩余量的装置,它并不是驾驶系统完成选路所必须的。
15、现代计算机是指电子计算机,它所基于的是( )体系结构。
A. 艾伦·图灵
B. 冯·诺依曼
C. 阿塔纳索夫
D. 埃克特-莫克利
正确答案:B
现代计算机,也就是电子计算机,主要是基于冯·诺依曼体系结构进行设计的。冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯·诺依曼体系结构。
判断题(每题 2 分,共 20 分)
1、C++表达式 int(3.14) 的值为3。( )
正确答案:正确
在C++中,使用int()对浮点数进行强制类型转换会去掉小数部分,只保留整数部分。因此,int(3.14)的值确实是3。
2、C++语句 cout << (2 * 3, 3 % 10, 2+3) 的输出为 6,3,5 。 ( )
正确答案:错误
在C++中,逗号运算符,会计算其左侧的表达式,然后丢弃结果,接着计算右侧的表达式并返回其结果。因此,cout << (2 * 3, 3 % 10, 2+3)只会输出2+3的结果,即5。
3、for(int i = 1; i < 10; i += 3;) ; 表示i从1开始到10结束间隔为3,相当于1、4、7、10。( )
正确答案:错误
这个for循环的确是从1开始,并且每次增加3,但循环条件i < 10意味着循环会在i变成10之前停止。因此,它实际上只会遍历1、4、7,并不会遍历到10。
4、C++表达式010+100+001的值为111。( )
正确答案:错误
在C++中,以0开头的整数字面量是八进制数。因此,010是八进制的10,即十进制的8;100是十进制的100;001是八进制的1,即十进制的1。所以,010+100+001的值是109,不是111。
5、if 语句中的条件表达式的结果可以为 int 类型。
正确答案:正确
在C++中,if语句的条件表达式必须能够转换为布尔类型(bool)。任何非零整数在转换为布尔类型时都为true,而零为false。因此,if语句中的条件表达式确实可以是int类型。
6、 在下面的C++代码 while(1) continue; 中,由于循环中的 continue 是无条件被执行,因此将导致死循环。( )
正确答案:正确
while(1)创建了一个无限循环,因为条件始终为真。在循环体中,continue语句会立即跳过当前迭代的剩余部分,并开始下一次迭代。由于没有退出循环的条件或语句,这会导致一个死循环。
7、C++表达式 ( ‘1’ + ‘1’ == ‘2’ ? flag = 1 : flag = 2) 的结果值和表达式 (flag==2) 的相同。( )
正确答案:错误
字符在C++中是以其ASCII值存储的。'1’的ASCII值是49,'2’的ASCII值是50。因此,‘1’ + '1’等于98,不等于’2’的ASCII值50。因此,条件运算符? :的结果是flag = 2,即2(赋值表达式的结果是被赋的值)。这与flag==2(其结果是布尔值)不同。
8、 在C++的程序中,不能用 scanf 作为变量名。( )
正确答案:错误
9、 小杨最近在准备考GESP,他用的Dev C++来练习和运行程序,所以Dev C++也是一个小型操作系统。( )
正确答案:错误
Dev-C++是一个集成开发环境(IDE),用于编写、编译和运行C++程序。它不是一个操作系统。操作系统是计算机上的一个基础软件层,负责管理硬件资源,为其他软件提供运行环境。Dev-C++只是在这个操作系统上运行的一个应用程序。
10、任何一个 while 循环都可以转化为等价的 for 循环( )。
正确答案:正确
编程题 (每题 25 分,共 50 分)
小杨的考试
【问题描述】
今天是星期X,小杨还有N天就要考试了,你能推算出小杨考试那天是星期几吗?(本题中使用7表示星期日)
【输入描述】
输入 2 行,第一行一个整数X(1<= X <= 7);第二行一个整数N(1 <= N <= 364)。
【输出描述】
输出一个整数,表示小杨考试那天是星期几。
【特别提醒】
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
【样例输入 1】
1
6
【样例输出 1】
7
【样例解释 1】
今天是星期 1,那么 6 天后就是星期日,星期日在本题中用7表示。
【样例输入 2】
5
3
【样例输出 2】
1
【样例解释 2】
今天是星期 5,那么 3 天后就是星期 1。
#include <iostream>
using namespace std;
int main(){
int x, n;
cin >> x >> n;
int ans = (x + n) % 7;
if (ans == 0){
cout << 7 << endl;
}else{
cout << ans << endl;
}
return 0;
}
小杨报数
【问题描述】
小杨需要从1到N报数。再报数过程中,小杨希望跳过M的倍数。例如,如果N=5,M=2,那么小杨就需要依次报出1、3、5。
现在,请你依次输出小杨报的数。
【输入描述】
输入 2 行,第一行一个整数N(1 <= N <= 1,000);第二行一个整数M(2 <= M <= 100)。
【输出描述】
输出若干行,依次表示小杨报的数。
【特别提醒】
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
【样例输入 1】
5
2
【样例输出 1】
1
3
5
【样例输入 2】
10
3
【样例输出 2】
1
2
4
5
7
8
10
#include <iostream>
using namespace std;
int main(){
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++){
if (i % m == 0)
continue;
cout << i << endl;
}
return 0;
}

该博客包含C++考试的单选题、判断题及编程题。单选题考查变量名、表达式求值等知识;判断题涉及C++表达式结果判断;编程题有推算考试星期和报数跳过倍数问题,帮助读者巩固C++基础和算法应用。
893

被折叠的 条评论
为什么被折叠?



