嵌入式软件工程师笔试集锦

嵌入式软件工程师笔试集锦
嵌入式软件工程师笔试集锦

选择题

1:设float a=2, b=4, c=3;,以下C语言表达式与代数式(a+b)+c计算结果不一致的是

A.(a+b)*c/2

B.(1/2)*(a+b)*c

C.(a+b)*c*1/2

D.c/2*(a+b)

参考答案:B,因为a,b,c三个变量都是浮点数,所以在B答案中其结果是0,因为在计算1/2是就是0,如果改成1/2.0就正确了。

2:为了向二进制文件尾部增加数据,打开文件的方式应采用

A.″ab″

B.″rb+″

C.″wb″

D.″wb+″

参考答案:D

3:下述程序执行后的输出结果是

#include

main()

{

int x='f';

printf("%c\n",'a'+(x-'a'+1));

}

A.g

B.h

C.i

D.j

参考答案:A

4:C语言中,下列运算符优先级最高的是

A.!

B.%

C.>>

D.==

参考答案:A

5:数组定义为“ int a [ 4 ] ; ”,表达式( ) 是错误的。

A.*a

B.a [ 0 ]

C.a

D.a++

参考答案:D

6:执行语句“ k=7>>1; ”后,变量k 的当前值是

A.15

B.31

C.3

D.1

参考答案:C

7:定义函数时,缺省函数的类型声明,则函数类型取缺省类型

A.void

B.char

C.float

D.int

参考答案:D

8:若main()函数带参数,参数个数最多是

A.0

B.1

C.2

D.3

参考答案:C 只知道有定义形式main(int argc,char* argv[]))

9:若有宏定义:#define MOD(x,y) x%y

则执行以下语句后的输出结果是

int a=13,b=94;

printf(″%d\n″,MOD(b,a+4));

A.5

B.7

C.9

D.11

参考答案:B

10:下列各个错误中,哪一个不属于编译错误

A.改变x 原值3 为5 ,写作“ x==5 ;”

B.花括号不配对

C.复合语句中的最后一条语句后未加分号

D.变量有引用、无定义

参考答案:A

11:下列程序段运行后,x 的值是( )

a=1;b=2;x=0;

if(!( -- a))x -- ;

if(!b)x=7;else ++x;

A.0

B.3

C.6

D.7

参考答案:A

12:设

#define N 3

#define Y(n) ((N+1)*n)

则表达式2*(N+Y(5+1))的值是

A.42

B.48

C.54

D.出错

参考答案:B Y(5+1) 传递过去的应该是6,而不是简单的把5+1给替换掉

13:若定义了char ch[]={″abc\0def″},*p=ch;则执行printf(″%c″,*p+4);语句的输出结果是

A.def

B.d

C.e

D.0

参考答案:C

14:下列转义字符中错误的是

A.′\000′

B.′\14′

C.′\x111′

D.′\2′

参考答案:C error C2022: '273' : too big for character

15:算术运算符,赋值运算符和关系运算符的运算优先级按从高到低依次为

A.算术运算、赋值运算、关系运算

B.算术运算、关系运算、赋值运算

C.关系运算、赋值运算、算术运算

D.关系运算、算术运算、赋值运算

参考答案:B

16:设#define N 3

#define Y(n) ((N+1)*n)

则表达式2*(N+Y(5+1))的值是

A.42

B.48

C.54

D.出错

参考答案:B

17:表达式strcmp( “ 3.14 ”,“ 3.278 ” ) 的值是一个

A.非零整数

B.浮点数

C.0

D.字符

参考答案: A

18:设struct

{ short a;

char b;

float c;

}cs;

则sizeof(cs)的值是

A.4

B.5

C.6

D.7

参考答案: D 字节对齐的话应该是8

19:若变量已正确定义,表达式( j=3 ,j++ )的值是

A.3

B.4

C.5

D.0

参考答案:A

20:C 语言中运算对象必须是整型的运算符是

A.%

B./

C.!

D.**

参考答案:A

简答题

21:打印一个N*N的方阵,N为每边字符的个数(3〈N〈20 ),要求最外层为“X”,第二层为“Y”,从第三层起每层依次打印数字0,1,2,3,...

例子:当N =5,打印出下面的图形:

X X X X X

X Y Y Y X

X Y 0 Y X

X Y Y Y X

X X X X X

22:谈谈COM的线程模型。然后讨论进程内/外组件的差别。

23:多态类中的虚函数表是Compile-Time,还是Run-Time时建立的? 参考答案:

24:#include

void main()

{ int c;

while ((c=getchar())!= ′\ n ′ )

switch(c - ′ 2 ′ )

{ case 0:

case 1:putchar(c+4);break;

case 2:putchar(c+4);break;

case 3:putchar(c+3);break;

default:putchar(c+2);break;

}

printf( ″\ n ″ );

}

