GESP C++ 2024年06月一级真题卷

一、单选题(每题 2 分,共 30 分)

1 在 C++ 中,下列不可做变量的是 ( ) 。
A. five-Star
B. five_star
C. fiveStar
D. _fiveStar
答案:A

解析:标识符命名规则,标识符由字母、数字和下划线组成,第一个字符不能是数字
2 C++ 表达式 3 - 3 * 3 / 5 的值是 ( ) 。
A. -1.2
B. 1
C. 0
D. 2
答案:D

解析:

在 C++ 中,表达式 3 - 3 * 3 / 5 的值是由运算符优先级决定的。运算符优先级规则是:

  1. **乘法(*)和除法(/)优先级高于加法(+)和减法(-)。
  2. 乘法和除法按从左到右的顺序进行计算。

让我们逐步计算 3 - 3 * 3 / 5

  1. 计算乘法和除法

    • 3 * 3 先计算得到 9
    • 然后 9 / 5。由于这是整数除法,结果是 1(在 C++ 中,整数除法会舍去小数部分)。
  2. 计算减法

    • 最后计算 3 - 1,结果是 2

所以,表达式 3 - 3 * 3 / 5 的值是 2
3 在 C++ 中,假设 N 为正整数,则表达式 cout << (N % 3 + N % 7) 可能输出的最大值是 ( )。
A. 6
B. 8
C. 9
D. 10
答案:B

解析:

N % 3 最大是2,N % 7最大的6,所以2+6=8
4 C++ 语句 printf("5%%2={%d}\n",5 % 2) 执行后的输出是 ( )。
A. 1={1}
B. 5%2={5%2}
C. 5%2={1}
D. 5 ={1}
答案:C

解析:

  1. 格式化字符串 printf("5%%2={%d}\n", 5 % 2)

    • 5%%2 中的 %% 会被解释为单个 %,因为在 printf 中,%% 是表示输出 % 字符的方式。
    • {%d} 表示一个占位符,它将被后面的表达式 5 % 2 的结果替换。5 % 2 是取模运算,结果为 1
  2. 替换后

    • 结果将是 5%2={1}

最终输出:

因此,执行后的输出是 C. 5%2={1}
5 对整型变量 i ,执行 C++ 语句 cin >> i, cout << i 时如果输入 5+2 ,下述说法正确的是()。
A. 将输出整数 7
B. 将输出 5
C. 语句执行将报错,输入表达式不能作为输出的参数
D. 语句能执行,但输出内容不确定
答案:B

解析:

在 C++ 中,语句 cin >> i 从标准输入中读取一个整数,并将其存储在整型变量 i 中。那么当输入 5+2 时,程序的行为如下:

分析:

  1. 输入处理

    • 当使用 cin >> i 时,cin 会读取输入的字符,直到遇到第一个非数字字符为止(即读取到空格、非数字字符等时停止)。在输入 5+2 的情况下,cin 将首先读取数字 5,然后遇到 + 符号,输入过程停止,并将 5 存储在变量 i 中。
    • +2 部分将留在输入缓冲区中,尚未处理。
  2. 输出处理

    • cout << i 将输出存储在变量 i 中的值,此时 i 中存储的是 5,因此输出将是 5

结论:

  • B. 将输出 5 是正确的。
    6 下面 C++ 代码执行后的输出是( )。

    A. 102={102}
    B. a+1={a+1}
    C. a+1={102}
    D. a 先被赋值为浮点数,后被赋值为整数,执行将报错
    答案:C

解析:%.0f 格式化符表示输出浮点数并省略小数部分(即输出为整数形式)。
7 表达式 9/4 - 6 % (6 - 2) * 10 的值是 ( )。
A. -17.75
B. -18
C. -14
D. -12.75
答案:C

解析:按照优先级:括号>乘、除和取模>加减

9/4-6%4*10=2-2*10=-18
8 下面 C++ 代码执行时输入 10 后,正确的输出是( )。

A. 第 5 行代码 1
B. 第 6 行代码 1
C. 第 5 行代码 1
D. 第 6 行代码 1
答案:C

解析:输入10,10%3=1,所以输出"第五行代码",注意%2d,输出两个字符,1是一个字符,不够用空格填充
9 下面 C++ 代码执行后输出是( )。

A. 9 45
B. 10 55
C. 10 45
D. 11 55
答案:C

解析:

主要i++和++i的区别:

i++是先赋值后计算,++i是先计算后赋值

