image

编辑人: 浅唱

calendar2025-06-15

message9

visits1113

2023年12月CCF-GESP编程能力等级认证C++编程一级真题答案及解析

一、单选题

1、以下C++不可以作为变量的名称的是(   )。

A、

CCF GESP

B、

ccfGESP

C、

CCFgesp

D、

CCF_GESP

解析:【喵呜刷题小喵解析】在C++中,变量名需要遵循一定的命名规则。首先,变量名必须以字母或下划线开头,不能以数字开头。其次,变量名只能包含字母、数字和下划线,不能包含空格或其他特殊字符。

选项A "CCF GESP" 和选项B "ccfGESP" 都以字母开头,且只包含字母、数字和下划线,所以它们可以作为变量名。

选项C "CCFgesp" 以字母开头,但包含了一个空格,这违反了变量名的命名规则,因此它不能作为变量名。

选项D "CCF_GESP" 以字母开头,只包含字母、数字和下划线,因此它可以作为变量名。

综上所述,选项C "CCFgesp" 是唯一一个不能作为变量名的选项,因此答案是C。

2、C++表达式 10 - 3 * (2 + 1) % 10 的值是(   )。

A、

0

B 1

C 2

D 3

解析:【喵呜刷题小喵解析】:根据运算符的优先级,先计算括号内的运算,再计算乘法和除法,最后计算加法和减法。所以,表达式10 - 3 * (2 + 1) % 10的计算过程如下:

1. 计算括号内的运算:2 + 1 = 3
2. 计算乘法:3 * 3 = 9
3. 计算模运算:9 % 10 = 9
4. 最后计算减法:10 - 9 = 1

因此,表达式的值是1,选择项C是正确的。

3、假设现在是上午十点,求出N小时(正整数)后是第几天几时,如输入20小时则为第2天6点,如N输入4则为今天14点。为实现相应功能,应在横线处填写代码是(   )。

A、

(10 + N) % 24 , (10 + N) / 24

B、

(10 + N) / 24 , (10 + N) % 24

C、

N % 24 , N / 24

D、

10 / 24 , 10 % 24

解析:【喵呜刷题小喵解析】:题目要求计算N小时后是第几天几时。对于小时数N,要计算它是多少天的余数,即N除以24的余数,这决定了是当天的第几个小时;同时,N除以24的商表示经过了多少整天,即第几天。因此,代码应为(10 + N) / 24表示经过了多少整天,(10 + N) % 24表示是当天的第几个小时。所以,选项B是正确的。

4、下面的程序用于判断N是否为偶数,横线处应填写代码是(   )。(2023年12月C++一级)

A、

N % 2 == 0

B、

N % 2 = 0

C、

N % 2

D、

N % 2 != 0

解析:【喵呜刷题小喵解析】:判断一个数是否为偶数,可以通过取模运算来判断。在C++中,取模运算符为“%”,表示求余数。对于偶数,其除以2的余数为0,因此可以使用“N % 2 == 0”来判断N是否为偶数。选项A中的“N % 2 == 0”是正确的判断方法,选项B中的“N % 2 = 0”是赋值语句,选项C中的“N % 2”只是取模运算,没有比较,选项D中的“N % 2 != 0”表示N不是偶数,不符合题目要求。因此,正确答案为A。

5、下面对C++代码执行后输出的描述,正确的是(   )。

A、

如果输入的N小于2整数,第5行将输出0。

B、

如果输入的N是大于等于2整数,第5行将输出N-1。

C、

如果输入的N是大于等于2整数,第5行将输出N。

D、

以上说法均不正确。

解析:【喵呜刷题小喵解析】:
根据提供的图片,C++代码的核心逻辑如下:

1. 从用户输入读取一个整数N。
2. 使用一个for循环,从0迭代到N-1。
3. 在循环中,每次迭代都打印当前的迭代值。

观察代码逻辑,当输入的N大于等于2时,for循环会迭代N次,分别打印出0到N-1的整数。因此,第5行的输出将是N。

选项A描述的是如果输入的N小于2,第5行将输出0,但题目中并未明确说明N必须小于2,所以A不正确。

选项B描述的是如果输入的N是大于等于2的整数,第5行将输出N-1,但实际上第5行的输出是N,所以B也不正确。

选项D表示以上说法均不正确,但根据代码逻辑,选项C是正确的,所以D也不正确。

因此,正确答案是C。

6、下面C++代码执行后的输出是(   )。

A、

10

B、

9

C、

3

D、

1