运行时输入:2473 ,输出结果:

参考答案:6897 VC++6.0测试过

25:用两个栈实现一个队列的功能?

参考答案:

设2个栈为A,B, 一开始均为空.入队:

将新元素push入栈A;出队:

(1)判断栈B是否为空;

(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;

(3)将栈B的栈顶元素pop出;这样实现的队列入队和出队的平摊复杂度都还是O(1), 26:写一语句实现x是否为2的若干次幂的判断。

参考答案:!(X)&(X-1)

27:解二次方程:a*x*x+b*x+c

int Quadratic( double a,double b,double c,double& x1,double& x2);

返回值:解的个数

28:如何判别一个数是unsigned。

参考答案;

#define issignal(x) ((x>=0 && ~x>=0) ? 1:0) //为1是无符号为0有符号

29:执行下述程序的输出结果是ABCDEFCDEFEF 。

#include

char b[]="ABCDEF";

main()

{

char *bp;

for (bp=b;*bp;bp+=2)

printf("%s",bp);

printf("\n");

}

30:已知一个数组table,用一个宏定义,求出数据的元素个数。

参考答案:#define NTBL

#define NTBL (sizeof(table)/sizeof(table[0]))

2.函数int compare(int a,int b),定义为该函数的函数指针P:为int(*p)(int,int);p= compare;

3.求输出结果

#include

void sub(char*s,int num)

{

int i ,j=num;

char t;

while(j-->1)

{

for(i=0;i

{

if(s[i]

{

t=s[i];

s[i]=s[i+1];

s[i+1]=t;

}

}

}

}

main()

{

char *s="CEAeded";

sub(s,6);

printf("%s\n",s)

}

输出结果:运行时程序崩溃,

//4**********************************************

//交换两个变量的值,不使用第三个变量,即a=3,b=5交换

//后b=3,a=5

unsigned char a=3,b=5;

//5**************************************************

#define N 100

void GetMemory1(char*p)

{

p=(char*)malloc(sizeof(char)*N);

strcpy(p,"Have a good day!");

}

char*GetMemory2(void)

{

char p[]="Have a good day!";

return p;

}

void main(void)

{

char*str1=NULL,*str2=NULL;

GetMemory1(str1);

GetMemory2(str2);

printf("\nstr1:%s",str1);

printf("\nstr2:%s",str2);

//6****************************************************** //构造N个结点的单链表返回链表头指针,要求链表中各结点顺序

//与结点数据输入顺序相反,例如输入1,2,3,4,5,形成的链表为

//head->5 4 3 2 1 ,补充程序

#define N 10

typedef struct Node

{

int data;

struct Node*next;

}NODE;

int Get_Data(int i);//定义省略

Node*Create_u()

{

int i;

NODE*p,*Head=NULL;

for(i=0;i

{

VP=New NODE;

P->Data=Get_Data(i);

________________;

________________;

}

return Head;

}

其实就是个头插法

//7**********************************************

//N个结点链表,每个结点中存放一个字符,判断链表存放的字符是否//中心对称,即a b c c b a或a b c b a,补充程序

typedef struct Node

{

int data;

struct Node*next;

}NODE;

bool Is_symmeic(NODE*head,*int n)

{

char D[N];

int i,d;

__________;

for(i=0;i

{

D[i]=head->data;

head=head->next;

}

if(__________)

{

head=head->next;

}

while(head)

{

_______________;

if(D[i]!=head->data)

{

return false;

}

head=head->next;

}

return true;

}

//8*************************************

//str中只含有大写和小写字母函数change_move(char*str)将字符串中大写改成*并//移到前面小写后返回*的个数

//如AabBdcYY改为*****abd,返回5

int chang_move(char*str)

{

int len,i,curstr=-1;

len=strlen(str);

for(i=len-1;i>=0;i--)

{

if(str[i]>='A'&&str[i]<='Z')

{

str[i]='*';

if(cursor==-1)

{

cursor=i;

}

else if(cursor>i)

{

_____________;

str[i]='*';

_____________;

}

}

return____________;

}

//9***********************************************

//求两个字符串的第一个公共子串,并返回该子串

//如:"a b c d e f g e h i" "a a c d e f * * g e h i"

//第一个为"c d e f";不许用strcmp()

char*Maxf(char*str1,char*str2)

{

}

、将一个链表逆序

LinkList *p1,*p2 =NULL,*p3 =NULL;

if(head ==NULL|| head->next ==NULL) return head;

p1 = head->next;

while(p1!=NULL)

{

p3 = p1->next;

p1->next = p2;

p2 = p1;

p1 = p3;

}

head->next = p2;

// head = p2;

return head;

}

2、计算一个字节里(byte)里面有多少bit被置1

count++;

}

cc = cc>>1;

}

return count;

}

int main()

{

const int c = 0xcf;

printf("%d\n",comb(c));

return 1;

}

3、在一个字符串中找到可能的最长的子字符串

memcpy(substring,&shortstring[j],i);

substring[i]='\0';

if(strstr(longstring,substring)!=NULL)

return substring;

}

}

return NULL;

}

