东软C_C++笔试.doc_第1页
东软C_C++笔试.doc_第2页
东软C_C++笔试.doc_第3页
东软C_C++笔试.doc_第4页
东软C_C++笔试.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;答:/假设线性表的双向链表存储结构typedef struct DulNodestruct DulNode *prior; /前驱指针ElemType data; /数据struct DulNode *next; /后继指针DulNode,*DuLinkList;/删除操作Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e)if(!(p=GetElemP_DuL(L,i) /此处得到i位置的节点指针,如果有需要也得写出具体函数实现return ERROR;e=p-data;p-prior-next=p-next;p-next-prior=p-pror;free(p);return OK;/插入操作Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e)if(!(p=GetElemP_DuL(L,i)return ERROR;if(!(s=(DuLinkList)malloc(sizeof(DuLNode)return ERROR;s-data=e;s-prior=p-prior;p-prior-next=s;s-next=p;p-prior=s;return OK;2.写一个函数,将其中的t都转换成4个空格。答:该函数命名为convert,参数的意义为:*strDest目的字符串,*strSrc源字符串,length源字符串的长度函数实现为:char* convert(char *strDest, const char *strSrc,int length)char * cp = strDest;int i=0;while(*strSrc & iif (*strSrc=t) /将t转换成4个空格for(int j=0;j= EPSINON) & (x =”或“=”形式。如果写成if (x = 0.0),则判为错,得0分。试题2:以下为Windows NT下的32位C+程序,请计算sizeof的值void Func ( char str100 ) sizeof( str ) = ?void *p = malloc( 100 );sizeof ( p ) = ?解答:sizeof( str ) = 4sizeof ( p ) = 4剖析:Func ( char str100 )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。数组名的本质如下:(1) 数组名指代一种数据结构,这种数据结构就是数组;例如:char str10;cout sizeof(str) endl;输出结果为10,str指代数据结构char10。(2) 数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;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)会产生宏的副作用剖析:这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。程序员对宏定义的使用要非常小心,特别要注意两个问题:(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) ? (*p+) : (*p+) 这个表达式会产生副作用,指针p会作三次+自增操作。除此之外,另一个应该判0分的解答是:#define MIN(A,B) (A) 1 + 2 * 3 其实是想要(1 + 2) * 32) 作为值返回时,类似1)#define ADD(a,b) (a) + (b)int c = ADD(a,b) * 3; = (a) + (b) * 3 其实是想要(a + b) * 3所以,一般的规则是:宏里面参数全部用括号括起来;如果作为值返回,整个表达式也用括号括起来。所以,上面最好这么写:#define MULTI(a,b) (a) * (b)#define ADD(a,b) (a) + (b)2、实际使用参数和宏内部变量同名#define HASH(str,sz,rst) dounsigned int n = 0; n = xxx; rst = n % sz;while(0)这是一个hash的宏实现,其中定义了一个临时变量n,根据str计算n,然后对sz求模并把返回值赋给传进来的rst.这么调用:int n;HASH(“hello”,7,n);不会达到改变n的效果,因为实际使用参数n和宏内部的变量n同名。宏扩展中最后一条语句是:n = n % sz;因为宏内部n有更小作 用域,实际赋值的是宏内部的那个临时变量n。外面调用的n不会有任何改变。这个副作用有些隐蔽,一般的规则是:宏内部变量使用一种不同风格的命名方式。比如:#define HASH(str,sz,rst) dounsigned int _n = 0; _n = 3、+,#define MAX(a,b) (a) (b) ? (a) : (b)int a = 3,b = 2;int c = MAX(a+,b);执行看看,不但a的值不是和想要的一致,返回值c也会让你大吃一惊,哈哈。(a = 5,c = 4)在宏内部一个变量”执行”多少次,它就自增或自减了多少次。所以一般使用宏最好不要传入自增自减。如果你一定要在宏里消除这个副作用,可以这样:#define MAX(a,b) (int _x = (a), _y = (b);(_x _y) ? _x : _y;)也就是:保证传入宏的参数在内部只使用一次。(注意:传入a+或+a都能得到各自正确的效果)这里的内部变量_x,_y是不需要用括号包起来的,原因可以自己想想。另外对宏中括号的使用补充说明两点:因为宏中定义了临时变量,所以要用括起来;因为要返回值,所以外面还要用()括起来(不返回值);另外,这里还有一个问题:实际中a,b不一定是int的,这个宏中的临时变量声明为int,不通用。改进:#define MAX(a,b,type) (type _x = (a), _y = (b);(_x _y) ? _x : _y;)使用:MAX(1,2,int); MAX(1.1,1.2,double);是不是感觉怪怪的,有点c+的感觉 这样的使用太复杂了,而且也会给代码的阅读带来难度。我觉得好的态度是多了解些宏的可能的副作用,在实际编码中遵守第1、2条规则,不要往宏中传入自增自减的东西,就够了。不要把过多的复杂度全扔给宏,”通用”也不能盲目,因为毕竟:yy是没有极限的。试题4:为什么标准头文件都有类似以下的结构?Code#ifndef _INCvxWorksh#define _INCvxWorksh#ifdef _cplusplusextern “C” #endif/*/#ifdef _cplusplus#endif#endif /* _INCvxWorksh */解答:头文件中的编译宏#ifndef_INCvxWorksh#define_INCvxWorksh#endif的作用是防止被重复引用。作为一种面向对象的语言,C+支持函数重载,而过程式语言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:编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”函数头是这样的:/pStr是指向以0结尾的字符串的指针/steps是要求移动的nvoid LoopMove ( char * pStr, int steps ) /请填充解答:正确解答1:Codevoid LoopMove ( char *pStr, int steps ) int n = strlen( pStr ) steps; char tmpMAX_LEN; strcpy ( tmp, pStr + n ); strcpy ( tmp + steps, pStr); *( tmp + strlen ( pStr ) ) = 0; strcpy( pStr, tmp );正确解答2:Codevoid LoopMove ( char *pStr, int steps ) int n = strlen( pStr ) steps; char tmpMAX_LEN; memcpy( tmp, pStr + n, steps ); memcpy(pStr + steps, pStr, n ); memcpy(pStr, tmp, steps );剖析:这个试题主要考查面试者对标准库函数的熟练程度,在需要的时候引用库函数可以很大程度上简化程序编写的工作量。最频繁被使用的库函数包括:(1) strcpy(2) memcpy(3) memsetmemcpy原型:extern void *memcpy(void *dest, void *src, unsigned int count);用法:#include 功能:由src所指内存区域复制count个字节到dest所指内存区域。说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。注意:与strcpy相比,memcpy并不是遇到0就结束,而是一定会拷贝完n个字节。举例:/ memcpy.c#include #include int main(int argc, char* argv)char *s=”Golden Global View”;char d20;clrscr();memcpy(d,s,strlen(s);dstrlen(s)=0;printf(“%s”,d);getchar();return 0;截取view#include int main(int argc, char* argv)char *s=”Golden Global View”;char d20;memcpy(d,s+14,4);/memcpy(d,s+14*sizeof(char),4*sizeof(char);也可d4=0;printf(“%s”,d);getchar();return 0;输出结果:View初始化数组char msg10;memcpy(msg,0,sizeof(msg);memset函数原型void *memset(void *s, int ch, unsigned n);编辑本段程序例#include #include #include memset函数int main(void)char buffer = “Hello worldn”;printf(“Buffer before memset: %sn”, buffer);memset(buffer, *, strlen(buffer) );printf(“Buffer after memset: %sn”, buffer);return 0;输出结果:Buffer before memset: Hello worldBuffer after memset: *编译平台:Microsoft Visual C+ 6.0也不一定就是把内容全部设置为ch指定的ASCII值,而且该处的ch可为int或者其他类型,并不一定要是char类型。例如下面这样:int array5 = 1,4,3,5,2;for(int i = 0; i 5; i+)cout0.000001&x-0.000001)10.Internet采用哪种网络协议?该协议的主要层次结构?Tcp/Ip协议主要层次结构为: 应用层/传输层/网络层/数据链路层/物理层。11.Internet物理地址和IP地址转换采用什么协议?ARP (Address Resolution Protocol)(地址解析協議)12.IP地址的编码分为哪俩部分?IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。13.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。循环链表,用取余操作做14.不能做switch()的参数类型是:switch的参数不能为实型。1.写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分)int a = 4;(A)a += (a+); (B) a += (+a) ;(C) (a+) += a;(D) (+a) += (a+);a = ?答:C错误,左侧不是一个有效变量,不能赋值,可改为(+a) += a;改后答案依次为9,10,10,112.某32位系统下, C+程序,请计算sizeof 的值(5分).char str = “/”char *p = str ;int n = 10;请计算sizeof (str ) = ?(1)sizeof ( p ) = ?(2)sizeof ( n ) = ?(3)void Foo ( char str100)请计算sizeof( str ) = ?(4)void *p = malloc( 100 );请计算sizeof ( p ) = ?(5)答:(1)17 (2)4 (3) 4 (4)4 (5)43. 回答下面的问题. (4分)(1).头文件中的 ifndef/define/endif 干什么用?预处理答:防止头文件被重复引用(2). i nclude 和 i nclude “filename.h” 有什么区别?答:前者用来包含开发环境提供的库头文件,后者用来包含自己编写的头文件。(3).在C+ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?答:函数和变量被C+编译后在符号库中的名字与C语言的不同,被extern C修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C+程序不能直接调用C 函数。C+提供了一个C 连接交换指定符号extern“C”来解决这个问题。(4). switch()中不允许的数据类型是?答:实型4. 回答下面的问题(6分)(1).Void GetMemory(char *p, int num)*p = (char *)malloc(num);void Test(void)char *str = NULL;GetMemory(&str, 100);strcpy(str, hello);printf(str);请问运行Test 函数会有什么样的结果?答:输出“hello”(2). void Test(void)char *str = (char *) malloc(100);strcpy(str, “hello”);free(str);if(str != NULL)strcpy(str, “world”);printf(str);请问运行Test 函数会有什么样的结果?答:输出“world”(3). char *GetMemory(void)char p = hello world;return p;void Test(void)char *str = NULL;str = GetMemory();printf(str);请问运行Test 函数会有什么样的结果?答:无效的指针,输出不确定5. 编写strcat函数(6分)已知strcat函数的原型是char *strcat (char *strDest, const char *strSrc);其中strDest 是目的字符串,strSrc 是源字符串。(1)不调用C+/C 的字符串库函数,请编写函数 strcat答:VC源码:char * _cdecl strcat (char * dst, const char * src)char * cp = dst;while( *cp )cp+; /* find end of dst */while( *cp+ = *src+ ) ; /* Copy src to end of dst */return( dst ); /* return dst */(2)strcat能把strSrc 的内容连接到strDest,为什么还要char * 类型的返回值?答:方便赋值给其他变量6.MFC中CString是类型安全类么?答:不是,其它数据类型转换到CString可以使用CString的成员函数Format来转换7.C+中为什么用模板类。答:(1)可用来创建动态增长和减小的数据结构(2)它是类型无关的,因此具有很高的可复用性。(3)它在编译时而不是运行时检查数据类型,保证了类型安全(4)它是平台无关的,可移植性(5)可用于基本数据类型19 关于内存对齐的问题以及sizof()的输出答:编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。20 int i=10, j=10, k=3; k*=i+j; k最后的值是?答:60,此题考察优先级,实际写成: k*=(i+j);,赋值运算符优先级最低19. 如何引用一个已经定义过的全局变量?答:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。20. 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。21. 语句for( ;1 ;)有什么问题?它是什么意思?答:无限循环,和while(1)相同。22. dowhile和whiledo有什么区别?答:前一个循环一遍再判断,后一个判断以后再循环。23. 请写出下列代码的输出内容#includemain()int a,b,c,d;a=10;b=a+;c=+a;d=10*a+;printf(b,c,d:%d,%d,%d,b,c,d);return 0;答:10,12,1201. 以下三条输出语句分别输出什么?char str1 = abc;char str2 = abc;const char str3 = abc;const char str4 = abc;const char* str5 = abc;const char* str6 = abc;cout boolalpha ( str1=str2 ) endl; / 输出什么?cout boolalpha ( str3=str4 ) endl; / 输出什么?cout boolalpha ( str5=str6 ) endl; / 输出什么?答:分别输出false,false,true。str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。2. 以下代码中的两个sizeof用法有问题吗?void UpperCase( char str ) / 将 str 中的小写字母转换成大写字母for( size_t i=0; iif( a=stri & stri=z )stri -= (a-A );char str = aBcDe;cout str字符长度为: sizeof(str)/sizeof(str0) endl;UpperCase( str );cout str endl;答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。3. 非C+内建型别 A 和 B,在哪几种情况下B能隐式转化为A?答:a. class B : public A / B公有继承自A,可以是间接继承的b. class B operator A( ); / B实现了隐式转化为A的转化c. class A A( const B& ); / A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数d. A& operator= ( const A& ); / 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个4. 以下代码有什么问题?struct TestTest( int ) Test() void fun() ;void main( void )Test a(1);a.fun();Test b();b.fun();答:变量b定义出错。按默认构造函数定义对象,不需要加括号。5. 以下代码有什么问题?cout (true?1:1) temp;unsigned int const size2 = temp;char str2 size2 ;答:str2定义出错,size2非编译器期间常量,而数组定义要求长度必须为编译期常量。7. 以下反向遍历array数组的方法有什么错误?vector array;array.push_back( 1 );array.push_back( 2 );array.push_back( 3 );for( vector:size_type i=array.size()-1; i=0; i ) / 反向遍历array数组cout arrayi endl;答:首先数组定义有误,应加上类型参数:vector array。其次vector:size_type被定义为unsigned int,即无符号数,这样做为循环变量的i为0时再减1就会变成最大的整数,导致循环失去控制。8. 以下代码中的输出语句输出0吗,为什么?struct CLSint m_i;CLS( int i ) : m_i(i) CLS()CLS(0);CLS obj;cout obj.m_i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论