版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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/c+ 程序进行编译和连接以产生可执行程序的通用 makefile。 在使用 makefile 之前,只需对它进行一些简单的设置即可;而且一经设置,即使以后对源程序文件有所增减一般也不再需要改动 makefile。因此,即便是一个没有学习过 makefile 书写规则
14、的人,也可以为自己的 c/c+ 程序快速建立一个可工作的 makefile。这个 makefile 可以在 gnu make 和 gcc 编译器下正常工作。但是不能保证对于其它版本的 make 和编译器也能正常工作。 如果你发现了本文中的错误,或者对本文有什么感想或建议,可通过 whyglinux at hotmail dot com 邮箱和作者联系。 此 makefile 的使用方法如下: 1. 程序目录的组织 尽量将自己的源程序集中在一个目录中,并且把 makefile 和源程序放在一起,这样用起来比较方便。当然,也可以将源程序分类存放在不同的目录中。 在程序目录中创建一个名为 makef
15、ile 的文本文件,将后面列出的 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 file */ #ifndef h
18、ello_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.h int main() pri
19、nt_hello(); return 0; 建立一个新的目录,然后把这三个文件拷贝到目录中,也把 makefile 文件拷贝到目录中。之后,对 makefile 的相关项目进行如下设置: 代码:program := hello # 设置运行程序名 srcdirs := . # 源程序位于当前目录下 srcexts := .c .cxx # 源程序文件有 .c 和 .cxx 两种类型 cflags := -g # 为 c 目标程序包含 gdb 可用的调试信息 cxxflags := -g # 为 c+ 目标程序包含 gdb 可用的调试信息 由于这个简单的程序只使用了 c 标准库的函数(puts)
20、,所以对于 cflags 和 cxxflags 没有过多的要求,ldflags 和 cppflags 选项也无需设置。 经过上面的设置之后,执行 make 命令就可以编译程序了。如果没有错误出现的话,./hello 就可以运行程序了。 如果修改了源程序的话,可以看到只有和修改有关的源文件被编译。也可以再为程序添加新的源文件,只要它们的扩展名是已经在 makefile 中设置过的,那么就没有必要修改makefile。 1.引言 本文的写作目的并不在于提供c/c+程序员求职面试指导,而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。许多面试题看似简单,
21、却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分。读者可从本文看到strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次。此外,还有一些面试题考查面试者敏捷的思维能力。 分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的深入剖析则可进一步增强自身的内功。2.找错题试题1:void test1()char string10;char* str1 = 0123456789;s
22、trcpy( 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,如果面试者指出字符数组str1不能在数组内结束可以
23、给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 ) = ?void *p = malloc( 100
24、);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)的作用结果是:(*p+) = (b)
27、? (*p+) : (*p+)这个表达式会产生副作用,指针p会作三次+自增操作。试题4:为什么标准头文件都有类似以下的结构? #ifndef _incvxworksh#define _incvxworksh #ifdef _cplusplusextern c #endif /*.*/ #ifdef _cplusplus#endif #endif /* _incvxworksh */解答:头文件中的编译宏#ifndef_incvxworksh#define_incvxworksh#endif 的作用是防止被重复引用。作为一种面向对象的语言,c+支持函数重载,而过程式语言c则不支持。函数被c+编译
28、后在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:编写一个函数,作用是把一个char组
29、成的字符串循环右移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位复制给tmp strcpy ( tmp
30、 + 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 ); 剖
31、析:这个试题主要考查面试者对标准库函数的熟练程度,在需要的时候引用库函数可以很大程度上简化程序编写的工作量。最频繁被使用的库函数包括:(1) strcpy(2) memcpy(3) memset试题6:已知wav文件格式如下表,打开一个wav文件,以适当的数据结构组织wav文件头并解析wav格式的各项信息。wave文件格式说明表偏移地址字节数数据类型内 容文件头 00h4 charriff标志04h4int32文件长度08h4charwave标志0ch4charfmt标志10h4过渡字节(不定)14h2int16格式类别16h2int16通道数18h2int16 采样率(每秒样本数),表示每个
32、通道的播放速度1ch4int32波形音频数据传送速率20h2int16数据块的调整数(按字节算的)22h2每样本的数据位数24h4char数据标记符data28h4int32语音数据的长度解答:将wav文件格式定义为结构体waveformat: typedef struct tagwaveformat char criffflag4; uin32 nfilelen; char cwaveflag4; char cfmtflag4; char ctransition4; uin16 nformattag ; uin16 nchannels; uin16 nsamplespersec; uin32
33、 navgbytespersec; uin16 nblockalign; uin16 nbitnumpersample; char cdataflag4; uin16 naudiolength; waveformat;假设wav文件内容读出后存放在指针buffer开始的内存单元内,则分析文件格式的代码很简单,为:waveformat waveformat;memcpy( &waveformat, buffer,sizeof( waveformat ) ); 直接通过访问waveformat的成员,就可以获得特定wav文件的各项格式信息。剖析:试题6考查面试者组织数据结构的能力,有经验的程序设计
34、者将属于一个整体的数据成员组织为一个结构体,利用指针类型转换,可以将memcpy、memset等函数直接用于结构体地址,进行结构体的整体操作。 透过这个题可以看出面试者的程序设计经验是否丰富。试题7:编写类string的构造函数、析构函数和赋值函数,已知类string的原型为:?已经封装的文件中写的程序class string public: string(const char *str = null); / 普通构造函数 string(const string &other); / 拷贝构造函数 string(void); / 析构函数 string & operate =(const st
35、ring &other); / 赋值函数 private: char *m_data; / 用于保存字符串 ;解答:这是在实现文件中编写的程序/普通构造函数string:string(const char *str) if(str=null) m_data = new char1; / 得分点:对空字符串自动申请存放结束标志0的空/加分点:对m_data加null 判断*m_data = 0; elseint length = strlen(str); m_data = new charlength+1; / 若能加 null 判断则更好 strcpy(m_data, str); / stri
36、ng的析构函数string:string(void) delete m_data; / 或delete m_data;/拷贝构造函数string:string(const string &other) / 得分点:输入参数为const型 int length = strlen(other.m_data); m_data = new charlength+1; /加分点:对m_data加null 判断strcpy(m_data, other.m_data); /赋值函数string & string:operate =(const string &other) / 得分点:输入参数为const型
37、 if(this = &other) /得分点:检查自赋值return *this; delete m_data; /得分点:释放原有的内存资源int length = strlen( other.m_data ); m_data = new charlength+1; /加分点:对m_data加null 判断strcpy( m_data, other.m_data ); return *this; /得分点:返回本对象的引用剖析:能够准确无误地编写出string类的构造函数、拷贝构造函数、赋值函数和析构函数的面试者至少已经具备了c+基本功的60%以上!在这个类中包括了指针类成员变量m_dat
38、a,当类中包括指针类成员变量时,一定要重载其拷贝构造函数、赋值函数和析构函数,这既是对c+程序员的基本要求,也是effectivec+中特别强调的条款。仔细学习这个类,特别注意加注释的得分点和加分点的意义,这样就具备了60%以上的c+基本功!const关键字至少有下列n个作用:(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在
39、函数内部不能改变其值;(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。例如:const classa operator*(const classa& a1,const classa& a2);operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:classa a, b, c;(a * b) = c; / 对a*b的结果赋值操作(a * b) = c显然不符合编程者的初衷,也没有任何意义。、4.技巧题试题1:请写一个c函
40、数,若处理器是big_endian的,则返回0;若是little_endian的,则返回解答:int checkcpu()union w int a;char b; c;c.a = 1;0x00 00 00 01四个字节,c.b为一个字节return (c.b = 1);大端的c.b为00,小端的c.b为01?/因为联合体共用一个空间剖析:嵌入式系统开发者应该对little-endian和big-endian模式非常了解。采用little-endian模式的cpu对操作数的存放方式是从低字节到高字节,而big-endian模式对操作数的存放方式是从高字节到低字节。例如,16bit宽的数0x12
41、34在little-endian模式cpu内存中的存放方式(假设从地址0x4000开始存放)为:内存地址存放内容0x40000x340x40010x12而在big-endian模式cpu内存中的存放方式则为:内存地址存放内容0x40000x120x40010x3432bit宽的数0x12345678在little-endian模式cpu内存中的存放方式(假设从地址0x4000开始存放)为:内存地址存放内容0x40000x780x40010x560x40020x340x40030x12而在big-endian模式cpu内存中的存放方式则为:内存地址存放内容0x40000x120x40010x340x40020x560x40030x78联合体union的存放顺序是所有成员都从低地址开始存放,面试者的解答利用该特性,轻松地获得了cpu对内存采用little-endian还是big-endian模式读写。如果谁能当场给出这个解答,那简直就是一个天才的程序员。试题2:写一个函数返回1+2+3+n的值(假定结果不会超过长整型变量的范围) 解答:int sum( int n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 土地转让协议书范文6篇
- 七年级上学期教学计划范文六篇
- 2023年一周工作计划
- 形容冬天寒冷的经典句子120句
- 三年级第二学期美术教学计划
- 实习工作总结锦集十篇
- 新年工作计划(3篇)
- 《秋天的水果》中班教案
- 大学生暑期三下乡心得体会
- 防校园欺凌主题班会教案
- 《正态分布理论及其应用研究》4200字(论文)
- GB/T 45086.1-2024车载定位系统技术要求及试验方法第1部分:卫星定位
- 1古诗文理解性默写(教师卷)
- 电力电子技术(广东工业大学)智慧树知到期末考试答案章节答案2024年广东工业大学
- 2024年中国移动甘肃公司招聘笔试参考题库含答案解析
- 富氢水项目经济效益及投资价值分析(模板参考)
- 小流域水土保持综合治理工程初步设计
- 增强热塑性塑料复合管在我国的发展现状
- 机械设计外文文献翻译、中英文翻译、外文翻译
- 美标渐开线花键计算程序2014.8
- 风动送样手册
评论
0/150
提交评论