第 1.1 节

26届嵌入式组提前批C/C++考核题

作者
李骏远的头像李骏远
协作者
董佳辉的头像董佳辉
发布于 2025/02/07更新于 2026/08/20

考前须知:

本次考试禁止各种形式的作弊,禁止使用AI,如发现取消考试成绩

可以翻看自己记录的笔记

1.选择题判断题的答案通过.txt文件保存

2.编程题每一题将源文件和头文件封装进文件夹,文件夹按照题号命名1,2,3,4,5

3.将所有题目封装进总文件夹命名格式为:姓名-学号

4.总文件夹打成压缩包zip格式通过邮件发送到060203selina@gmail.com

如被Gmail退回请发送到2762335112@qq.com

一、选择题 10题 × 3分 = 30分

单选 01|在文件作用域写下 `int system_mode;` 且没有显式初始化。程序开始运行时,`system_mode` 的值是( )。 [3分]

A.0

B.随机值

C.1

D.编译错误

单选 02|执行下列代码后,输出结果是( )。 [3分]

int a = 6;
int b = a;
int* p = &a;
*p = 9;
std::cout << a << " " << b;

A.6 6

B.9 9

C.9 6

D.6 9

单选 03|执行下列代码后,输出结果是( )。 [3分]

int count = 2;
{
    int count = 5;
    ++count;
}
std::cout << count;

A.2

B.3

C.5

D.6

单选 04|执行下列代码后,`result` 的值是( )。 [3分]

int x = 7;
int result = (x % 2 == 0) ? x / 2 : x + 1;

A.3

B.4

C.7

D.8

单选 05|执行下列代码后,输出结果是( )。 [3分]

int n = 0;
do {
    n += 2;
} while (n < 0);
std::cout << n;

A.0

B.2

C.无限循环

D.编译错误

单选 06|执行下列代码后,输出结果是( )。 [3分]

int data[4] = {10, 20, 30, 40};
int* p = &data[1];
std::cout << *(p + 1);

A.10

B.20

C.30

D.40

单选 07|执行下列代码后,输出结果是( )。 [3分]

void update(int value, int* target) {
    value += 2;
    *target += 2;
}
int a = 3;
int b = 3;
update(a, &b);
std::cout << a << " " << b;

A.3 3

B.5 3

C.3 5

D.5 5

单选 08|执行下列代码后,输出结果是( )。 [3分]

struct Data { int value; };
Data d = {4};
Data* p = &d;
p->value = 10;
std::cout << d.value;

A.4

B.10

C.输出地址

D.编译错误

单选 09|关于头文件中的 `extern int total;`,下列说法正确的是( )。 [3分]

A.它要求每个包含该头文件的源文件都定义一个独立的 total

B.它通常声明 total 在其他位置有且只有一个定义

C.它把 total 定义为局部变量

D.它使 total 成为常量

单选 10|关于 `union`,下列说法正确的是( )。 [3分]

A.所有成员始终拥有互不重叠的独立存储

B.所有成员共享同一块存储,写入一个成员会影响这块共享存储

C.联合体大小一定等于所有成员大小之和

D.联合体不能包含整型成员

二、判断题 5题 × 2分 = 10分

判断 01|在包含正确头文件的 C++ 程序中,`printf` 和 `std::cout` 都可以用于输出。 [2分]

答案:( )

判断 02|函数内的普通局部变量`int value;` 如果没有初始化,读取它时一定得到 0。 [2分]

答案:( )

判断 03|指针变量本身也是一个有存储和地址的对象;它保存的值通常是另一个对象的地址或空指针值。 [2分]

答案:( )

判断 04|把指针传给函数时,复制的是指针值;函数重设形参指针不会改变调用者的指针,但通过解引用仍可修改所指对象。 [2分]

答案:( )

判断 05|只要在头文件中写`extern int total;`,链接器就会为每个源文件各创建一个独立的 `total`。 [2分]

答案:( )

三.编程题

进入编程题前自检|每个变量保存什么值?每个指针保存谁的地址?函数修改的是副本还是原对象?

