C/C++公共基础二卷考核题
考核完毕后,请将所写的所有文件压成一个压缩包,压缩包名字的格式为 专业班级+姓名(例如:机电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.浮点型

二、程序题(每题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

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

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


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

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中最小的数并打印。


17.要求使用函数模板,请创建一个模板类型占位符T,并编写一个名为 calculate 的函数,该函数可以接受三个T类型的参数,并计算三个参数相加后的结果,并将结果当做返回值。该函数第三个参数有默认值为0,调用只给予两个参数,则只计算两个参数的和并返回。
在主函数里定义2个无符号短整形变量a,b;然后定义三个单精度浮点型变量x,y,z;
要求调用calculate函数计算出a,b的和,x,y的和以及x,y,z的和,并打印。



