嵌入式工程师笔试题.docx
- 文档编号:7696127
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:54
- 大小:57.04KB
嵌入式工程师笔试题.docx
《嵌入式工程师笔试题.docx》由会员分享,可在线阅读,更多相关《嵌入式工程师笔试题.docx(54页珍藏版)》请在冰豆网上搜索。
嵌入式工程师笔试题
1、将一个字符串逆序
2、将一个链表逆序
3、计算一个字节里(byte)里面有多少bit被置1
4、搜索给定的字节(byte)
5、在一个字符串中找到可能的最长的子字符串
6、字符串转换为整数
7、整数转换为字符串
/*题目:
将一个字符串逆序*/
#include
usingnamespacestd;
//#defineNULL((void*)0)
char*mystrrev(char*constdest,constchar*constsrc)
{
if(dest==NULL&&src==NULL)
returnNULL;
char*addr=dest;
intval_len=strlen(src);
dest[val_len]='\0';
inti;
for(i=0;i { *(dest+i)=*(src+val_len-i-1); } returnaddr; } main() { char*str="asdfa"; char*str1=NULL; str1=(char*)malloc(20); if(str1==NULL) cout<<"mallocfailed"; cout< free(str1); str1=NULL;//杜绝野指针 } p=head; q=p->next; while(q! =NULL) { temp=q->next; q->next=p; p=q; q=temp; } 这样增加个辅助的指针就行乐。 ok通过编译的代码: /*一个链表逆序*/ #include #include #include 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->next=p; tail=p; scanf("%d",&e); } tail->next=NULL; returnhead; } List*list_reverse(List*head) { List*p,*q,*r; p=head; q=p->next; while(q! =NULL) { r=q->next; q->next=p; p=q; q=r; } head->next=NULL; head=p; returnhead; } voidmain(void) { structList*head,*p; intd; head=list_create(); printf("\n"); for(p=head->next;p;p=p->next) printf("--%d--",p->data); head=list_reverse(head); printf("\n"); for(p=head;p->next;p=p->next) printf("--%d--",p->data); } /*编写函数数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 { //计算该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< 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; } #include #include // //自定义函数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); printf("%d\n",MyAtoI(str)); } #include #include voidreverse(chars[]) { //字符串反转 intc,i=0,j; for(j=strlen(s)-1;i { 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+'0'; }while((n=n/10)>0); //如果是负数,补上负号 if(sign<0) s[i++]='-'; s[i]='\0';//字符串结束 reverse(s); } voidmain() { intm; charc[100]; printf("请输入整数m: "); scanf("%d",&m); IntegerToString(c,m); printf("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("%d",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、将一个字符串逆序 2、将一个链表逆序 3、计算一个字节里(byte)里面有多少bit被置1 4、搜索给定的字节(byte) 5、在一个字符串中找到可能的最长的子字符串 6、字符串转换为整数 7、整数转换为字符串 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; } 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; } int main() { int d,count; scanf("%d",&d); count = cal(d); printf("%d of one\n",count); return 0; } 4、#include #include void findmax(char *p) { int j = 0,max = 0; int count = 0; char record[200]; char recordmax[200]; for(int i = 0;;i++) { if((*(p + i) == ' ') || (*(p + i) == '\0')) { if(count > max) { max = count; record[j] = '\0'; strcpy(recordmax,record); } count = 0; j = 0; } else { record[j] = *(p + i); count ++; j ++; } if(*(p + i) == '\0') break; } printf("%s\n",recordmax); } int main() { char str[]="zeng weidsfdsaf langd hah"; printf("%s\n",str); findmax(str); return 0; } 北京诚亚科技有限责任公司笔试题 预处理器(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).通过给优化器一些附加的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 工程师 笔试
![提示](https://static.bdocx.com/images/bang_tan.gif)