一、单选题(每题 2 分,共 30 分)
第一代:真空管(电子管)计算机
电脑的前身是一种叫"加法器"的东西,是由法国的一位数学家"布莱士·帕斯卡"所发明后来又渐渐改良...可以做加减乘除的四则运算的"差分机"。
第二代:晶体管计算机
晶体管的发明,在计算机领域引来一场晶体管革命,它以尺寸小、重量轻、寿命长、效率高、发热少、功耗低等优点改变了电子管元件运行时产生的热量太多、可靠性较差、运算速度不快、价格昂贵、体积庞大这些缺陷,从此大步跨进了第二代的门槛。
第三代:集成电路计算机
1958年德州仪器的工程师Jack Kilby发明了集成电路(IC),将三种电子元件结合到一片小小的硅片上。更多的元件集成到单一的半导体芯片上,计算机变得更小,功耗更低,速度更快。这一时期的发展还包括使用了操作系统,使得计算机在中心程序的控制协调下可以同时运行许多不同的程序。
第四代:超大规模集成电路计算机
1967年和1977年分别出现了大规模和超大规模集成电路。第四代计算机是指从1970年以后采用大规模集成电路(LSI)和超大规模集成电路(VLSI)为主要电子器件制成的计算机。例如80386微处理器,在面积约为10mm X l0mm的单个芯片上,可以集成大约32万个晶体管。

int(-123.123 / 10)
,先进行除法运算,得到 -12.3123,然后进行截断取整,结果是 -12。






在 C++ 中,break 和 continue 是两个控制语句,用于在循环中控制程序流程。
- break 语句: break 语句用于立即终止当前所在的循环(for、while 或 do-while 循环),然后跳出循环体,继续执行循环后面的代码。使用 break 可以提前跳出循环,而不必等到循环条件不满足才结束。
- continue 语句: continue 语句用于立即跳过当前循环体中的剩余代码,然后继续执行下一次循环迭代。使用 continue 可以在满足某个条件时,跳过本次循环的剩余部分,而不终止整个循环。
- 横线处需要填写一个终止当前循环语句,所以答案A符合


这是因为,外层循环从1到8循环,内层循环从1开始,每次增加2,直到小于外层循环的计数器i。因此,内层循环的迭代次数如下:
- i = 1: 0次
- i = 2: 1次(j=1)
- i = 3: 1次
- i = 4: 2次(j=1,3)
- i = 5: 2次
- i = 6: 3次(j=1,3,5)
- i = 7: 3次
- i = 8: 4次(j=1,3,5,7)
因此,总共有16次迭代,cnt的值增加了16次,最终的值为16。

外层循环 for (int i = 1; i < 13; i += 3)
每次增加3,内层循环 for (int j = 1; j < i; j += 2)
每次增加2。然后,对于每个内层循环,检查 if (i * j % 2 == 0)
是否成立,如果成立就执行 break
中断内层循环,否则增加 cnt
的值。
现在我们逐步分析内层循环的执行:
- 当
i = 1
时,内层循环没有执行,因为j < i
不满足条件。 - 当
i = 4
时,内层循环执行一次,j = 1
,i * j
是偶数,因此执行break
中断内层循环。 - 当
i = 7
时,内层循环执行两次,j = 1,
3
,5三次都不满足i * j % 2 == 0
条件,所以cnt
值增加3。 - 当
i = 10
时,内层循环执行三次,j = 1,i * j
是偶数满足条件,所以break
。
最后,将 cnt
的值输出,即 cout << cnt;
,得到的结果是 3。