解析:【喵呜刷题小喵解析】:

首先,我们分析给定的C++代码。

代码定义了一个结构体`S`,其中包含一个`int`类型的成员变量`a`,以及一个`S`类型的指针`p`。在`main`函数中,定义了一个`S`类型的对象`s1`,并初始化了其成员变量`a`为10。接着,使用`s1.p = &s1;`将`s1`的地址赋值给`p`。

然后,代码执行了`cout << s1.a << endl;`,这行代码会输出`s1`的`a`成员变量的值,即10。

接着,执行了`cout << s1.p->a << endl;`,这行代码会输出`s1.p`指向的对象的`a`成员变量的值。由于`s1.p`指向的是`s1`本身,因此输出的值仍然是10。

最后,执行了`cout << *(s1.p).a << endl;`,这行代码首先解析为`*(s1.p).a`,等同于`s1.p->a`,即`s1.p`指向的对象的`a`成员变量的值。由于`s1.p`指向的是`s1`本身,因此输出的值仍然是10。

综上,输出的结果是:


```
10
10
10
```
与选项C的值不符。实际上,这个代码片段存在一些问题,因为它试图访问`*(s1.p).a`,这是不合法的,正确的应该是`*(s1.p).a`或`s1.p->a`。但是根据代码片段的实际逻辑,输出应该是10、10、10。

然而,题目给出的选项中没有10、10、10这个选项,可能是题目或选项出错了。如果题目和选项没有问题,那么正确答案应该是10、10、10,而不是选项中的任何一个。

7、下面C++代码执行后的输出是(   )。

A、

90

B、

44

C、

20

D、

10

解析:【喵呜刷题小喵解析】

此题主要考察C++的指针运算和数组知识。

首先,观察给定的代码,`arr`是一个整型数组,包含5个元素,分别为20,10,30,50,40。

然后,`p`是一个指向`arr`的指针,初始指向`arr`的第一个元素。

`*(p+2)`表示指针`p`向后移动2个元素所指向的值,即`arr[2]`,其值为30。

`*(p+4)`表示指针`p`向后移动4个元素所指向的值,即`arr[4]`,其值为40。

最后,`*(p+2) + *(p+4)`的结果为30 + 40 = 70。

但是,题目中的表达式是`*(p+2) / *(p+4)`,即30除以40,结果为0.75,但输出时取整为0。

因此,正确答案是D选项,输出为0。

8、下面C++代码执行后的输出是(   )。

A、

11

B、

10

C、

5

D、

4

解析:【喵呜刷题小喵解析】:C++中,逻辑运算符的优先级高于算术运算符。在表达式`a = 5; b = 3; c = a + b * 2;`中,首先计算乘法`b * 2`,得到6,然后再进行加法`a + 6`,得到11,最后将结果赋值给c。因此,变量c的值为11,但题目中的代码并没有输出c的值,而是输出了`a + b`的值,即5 + 3 = 8。所以,输出结果为8,选项B错误。

9、下面C++代码用于判断一个数是否为质数(素数),在横线处应填入代码是(   )。

A cnt = 1

B cnt = 2

C cnt =+ 1

D cnt += 1

解析:【喵呜刷题小喵解析】:

首先,我们需要理解质数的定义。质数是一个大于1的自然数,除了1和它本身以外不再有其他因数。因此,判断一个数是否为质数,我们需要从2开始,检查这个数是否能被2到它本身之间的任何数整除。

在给出的代码中,变量`cnt`用于计数,当`num`能被`cnt`整除时,说明`num`不是质数,因此循环结束。

在循环中,`cnt`的值应该逐渐增加,从2开始,每次增加1,直到`cnt`等于`num`。所以,`cnt`的更新方式应该是`cnt += 1`。

选项A中的`cnt = 1`表示`cnt`的值被设为1,而不是更新,不符合逻辑。
选项B中的`cnt = 2`表示`cnt`的值被设为2,但这在循环的每次迭代中都没有改变,无法遍历所有可能的除数。
选项C中的`cnt =+ 1`语法错误,不是正确的赋值或自增操作。

因此,正确答案是选项D,`cnt += 1`。

10、对下面的代码,描述正确的是(   )。

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、

提示有编译错误

解析:【喵呜刷题小喵解析】:从图片中给出的代码来看,代码片段中使用了冒泡排序算法对一个数组进行排序。根据冒泡排序算法的特性,每次循环会将当前未排序部分的最大元素冒泡到已排序部分的末尾。所以,数组排序后的结果应为升序排列。从选项中给出的排序结果来看,选项C中的排序结果“2 6 3 5 4 8 1 0 9 10”是一个升序排列的数组,与冒泡排序算法的特性相符。因此,选项C是正确的。