void main(void)

{

char*str1 ="aocdfe";

char*str2 ="pmcdfa";

char*comman =NULL;

if(strlen(str1)>strlen(str2))

comman= commanstring(str2,str1);

else

comman = commanstring(str1,str2);

printf("the longest comman string is:%s\n",comman); }

4、字符串转换为整数

int c, i=0, j;

for(j=strlen(s)-1;i

{ c=s[i];

s[i]=s[j];

s[j]=c;

i++;

}

}

void IntegerToString(char s[],int n)

{int i=0,sign;

if((sign=n)<0)//如果是负数,先转成正数

n=-n;

do//从个位开始变成字符,直到最高位,最后应该反转

{ s[i++]=n%10+'0';

}while((n=n/10)>0);

//如果是负数,补上负号

if(sign<0)

s[i++]='-';

s[i]='\0';//字符串结束

reverse(s);

}

void main()

{int m;

char c[100];

5、整数转换为字符串

#include

#include

int Atoi(char str[])

{

int i;

int weight = 1;// 权重

int rtn = 0;// 用作返回

for(i =strlen(str)- 1; i >= 0; i--) {

rtn +=(str[i]-'0')* weight;// weight *= 10;// 增重

}

return rtn;

}

void main()

{

6、将一个字符串逆序

#include

#include

char*strconv(char*p)

{

int length =strlen(p); char*ptr = p;

char*ptr_1 = p + length -1; while(ptr < ptr_1)

{

char c =*ptr;

*ptr =*ptr_1;

*ptr_1 = c;

++ptr;

--ptr_1;

}

return p;

}

int main()

如果一棵具有n个结点的深度为k的二叉树,它的每一个结点都与深度为k的满二叉树中编号为1~n的结点一一对应,这棵二叉树称为完全二叉树。

可以根据公式进行推导,假设n0是度为0的结点总数(即叶子结点数),n1是度为1的结点总数,n2是度为2的结点总数,由二叉树的性质可知:n0=n2+1,则n= n0+n1+n2(其中n为完全二叉树的结点总数),由上述公式把n2消去得:n= 2n0+n1-1,由于完全二叉树中度为1的结点数只有两种可能0或1,由此得到n0=(n+1)/2或n0=n/2,合并成一个公式:n0=(n+1)/2 ,就可根据完全二叉树的结点总数计算出叶子结点数。

700/2=350个叶子节点

2.static 数据成员必须在类定义的外部定义。不象普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。

静态数据成员的用途之一是统计有多少个对象实际存在。

静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。也

不能在构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,那么每次创建一个类的对象则

静态数据成员都要被重新初始化

结果呢?

知道了这是统计9999的二进制数值中有多少个1的函数,且有9999=9×1024+512+256+15

9×1024中含有1的个数为2;

512中含有1的个数为1;

256中含有1的个数为1;

15中含有1的个数为4;

故共有1的个数为8,结果为8。

1000 - 1 = 0111,正好是原数取反。这就是原理。

用这种方法来求1的个数是很效率很高的。

不必去一个一个地移位。循环次数最少。

4.分析下面的程序

struct s1

{

int i: 8;

int j: 4;

int a: 3;

double b;

};

struct s2

{

int i: 8;

int j: 4;

double b;

int a:3;

};

printf("sizeof(s1)= %d\n",sizeof(s1)); printf("sizeof(s2)= %d\n",sizeof(s2)); result: 16, 24

第一个struct s1

{

int i: 8;

理论上是这样的,首先是i在相对0的位置,占8位一个字节,然后,j就在相对一个字节的位置,由于一个位置的字节数是4位的倍数,因此不用对齐,就放在那里了,然后是a,要在3位的倍数关系的位置上,因此要移一位,在15位的位置上放下,目前总共是18位,折算过来是2字节2位的样子,由于double是8 字节的,因此要在相对0要是8个字节的位置上放下,因此从18位开始到8个字节之间的位置被忽略,直接放在8字节的位置了,因此,总共是16字节。

1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:

struct bs

{

unsigned a:4

unsigned :0 /*空域*/

unsigned b:4 /*从下一单元开始存放*/

unsigned c:4

}

在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。

2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位

3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:struct k

{

int a:1

int :2 /*该2位不能使用*/

int b:3

int c:2

};

从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按二进位分配的。

5.在对齐为4的情况下分析下面程序的结果

华为(嵌入式)笔试题

(1)什么是预编译,何时需要预编译: 答案: 1、总是使用不经常改动的大型代码体。 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。 (2)char * const p char const * p const char *p 上述三个有什么区别? 答案: char * const p; //常量指针,p的值不可以修改 char const * p;//指向常量的指针,指向的常量值不可以改 const char *p; //和char const *p (3)char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char *str5 = "abc"; const char *str6 = "abc"; char *str7 = "abc"; char *str8 = "abc"; cout < < ( str1 == str2 ) < < endl; cout < < ( str3 == str4 ) < < endl; cout < < ( str5 == str6 ) < < endl; cout < < ( str7 == str8 ) < < endl; 结果是:0 0 1 1 str1,str2,str3,str4是数组变量,它们有各自的内存空间;而 str5,str6,str7,str8是指针,它们指向相同的常量区域。 (4)以下代码中的两个sizeof用法有问题吗? [C易] void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母 { for( size_t i=0; i

嵌入式软件工程师笔试题

(一) 1什么是预编译,何时需要预编译: 答案: 1、总是使用不经常改动的大型代码体。 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。 2 char * const p char const * p const char *p 上述三个有什么区别? 答案: char * const p; //常量指针,p的值不可以修改 char const * p;//指向常量的指针,指向的常量值不可以改const char *p;//和char const *p 3 char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char *str5 = "abc"; const char *str6 = "abc"; char *str7 = "abc"; char *str8 = "abc"; cout < < ( str1 == str2 ) < < endl; cout < < ( str3 == str4 ) < < endl; cout < < ( str5 == str6 ) < < endl; out < < ( str7 == str8 ) < < endl; 结果是:0 0 1 1 str1,str2,str3,str4是数组变量,它们有各自的存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。 4以下代码中的两个sizeof用法有问题吗? [C易] void UpperCase( char str[] ) // 将str 中的小写字母转换成大写字母 {for( size_t i=0; i

面试题嵌入式软件开发

1. 什么是预编译,何时需要预编译: 答案: 1、总是使用不经常改动的大型代码体。(好工程的回答,不是么~~~:)) 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。 2. char * const p char const * p const char *p 上述三个有什么区别? 答案: char * const p; //常量指针,const修饰的是指针p,故p的值不可以修改 char const * p;//const修饰的是*p,为指向常量的指针,指向的常量值不可以改const char *p;//和char const *p 3. 数组变量和指针的区别? [cpp]view plaincopy 1.#include https://www.360docs.net/doc/d38661462.html,ing namespace std; 3. 4.int main(int argc, char const *argv[]) 5.{ 6.char str1[] = "abc"; 7.char str2[] = "abc"; 8.const char str3[] = "abc"; 9.const char str4[] = "abc"; 10.const char *str5 = "abc"; 11.const char *str6 = "abc"; 12.char *str7 = "abc"; 13.char *str8 = "abc"; 14. 15. cout << ( str1 == str2 ) << endl; 16. cout << ( str3 == str4 ) << endl; 17. cout << ( str5 == str6 ) << endl; 18. cout << ( str7 == str8 ) << endl; 19. 20.return 0; 21.} 结果是:0 0 1 1 str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。

华为嵌入式面试题

华为嵌入式系统面试题 (1)什么是预编译,何时需要预编译: 答案: 1、总是使用不经常改动的大型代码体。 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选 项。在这种情况下,可以将所有包含文件预编译为一个预编译头。 (2)char * const p char const * p const char *p 上述三个有 什么区别? 答案: char * const p; //常量指针,p的值不可以修改 char const * p;//指向常量的指针,指向的常量值不可以改 const char *p; //和char const *p (3)char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char *str5 = "abc"; const char *str6 = "abc"; char *str7 = "abc"; char *str8 = "abc"; cout < < ( str1 == str2 ) < < endl; cout < < ( str3 == str4 ) < < endl; cout < < ( str5 == str6 ) < < endl; cout < < ( str7 == str8 ) < < endl; 结果是:0 0 1 1 str1,str2,str3,str4是数组变量,它们有各自的存空间;而 str5,str6,str7,str8是指针,它们指向相同的常量区域。 (4)以下代码中的两个sizeof用法有问题吗? [C易] void UpperCase( char str[] ) // 将 str 中的小写字母转换成大 写字母{ for( size_t i=0; i

嵌入式C语言经典笔试题目

嵌入式c语言经典笔试题目 1 .用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1) #define语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。 3)意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。 4)如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。 2 .写一个"标准"宏MIN,这个宏输入两个参数并返回较小的一个。 #define MIN(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语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。 死循环(Infinite loops) 4.嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢? 这个问题用几个解决方案。我首选的方案是: while(1) { } 一些程序员更喜欢如下方案: for(;;) { } 这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,

嵌入式软件开发人员笔试题

四川九洲电器集团有限责任公司成都技术中心 嵌入式软件开发人员笔试试题 本笔试试题分为C语言基础、算法、思维能力三部份。总分100分,描述思路和最后结果都很重要。 一、C语言基础 1. 语句实现x是否为2的若干次幂的判断。(5分) 2. 宏定义写出swap(x,y)。(5分) 3. 用变量a给出下面的定义。(16分,各两分) a) 一个整型数(An integer) b) 一个指向整型数的指针(A pointer to an integer) c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) d) 一个有10个整型数的数组(An array of 10 integers) e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers) f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers) g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer) h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions that take an integer argument and return an integer )