答案:B
- 初始时,
x
的值为 1。 - 进入
while
循环,首先检查if (!(x % 3))
,如果x
是3的倍数,输出x
的值并在后面加上逗号。在这个阶段,x
的值为 1,因此不满足条件,不执行这个分支。 - 接下来,进入
else if (x / 10)
分支。这个条件会在x
超过等于 10 时成立。此时x
为 1,所以条件不成立,不执行break
,继续执行x += 2;
。 - 循环继续,此时
x
变为 3。再次进入if (!(x % 3))
分支,因为 3 是 3 的倍数,所以输出3
。 - 循环继续,
x
变为 5,然后 7,9,11。在x是9的时候,9是3的倍数,所以输出3。 - 在
x
变为 11 时,再次进入else if (x / 10)
分支,因为此时x
除以 10 的结果为 1(整数除法),条件成立,执行break
,跳出循环。 - 最后,输出循环结束时的
x
的值,即 11。






True
不是一个合法的标识符。C++是区分大小写的,所以True
会被认为是一个未声明的标识符,从而导致编译错误。
二、判断题(每题2分,共20分)
7.8 / 2
的值为 3.9
,一般默认类型为 double
。如果需要将其转换为 float
类型,可以使用强制类型转换运算符
(2 * 3) || (2 + 5)
的值为 1
。这是因为 ||
运算符表示逻辑或,只要其中一个操作数为真,整个表达式的结果就为真。在这个表达式中,(2 * 3)
的结果为 6
,而 (2 + 5)
的结果为 7
,它们都被视为真。因此,整个表达式的结果为真,即 1
。
C++中的逗号表达式是一种特殊的运算符,它可以将多个表达式组合在一起,并按顺序执行。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。从本质上讲,逗号的作用是导致一系列运算被顺序执行。最右边的那个表达式的值将作为整个逗号表达式的值,其他表达式的值会被丢弃。
逗号表达式的一般形式为:表达式1, 表达式2
。求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。
int a = 1, b = 2, c = 3;
int d = (a++, b++, c++);
在这个例子中,d
的值将为 3
,因为整个逗号表达式的值是 c++
,即 3
。在求解过程中,a++
和 b++
的值都会被计算,但是它们的值都会被丢弃,因为它们不是整个逗号表达式的最后一个表达式。
请注意,逗号表达式的优先级非常低,因此在使用逗号表达式时,应该使用括号来明确优先级。例如
int a = 1, b = 2, c = 3;
int d = ((a++, b++), c++);
在这个例子中,d
的值将为 4
,因为整个逗号表达式的值是 c++
,即 3
。但是,在求解过程中,a++
和 b++
的值都会被计算,因为它们被括在一对括号中,这样它们就可以在整个逗号表达式之前被计算。
2、分析题目
让我们来分析这个 for
循环的执行过程:
for (m = 0, n = 1; n < 9; ) {
n = ((m = 3 * n, m + 1), m - 1);
}
首先,初始化语句为 m = 0, n = 1;
,然后进入循环。条件是 n < 9
。
循环体内的语句是 n = ((m = 3 * n, m + 1), m - 1);
。这是一个逗号表达式,逗号表达式会依次执行其中的表达式,并返回最后一个表达式的值。
m = 3 * n
:计算3 * n
的值,将其赋给m
。m + 1
:将m
的值加1。,
:逗号操作符,返回表达式序列中的最后一个表达式的值。m - 1
:将m
的值减1,并将结果赋给n
。
所以,每次循环都会更新 m
和 n
的值。现在我们来迭代执行这个循环:
-
第一次循环:
- 初始值:
m = 0, n = 1
- 计算:
m = 3 * 1 = 3
,m + 1 = 4
,m - 1 = 3 - 1 = 2
- 最终:
n = 2
- 初始值:
-
第二次循环:
- 初始值:
m = 3, n = 2
- 计算:
m = 3 * 2 = 6
,m + 1 = 7
,m - 1 = 6 - 1 = 5
- 最终:
n = 5
- 初始值:
-
第三次循环:
- 初始值:
m = 6, n = 5
- 计算:
m = 3 * 5 = 15
,m + 1 = 16
,m - 1 = 15 - 1 = 14
- 最终:
n = 14
- 初始值:
&&
来组合两个比较表达式,如 (a >= 5 && a <= 10)
。这样可以确保 a
的值在区间 [5, 10]
内。