编程题 1|变量赋值与数值换算 8分

任务|编写完整程序:输入两个整数 `raw` 和 `offset`。先执行 `int corrected = raw;`,再将 `offset` 加到 `corrected`;若结果小于 0 则改为 0,若大于 4095 则改为 4095。定义常量 `REF_VOLTAGE = 3.3`,按 `voltage = corrected * REF_VOLTAGE / 4095.0` 计算电压并保留两位小数。输入 `2000 100` 时输出 `raw=2000`、`corrected=2100`、`voltage=1.69V`。最后用一句话解释为什么修改 `corrected` 不会改变 `raw`。

考查点|变量、常量、赋值复制、数据类型、运算符、if/else、浮点除法

编程题 2|函数编写与值传递 10分

任务|声明并定义 `void addOne(int value)`,在函数内执行 `value += 1`;再声明并定义 `int stepValue(int start, int step, int times)`,使用 `while` 循环把 `step` 累计 `times` 次并返回结果。在 `main` 中令 `int n = 10`,调用 `addOne(n)` 后输出 `n`,再输出 `stepValue(n, 3, 4)`。预期结果分别为 10 和 22,并解释第一个结果。

考查点|函数声明、定义、调用、返回值、局部变量、while、值传递

编程题 3|指针与结构体 14分

任务|定义 `struct Motor { int id; int speed; bool enabled; };`。实现 `bool setSpeed(Motor* motor, int newSpeed)`:空指针或速度不在 -5000~5000 时返回 `false`,否则写入速度、将 `enabled` 设为 `true` 并返回 `true`。实现 `void stopMotor(Motor* motor)`:非空时把速度设为 0、使能设为 `false`。在 `main` 中创建 `Motor m = {1, 1200, true}` 和 `Motor* p = &m`,输出 `&m` 与 `p`,依次调用 `setSpeed(p, 1500)`、`stopMotor(&m)` 并打印每步结果。说明两个地址为什么相同、函数为什么能修改原结构体。

考查点|结构体对象、取地址、指针值、空指针、`->`、通过地址修改原对象

struct Motor {
    int id;
    int speed;
    bool enabled;
};

bool setSpeed(Motor* motor, int newSpeed);
void stopMotor(Motor* motor);

编程题 4|分文件编程并调用 12分

任务|建立 `counter.h`、`counter.cpp` 和 `main.cpp`。在命名空间 `counter` 中:头文件声明 `extern int total;`、`void reset();`、`void add(int value);`、`int getTotal();`;`counter.cpp` 中只定义一次 `total` 并实现三个函数;`main.cpp` 中调用 `reset()`,再依次加入 4 和 7,输出 `total=11`。写出同时编译两个 `.cpp` 文件的命令,并说明`extern` 声明与变量定义的区别。

考查点|头文件、声明与定义、extern、命名空间、跨文件调用与链接

// counter.h
namespace counter {
extern int total;
void reset();
void add(int value);
int getTotal();
}

编程题 5|混合应用:采样通道分析 16分

任务|定义 `enum State { NORMAL, ALERT };` 和结构体 `Channel`,其中包含 `id`、6 个整型样本、`minimum`、`maximum`、`average`、`state`。实现 `int sumSamples(const int* data, int length)`;实现 `void findMinMax(const int* data, int length, int* minValue, int* maxValue)`;实现 `void analyze(Channel* channel, int threshold)`,计算最小值、最大值和平均值,平均值大于等于阈值时设为 `ALERT`;实现 `void printChannel(const Channel* channel)`,使用 `switch` 输出状态。`main` 中使用样本 `{62, 68, 75, 80, 85, 90}`、阈值 75,应得到 `minimum=62`、`maximum=90`、`average=76.67`、`state=ALERT`。

考查点|枚举、结构体、数组、for、函数、指针、输出参数、if、switch、综合调试

enum State { NORMAL, ALERT };

struct Channel {
    int id;
    int samples[6];
    int minimum;
    int maximum;
    double average;
    State state;
};