一、单选题(每题 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
的值是由运算符优先级决定的。运算符优先级规则是:
- **乘法(
*
)和除法(/
)优先级高于加法(+
)和减法(-
)。 - 乘法和除法按从左到右的顺序进行计算。
让我们逐步计算 3 - 3 * 3 / 5
:
-
计算乘法和除法:
3 * 3
先计算得到9
。- 然后
9 / 5
。由于这是整数除法,结果是1
(在 C++ 中,整数除法会舍去小数部分)。
-
计算减法:
- 最后计算
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
解析:
-
格式化字符串
printf("5%%2={%d}\n", 5 % 2)
:5%%2
中的%%
会被解释为单个%
,因为在printf
中,%%
是表示输出%
字符的方式。{%d}
表示一个占位符,它将被后面的表达式5 % 2
的结果替换。5 % 2
是取模运算,结果为1
。
-
替换后:
- 结果将是
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
时,程序的行为如下:
分析:
-
输入处理:
- 当使用
cin >> i
时,cin
会读取输入的字符,直到遇到第一个非数字字符为止(即读取到空格、非数字字符等时停止)。在输入5+2
的情况下,cin
将首先读取数字5
,然后遇到+
符号,输入过程停止,并将5
存储在变量i
中。 +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是先计算后赋值
分析循环和语句:
-
初始声明:
int Sum = 0, i = 0;
声明并初始化两个整型变量Sum
和i
,它们的初始值都是0
。
-
for 循环:
for ( ; i < 10; )
:- 这里没有指定初始化表达式和迭代表达式,只有一个循环条件
i < 10
。 - 循环的内容是
Sum += i++;
。这行代码先将i
的当前值加到Sum
中,然后再将i
自增。
- 这里没有指定初始化表达式和迭代表达式,只有一个循环条件
-
循环执行过程:
- 第一次循环:
i
为0
,Sum
变为0
(Sum += 0
),然后i
自增为1
。 - 第二次循环:
i
为1
,Sum
变为1
(Sum += 1
),然后i
自增为2
。 - 第三次循环:
i
为2
,Sum
变为3
(Sum += 2
),然后i
自增为3
。 - 以此类推,直到
i
达到10
。
- 第一次循环:
-
循环结束后:
- 当
i
增加到10
时,循环条件i < 10
不再满足,循环退出。 Sum
的最终值是0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
。
- 当
-
输出:
cout << i << " " << Sum;
输出i
的值和Sum
的值。
- 此时,
i
的值是10
,Sum
的值是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
是否为质数。如果Flag
为true
,输出 "是质数";否则输出 "不是质数"。
- 如果
分析选项:
A. 如果输入负整数,可能输出"是质数"
- 错误 。如果输入负整数,由于
N < 2
,Flag
将保持false
,所以输出 "不是质数"。这个选项描述不准确。
B. 如果输入2,将输出"不是质数",因为此时循环不起作用
- 错误 。当
N == 2
时,循环不会执行,但Flag
在if (N >= 2)
之后被设为true
,因此会输出 "是质数"。
C. 如果输入2,将输出"是质数",即便此时循环体没有被执行
- 正确 。对于
N == 2
,程序不会进入for
循环,因为循环条件i < N
不成立。但是Flag
被设为true
,所以输出 "是质数"。
D. 如果将 if (N >= 2)
改为 if (N > 2)
将能正确判断N是否质数
- 错误 。如果将条件改为
if (N > 2)
,输入2
时Flag
不会被设置为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
-
单一否定
!N
:!N
是逻辑非运算符,用于将N
转换为布尔值。- 如果
N
的值为0
,则!N
为true
(布尔值1
)。 - 如果
N
的值非0
,则!N
为false
(布尔值0
)。
-
双重否定
!!N
:!!N
先对N
应用一次逻辑非运算符!
,然后再对结果应用一次逻辑非运算符!
。- 所以,
!!N
结果会是true
(1)或false
(0),具体取决于N
是否为零。- 如果
N
为0
,则!N
是true
(1),!!N
结果是false
(0)。 - 如果
N
非零,!N
是false
(0),!!N
结果是true
(1)。
- 如果
结论
!!N
的值不会等于N
的值,而是将N
转换为布尔值后再进行转换:N
为0
时,!!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
的布尔表示,转换为 0
或 1
。
第 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; // 程序成功结束
}