for
循环,并在循环体内对计数器 cnt
进行了增加和对循环变量 i
进行了增加。由于 i += 1
会在每次迭代时执行,因此实际上相当于 i
每次增加了2。2.这个代码片段中的循环会从
i = 1
开始,每次迭代都会执行 cnt += 1;
,然后 i
增加2。由于循环条件是 i < 10
,因此循环将执行5次(i 分别为 1、3、5、7、9)。所以,cnt
的最终值是5。

i = -100
开始,每次迭代 i
都会增加2,循环条件是 i < 100
。在每次迭代中,rst
累加了当前的 i
的值。
i从 -100
到 98
(不包括 100
),这是一个等差数列。你可以使用等差数列求和的公式,或者直接计算出这个范围内的偶数和。
使用等差数列求和公式:Sn=(a1+an)*n/2
项数 n:【98−(−100)】/2+1=100(加1是因为包括了0),首项 a1 为 -100,末项 an 为 98。

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





#include <iostream>
using namespace std;
int main() {
// 从用户输入中获取矩阵的大小
int n;
cin >> n;
// 外层循环控制行数
for (int i = 0; i < n; i++) {
// 内层循环控制列数
for (int j = 0; j < n; j++) {
// 如果当前元素位于主对角线或副对角线上,输出"+"
if (i == j || i + j == n - 1)
cout << "+";
else
// 否则输出"-"
cout << "-";
}
// 换行,表示当前行输出结束
cout << endl;
}
// 程序结束
return 0;
}
编程题 2

#include<iostream>
using namespace std;
int main() {
int n;
cin >> n;
int t = 0; // 初始化计数器
// 交换确保 mg 是最大的,mb 是最小的
while (n != 495) {
int mg = n % 10, ms = n / 10 % 10, mb = n / 100;
if (mg < ms) swap(mg, ms);
if (mg < mb) swap(mg, mb);
if (ms < mb) swap(ms, mb);
int max=mg*100+ms*10+mb;
int min=mb*100+ms*10+mg;
n=max-min;
t++;
}
cout << t << endl; // 输出循环次数
return 0;
}
官方给的参考答案:
#include <iostream>
using namespace std;
int main() {
int n = 0;
cin >> n;
for (int t = 0; ; t++) {
// 如果 n 等于 495,输出循环次数并退出循环
if (n == 495) {
cout << t << endl;
break;
}
// 将三位数的各个位拆分为个位、十位和百位
int m0 = n % 10, m1 = n / 10 % 10, m2 = n / 100;
// 初始化最大值和最小值
int tmax = 0, tmin = 0;
// 根据不同的位数大小关系,生成最大值和最小值
if (m0 >= m1 && m1 >= m2) {
tmax = m0 * 100 + m1 * 10 + m2;
tmin = m2 * 100 + m1 * 10 + m0;
} else if (m0 >= m2 && m2 >= m1) {
tmax = m0 * 100 + m2 * 10 + m1;
tmin = m1 * 100 + m2 * 10 + m0;
} else if (m1 >= m0 && m0 >= m2) {
tmax = m1 * 100 + m0 * 10 + m2;
tmin = m2 * 100 + m0 * 10 + m1;
} else if (m1 >= m2 && m2 >= m0) {
tmax = m1 * 100 + m2 * 10 + m0;
tmin = m0 * 100 + m2 * 10 + m1;
} else if (m2 >= m0 && m0 >= m1) {
tmax = m2 * 100 + m0 * 10 + m1;
tmin = m1 * 100 + m0 * 10 + m2;
} else { // m2 >= m1 && m1 >= m0
tmax = m2 * 100 + m1 * 10 + m0;
tmin = m0 * 100 + m1 * 10 + m2;
}
// 更新 n 为最大值和最小值的差值
n = tmax - tmin;
}
return 0;
}