分析循环和语句:

  1. 初始声明:

    • int Sum = 0, i = 0; 声明并初始化两个整型变量 Sumi,它们的初始值都是 0
  2. for 循环:

    • for ( ; i < 10; ):
      • 这里没有指定初始化表达式和迭代表达式,只有一个循环条件 i < 10
      • 循环的内容是 Sum += i++;。这行代码先将 i 的当前值加到 Sum 中,然后再将 i 自增。
  3. 循环执行过程:

    • 第一次循环:i0Sum 变为 0Sum += 0),然后 i 自增为 1
    • 第二次循环:i1Sum 变为 1Sum += 1),然后 i 自增为 2
    • 第三次循环:i2Sum 变为 3Sum += 2),然后 i 自增为 3
    • 以此类推,直到 i 达到 10
  4. 循环结束后:

    • i 增加到 10 时,循环条件 i < 10 不再满足,循环退出。
    • Sum 的最终值是 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
  5. 输出:

    • cout << i << " " << Sum; 输出 i 的值和 Sum 的值。
  • 此时,i 的值是 10Sum 的值是 45
    10 下面 C++ 代码用于判断 N 是否为质数(只能被 1 和它本身整除的正整数)。程序执行后,下面有关描述正确的是( )。

    A. 如果输入负整数,可能输出 " 是质数 "
    B. 如果输入 2 ,将输出 " 不是质数 " ,因为此时循环不起作用
    C. 如果输入 2 ,将输出 " 是质数 " ,即便此时循环体没有被执行
    D. 如果将 if (N >= 2) 改为 if (N > 2) 将能正确判断 N 是否质数
    答案:C

解析:

分析程序:

  • N 的值输入 :程序首先要求用户输入一个整数 N
  • 判断条件
    • 如果 N >= 2,程序将 Flag 设为 true,并开始检查 N 是否能被 2 到 N-1 之间的任何数整除。
    • 如果 N 在这个范围内被某个数整除,Flag 会被设为 false 并退出循环。
    • 最终,Flag 的值决定了 N 是否为质数。如果 Flagtrue,输出 "是质数";否则输出 "不是质数"。

分析选项:

A. 如果输入负整数,可能输出"是质数"

  • 错误 。如果输入负整数,由于 N < 2Flag 将保持 false,所以输出 "不是质数"。这个选项描述不准确。

B. 如果输入2,将输出"不是质数",因为此时循环不起作用

  • 错误 。当 N == 2 时,循环不会执行,但 Flagif (N >= 2) 之后被设为 true,因此会输出 "是质数"。

C. 如果输入2,将输出"是质数",即便此时循环体没有被执行

  • 正确 。对于 N == 2,程序不会进入 for 循环,因为循环条件 i < N 不成立。但是 Flag 被设为 true,所以输出 "是质数"。

D. 如果将 if (N >= 2) 改为 if (N > 2) 将能正确判断N是否质数

  • 错误 。如果将条件改为 if (N > 2),输入 2Flag 不会被设置为 true,输出将错误地显示 "不是质数"。
    11 下面的 C++ 代码用于求 1~N 之间所有奇数之和,其中 N 为正整数,如果 N 为奇数,则求和时包括 N 。有关描述错误的是( )。

    A. 执行代码时如果输入 10 ,则最后一行输出将是 11 25
    B. 执行代码时如果输入 5 ,则最后一行输出将是 6 9
    C. 将 i += 1 移到 if (i % 2 == 1) 前一行,同样能实现题目要求
    D. 删除 if (i % 2 == 1) ,并将 i += 1 改为 i += 2 ,同样可以实现题目要求
    答案:C

解析:

选项C:将 i += 1 移到 if (i % 2 == 1) 前一行,先执行i += 1 ,i直接变成了2,那么sum就加不了1了
12 如果一个整数 N 能够表示为 X*X 的形式,那么它就是一个完全平方数,下面 C++ 代码用于完成判断 N 是否为一个完全平方数,在横线处应填入的代码是( )。

A. i == N*N
B. i*10 == N
C. i+i == N
D. i*i == N
答案:D

解析:略
13 执行下面 C++ 代码后输出的 cnt 的值是( )。

A. 8
B. 7
C. 4
D. 1
答案:D

解析:

分析程序:

i=0,i*i<64,所以i<8,i每次自增2,所以符合条件的i分别是0,2,4,6一个4个数,合计计数4次,所以cnt是4
14 小杨父母带他到某培训机构给他报名参加 CCF 组织的 GESP 认证考试的第 1 级,那他可以选择的认证语言有几种?( )
A. 1
B. 2
C. 3
D. 4
答案:C

解析:scratch、python和c++三种
15 ENIAC 于 1946 年投入运行,是世界上第一台真正意义上的计算机,它的主要部件都是()组成的。
A. 感应线圈
B. 电子管
C. 晶体管
D. 集成电路
答案:B

解析:

计算机的发展一般分为三个主要阶段,每个阶段对应着技术的重大进步和计算机性能的显著提高。

第一阶段:电子管计算机(1940s-1950s)

  • 时间范围:1940年代至1950年代。
  • 主要技术:使用电子管作为主要的逻辑元件。
  • 代表机型:ENIAC、UNIVAC、IBM 701。
  • 特点:体积庞大、功耗高、发热量大,运算速度相对较慢。主要用于科学计算和军事应用。

第二阶段:晶体管计算机(1950s-1960s)

  • 时间范围:1950年代中期至1960年代。
  • 主要技术:使用晶体管替代电子管。
  • 代表机型:IBM 1401、IBM 7090。
  • 特点:体积显著减小,功耗和发热量大幅降低,可靠性提高,运算速度明显提升。晶体管的发明使计算机更小、更快、更可靠,推动了商业计算机的普及。

第三阶段:集成电路计算机(1960s-至今)

  • 时间范围:1960年代至今。
  • 主要技术:使用集成电路(IC),后期发展为超大规模集成电路(VLSI)。
  • 代表机型:IBM System/360、Apple II、IBM PC、现代的个人计算机和服务器。
  • 特点:计算机的性能、存储容量和运算速度持续提高,成本不断降低,体积越来越小。计算机进入家庭和办公场所,普及应用在各个领域。

二、判断题(每题2分,共20分)

1 在 C++ 代码中变量 X 被赋值为 16.44 ,则 cout << X / 10 执行后输出的一定是 1 。 ( )
答案:错

解析:

如果x是int类型


如果x是double类型

2 C++ 的整型变量 N 被赋值为 10 ,则语句 cout << N / 4 << "->" << N % 4 << "->" << N / 4.0 执行后输出是 2->2->2.0 。 ( )
答案:错

解析:

3 定义 C++ 的 float 型变量 N ,则语句 cin >> N; cout << int(float(N)) 可以输入正负整数和浮点数, 并将其转换为整数后输出。( )
答案:对

解析:略
4 C++ 的整型 N 被赋值为 5 ,语句 printf("%d*2",N) 执行后将输出 10 。( )
答案:错

解析:是5*2
5 在 C++ 中, break 语句用于终止当前层次的循环,循环可以是 for 循环,也可以是 while 循环。( )
答案:错

解析:是5*2
6 在 C++ , continue 语句通常与 if 语句配合使用。( )
答案:对

解析:略
7 在 C++ 代码中,不可以将变量命名为 printf ,因为 printf 是 C++ 语言的关键字。( )
答案:错

解析:
在 C++ 中,printf 不是一个关键字,而是一个标准库函数的名称。printf 是 C 标准库中的函数,用于格式化输出。
给大家一个建议,如果在DevC++中,如果标识符不是粗体,那么都不是关键字

8 在 C++ 中有整型变量 N ,则表达式 N += 8/4//2 相当于 N += 8/(4/2) 。( )
答案:错

解析:因为 // 是 C++ 中的注释符号,用于表示单行注释。// 后面的内容会被视为注释,不会参与计算。

N += 8/4//2 实际上等价于 N += 8/4,即 N += 2
9 C++ 中定义变量 int N ,则表达式 (!!N) 的值也是 N 的值。 ( )
答案:错

解析:

在 C++ 中,表达式 !!N 是一种将变量 N 转换为布尔值(0 或 1)的技巧。让我们详细分析这个表达式的含义和行为。

解释 !!N

  1. 单一否定 !N:

    • !N 是逻辑非运算符,用于将 N 转换为布尔值。
    • 如果 N 的值为 0,则 !Ntrue(布尔值 1)。
    • 如果 N 的值非 0,则 !Nfalse(布尔值 0)。
  2. 双重否定 !!N:

    • !!N 先对 N 应用一次逻辑非运算符 !,然后再对结果应用一次逻辑非运算符 !
    • 所以,!!N 结果会是 true(1)或 false(0),具体取决于 N 是否为零。
      • 如果 N0,则 !Ntrue(1),!!N 结果是 false(0)。
      • 如果 N 非零,!Nfalse(0),!!N 结果是 true(1)。