嵌入式工程师经典面试题

上个星期, 去深圳一家搞 ARM 开发的公司面试, HR 叫我做了一份卷子, 里面都是 C 编程, 心中暗喜, 因为这些题基本上都在程序员面试宝典里见过。后来回到学校, 在网上搜索,原来这些题都是嵌入式工程师的经典面试题目, 很多网站上都可以找得到。现把他贴出来, 附上网上的答案,跟大家分享,因为这些题实在太经典了。 预处理器(Preprocessor 1 . 用预处理指令 #define 声明一个常数, 用以表明 1年中有多少秒 (忽略闰年问题 #define SECONDS_PER_YEAR (60 * 60 * 24 * 365UL 我在这想看到几件事情: 1 #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等 2 懂得预处理器将为你计算常数表达式的值,因此直接写出你如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。 3 意识到这个表达式将使一个 16位机的整型数溢出 -因此要用到长整型符号 L, 告诉编译器这个常数是的长整型数。 4 如果你在你的表达式中用到 UL (表示无符号长整型,那么你有了一个好的起点。记住,第一印象很重要。 2 . 写一个 " 标准 " 宏 MIN ,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B ((A <= (B ? (A : (B 这个测试是为下面的目的而设的: 1 标识 #define在宏中应用的基本知识。这是很重要的。因为在嵌入 (inline操作符变为标准 C 的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。

海康嵌入式笔试题

海康嵌入式笔试题 Revised as of 23 November 2020

海康嵌入式笔试题 1.请问TCP/IP协议分为哪几层FTP协议属于哪一层 答:可以分为物理层,数据链路层,网络层,传输层,应用层 应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、 文件传输协议(FTP)、网络远程访问协议(Telnet)等。 传输层:在此层中,它提供了节点间的数据传送,应用程序之间的通信服务, 主要功能是数据格式化、数据确认和丢失重传等。 如传输控制协议(TCP)、用户数据报协议(UDP)等, TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据, 并且确定数据已被送达并接收。 互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。如ARP是地址解析协议,在这一层的时候吧IP地址转换为物理地址网络接口层(主机-网络层):接收IP数据报并进行传输,从网络上接收物理帧,抽取IP数据报转交给下一层,对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、SerialLine等)来传送数据。 另外补充一下OSI的七层所对应的协议: 应用层(Application): 应用程序网关(applicationgateway)Telnet:远程登录(在应用层连接两部分应用程序) FTP(FileTransferProtocol):文件传输协议 HTTP(HyperTextTransferProtocol):超文本传输协议 SMTP(SimpleMailTransterProtocol):简单邮件传输协议 POP3(PostOfficePtotocol):邮局协议 SNMP(SimpleNetworkMangementProtocol)简单网络管理协议 DNS(DomainNameSystem):域名系统 传输层(Transport): 传输网关(transportgateway) TCP(TransmissionControlPotocol):传输控制协议 (在传输层连接两个网络) UDP(UserDataPotocol):用户数据协议 网络层(Internet): 多协议路由器(multiprotocolrouter) IP(InternetProtocol):网络协议(在异构网络间转发分组) ARP(AddressResolutionProtocol):地址解析协议 RARP(ReverseAddressResolutionProtocol):逆地址解析协议 ICMP(InternetControlMessageProtocol):因特网控制消息协议

