返回导页:导页
01 - 笔试内容
编程题小白选择用纯C语言编程,所以什么都得自己做,除了基础库,没有引用其它库,数值转换要注意边界问题,也就是最大最少值也要转换成功,链表题注意指针指向问题
不定项选择题,答案可能有多个,谨慎选择
1.一个32位数据类型的数0x1234567,以小端模式,存储到0x2001~0x2004地址中,在地址Ox2002上存储的数值是
- 0x45
- 0x23
- 0x34
- 0x56
2.使用GCC编评器,在32位平台中,有如下定义的结构体:
struct Astruct{
char a;
char b;
int c;
}attribute_((packed));
请问sizeof(struct Astruct)为多少
- 7
- 8
- 6
- 5
3.关键词virtual不能用干修饰
- 构造函数
- 成员函数
- 析构函数
- 类
4.c++的虚函数表有多少个?
- 所有类的对象实例共用一个
- 每个类有一个
- 每个对象实例有一个
- 整个程序共用一个
5.C语言中,malloc函数申请到的空间存储在哪个位置
- bss段
- 栈区
- 堆区
- data段
6.预防死锁的编程原则正确的有
- 在持有锁的临界区调用用户提供的代码
- 使用固定顺序加锁
- 使用层次锁
- 避免嵌套锁
7.一个频率为2000Hz的方波,占空比为40%,一个周期内低电平的宽度为
- 200us
- 800ms
- 300us
- 200ms
8.声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是
- int((int*)[10])*p
- 其他所有选项都不正确
- (int *p[10])(int*)
- int (*(*p)[10])(*int*)
- int [10]*p(int*)
9.指针和引用的说法,以下正确的是
- 引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,而指针在任何时候都可以改变为指向另一个对象
- 引用的创建不会调用类的烤贝构造函数
- 引用在创建的同时必须初始化,而指针在定义的时候不必初始化
- 不存在NULL引用,而指针则可以是NULL
10.下列哪些STL容器通常是由红黑树实现的?
- deque
- unordered_map
- map
- set
11.使用gcc test.c -o test命令生成的文件是
- 编译后的汇编代码文件
- 编译后的目标文件
- 可执行程序
- 预处理后的C源代码文件
12.在单循环的嵌入式系统中,使用一个全局恋量在中断函数和main函数之间传递数据,为了避免数据错误,可以采用如下做法()
- 可可用const修饰此全局变景
- 可以用volatile修饰此全局变最
- 可以用static修饰此全局恋量
- 可以用static const修饰此全局变量
13.关于单例模式和全局变量的描述,正确的是
- 单例类的构造函效必须为私有
- 如果单例类从未使用过,那么就不会创建它的对象
- 单例类的析构函数必须为私有
- 单例类必须提供一个静态方法以供全局访问
14.以下嵌入式中断,描述正确的是
- CPU使用率高,不用循环等待
- 响应速度快
- 可以强行打断原有程序的执行,从而实现CPU的抢占式调度
- 中断函数可以添加500ms延时的操作
15.以下语句有赋值作用的是
- a+1
- ++a
- a*=b
- a++
16.哪个命令用来卸载一个内核模块?
- rmmod
- unmod
- modprobe
- delmod
17.若要使用进程名来结束进程,应使用()命令
- ps-d
- profree
- psfree
- kill
18.char str[20]="0123456789”;
int a=strlen(str);
int b=sizeof(str);
a,b的值分别是
- 10,20
- 10,4
- 4,20
- 4,4
19.对所有用户的变量设置,应当放哪个文件下?
- /etc/profile
- /etc/skel/.bashrc
- ~/bash_profile
- /etc/bashrc
20.下面哪种写法表示如果cmd1成功执行,则执行cmd2命令?
- cmd1 || cmd2
- cmd1 | cmd2
- cmd1 & cmd2
- cmd1 && cmd2
编程题,纯编辑器,没有测试环境
21.要求实现下面的函数,自行实现字符串转整数,给定一个字符串表示的10进制整数(大小在int类型的范围内),转换成n进制的整数(2<=N<=36),如果转换失败,函数返回“Error"。
char* radixConvert(const char *num,const int n);
示例输入:“10”,2,调用radixConvert(“10”,2),返回:“1010"
char* radixConvert(const char*num, const int n)
{
//开辟
int flag = 1;
int data = 0;
int i = 0;
int t,k;
char c;
char *ret = (char*)malloc(sizeof(char)*33);
memset(ret,0,sizeof(char)*33);
strcpy(ret,"Error");
//入口判断
if(NULL == num || n<2 || n>36)
return ret;
//正负判断
if('-' == num[0])
{
flag = -1;
++i;
}
//转为整数
while(num[i])
{
//合法字符
if(num[i] >= '0' && num[i] <= '9')
{
data = data*10 + (num[i] - '0');
++i;
}
//非法字符
else
return ret;
}
//如果是0,特殊处理,直接返回
if(0 == data)
{
ret[0] = '0';
ret[1] = '\0';
return ret;
}
//如果不为0,计算进制
i = 0;
while(data)
{
t = data % n;
if(t < 10)
{
//正负判断,用于处理最小值
if(t >= 0)
ret[i++] = t + '0';
else
ret[i++] = -t + '0';
}
else
{
ret[i++] = t + 'A' - 10;
}
data /= n;
}
if(-1 == flag)
{
ret[i++] = '-';
}
//添加结束标志
ret[i] = '\0';
//反转
k = 0;
--i;
while(k<i)
{
c = ret[k];
ret[k] = ret[i];
ret[i] = c;
++k;
--i;
}
return ret;
}
22.电视机提供了喜爱节目功能用于收喜欢观看的节目。在喜爱节目功能中,为了更好的满足用户习惯,我们根据用户播放节目的次数,动态修改喜爱节目的排列顺序。
规则为:
(1)节目每被选播一次加1权重分;
(2)喜爱目列表按权重分由高到低排序;
(3)选播节目时,系统均会调用一次动态排序函数UpdateFavChannel,进行权重分更新和节目重新排序功能。
数据结构如下:
typedef struct_Favchannel
{
int ChannelNo;//节目编号
unsigned int FavPoints;//权重分
struct Favchannel *next;
}FavChannel;
函数名:void UpdateFavChannel(FavChannel*pFavHead,int ChannelNo);pFavHead为指向喜爱节目列表头指针(单向链表,里边的节目已经按从大到小排好序,表头无数据),ChannelNo表示选播的节目编号。
void UpdateFavChannel(FavChannel *pFavHead, int ChannelNo)
{
if(NULL == pFavHead)
return ;
FavChannel* prev = pFavHead;
FavChannel* curr = pFavHead->next;
FavChannel* target = pFavHead->next->next;
int t;
unsigned int k;
//寻找target
while((NULL != target) && (target->ChannelNo != ChannelNo))
target = target->next;
//没有则返回
if(NULL == target)
return;
else
{
//加权重
target->FavPoints += 1;
//如果本来就在列头,特殊处理,不需要排序
if(target == pFavHead->next)
return ;
else
{
//开始排序,寻找插入目标
while((NULL != curr) && (curr->FavPoints >= target->FavPoints))
{
prev = curr;
curr = curr->next;
}
//如果找到,而且不是target指针,就交换位置
//交换两个项的值,无需移动指针
if(NULL != curr && prev != target)
{
t = curr->ChannelNo;
curr->ChannelNo = target->ChannelNo;
target->ChannelNo = t;
k = curr->FavPoints;
curr->FavPoints = target->FavPoints;
target->FavPoints = k;
}
}
}
}
02 - 总结
- 基础知识涉及C、C++、Linux、嵌入式相关、操作系统以及数据结构,需要好好复习
- 纯编辑器写代码一定要自己用笔纸试验整个过程,没有测试环境,太容易出错
返回导页:导页