结论

  • !!N 的值不会等于 N 的值,而是将 N 转换为布尔值后再进行转换:
    • N0 时,!!N 的值是 0
    • N 为非 0 时,!!N 的值是 1
cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int N1 = 5; // 非零值
    int N2 = 0; // 零值

    cout << "!!N1 = " << !!N1 << endl; // 输出: 1
    cout << "!!N2 = " << !!N2 << endl; // 输出: 0

    return 0;
}

在这个示例中:

  • !!N1 的结果是 1,因为 N1 是非零值。
  • !!N2 的结果是 0,因为 N2 是零值。

因此,!!N 的值是 N 的布尔表示,转换为 01
10 GESP 测试是对认证者的编程能力进行等级认证,同一级别的能力基本上与编程语言无关。( )
答案:对

解析:略

三、编程题(每题25 分,共50分)

编程题 1

3.1.1 题面描述
小杨计划在某个时刻开始学习,并决定在学习 秒后开始休息。 小杨想知道自己开始休息的时刻是多少。
3.1.2 输入格式
前三行每行包含一个整数,分别表示小杨开始学习时刻的时h 、分m 、秒s ( 1<=h<=12,0<=m<=59 ,0<=s<=59 的值符合 )。
第四行包含一个整数k ,表示小杨学习的总秒数(注: k的值符合1<=k<=3600)。
3.1.3 输出格式
输出一行,包含三个整数,分别表示小杨开始休息时刻的时、分、秒。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	int h,m,s;
	cin>>h>>m>>s;
	int k;
	cin>>k;
	int now=h*60*60+m*60+s;
	now+=k;
	int hh = now/3600;
	now %= 3600;
	int mm = now/60;
	now %= 60;
	cout<<hh<<" "<<mm<<" "<<now<<"\n";
	return 0;
} 

编程题 2

3.2.1 题面描述
小杨有一个正整数n ,他想知道n 是否是一个立方数。 一个正整数 n是立方数当且仅当存在一个正整数x 满足x*x*x=n 。
3.2.2 输入格式
第一行包含一个正整数 。
3.2.3 输出格式
如果正整数 是一个立方数,输出 Yes ,否则输出 No 。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n; // 定义一个整数变量 n
    cin >> n; // 从标准输入读取一个整数值并存储在变量 n 中

    int fl = 0; // 定义并初始化标志变量 fl,初始值为 0

    // 遍历从 1 到 n 的每个整数 i
    for (int i = 1; i <= n; i++) {
        // 如果 i 的立方等于 n
        if (i * i * i == n) {
            fl = 1; // 设置标志变量 fl 为 1
            break; // 跳出循环,因为找到了满足条件的 i
        }
    }

    // 根据标志变量 fl 的值输出结果
    if (fl)
        cout << "Yes\n"; // 如果 fl 为 1,输出 "Yes"
    else
        cout << "No\n"; // 如果 fl 为 0,输出 "No"

    return 0; // 程序成功结束
}
相关推荐
pianmian12 分钟前
完全平方数
数据结构·算法
A_Tai23333334 分钟前
贪心算法解决用最少数量的箭引爆气球问题
算法·贪心算法
唐叔在学习15 分钟前
【唐叔学算法】第19天:交换排序-冒泡排序与快速排序的深度解析及Java实现
java·算法·排序算法
_nirvana_w_15 分钟前
C语言实现常用排序算法
c语言·算法·排序算法
Moweiii19 分钟前
SDL3 GPU编程探索
c++·游戏引擎·图形渲染·sdl·vulkan
唐叔在学习23 分钟前
【唐叔学算法】第18天:解密选择排序的双重魅力-直接选择排序与堆排序的Java实现及性能剖析
数据结构·算法·排序算法
渝妳学C1 小时前
【C++】类和对象(下)
c++
Kenneth風车1 小时前
【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版 (1)11
算法·机器学习·分类
最后一个bug1 小时前
rt-linux中使用mlockall与free的差异
linux·c语言·arm开发·单片机·嵌入式硬件·算法
EleganceJiaBao1 小时前
【C语言】结构体模块化编程
c语言·c++·模块化·static·结构体·struct·耦合