嵌入式软件工程师笔试题

笔试题 1: 设 float a=2, b=4, c=3; ,以下 C 语言表达式与代数式 (a+b)+c 计算结果不一致的是 A.(a+b)*c/2 B.(1/2)*(a+b)*c C.(a+b)*c*1/2 D.c/2*(a+b) 参考答案: B,因为 a,b,c 三个变量都是浮点数,所以在 B 答案中其结果是 0,因为在计算 1/2 是就是 0,如果改成 1/2.0 就正确了。 2: 为了向二进制文件尾部增加数据,打开文件的方式应采用 A.″ab″ B.″rb+″ C.″wb″ D.″wb+″ 参考答案: D 3: 下述程序执行后的输出结果是 #include main() { int x= 'f'; printf( “%c n”, 'a'+(x - ‘a'+1)); } A.g B.h C.i D.j 参考答案: A 4:C 语言中,下列运算符优先级高的是 A.! B.% C.>> D.= = 参考答案: A 5:数组定义为“ int a [ 4 ] ; ”,表达式 ( ) 是错误的。 A.*a B. a [ 0 ] C. a D.a++ 参考答案: D

6: 执行语句“ k=7>>1; ”后,变量 k 的当前值是 A.15 B.31 C. 3 D. 1 参考答案: C 7: 定义函数时,缺省函数的类型声明,则函数类型取缺省类型 A.void B.char C.float D.int 参考答案: D 8: 若 main() 函数带参数,参数个数多是 A.0 B. 1 C. 2 D. 3 参考答案: C 只知道有定义形式 main(int argc,char* argv[])) 9: 若有宏定义: #define MOD(x , y) x%y 则执行以下语句后的输出结果是 int a=13 ,b=94; printf( ″%d n″, MOD(b, a+4)); A. 5 B.7 C.9 D.11 参考答案: B 10: 下列各个错误中,哪一个不属于编译错误 A.改变 x 原值 3 为 5 ,写作“ x==5 ; ” B.花括号不配对 C.复合语句中的后一条语句后未加分号 D.变量有引用、无定义参考答案: A 11: 下列程序段运行后, x 的值是 ( ) a=1;b=2;x=0; if(!( — a))x — ; if(!b)x=7;else ++x; A.0 B. 3 C. 6 D.7 参考答案: A

