第 2.4 节

C/C++公共基础二卷考核题及答案

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

考核完毕后,请将所写的所有文件压成一个压缩包,压缩包名字的格式为 专业班级+姓名(例如:机电2103董佳辉),发到邮箱tungchiahui@gmail.com。(优先发)

如果邮件被谷歌服务器退回,就发送到邮箱tungchia-hui@foxmail.com

一、选择题(每题3分,共33分)

题目答案写在记事本中,以.txt的形式提交。

1.局部变量储存在以下哪个内存区内?( )

A.静态存储区 B.栈区 C.堆区 D.代码区

2.char * 类型的全局变量如果没有进行初始化,那么程序会讲该变量自动初始化为?()

A.0 B.随机数 C.'0' ** D.NULL**

3.在C/C++中,0b11代表的是十进制数值3()

A.对 B.错

4.在C/C++中,0x11代表的是十进制数值17()

A.对 B.错

5.如果定义了一个数组arr[4],那么(*arr)代表的意思是()

A.单纯只是数组的名字

B.数组所有元素的值

C.数组0号元素的值

D.数组0号元素的地址(指针)

6.结构体struct变量所占的内存大小为( )

A.4字节

B.所占内存最大的成员变量的大小

C.根据不同的字长,拥有不同的大小

D.所有成员变量所占内存大小之和

7.联合体union变量所占的内存大小为( )

A.4字节

B.所占内存最大的成员变量的大小

C.根据不同的字长,拥有不同的大小

D.所有成员变量所占内存大小之和

8.一般,C语言源文件的扩展名是( )

A.c ** B.cpp C.h ** D.sln

9.一般,C/C++的头文件的作用是( )

**A.声明函数与变量 ** B.进行业务代码的编写

C.进行预处理代码的编写 D.多此一举,没有啥实质作用

10.以下说法正确的是(多选)( )

**A. ****C++****兼容C语言(.cpp里可以用c语言),且可以在C++工程中使用C语言 **

B.C语言不兼容C++(.c里不可以用C++),但可以在C语言工程中使用C++

C.C语言不兼容C++,不可以在C语言工程中使用C++

D.C语言兼容C++,可以在C语言工程中使用C++

11.以下是控制电机的部分源码,请分析下面代码中g_canx_handler变量的类型( )

CAN_HandleTypeDef   g_canx_handler;     /* CANx句柄 */
/**
 * @brief       CAN初始化
 * @param       tsjw    : 重新同步跳跃时间单元.范围: 1~3;
 * @param       tbs2    : 时间段2的时间单元.范围: 1~8;
 * @param       tbs1    : 时间段1的时间单元.范围: 1~16;
 * @param       brp     : 波特率分频器.范围: 1~1024;
 *   @note      以上4个参数, 在函数内部会减1, 所以, 任何一个参数都不能等于0
 *              CAN挂在APB1上面, 其输入时钟频率为 Fpclk1 = PCLK1 = 42Mhz
 *              tq     = brp * tpclk1;
 *              波特率 = Fpclk1 / ((tbs1 + tbs2 + 1) * brp);
 *              我们设置 can_init(1, 6, 7, 6, 1), 则CAN波特率为:
 *              42M / ((6 + 7 + 1) * 6) = 500Kbps
 *
 * @param       mode    : CAN_MODE_NORMAL,  普通模式;
                          CAN_MODE_LOOPBACK,回环模式;
 * @retval      0,  初始化成功; 其他, 初始化失败;
 */