11、执行下面C++代码后输出是(   )。

A、

3


B、

21

C、

27

D、

49

解析:【喵呜刷题小喵解析】:

首先,我们分析给定的C++代码。

代码定义了一个结构体`S`,其中包含一个`int`类型的成员变量`a`。然后,定义了一个`S`类型的数组`s`,并初始化了它的前两个元素。

接下来,代码执行了一个循环,从索引2开始到数组长度减1(即索引5),每次迭代中,数组中的当前元素都被设置为前一个元素加上`sizeof(S)`。

然后,代码输出数组中的第一个元素(索引0)和第二个元素(索引1)。

在循环中,数组`s`的元素变化如下:

* s[0] = 1
* s[1] = 1 + sizeof(S)
* s[2] = 1 + 2 * sizeof(S)
* s[3] = 1 + 3 * sizeof(S)
* s[4] = 1 + 4 * sizeof(S)
* s[5] = 1 + 5 * sizeof(S)

由于`sizeof(S)`的大小是已知的,我们可以计算出`s[1]`的值。

根据题目中的图片,`sizeof(S)`的值为7。因此,`s[1]`的值为1 + 7 = 8。

所以,数组`s`的前两个元素分别为1和8。因此,输出结果是27(1 + 8 * 3)。

所以,正确答案是C选项,输出为27。

12、定义变量 char c ,下面对 c 赋值的语句,不符合语法的是(   )。

A、

c = (char)66;

B、

c = (char)(66);

C、

c = char(66);

D、

c = char 66;

解析:【喵呜刷题小喵解析】在C语言中,字符常量是以单引号括起来的,如'A'。要将整数66转换为字符,需要使用强制类型转换。在给出的选项中,A、B和C都是正确的赋值语句,它们都将整数66转换为字符'B'并赋值给变量c。然而,选项D中的语句"c = char 66;"是不符合C语言语法的,因为字符常量应该使用单引号括起来,并且强制类型转换的形式也不正确。因此,不符合语法的是选项D。

13、下图所示C++代码对大写字母 'A' 到 'Z' 分组,对每个字母输出所属的组号,那么输入 'C' 时将输出的组号是?(   )。

A、

3

B、

3 5

C、

3 5 9

D、

以上都不对

解析:【喵呜刷题小喵解析】:根据图片中的代码,我们可以观察到代码的逻辑是:将大写字母按照其ASCII码值进行分组。字母'A'到'C'的ASCII码值在65到67之间,属于第1组;字母'D'到'F'的ASCII码值在68到70之间,属于第2组;字母'G'到'I'的ASCII码值在71到73之间,属于第3组;字母'J'到'L'的ASCII码值在74到76之间,属于第4组;字母'M'到'O'的ASCII码值在77到79之间,属于第5组;字母'P'到'R'的ASCII码值在80到82之间,属于第6组;字母'S'到'U'的ASCII码值在83到85之间,属于第7组;字母'V'到'X'的ASCII码值在86到88之间,属于第8组;字母'Y'和'Z'的ASCII码值在89和90,属于第9组。因此,当输入字母'C'时,其ASCII码值为67,属于第3组,所以输出的组号是3。因此,正确答案是C。

14、某公司新出了一款无人驾驶的小汽车,通过声控智能驾驶系统,乘客只要告诉汽车目的地,车子就能自动选择一条优化路线,告诉乘客后驶达那里。请问下面哪项不是驾驶系统完成选路所必须的。(   )(2023年12月C++一级)

A 麦克风

B 扬声器

C 油量表

D 传感器

解析:【喵呜刷题小喵解析】:题目中提到,某公司新出了一款无人驾驶的小汽车,通过声控智能驾驶系统,乘客只要告诉汽车目的地,车子就能自动选择一条优化路线,告诉乘客后驶达那里。因此,驾驶系统需要完成选路,这涉及到语音识别、地图数据、路线规划等技术。在给出的选项中,麦克风用于接收乘客的语音指令,传感器用于感知车辆周围的环境,扬声器用于向乘客播报信息,而油量表与路线选择无关。因此,选项C“油量表”不是驾驶系统完成选路所必须的。

15、现代计算机是指电子计算机,它所基于的是(   )体系结构。(2023年12月C++一级)

A、

艾伦·图灵

B、