嵌入式工程师面试题--经典

1、将一个字符串逆序 2、将一个链表逆序 3、计算一个字节里(byte)里面有多少bit被置1 4、搜索给定的字节(byte) 5、在一个字符串中找到可能的最长的子字符串 6、字符串转换为整数 7、整数转换为字符串 style="MARGIN: 0px; COLOR: rgb(102,102,102); LINE-HEIGHT: 150%" wrap="break-word"1、char *strconv(char *p) { int i,length; char temp; length = strlen(p); for(i = 0;i < length/2;i++) { temp = *(p + i);

*(p + i) = *(p + length - 1 - i); *(p +length - 1 - i) = temp; } return p; } int main() { char src[100]; char *p; scanf("%s",src); p = strconv(src); printf("%s\n",p); return 0;

style="MARGIN: 0px; COLOR: rgb(102,102,102); LINE-HEIGHT: 150%" wrap="break-word"3、int cal(int data) //calculation the number of bit in one byte { int a; int count = 0; a = data % 100; while (a != 0) { count += a % 2; a /= 2; } return count;

经典嵌入式面试题

经典嵌入式面试题 C语言测试就是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者与被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也就是相当有趣的。 从被面试者的角度来讲,您能了解许多关于出题者或监考者的情况。这个测试只就是出题者为显示其对ANSI标准细节的知识而不就是技术技巧而设计不?这个愚蠢的问题不?如要您答出某个字符的ASCII值。这些问题着重考察您的系统调用与内存分配策略方面的能力不?这标志着出题者也许花时间在微机上而不上在嵌入式系统上。如果上述任何问题的答案就是"就是"的话,那么我知道我得认真考虑我就是否应该去做这份工作。 从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,您能了解应试者C语言的水平。不管怎么样,瞧一下这人如何回答她不会的问题也就是满有趣。应试者就是以好的直觉做出明智的选择,还就是只就是瞎蒙呢?当应试者在某个问题上卡住时就是找借口呢,还就是表现出对问题的真正的好奇心,把这瞧成学习的机会呢?我发现这些信息与她们的测试成绩一样有用。 有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮住。这些问题都就是我这些

年实际碰到的。其中有些题很难,但它们应该都能给您一点启迪。 这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为了让您能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为您所用,请自行按您的意思分配分数。 预处理器(Preprocessor) 1 、用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想瞧到几件事情: ?; #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) ?; 懂得预处理器将为您计算常数表达式的值,因此,直接写出您就是如何计算一年中有多少秒而不就是计算出实际的值,就是更清晰而没有代价的。 ?; 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数就是的长整型数。 ?; 如果您在您的表达式中用到UL(表示无符号长整型),那么您有了一个好的起点。记住,第一印象很重要。 2 、写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。#define MIN(A,B) ( (A) <= (B) ? (A) : (B) )

第三套嵌入式软件工程师考试试题B卷

第三套嵌入式软件工程师 考试试题B卷 The document was prepared on January 2, 2021

嵌入式Linux软件工程师认证考试 B卷 20个小题,每小题1分,共20分) 1、在下列ARM处理器的各种模式中,()模式有自己独立的R8-R14寄存器。 A、系统模式(System)、 B、终止模式(Abort) C、中断模式(IRQ) D、快中断模式(FIQ) 2、按照ARM过程调用标准(APCS),栈指针使用()寄存器, A、R0 B、R13 C、R14 D、R15 3、在ARM体系结构中,()寄存器作为连接寄存器,当进入子程序时或者处理器响应异常的时候,用来保存PC的返回值;()寄存器作为处理器的程序计数器指针。 A、R0,R14 B、R13,R15 C、R14,R15 D、R14,R0 4、在ARM体系结构中,要从主动用户模式(User)切换到超级用户模式(Supervisor),应采用何种方法() A、直接修改CPU状态寄存器(CPSR)对应的模式 B、先修改程序状态备份寄存器(SPSR)到对应的模式,再更新CPU状态 C、使用软件中断指令(SWI) D、让处理器执行未定义指令 5、下面关于MMU和Linux描述错误的是:() A、MMU是内存管理单元Memory Management Unit的缩写 B、uClinux可以运行在有MMU的处理器上 C、Linux内核功能强大,内存管理功能丰富,即使在没有MMU的处理器上,也可 以通过软件实现地址映射。 D、Linux系统正是利用MMU,才能使得各个进程有独立的寻址空间