uint8_t CAN1_Init(uint32_t tsjw, uint32_t tbs2, uint32_t tbs1, uint16_t brp, uint32_t mode)
{
    g_canx_handler.Instance = CAN1;
    g_canx_handler.Init.Prescaler = brp;                /* 分频系数(Fdiv)为brp+1 */
    g_canx_handler.Init.Mode = mode;                    /* 模式设置 */
    g_canx_handler.Init.SyncJumpWidth = tsjw;           /* 重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1TQ~CAN_SJW_4TQ */
    g_canx_handler.Init.TimeSeg1 = tbs1;                /* tbs1范围CAN_BS1_1TQ~CAN_BS1_16TQ */
    g_canx_handler.Init.TimeSeg2 = tbs2;                /* tbs2范围CAN_BS2_1TQ~CAN_BS2_8TQ */
    g_canx_handler.Init.TimeTriggeredMode = DISABLE;    /* 非时间触发通信模式 */
    g_canx_handler.Init.AutoBusOff = DISABLE;           /* 软件自动离线管理 */
    g_canx_handler.Init.AutoWakeUp = DISABLE;           /* 睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位) */
    g_canx_handler.Init.AutoRetransmission = ENABLE;    /* 禁止报文自动传送 */
    g_canx_handler.Init.ReceiveFifoLocked = DISABLE;    /* 报文不锁定,新的覆盖旧的 */
    g_canx_handler.Init.TransmitFifoPriority = DISABLE; /* 优先级由报文标识符决定 */
    if (HAL_CAN_Init(&g_canx_handler) != HAL_OK)
    {
        return 1;
    }
}

A.常量 ** B.结构体** C.指针变量 D.浮点型

image\.png

二、程序题(每题10分,第16题17分,共67分)

提交源文件.cpp,源文件以题号命名。

第15题提交压缩包,压缩包内要有main.cpp和库的文件,压缩包以题号命名。

12.输出 [100,1000)范围内所有的水仙花数

水仙花数:个*个*个 + 十*十*十 + 百*百*百 == 自身 例如 153:1*1*1 + 5*5*5 + 3*3*3 = 1 + 125 + 27 == 153

image\.png

#include <iostream>

using std::cout;
using std::cin;
using std::endl;

int main()
{
    for (int i = 100; i < 1000; i++) {
        int a = i / 100;
        int b = (i / 10) % 10;
        int c = i % 10;
        if (a * a * a + b * b * b + c * c * c == i) {
            cout << i << " ";
        }
    }
    return 0;
}

13.请使用联合体(共同体)来完成输入一个字母,并打印他的ascii码。 (特殊要求:该联合体变量必须定义为局部变量)

image3\.png

#include <iostream>

using std::cout;
using std::cin;
using std::endl;

union Convert
{
        int asc;
        char letter;
};

typedef Convert con;

int main()
{
        con con__;     //局部变量
        con__.asc = 0;   //有的编译器需要初始化后三个字节。
        cin >> con__.letter;
        cout << con__.asc << endl;
        return 0;
}

14.题目:定义一个结构体Point,包含二个双精度浮点型的变量x和y。(含义: 每个结构体变量都是一个点,成员变量是该点的x,y坐标)

然后,定义一个函数p_swap(),该函数返回值是void,作用是交换两个point结构体变量的x,y。最后,编写一个主函数main(),创建两个Point结构体的实例,调用p_swap()函数交换两点坐标,并输出交换前和交换后的结果。(特殊要求:使用typedef对结构体类型进行重命名)

image\.png

#include <iostream>

using std::cout;
using std::cin;
using std::endl;

// 定义结构体Point
typedef struct
{
    double x;
    double y;
}Point;

// 定义函数p_swap,交换两个Point结构体变量的x,y
void p_swap(Point& p1, Point& p2)
{
    double temp_x;
    double temp_y;

    temp_x = p1.x;
    temp_y = p1.y;
    p1.x = p2.x;
    p1.y = p2.y;
    p2.x = temp_x;
    p2.y = temp_y;
}

int main()
{
    // 创建两个Point结构体实例
    Point p1;
    Point p2;

    cout << "请输入第一个点P1的X:";
    cin >> p1.x;
    cout << "请输入第一个点P1的Y:";
    cin >> p1.y;
    cout << "请输入第一个点P2的X:";
    cin >> p2.x;
    cout << "请输入第一个点P2的Y:";
    cin >> p2.y;

    // 输出交换前的结果
    cout << "交换之前: \nP1的X,Y是:" << p1.x << " " << p1.y << endl << "P2的X,Y是:" << p2.x << " " << p2.y << endl;

    // 调用函数p_swap交换两点坐标
    p_swap(p1, p2);

    // 输出交换后的结果
    cout << "交换之后: \nP1的X,Y是:" << p1.x << " " << p1.y << endl << "P2的X,Y是:" << p2.x << " " << p2.y << endl;

    return 0;
}