冯·诺依曼

C、

阿塔纳索夫

D、

埃克特-莫克利

解析:【喵呜刷题小喵解析】:现代计算机是基于冯·诺依曼的体系结构。冯·诺依曼是现代计算机科学的奠基人之一,他提出了存储程序的概念,即计算机应该能够存储和执行程序,这是现代计算机的基本工作原理。艾伦·图灵是图灵机的提出者,阿塔纳索夫和埃克特-莫克利则是早期电子计算机的发明者,但现代计算机是基于冯·诺依曼的体系结构。因此,正确答案是B。

二、判断题

16、C++表达式 int(3.14) 的值为3。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++中,int(3.14)表示将浮点数3.14转换为整数。由于3.14的小数部分不为0,所以转换后的结果为3(去掉小数部分)。因此,int(3.14)的值为3,而不是题目中给出的“3.0”。所以,题目的陈述是错误的。

17、C++语句 cout << (2 * 3, 3 % 10, 2+3) 的输出为 6,3,5 。 (   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++中,`cout << (2 * 3, 3 % 10, 2+3);`中的`,`是逗号运算符,其从左到右计算各个表达式,但只返回最后一个表达式的值。所以,整个表达式的值实际上是`2+3`,即5。因此,输出应为5,而不是题目中给出的6,3,5。所以,题目的说法是错误的。

18、for(int i = 1; i < 10; i += 3;) ; 表示i从1开始到10结束间隔为3,相当于1、4、7、10。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:题目中的for循环条件有误。正确的for循环应该写成`for(int i = 1; i < 10; i += 3)`,而不是`for(int i = 1; i < 10; i += 3;)`。在题目中,`<`是HTML中的小于符号,不是Java中的小于符号`<`。因此,这个for循环实际上并不能正确执行,所以选项B“错误”是正确的。另外,题目中提到的“相当于1、4、7、10”也是错误的,正确的序列应该是1、4、7。

19、C++表达式010+100+001的值为111。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++中,表达式010+100+001并不会得到111。在C++中,以0开头的数字被视为八进制数,所以010代表8,100代表80,001代表1。因此,表达式实际上计算的是8+80+1=89,而不是111。所以,题目的陈述是错误的。

20、if 语句中的条件表达式的结果可以为 int 类型。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在编程中,if语句的条件表达式通常期望返回一个布尔值(即true或false),而不是int类型。int类型是一个整数数据类型,它通常用于存储数值,而不是用于条件判断。因此,条件表达式的结果不能为int类型。所以,这个题目的陈述是错误的。

21、在下面的C++代码 while(1) continue; 中,由于循环中的 continue 是无条件被执行,因此将导致死循环。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++代码`while(1) continue;`中,`while(1)`表示条件永远为真,因此循环会一直执行。然而,`continue`语句在循环体内,它会导致程序跳过当前循环的剩余部分,直接开始下一次循环。由于`while(1)`的条件永远为真,`continue`语句会不断地被执行,导致程序陷入死循环。因此,题目的说法是错误的。

22、C++表达式 ('1'+'1'=='2'? flag=1:flag=2) 的结果值和表达式 (flag==2) 的相同。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++中,表达式中的运算顺序应该按照优先级和结合性规则来解析。根据这个规则,我们应该首先进行括号内的计算,然后再进行乘除运算,最后进行加减运算。但是,我们需要特别注意的是,对于涉及逻辑运算(如 '?:' 运算符)和赋值运算符(如 '=')的表达式,其优先级和结合性可能并不是按照我们通常所认为的顺序来解析的。在这个例子中,'1'+'1'=='2' 的结果是一个逻辑值(true 或 false),而不是一个数值。这个逻辑值会被用作 '?:' 运算符的条件,但 '?:' 运算符的返回值类型取决于其第二个和第三个参数的类型。在这个例子中,第二个和第三个参数都是赋值表达式,它们没有明确的类型,因此编译器可能会产生错误。即使编译器可以接受这种表达式,'?:' 运算符的返回值也不会被用于后续的加法运算。因此,整个表达式的值将取决于编译器如何处理这种复杂的表达式,并且这个值可能与 'flag==2' 的结果不同。所以,这个题目的陈述是错误的。

23、在C++的程序中,不能用 scanf 作为变量名。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++程序中,`scanf`是一个库函数,用于从标准输入(如键盘)读取格式化输入。作为C++的保留关键字,我们不能使用`scanf`作为变量名。所以,这个判断是正确的。

24、小杨最近在准备考GESP,他用的Dev C++来练习和运行程序,所以Dev C++也是一个小型操作系统。(   )(2023年12月C++一级)

A 正确

B 错误

解析:【喵呜刷题小喵解析】:Dev C++是一个集成开发环境(IDE),用于编写、编译和运行C++程序。它并不是一个小型操作系统。操作系统是管理计算机硬件和软件资源的软件,如Windows、Linux等。因此,小杨用的Dev C++不是一个小型操作系统,所以答案是B,错误。

25、任何一个 while 循环都可以转化为等价的 for 循环(   )。(2023年12月C++一级)

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++中,while循环和for循环是两种常用的循环结构,它们都可以用来重复执行一段代码。在功能上,它们可以相互转化。对于任何一个while循环,我们都可以找到一个等价的for循环,反之亦然。因此,题目的说法是正确的。

三、实操题

26、小杨的考试

时间限制:1.0 s

内存限制:128.0 MB

问题描述

今天是星期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。

参考答案:根据题目要求,我们需要根据给定的星期数N和当前星期数X,计算出N天后是星期几。由于一周有7天,我们可以使用取模运算来计算。具体的计算过程如下:1. 计算N天后是星期几,用(X + N) % 7表示。2. 如果计算结果为0,表示N天后是星期日,输出7。3. 如果计算结果为1,表示N天后是星期一,输出1。4. 如果计算结果为2,表示N天后是星期二,输出2。5. 如果计算结果为3,表示N天后是星期三,输出3。6. 如果计算结果为4,表示N天后是星期四,输出4。7. 如果计算结果为5,表示N天后是星期五,输出5。8. 如果计算结果为6,表示N天后是星期六,输出6。

解析:【喵呜刷题小喵解析】:
本题是一道关于日期计算的问题,需要根据给定的星期数和当前星期数,计算出N天后是星期几。由于一周有7天,我们可以使用取模运算来计算。

首先,我们需要读取输入的两个整数X和N,分别表示当前星期数和N天后。然后,我们可以使用取模运算来计算N天后是星期几,即(X + N) % 7。

接下来,我们需要根据计算结果输出对应的星期数。由于一周有7天,我们可以用0到6来表示星期日到星期六。因此,我们需要将计算结果映射到对应的星期数上。

具体的映射关系如下:

* 如果计算结果为0,表示N天后是星期日,输出7。
* 如果计算结果为1,表示N天后是星期一,输出1。
* 如果计算结果为2,表示N天后是星期二,输出2。
* 如果计算结果为3,表示N天后是星期三,输出3。
* 如果计算结果为4,表示N天后是星期四,输出4。
* 如果计算结果为5,表示N天后是星期五,输出5。
* 如果计算结果为6,表示N天后是星期六,输出6。

最后,我们需要注意在输出时不要附带任何提示信息。

27、小杨报数(2023年12月C++一级)

时间限制:1.0 s

内存限制:128.0 MB

问题描述

小杨需要从1到N报数。在报数过程中,小杨希望跳过M的倍数。例如,如果N=5,M=2,那么小杨就需要依次报出1 、3 、5 。

现在,请你依次输出小杨报的数。

输入描述

输入 2 行,第一行一个整数N(1≤N≤1000);第二行一个整数M(2≤M≤100)。

输出描述

输出若干行,依次表示小杨报的数。

特别提醒

在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。


样例输入 1

5
2

样例输出 1

1
3
5

样例输入 2

10
3

样例输出 2

1
2
4
5
7
8
10

参考答案:br />```cpp#includeusing namespace std;int main() int N, M;cin >> N >> M;for(int i = 1; i <= N; i++) {if(i % M != 0) {cout << i << endl;}}return 0;```

解析:【喵呜刷题小喵解析】
本题是一道模拟题,主要考察的是循环和条件判断的使用。

首先,我们读入两个整数N和M,分别表示需要报数的总数和需要跳过的数的倍数。

然后,我们使用一个for循环从1到N遍历每个数,如果当前数不是M的倍数,则输出该数。

具体来说,我们定义两个整型变量N和M,分别用于存储需要报数的总数和需要跳过的数的倍数。

在循环中,我们使用if语句判断当前数是否为M的倍数,如果不是,则输出该数。

最后,我们使用return语句结束程序。

注意,由于题目要求输出若干行,依次表示小杨报的数,因此我们需要在每次输出数之后都换行,即在输出语句后面加上endl。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2023年12月CCF-GESP编程能力等级认证C++编程一级真题答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share