收集的一些嵌入式软件开发工程师面试题

收集的一些嵌入式软件开发工程师面试题 1.什么是平衡二叉树编写一个删除平衡二叉树的程序 2.写一个程序,求有向有权图两点之间的最小权 3.根据你的理解,写出Cstring类的构造函数和析构函数 4.使用C语言实现对ini文件的访问,使程序可以对int,double,字符串类进行读写。 5.n×n个方格(n为任意整数),定义若两个格有公共边则称两个格相邻。现将个格中的N个格子图黑,使每个格子都与黑格子相邻。试编程,使N最小。 1.static变量和static 函数各有什么特点 3.描述一下嵌入式基于ROM的运行方式基于ram的运行方式有什么区别。 4.task 有几种状态 5.task 有几种通讯方式 6.C函数允许重入吗 7.嵌入式操作系统和通用操作系统有什么差别 一面,技术面 (1)VxWorks、uc/OS、Palm嵌入式系统操作系统的区别 (2)做嵌入式软件开发和普通桌面软件开发有什么区别 (3)c语言问题,union和struct 的区别

(4)sizeof(一大堆变量),如果用这个函数分配内存的大小一定与定义相同吗 (5)解释什么是优先级反转。 Can structures be passed to the functions by value Why cannot arrays be passed by values to functions Advantages and disadvantages of using macro and inline functions What happens when recursion functions are declared inline Scope of static variables Difference between object oriented and object based languages Multiple inheritance objects contain howmany multiply inherited ancestor What are the 4 different types of inheritance relationship How would you find out the no of instance of a class Is java a pure object oriented language Why Order of constructor and destructor call in case of multiple inheritance Can u have inline virtual functions in a class When you inherit a class using private keyword which members of base class are visible to the derived class

嵌入式笔试题

嵌入式笔试题 国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。 下面就由为大家介绍一下嵌入式笔试题的文章,欢迎阅读。 嵌入式笔试题篇11:用C语言实现大小端的测试Int CheckCpu(){union{int a;char b;}c;c.a=1;if(c.b==1)printf(“小端);else printf(“大端);}2:volatile的作用有哪些?Volatile第一变量相当于告诉编译器这个变量的值会随时发生变化,每次使用之前都要去内存里从新读取它的值,并不要随意针对它做优化,主要用在:1:一个中断子程序中会访问到的非自动变量;2:多线程应用中被几个线程共享的变量;3:并行设备的硬件寄存器。 3:C语言中static关键字的作用有哪些?1:在函数体中,一个被声明为静态的变量在这个变量在调用过程中维持其值不变;2:在模块内(但在函数体外),一个被声明为静态的变量,可以被这个模块内的所用函数使用,但不能被模块外的函数使用,它是一个本地的全局变量;3:在模块内,一个被声明为静态变量的函数,智能被这个模块内的函数调用;4:static全局变量与局部变量的区别:static全局变量只能被初始化一次,防止其他单元文件中被引用;5:static局部变量与局部变量的区别:static局部变量只能被初始化一次,下一次依据上一次结果的值;6:static函数与普通函数的区别:static在内存中只用一份,普通函数在每