image\.png

15.我们需要定义一个储存一个复数的命名空间,请定义一个命名空间为complex_number_ns,该命名空间内有两个整形变量real,imag(含义:real为实部,imag为虚部),还有一个函数norm_calc,该函数可接受两个整形参数(实部与虚部),并返回该复数的向量的模(范数)。

请在主函数中输入一个复数的实部与虚部,并打印他的模。(必须使用该命名空间)

image\.png

#include <iostream>

using std::cout;
using std::cin;
using std::endl;

namespace complex_number_ns
{
    int real;
    int imag;

    float norm_calc(int real, int imag);
}

int main()
{
    cout << "请输入复数的实部: ";
    cin >> complex_number_ns::real;

    cout << "请输入复数的虚部: ";
    cin >> complex_number_ns::imag;

    auto norm = complex_number_ns::norm_calc(complex_number_ns::real, complex_number_ns::imag);

    cout << "复数的模为: " << norm << endl;

    return 0;
}


float complex_number_ns::norm_calc(int real, int imag)
{
    return sqrt(real * real + imag * imag);
}

16.编写自己的库并调用

主函数写在main.cpp文件中,然后新建1个C++的库,库名叫my_lib。

my_lib库用来声明和定义函数。该库内有函数my_compare,该函数接受两个int类型的数为参数,比较两个参数的大小,并返回这两个参数中最大的一个(返回值为float),

然后在该库中重载该函数,使其能够接受两个float类型的数为参数,比较这两个参数的大小,并返回两个参数中最小的一个(返回值为float)

在主函数中定义两个int类型的变量a,b;定义两个float类型的变量m,n;请用库中的函数找到a和b中最大的数并打印,找到m和n中最小的数并打印。

image\.png

main.cpp

#include <iostream>
#include "my_lib.h"

using std::cout;
using std::cin;
using std::endl;

int main()
{
        int a, b;
        float m, n;
        cout << "请输入整形a:";
        cin >> a;
        cout << "请输入整形b:";
        cin >> b;
        cout << "请输入浮点型m:";
        cin >> m;
        cout << "请输入浮点型n:";
        cin >> n;

        cout << "整形中比较大的数是:" << my_compare(a, b) << endl;
        cout << "浮点型中比较小的数是:" << my_compare(m, n) << endl;
        return 0;
}

my_lib.cpp

#include "my_lib.h"

float my_compare(int a, int b)
{
        if (a >= b)
        {
                return a;
        }
        return b;
}


float my_compare(float a, float b)
{
        if (a >= b)
        {
                return b;
        }
        return a;
}

my_lib.h

#ifndef __MY_LIB_H_
#define __MY_LIB_H_

float my_compare(int a, int b);
float my_compare(float a, float b);


#endif

image\.png

17.要求使用函数模板,请创建一个模板类型占位符T,并编写一个名为 calculate 的函数,该函数可以接受三个T类型的参数,并计算三个参数相加后的结果,并将结果当做返回值。该函数第三个参数有默认值为0,调用只给予两个参数,则只计算两个参数的和并返回。

在主函数里定义2个无符号短整形变量a,b;然后定义三个单精度浮点型变量x,y,z;

要求调用calculate函数计算出a,b的和,x,y的和以及x,y,z的和,并打印。

image\.png

#include <iostream>

using std::cout;
using std::cin;
using std::endl;

template <typename T>
T calculate(T a, T b, T c = 0);


int main()
{
    unsigned short int a, b;
    float x, y, z;
    cout << "请输入无符号短整形a:";
    cin >> a;
    cout << "请输入无符号短整形b:";
    cin >> b;
    cout << "请输入浮点型x:";
    cin >> x;
    cout << "请输入浮点型y:";
    cin >> y;
    cout << "请输入浮点型z:";
    cin >> z;
    cout << "ab的和是:" << calculate<unsigned short int>(a, b) << endl;
    cout << "xy的和是:" << calculate<float>(x,y) << endl;
    cout << "xyz的和是:" << calculate<float>(x,y,z) << endl;
        return 0;
}


template <typename T>
T calculate(T a, T b, T c = 0)
{
        return a + b + c;
}

image\.png