嵌入式工程师笔试题带答案Word格式.docx
《嵌入式工程师笔试题带答案Word格式.docx》由会员分享,可在线阅读,更多相关《嵌入式工程师笔试题带答案Word格式.docx(63页珍藏版)》请在冰豆网上搜索。
next;
while(q!
=NULL)
{
temp=q->
q->
next=p;
p=q;
q=temp;
}
这样增加个辅助的指针就行乐。
ok通过编译的代码:
/*一个链表逆序*/
stdio.h>
ctype.h>
stdlib.h>
typedefstructList{
intdata;
structList*next;
}List;
List*list_create(void)
structList*head,*tail,*p;
inte;
head=(List*)malloc(sizeof(List));
tail=head;
printf("
\nListCreate,inputnumbers(endof0):
);
scanf("
%d"
&
e);
while(e){
p=(List*)malloc(sizeof(List));
p->
data=e;
tail->
tail=p;
next=NULL;
returnhead;
List*list_reverse(List*head)
List*p,*q,*r;
p=head;
q=p->
while(q!
{
r=q->
q=r;
}
head->
head=p;
voidmain(void)
structList*head,*p;
intd;
head=list_create();
\n"
for(p=head->
p;
p=p->
next)
--%d--"
p->
data);
head=list_reverse(head);
for(p=head;
p->
/*编写函数数N个BYTE的数据中有多少位是1。
*/
解:
此题按步骤解:
先定位到某一个BYTE数据;
再计算其中有多少个1。
叠加得解。
#incluede<
#defineN10
//定义BYTE类型别名
#ifndefBYTE
typedefunsignedcharBYTE;
#endif
intcomb(BYTEb[],intn)
intcount=0;
intbi,bj;
BYTEcc=1,tt;
//历遍到第bi个BYTE数据
for(bi=0;
bi<
n;
bi++)
{
//计算该BYTE的8个bit中有多少个1
tt=b[bi];
for(bj=0;
bj<
8;
bj++)
//与1相与或模2结果是否是1?
测试当前bit是否为1
//if(tt%2==1)
if((tt&
cc)==1)
count++;
}
//右移一位或除以2,效果相同
//tt=tt>
>
1;
tt=tt/2;
returncount;
//测试
intmain()
BYTEb[10]={3,3,3,11,1,1,1,1,1,1};
cout<
comb(b,N)<
endl;
return0;
/*编写一个C函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。
char*search(char*cpSource,charch)
char*cpTemp=NULL,*cpDest=NULL;
intiTemp,iCount=0;
while(*cpSource)
if(*cpSource==ch)
iTemp=0;
cpTemp=cpSource;
while(*cpSource==ch)
++iTemp,++cpSource;
if(iTemp>
iCount)
iCount=iTemp,cpDest=cpTemp;
if(!
*cpSource)
break;
++cpSource;
returncpDest;
string.h>
//
//自定义函数MyAtoI
//实现整数字符串转换为证书输出
//程序不检查字符串的正确性,请用户在调用前检查
intMyAtoI(charstr[])
inti;
intweight=1;
//权重
intrtn=0;
//用作返回
for(i=strlen(str)-1;
i>
=0;
i--)
rtn+=(str[i]-'
0'
)*weight;
//
weight*=10;
//增重
returnrtn;
voidmain()
charstr[32];
printf("
Inputastring:
gets(str);
%d\n"
MyAtoI(str));
#include<
voidreverse(chars[])
{
//字符串反转
intc,i=0,j;
for(j=strlen(s)-1;
i<
j;
j--)
{
c=s[i];
s[i]=s[j];
s[j]=c;
i++;
voidIntegerToString(chars[],intn)
inti=0,sign;
if((sign=n)<
0)//如果是负数,先转成正数
n=-n;
do//从个位开始变成字符,直到最高位,最后应该反转
s[i++]=n%10+'
}while((n=n/10)>
0);
//如果是负数,补上负号
if(sign<
0)
s[i++]='
-'
s[i]='
//字符串结束
reverse(s);
intm;
charc[100];
请输入整数m:
"
m);
IntegerToString(c,m);
integer=%dstring=%s\n"
m,c);
1、
解释C语言关键字extern、static的含义。
2、
解释C语言关键字volatile、const的含义。
3、举例说明typedef和define的用法。
4、语句for(;
1;
)有什么问题?
它是什么意思?
5、do……while和while……do有什么区别?
6、请写出下列代码的输出内容
#include
main()
{
inta,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("
b,c,d:
%d,%d,%d"
,b,c,d);
return0;
}
答:
7、设有以下说明和定义:
(32位编译器情况下)
typedefunion{longi;
intk[5];
charc;
}DATE;
structdata{intcat;
DATEcow;
doubledog;
}too;
DATEmax;
则语句printf("
sizeof(structdate)+sizeof(max));
的执行结果是:
_______
8、下面是51单片机最小系统电路图,试分析该电路结构以及实现原理?
9、谈谈汇编语言、C和C++三种语言在嵌入式开发中的区别和特点?
简述你对嵌入式概念的理解?
10、列举常见的嵌入式操作系统和单片机?
简要介绍你以前做过的项目,在项目中用过什么处理器和操作系统,实现什么功能以及关键技术。
威盛的一场笔试
1.什么是平衡二叉树?
编写一个删除平衡二叉树的程序?
2.写一个程序,求有向有权图两点之间的最小权?
3.根据你的理解,写出Cstring类的构造函数和析构函数?
4.使用C语言实现对ini文件的访问,使程序可以对int,double,字符串类进行读写。
5.n×
n个方格(n为任意整数),定义若两个格有公共边则称两个格相邻。
现将n个格中的N个格子图黑,使每个格子都与黑格子相邻。
试编程,使N最小。
1、char
*strconv(char
*p)
int
i,length;
char
temp;
length
=
strlen(p);
for(i
0;
i
length/2;
i++)
temp
*(p
+
i);
i)
-
1
+length
return
src[100];
*p;
scanf("
%s"
src);
p
strconv(src);
%s\n"
p);
3、int
cal(int
data)
//calculation
the
number
of
bit
in
one
byte
a;
count
a
data
%
100;
while
(a
!
0)
+=
2;
/=
count;
d,count;
d);
cal(d);
%d
one\n"
count);
4、#include<
void
findmax(char
j
0,max
record[200];
recordmax[200];
for(int
if((*(p
==
'
)
||
(*(p
))
if(count
max)
max
record[j]
strcpy(recordmax,record);
else
++;
if(*(p
)
break;
recordmax);
str[]="
zeng
weidsfdsaf
langd
hah"
str);
findmax(str);
北京诚亚科技有限责任公司笔试题
预处理器(Preprocessor)
1.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#defineSECONDS_PER_YEAR(60*60*24*365)UL
我在这想看到几件事情:
1).#define语法的基本知识(例如:
不能以分号结束,括号的使用,等等)
2).懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3).意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4).如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。
记住,第一印象很重要。
2.写一个"
标准"
宏MIN,这个宏输入两个参数并返回较小的一个。
#defineMIN(A,B)((A)<
=(B)(A):
(B))
这个测试是为下面的目的而设的:
1).标识#define在宏中应用的基本知识。
这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
2).三重条件操作符的知识。
这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
3).懂得在宏中小心地把参数用括号括起来
4).我也用这个问题开始讨论宏的副作用,例如:
当你写下面的代码时会发生什么事?
least=MIN(*p++,b);
3.预处理器标识#error的目的是什么?
如果你不知道答案,请看参考文献1。
这问题对区分一个正常的伙计和一个书呆子是很有用的。
只有书呆子才会读C语言课本的附录去找出象这种
问题的答案。
当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。
死循环(Infiniteloops)
4.嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
这个问题用几个解决方案。
我首选的方案是:
while
(1){}
一些程序员更喜欢如下方案:
for(;
){}
这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。
如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的
基本原理。
如果他们的基本答案是:
我被教着这样做,但从没有想到过为什么。
这会给我留下一个坏印象。
第三个方案是用goto
Loop:
...
gotoLoop;
应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。
数据声明(Datadeclarations)
5.用变量a给出下面的定义
a)一个整型数(Aninteger)
b)一个指向整型数的指针(Apointertoaninteger)
c)一个指向指针的的指针,它指向的指针是指向一个整型数(Apointertoapointertoaninteger)
d)一个有10个整型数的数组(Anarrayof10integers)
e)一个有10个指针的数组,该指针是指向一个整型数的(Anarrayof10pointerstointegers)
f)一个指向有10个整型数数组的指针(Apointertoanarrayof10integers)
g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(Anarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger)
答案是:
a)inta;
//Aninteger
b)int*a;
//Apointertoaninteger
c)int**a;
//Apointertoapointertoaninteger
d)inta[10];
//Anarrayof10integers
e)int*a[10];
//Anarrayof10pointerstointegers
f)int(*a)[10];
//Apointertoanarrayof10integers
g)int(*a)(int);
//Apointertoafunctionathattakesanintegerargumentandreturnsaninteger
h)int(*a[10])(int);
//Anarrayof10pointerstofunctionsthattakeanintegerargumentandreturnaninteger
6.关键字static的作用是什么?
这个简单的问题很少有人能回答完全。
在C语言中,关键字static有三个明显的作用:
1).在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2).在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
3).在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。
这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。
7.关键字const是什么含意?
我只要一听到被面试者说:
const意味着常数"
,我就知道我正在和一个业余者打交道。
去年DanSaks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:
EmbeddedSystemsProgramming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着"
只读"
就可以了。
尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。
(如果你想知道更详细的答案,仔细读一下Saks的文章吧。
)如果应试者能正确回答这个问题,我将问他一个附加的问题:
下面的声明都是什么意思?
constinta;
intconsta;
constint*a;
int*consta;
intconst*aconst;
前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。
顺带提一句,也许你可能会问,即使不用关键字const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?
我也如下的几下理由:
1).关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。
如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。
(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。
)
2).通过给优化器一些