一次调用中维持一份拷贝。 4:请问下面三种变量的区别:Int const *p : 指向常整型的指针;Int *const p; 指向整型的常指针;Int *const *p:指向常整型的常指针;5:在ARM系统中,在函数调用的时候,参数是通过哪种方式传递的。 当参数小于等于4的时候是通过r0~r3来进行传递的,当参数大于4的时候是通过压栈的方式进行传递。 6:中断与异常有何区别.异常在处理的时候必须考虑与处理器的时钟同步,实际上异常也称为同步中断,在处理器执行到因编译错误而导致的错误指令时,或者在执行期间出现特殊错误,必须靠内核处理的时候,处理器就会产生一个异常;所谓中断是指外部硬件产生的一个电信号从CPU的中断引脚进入,打断CPU的运行。 所谓异常是指软件运行过程中发生了一些必须作出处理的事件,CPU自动产生一个陷入来打断CPU的运行。 7:用预处理指令#define表示一年中有多少秒#define SECONDS_PER_YEAR (60*60*24*365)UL注意后面必须加UL,表示计算的结构是常整型。 8:简述SPI,UART,I2C三种传输方式。 SPI:高速同步串行口,首发独立,可同步进行SPI接口主要应用在EEPROM,Flash,实时时钟,A/D转化器,数字信号处理,是一种全双工同步通讯总线,该接口一般使用四条线:串行时钟线(sck),主出从入线,主入从出线,低电平有效地的从机选择线。

嵌入式C语言面试题汇总(超经典)

第一部分:基本概念及其它问答题 1、关键字static的作用是什么? 这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。 2、“引用”与指针的区别是什么? 答、1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。 指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。 流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。 3、.h头文件中的ifndef/define/endif 的作用? 答:防止该头文件被重复引用。 4、#include 与#include “file.h”的区别? 答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。 5、描述实时系统的基本特性 答:在特定时间内完成特定的任务,实时性与可靠性。 6、全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 答:全局变量储存在静态数据区,局部变量在堆栈中。 7、什么是平衡二叉树? 答:左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。 8、堆栈溢出一般是由什么原因导致的? 答:1.没有回收垃圾资源 2.层次太深的递归调用

嵌入式经典笔试题目

1将一个字符串逆序 2、将一个链表逆序 3、计算一个字节里(byte)里面有多少bit被置1 4、搜索给定的字节(byte) 5、在一个字符串中找到可能的最长的子字符串 6、字符串转换为整数 7、整数转换为字符串 答案: 1、方法1: int main() { char* src = "hello,world"; int len = strlen(src); char* dest = (char*)malloc(len+1);//要为\0分配一个空间char* d = dest; char* s = &src[len-1];//指向最后一个字符 while( len-- != 0 ) *d++=*s--; *d = 0;//尾部要加\0 printf("%s\n",dest); free(dest);// 使用完,应当释放空间,以免造成内存汇泄露return 0; } 方法2: #include #include main() { char str[]="hello,world"; int len=strlen(str); char t; for(int i=0; i { t=str[i]; str[i]=str[len-i-1]; str[len-i-1]=t; } printf("%s",str); return 0; } 2、 链表题:一个链表的结点结构 struct Node {

int data ; Node *next ; }; typedef struct Node Node ; (1)已知链表的头结点head,写一个函数把这个链表逆序 ( Intel) Node * ReverseList(Node *head) //链表逆序 { if ( head == NULL || head->next == NULL ) return head; Node *p1 = head ; Node *p2 = p1->next ; Node *p3 = p2->next ; p1->next = NULL ; while ( p3 != NULL ) { p2->next = p1 ; p1 = p2 ; p2 = p3 ; p3 = p3->next ; } p2->next = p1 ; head = p2 ; return head ; } (2)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同) Node * Merge(Node *head1 , Node *head2) { if ( head1 == NULL) return head2 ; if ( head2 == NULL) return head1 ; Node *head = NULL ; Node *p1 = NULL; Node *p2 = NULL; if ( head1->data < head2->data ) { head = head1 ; p1 = head1->next; p2 = head2 ; } else {

嵌入式软件工程师笔试题华为优选稿

嵌入式软件工程师笔试 题华为 集团公司文件内部编码:(TTT-UUTT-MMYB-URTTY-ITTLTY-

(一)1什么是预编译,何时需要预编译: 答案: 1、总是使用不经常改动的大型代码体。 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。 2char*constpcharconst*pconstchar*p上述三个有什么区别 答案: char*constp;//常量指针,p的值不可以修改 charconst*p;//指向常量的指针,指向的常量值不可以改 constchar*p;//和charconst*p 3 charstr1[]="abc"; charstr2[]="abc"; constcharstr3[]="abc"; constcharstr4[]="abc"; constchar*str5="abc"; constchar*str6="abc"; char*str7="abc"; char*str8="abc";

cout<<(str1==str2)<

相关文档
最新文档