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

#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码。 (特殊要求:该联合体变量必须定义为局部变量)

#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对结构体类型进行重命名)

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

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

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

#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;
}

