一、单选题(每题 2 分,共 30 分)
1. 高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。
A. 编辑
B. 保存
C. 调试
D. 编译
答案:D
解析:略
2. 能够实现下面流程图功能的伪代码是( )。
A.
if
条件判断
then
语句块
B.
if
条件判断
then
什么也不做
else
语句块
C.
while
条件判断
do
语句块
D.
while not
条件判断
do
语句块
3. 下列关于 C++语言的叙述,正确的是( )。
A.
char
类型变量不能赋值给
int
类型的变量。
B. 两个
int
类型变量相乘,计算结果还是
int
类型。
C. 计算两个
int
类型变量相乘时,如果乘积超出了
int
类型的取值范围,程序会报错崩溃。
D. 计算两个
double
类型变量相除时,如果除数的值为
0.0
,程序会报错崩溃。
4. 下列关于 C++语言的叙述,不正确的是( )。
A.
if
语句中的判断条件必须用小括号‘
(
’和‘
)
’括起来。
B.
for
语句中两个‘
;
’之间的循环条件可以省略,表示循环继续执行的条件一直满足。
C. 循环体包含多条语句时,可以用缩进消除二义性。
D. 除了“先乘除、后加减”,还有很多运算符优先级。
答案:C
解析:
- 循环体包含多条语句时,必须用大括号‘{’和‘}’括起来,否则只有第一条语句会被循环执行,这是一个常见的逻辑错误。
5. 以下哪个是 C++语言的关键字?( )
A.
main
B.
max
C.
double
D.
sqrt
答案:C
解析:double 是 C++语言的基本数据类型之一,用于表示双精度浮点数,它是一个关键字,不能用作其他用途。
6. 以下哪个不是 C++语言的运算符?( )
A.
>=
B.
/=
C.
||
D.
<>
7. 如果
a
为
int
类型的变量,
b
为
char
类型的变量,则下列哪个语句不符合 C++语法?( )
A.
a = a + 1.0;
B.
a = (int)(b - '0');
C.
b = (char)(a + '0');
D.
(int)b = a;
答案:D
解析:本题主要考察转化问题:
-
隐式类型转换:在某些情况下,C++ 会自动将一种数据类型转换为另一种数据类型。例如,当一个 int 类型的变量与一个 double 类型的变量相加时,C++ 会将 int 类型的变量转换为 double 类型的变量,然后执行加法运算。这种类型转换称为隐式类型转换。
-
强制类型转换:在某些情况下,程序员可能需要将一种数据类型强制转换为另一种数据类型。例如,将一个 double 类型的变量转换为 int 类型的变量。在 C++ 中,可以使用强制类型转换来实现这一点。
-
选项D,这个语句不符合 C++语法。在 C++中,不允许将值赋给一个强制类型转换的结果,因为强制类型转换的结果是一个临时值,不能被赋值。
8. 如果用两个
int
类型的变量
a
和
b
分别表达平行四边形的两条边长,用
int类型的变量 h
表达
a
边对应的高,则下列哪个表达式不能用来计算
b
边对应的高?( )
A.
a / b * (0.0 + h)
B.
(0.0 + a * h) / b
C.
a * h / (b + 0.0)
D.
(a + 0.0) * h / b
答案:A
解析:b对应的高=a*h/b,先求出平行四边形的面积,再除以b的边长。
选项A:a / b * (0.0 + h),a / b,a、b都是int类型,它们相除得到的也是int类型(例如,7/2=3)
9. 以下哪个循环语句会无限次执行?( )
A.
for (int a = 0; a; a++) ;
B.
for (bool b = false; b <= true; b++) ;
C.
for (char c = 'A'; c < 'z'; c++) ;
D.
for (double d = 0.0; d < 10.0; d += 0.001) ;
答案:B
解析:B. for (bool b = false; b <= true; b++) ; 这个循环语句的条件是 b <= true,而 b 的初始值为 false。因为 false 在 C++ 中被视为 0,而 true 被视为 1,0<=1,这条语句会一直成立。
A. for (int a = 0; a; a++) ; 这个循环语句的条件是 a,而 a 的初始值为 0。因为 0 在 C++ 中被视为 false,所以这个循环语句永远不会执行。
C. for (char c = ‘A’; c < ‘z’; c++) ; 这个循环语句的条件是 c < ‘z’,而 c 的初始值为 ‘A’。因为 ‘A’ 在 ASCII 码表中的值为 65,而 ‘z’ 的值为 122,所以这个循环语句会执行 57 次,然后停止。
D. for (double d = 0.0; d < 10.0; d += 0.001) ; 这个循环语句的条件是 d < 10.0,而 d 的初始值为 0.0。d += 0.001,该循环执行有限次数一定会大于等于10.0
10. 如果
a
为
char
类型的变量,且
a
的值为
'C'
(已知
'C'
的 ASCII 码为 67), 则执行 cout << (a + 2);
会输出( )。
A.
E
B.
C+2
C.
C2
D.
69
答案:D
解析:
隐式类型转换:在某些情况下,C++ 会自动将一种数据类型转换为另一种数据类型。例如,当一个 char 类型的变量与一个 int类型的变量相加时,C++ 会将char类型的变量转换为 int类型的变量,然后执行加法运算。这种类型转换称为隐式类型转换。
输出
11. 如果
a
和
b
均为
int
类型的变量,下列表达式能正确判断“
a
等于
1
且
b等于 1
”的是( )。
A.
(a == b) && (b == 1)
B.
(a && b)
C.
(a == b == 1)
D.
(a * b == 1)
12. 如果
a
为
char
类型的变量,下列哪个表达式可以正确判断“
a
是数字”? ( )
A.
'0' <= a && a <= '9'
B.
'1' <= a && a <= '0'
C.
'0' <= a <= '9'
D.
'1' <= a <= '0
答案:A
解析:略
13. 在下列代码的横线处填写( ),使得输出是 9
。
A.
(a + b)
B.
(a + b - '0')
C.
(char)(a + b)
D.
(char)(a + b - '0')
答案:D
解析:
选项A:在 C++ 中,字符变量实际上是以整数形式存储的,每个字符都对应一个 ASCII 码。字符 ‘3’ 对应的 ASCII 码是 51,字符 ‘6’ 对应的 ASCII 码是 54。所以,当你执行 cout<<(a+b);
时,实际上是在输出两个字符对应的 ASCII 码的和,即 51 + 54 = 105。所以,这段代码的输出将会是 105。同理选项B的值是57;
如果要输出字符,需要将数值转化成char类型,所以答案选D
14. 在下列代码的横线处填写( ),可以使得输出是 42
。
A.
i % 3 == 0
B.
20 % i == 0
C.
i <= 8
D.
i >= 18
答案:B
解析:根据代码求的是20所有的因数和,20的因数:1,20,2,10,4,5,1+20+2+10+4+5=42
15. 执行以下 C++语言程序后,输出结果是( )。
A.
A
B.
B
C.
C
D.
D
答案:C
解析:只有答案选C,满足3个条件
二、判断题(每题 2 分,共 20 分)
1. 诞生于 1986 年的中华学习机 CEC-I 入选了 2021 年的 CCF 计算机历史记忆(一 类),它的内存只有 64KB。当时的汉字编码字符集 GB2312 中共有 6763 个汉字,假如每个汉字用 2 个字节编码,将整个 GB2312 汉字字符集都放入 CEC-I 的内存,也只占用了不超过 1/5 的内存空间。
答案:错误
解析:64KB=64*1024=65536B,6763*2/65536约等于0.21,超过1/5 的内存空间
2. 域名是由一串用点分隔的名字来标识互联网上一个计算机或计算机组的名称, CCF 编程能力等级认证官方网站的域名是 gesp.ccf.org.cn,其中顶级域名是 gesp。
3. 在使用 C++语言编写程序时,不能使用
sqrt
、
abs
等数学函数,包含
<cmath> 或<math.h>
头文件后就能够使用了。
4. 在 C++语言中,标识符中可以有下划线‘
_
’。同时,‘
_
’也是 C++语言的运算符。
答案:错误
解析:在 C++语言中,标识符中可以有下划线‘_’,但是‘_’不是 C++语言的运算符
5. 如果
a
是
double
类型的变量,而且值为
3.5
,则表达式
a * 10
的计算结果 为 35
,且结果类型为
int
。
答案:错误
解析:a * 10是35.0结果类型为double
6. 在
if
语句中,如果条件成立时需要执行多条语句,可以使用大括号‘
{
’和 ‘}
’将这些语句括起来。
7. 循环语句的循环体有可能无限制地执行下去。
8.
++
和
==
都是 C++语言的运算符,但
+=
不是。
9. 如果
a
为
char
类型的变量,且取值为大写字母
'F'
,则执行语句
a = a + 1; 后,a
的值会变为大写字母
'G'
。
10. 表达式
sqrt(9.0)
的计算结果为
3
,且结果类型为
int
。
答案:错误
解析:sqrt(9.0)的计算结果为 3.0,且结果类型为 double
三、编程题(每题 25 分,共 50 分)
1. 找素数
【问题描述】
小明刚刚学习了素数的概念:如果一个大于 1 的正整数,除了 1 和它自身外, 不能被其他正整数整除,则这个正整数是素数。现在,小明想找到两个正整数A 和B
之间(包括
A
和
B
)有多少个素数?
【输入描述】
输入 2 行,第一行包含正整数
?
,第二行包含正整数
?
。约定
2 ≤ A ≤ B≤ 1000。
【输出描述】
输出一行,包含一个整数
C
,表示找到
C
个素数。
【样例输入 1】
【样例输出 1】
【样例解释 1】
在 2 和 10 之间有 4 个素数,分别为:2、3、5、7。
【样例输入 2】
【样例输出 2】
【参考程序】
素数是只有两个正因数(1 和它自身)的正整数。程序重点:检查n是否可以被小于其平方根的任何数整除
#include <iostream>
using namespace std;
int main() {
int a = 0, b = 0, cnt = 0; // 初始化变量a,b和计算变量cnt
cin >> a >> b; // 从用户输入中读取两个整数
// 对于范围[a, b]内的每个数n
for (int n = a; n <= b; n++) {
bool isPrime = true; // 假设n是素数
// 检查n是否可以被小于其平方根的任何数整除
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
isPrime = false; // 如果n可以被i整除,那么n不是素数
break;
}
}
// 如果n是素数,增加计数器
if (isPrime)
cnt++;
}
cout << cnt << endl; // 输出素数的数量
return 0;
}
2. 自幂数判断
【问题描述】
自幂数是指,一个
N
位数,满足各位数字
N
次方之和是本身。例如,153 是 3 位数,其每位数的 3 次方之和,1 ^
3
+ 5 ^
3
+ 3 ^
3
= 153
,因此 153 是自幂数;1634 是 4 位数,其每位数的 4 次方之和,1 ^
4
+ 6^
4
+ 3^
4
+ 4 ^
4
= 1634
,因此 1634 是自幂数。
现在,输入若干个正整数,请判断它们是否是自幂数。
【输入描述】
输入第一行是一个正整数
M
,表示有
M
个待判断的正整数。约定
1 ≤ M ≤ 100
。
从第 2 行开始的
M
行,每行一个待判断的正整数。约定这些正整数均小于
10 ^
8
。
【输出描述】
输出
M
行,如果对应的待判断正整数为自幂数,则输出英文大写字母
'T'
,
否则输出英文大写字母
'F'
。
提示:不需要等到所有输入结束在依次输出,可以输入一个数就判断一个数
并输出,再输入下一个数。
【样例输入 1】
【样例输出 1】
【样例输入 2】
【样例输出 2】
【参考程序】
#include <iostream>
using namespace std;
int main() {
int m = 0;
cin >> m; // 读取测试用例的数量
for (int i = 0; i < m; i++) { // 对于每个测试用例
int n = 0;
cin >> n; // 读取要检查的数
// 计算 n 有多少个位数,记为 length,例如n是153,length是3
int t = n, length = 0;
while (t > 0) {
t /= 10;
length++;
}
// 计算 n 的每位数字的 length 次方之和,记为 sum
int sum = 0;
t = n;
while (t > 0) {
int d = t % 10; // 获取 t 的最后一位数字,例如153,t是3
t /= 10; // 去掉 t 的最后一位数字,t从153,变成15
// 计算 d 的 length 次方
int mul = 1;
for (int j = 0; j < length; j++)
mul *= d;
sum += mul; // 将 d 的 length 次方加到 sum 上
}
// 如果 sum 和 n 相等,那么 n 是自幂数
if (sum == n)
cout << "T" << endl; // 输出 "T" 表示 n 是自幂数
else
cout << "F" << endl; // 输出 "F" 表示 n 不是自幂数
}
return 0;
}