嵌入式软件工程师笔试题_.doc

上传人:飞****2 文档编号:88937907 上传时间:2023-05-04 格式:DOC 页数:46 大小:179KB
返回 下载 相关 举报
嵌入式软件工程师笔试题_.doc_第1页
第1页 / 共46页
嵌入式软件工程师笔试题_.doc_第2页
第2页 / 共46页
点击查看更多>>
资源描述

《嵌入式软件工程师笔试题_.doc》由会员分享,可在线阅读,更多相关《嵌入式软件工程师笔试题_.doc(46页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、/6*/构造N个结点的单链表返回链表头指针,要求链表中各结点顺序/与结点数据输入顺序相反,例如输入1,2,3,4,5,形成的链表为/head-5 4 3 2 1 ,补充程序#define N 10typedef struct Nodeint data;struct Node*next;NODE;int Get_Data(int i);/定义省略Node*Create_u()int i;NODE*p,*Head=NULL;for(i=0;iData=Get_Data(i);_ p-next = Head-next;_ Head =p _;return Head;/7*/N个结点链表,每个结点中存

2、放一个字符,判断链表存放的字符是否/中心对称,即a b c c b a或a b c b a,补充程序typedef struct Nodeint data;struct Node*next;NODE;bool Is_symmeic(NODE*head,*int n)char DN;int i,d;_d=n/2 _;for(i=0;idata;head=head-next;if(_head!=NULL&_ 1=n%2_)head=head-next;while(head)_ -i _;if(Di!=head-data)return false;head=head-next;return true

3、;/8*/str中只含有大写和小写字母函数change_move(char*str)将字符串中大写改成*并/移到前面小写后返回*的个数/如AabBdcYY改为*abd,返回5int chang_move(char*str)int len,i,curstr=-1;len=strlen(str);for(i=len-1;i=0;i-)if(stri=A&strii)_;stri=*;_;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

4、*Maxf(char*str1,char*str2)3.二维数组空间的动态申请 a.简单的,已经有一维,如 char (*c)5;c=new charn5;/n为已定义的行数b.二维的int *p;p=new int*m_row;/创建行指针for(int i=0;im_row;i+)/为每一行分配空间 pi=new intm_cols;写到某一个函数中:void getmemory(int * &p,int m_row,int m_cols) p=new int*m_row;/创建行指针for(int i=0;im_row;i+)/为每一行分配空间 pi=new intm_cols;释放空间

5、:void deletememory(int *&p,int m_row) /释放每一行所分配的空间 for(int i=0;im_row;i+) delete xi;/释放行指针 delete x; x=0;via嵌入式笔试两题 -|yingwang294 发表于 2006-10-31 10:40:00 以下是威盛嵌入式笔试的最后两道小题题一:原题如下:改程序,并确定运行结果i nclude i nclude i nclude char *getstring(void) char p=hello everyone; return p;char *getmemory(void) return

6、(char *)malloc(10);int main(int argc, char* argv) char *p=getmemory(); strcpy(p,helloworld); printf(%s,p); printf(%s,getstring(); return 0;这个主要是char p前少一个static.题二:读程序,写出运行结果i nclude i nclude i nclude i nclude typedef struct int value; char type;head_t;这是什么东西啊?typedef struct head_t head; int para;me

7、ssage_t;void main(void) message_t *message=NULL; head_t *head=NULL; message=(message_t *)malloc(sizeof(message_t); assert(message);/测试的条件不成立则终止程序 memset(message,0,sizeof(message_t); message-para=100; message-head.type=a; head=(head_t *)message; head-value+; head-type+;printf(message-head.value=%d,me

8、ssage-head.type=%c,message-para=%dn,message-head.value,message-head.type,message-para); free(message); return;#include #include using namespace std; class Student public: Student() Student( const string& nm, int sc = 0 ) : name( nm ), score( sc ) void set_student( const string& nm, int sc = 0 ) name

9、 = nm; score = sc; const string& get_name() const return name; int get_score() const return score; private: string name; int score; ; / output students name and score void output_student( const Student& student ) cout student.get_name() t; cout student.get_score() endl; int main() Student stu( Wang,

10、 85 ); output_student( stu ); 设 计了一个类 Student,数据成员有 name 和 score,有两个构造函数,有一个设置成员数据函数 set_student(),各有一个取得 name 和 score 的函数 get_name() 和 get_score()。请注意 get_name() 和 get_score() 后面都加了 const,而 set_student() 后面没有(也不能有const)。首先说一点题外话,为什么 get_name() 前面也加 const。如果没有前后两个 const 的话,get_name() 返回的是对私有数据成员 nam

11、e 的引用,所以通过这个引用可以改变私有成员 name 的值,如 Student stu( Wang, 85 );stu.get_name() = Li;即把 name 由原来的 Wang 变成了 Li,而这不是我们希望的发生的。所以在 get_name() 前面加 const 避免这种情况的发生。那么,get_name() 和 get_score() 这两个后面应该加 const的成员函数,如果没有 const 修饰的话可不可以呢?回答是可以!但是这样做的代价是:const对象将不能再调用这两个非const成员函数了。如const string& get_name(); / 这两个函数都应该

12、设成 const 型int get_score();void output_student( const Student& student ) cout student.get_name() t; / 如果 get_name() 和 get_score() 是非const成员函数,这一句和下一句调用是错误的cout student.get_score() endl; 由 于参数student表示的是一个对const Student型对象的引用,所以 student 不能调用非const成员函数如 set_student()。如果 get_name() 和 get_score() 成员函数也变成

13、非const型,那么上面的 student.get_name() 和 student.get_score() 的使用就是非法的,这样就会给我们处理问题造成困难。因此,我们没有理由反对使用const,该加const时就应该加上const,这样使成员函数除了非const的对象之外,const对象也能够调用它。c/C+ 通用 Makefile 本文提供了一个用于对 C/C+ 程序进行编译和连接以产生可执行程序的通用 Makefile。 在使用 Makefile 之前,只需对它进行一些简单的设置即可;而且一经设置,即使以后对源程序文件有所增减一般也不再需要改动 Makefile。因此,即便是一个没有学

14、习过 Makefile 书写规则的人,也可以为自己的 C/C+ 程序快速建立一个可工作的 Makefile。这个 Makefile 可以在 GNU Make 和 GCC 编译器下正常工作。但是不能保证对于其它版本的 Make 和编译器也能正常工作。 如果你发现了本文中的错误,或者对本文有什么感想或建议,可通过 whyglinux AT hotmail DOT com 邮箱和作者联系。 此 Makefile 的使用方法如下: 1. 程序目录的组织 尽量将自己的源程序集中在一个目录中,并且把 Makefile 和源程序放在一起,这样用起来比较方便。当然,也可以将源程序分类存放在不同的目录中。 在程

15、序目录中创建一个名为 Makefile 的文本文件,将后面列出的 Makefile 的内容复制到这个文件中。(注意:在复制的过程中,Makfile 中各命令前面的 Tab 字符有可能被转换成若干个空格。这种情况下需要把 Makefile 命令前面的这些空格替换为一个 Tab。) 将当前工作目录切换到 Makefile 所在的目录。目前,这个 Makefile 只支持在当前目录中的调用,不支持当前目录和 Makefile 所在的路径不是同一目录的情况。 2. 指定可执行文件 程序编译和连接成功后产生的可执行文件在 Makefile 中的 PROGRAM 变量中设定。这一项不能为空。为自己程序的可

16、执行文件起一个有意义的名子吧。 3. 指定源程序 要编译的源程序由其所在的路径和文件的扩展名两项来确定。由于头文件是通过包含来使用的,所以在这里说的源程序不应包含头文件。 程序所在的路径在 SRCDIRS 中设定。如果源程序分布在不同的目录中,那么需要在 SRCDIRS 中一一指定,并且路径名之间用空格分隔。 4. Makefile 目标(Targets) 下面是关于这个 Makefile 提供的目标以及它所完成的功能: o make 编译和连接程序。相当于 make all。 o make objs 仅仅编译程序产生 .o 目标文件,不进行连接(一般很少单独使用)。 o make clean

17、 删除编译产生的目标文件和依赖文件。 o make cleanall 删除目标文件、依赖文件以及可执行文件。 o make rebuild 重新编译和连接程序。相当于 make clean & make all。 下面提供两个例子来具体说明上面 Makefile 的用法。 例一Hello World 程序 这个程序的功能是输出 Hello, world! 这样一行文字。由 hello.h、hello.c、main.cxx 三个文件组成。前两个文件是 C 程序,后一个是 C+ 程序,因此这是一个 C 和 C+ 混编程序。 代码:/* File name: hello.h * C header f

18、ile */ #ifndef HELLO_H #define HELLO_H #ifdef _cplusplus extern C #endif void print_hello(); #ifdef _cplusplus #endif #endif 代码:/* File name: hello.c * C source file. */ #include hello.h #include void print_hello() puts( Hello, world! ); 代码:/* File name: main.cxx * C+ source file. */ #include hello.

19、h int main() print_hello(); return 0; 建立一个新的目录,然后把这三个文件拷贝到目录中,也把 Makefile 文件拷贝到目录中。之后,对 Makefile 的相关项目进行如下设置: 代码:PROGRAM := hello # 设置运行程序名 SRCDIRS := . # 源程序位于当前目录下 SRCEXTS := .c .cxx # 源程序文件有 .c 和 .cxx 两种类型 CFLAGS := -g # 为 C 目标程序包含 GDB 可用的调试信息 CXXFLAGS := -g # 为 C+ 目标程序包含 GDB 可用的调试信息 由于这个简单的程序只使用

20、了 C 标准库的函数(puts),所以对于 CFLAGS 和 CXXFLAGS 没有过多的要求,LDFLAGS 和 CPPFLAGS 选项也无需设置。 经过上面的设置之后,执行 make 命令就可以编译程序了。如果没有错误出现的话,./hello 就可以运行程序了。 如果修改了源程序的话,可以看到只有和修改有关的源文件被编译。也可以再为程序添加新的源文件,只要它们的扩展名是已经在 Makefile 中设置过的,那么就没有必要修改Makefile。 C/C+程序员应聘试题剖析1.引言 本文的写作目的并不在于提供C/C+程序员求职面试指导,而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大

21、论坛,部分试题解答也参考了网友的意见。许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分。读者可从本文看到strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次。此外,还有一些面试题考查面试者敏捷的思维能力。 分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的深入剖析则可进一步增强自身的内功。2.找错题试题1:void test1()char strin

22、g10;char* str1 = ;strcpy( string, str1 );试题2:void test2()char string10, str110;int i;for(i=0; i10; i+)str1i = a;strcpy( string, str1 );试题3:void test3(char* str1)char string10;if( strlen( str1 ) = 10 )strcpy( string, str1 );解答:试题1字符串str1需要11个字节才能存放下(包括末尾的0),而string只有10个字节的空间,strcpy会导致数组越界;对试题2,如果面试者指

23、出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;对试题3,if(strlen(str1) = 10)应改为if(strlen(str1) = - EPSINON) & (x =”或“=”形式。如果写成if (x = 0.0),则判为错,得0分。试题2:以下为Windows NT下的32位C+程序,请计算sizeof的值void Func ( char str100 )sizeof( str ) = ?voi

24、d *p = malloc( 100 );sizeof ( p ) = ?解答:sizeof( str ) = 4sizeof ( p ) = 4剖析:Func ( char str100 )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。数组名的本质如下:(1)数组名指代一种数据结构,这种数据结构就是数组;例如:char str10;cout sizeof(str) endl;输出结果为10,str指代数据结构char10。(2)数组名可以转换为指向其指代实体的指针,而且是一个指针

25、常量,不能作自增、自减等操作,不能被修改;char str10; str+; /编译出错,提示str不是左值/注意与上面的数组作函数形参区别,讲解如下:(3)数组名作为函数形参时,沦为普通指针。Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str ) 、sizeof ( p ) 都为4。试题3:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?least = MIN(*p+, b);解答:#define MIN(A,B) (A) = (B) ? (A) : (B)MIN(*p+, b)会产生宏的副作用

26、剖析:这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。程序员对宏定义的使用要非常小心,特别要注意两个问题:(1)谨慎地将宏定义中的“参数”和整个宏用括弧括起来。所以,严格地讲,下述解答:#define MIN(A,B) (A) = (B) ? (A) : (B)#define MIN(A,B) (A = B ? A : B )都应判0分;(2)防止宏的副作用。宏定义#define MIN(A,B) (A) = (B) ? (A) : (B)对MIN(*p+, b)

27、的作用结果是:(*p+) = (b) ? (*p+) : (*p+)这个表达式会产生副作用,指针p会作三次+自增操作。试题4:为什么标准头文件都有类似以下的结构? #ifndef _INCvxWorksh#define _INCvxWorksh #ifdef _cplusplusextern C #endif /*.*/ #ifdef _cplusplus#endif #endif /* _INCvxWorksh */解答:头文件中的编译宏#ifndef_INCvxWorksh#define_INCvxWorksh#endif 的作用是防止被重复引用。作为一种面向对象的语言,C+支持函数重载,

28、而过程式语言C则不支持。函数被C+编译后在symbol库中的名字与C语言的不同。例如,假设某个函数的原型为: void foo(int x, int y);该函数被C编译器编译后在symbol库中的名字为_foo,而C+编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C+就是考这种机制来实现函数重载的。为了实现C和C+的混合编程,C+提供了C连接交换指定符号extern C来解决名字匹配问题,函数声明前加上extern C后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就可以调用C+的函数了。试题5

29、:编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh” 函数头是这样的:/pStr是指向以0结尾的字符串的指针/steps是要求移动的nvoid LoopMove ( char * pStr, int steps )/请填充.解答:正确解答1:void LoopMove ( char *pStr, int steps )int n = strlen( pStr ) - steps;char tmpMAX_LEN; /这是何物啊?重新定义一个中间数组 strcpy ( tmp, pStr + n );把前n位

30、复制给tmp strcpy ( tmp + steps, pStr);把pstr复制给tmp,从steps位开始*( tmp + strlen ( pStr ) ) = 0;截取strlen()长度,strcpy( pStr, tmp );正确解答2:void LoopMove ( char *pStr, int steps )int n = strlen( pStr ) - steps;char tmpMAX_LEN; memcpy( tmp, pStr + n, steps ); 将后steps位复制给tmpmemcpy(pStr + steps, pStr, n ); memcpy(pStr, tmp, steps ); 剖析:这个试题主要考查面试者对标准库函数的熟练程度,在需要的时候引用库函数可以很大程度上简化程序编写的工作量。最频繁被使用的库函数包括:(1) strcpy(2) memcpy(3) memset试题6:已知WAV文件格式如下表,打开一个WAV文件,以适当的数据结构组织WAV文件头并解析WA

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com