名企试题解答总结.docx
- 文档编号:27875464
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:33
- 大小:35.21KB
名企试题解答总结.docx
《名企试题解答总结.docx》由会员分享,可在线阅读,更多相关《名企试题解答总结.docx(33页珍藏版)》请在冰豆网上搜索。
名企试题解答总结
名企试题解答总结
说明:
1~4IBM,5~6XX
1.C++对比C的优点?
C++相对C是一种更高级的语言,是C的超集,优势在于具有封装,继承,多态等特点,函数库丰富,可扩展性强。
知识点:
C++的高级特性:
重载内联constvirtual
C++面向对象特性:
继承封装多态
继承是指一个对象直接使用另一对象的属性和方法。
类:
具体对象(实例)的抽象。
隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
多态(Polymorphism)按字面的意思就是“多种状态”。
在面向对象语言中,接口的多种不同的实现方式即为多态。
引用CharlieCalverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4编程技术内幕”)。
简单的说,就是一句话:
允许将子类类型的指针赋值给父类类型的指针。
多态性在ObjectPascal和C++中都是通过虚函数(VirtualFunction)实现的。
2.inline函数的特点?
a.inline函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。
b.编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。
c.Inline函数的定义在头文件中。
3.inline&宏的不同?
宏在使用时,仅仅只是做预处理器符号表中的简单替换,而inline函数是一个真正的函数,会进行参数的传递,类型检查等工作,保证调用正确。
4.名词解释
抽象
从我们需要解决的问题出发,在与该问题相关的一组关联对象中提取出主要的或共有的部分――说简单一点,就是用相同的行为来操作不同的对象。
举个例子,class是一系列具有某些共同属性的对象的抽象。
算法复杂度
算法复杂度分为时间复杂度和空间复杂度。
其作用:
时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小。
5.对任意输入的正整数N,编写C程序求N!
的尾部连续0的个数,并指出计算复杂度。
如:
18!
=6402373705728000,尾部连续0的个数是3。
(不用考虑数值超出计算机整数界限的问题)
#include
intmain()
{
intN=5,i,zero_number=0;
intresult=N;
for(i=1;i { result=result*(N-i); } printf("%d\n",result); while(! (((result/10)*10) { result=result/10; zero_number++; } printf("%d\n",zero_number); returnzero_number; } 另一种思路: 求出1->1000里,能被5整除的数的个数n1,能被25整除的数的个数n2,能被125整除的数的个数n3,能被625整除的数的个数n4. 1000! 末尾的零的个数=n1+n2+n3+n4; 下面是求N! 分解后因子5的个数(能被5整除的次数),即为0的个数。 int countFactorialZero(int n) { int count=0; for(int i=5;i { int j=i;//注意不要直接用i while(j%5==0) { j/=5; count++; } } return count; } 6.编写一个C语言函数,要求输入一个url,输出该url是首页、目录页或者其他url 如下形式叫做首页: militia.info/ http: //hgh-products.my- 如下形式叫做目录页: .tw/user/tgk5ar1r/profile/ 请注意: a)url有可能带http头也有可能不带 b)动态url(即含有"? "的url)的一律不算目录页,如: 另: 如果你会linux,请用linux下的grep命令实现第2题的功能(附加5分)。 /****思路: 经观察,首页类的url中之多含有3个/(http头的//和末尾的/),或者只含有1个(没有http头),而目录类的url所含的个数至少为2个(此时不含http头)或至少4个(此时包含http头)。 如果url中出现? 则视为动态网页,归类为其他网页。 作者: xiaocui 时间: 2007.9.12 版本: v1.0**************************************************************************/ #include #include usingnamespacestd; stringresult[3]={"首页","目录页","其他页"}; stringgetCategory(stringurl) { //首先判断是否是动态网页 if(strchr(url.c_str(),'? ')! =NULL) { returnresult[2]; } boolisHttp;//是否包含http头 if(strstr(url.c_str(),"http: //")! =NULL) { isHttp=true; } else { isHttp=false; } if(isHttp==true) { char*buff=newchar[url.size()-7];//去除http: //和最后的/ inti; for(i=0;i { buff[i]=url[7+i]; } buff[i]='\0'; if(strchr(buff,'/')==NULL) { delete[]buff; returnresult[0]; } else { delete[]buff; returnresult[1]; } } else { char*buff=newchar[url.size()+1]; strcpy(buff,url.c_str()); buff[strlen(buff)-1]='\0';//去除最后的/ if(strchr(buff,'/')==NULL) { delete[]buff; returnresult[0]; } else { delete[]buff; returnresult[1]; } } } intmain() { cout<<"请输入url: "; stringurl; cin>>url; cout<<"url类型为: "< return0; } 6.用一个数据结构定义通道和墙组成的迷宫。 用数组定义,1代表墙0代表通道 #defineMax_passageway1000 #defineMax_wall1000 struct { maze[Max_passageway][Max_wall]; }MazeType; 7.哪些操作会隐式调用C++的拷贝构造函数? 按值返回,按值传递参数,用一个对象初始化另一个对象。 8.请定义一个指向此函数的指针inttest(char*p1,intnTestCount) inttest(char*,int) int(*ptr)(char*p1,intn); ptr=test; ******注意指针函数和函数指针的区别: Eg: 函数指针int(*test)(intn)函数返回一个指针。 指针函数int*test(intn) 函数指针数组(*test[10])(intn) a.请定义一个指向此函数的指针inttest(char*p1,intnTestCount) b.声明此指针的数组,包含10个元素。 c.给数组的第一个元素赋值,使其指向test. d.写出调用数组的第一个元素,执行test操作实例的语句。 a.int(*func)(char*,int); b.funcmyFunc[10]; c.myFunc[0]=test; d.char*p; intn; (*myFunc[0])(p,n); 9.返回值是如何传递回父函数的。 编译器会将返回值压入栈中,函数返回后由父函数找到栈位置,并取出该值,然后改变栈顶指针。 10.什么是预编译,何时需要预编译? 预编译又称为预处理,是做些代码文本的替换工作。 处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。 c编译系统在对程序进行通常的编译之前,先进行预处理。 c提供的预处理功能主要有以下三种: 1)宏定义 2)文件包含 3)条件编译。 11.char*constpcharconst*pconstchar*p上述三个有什么区别? 答案: char*constp;//常量指针,p的值不可以修改 charconst*p;//指向常量的指针,指向的常量值不可以改; constchar*p;//和charconst*p一样 12.(9)写一个“标准”宏,这个宏输入两个参数并返回较小的一个。 答案: 。 #defineMin(X,Y)((X)>(Y)? (Y): (X))//注意: XY加括号,并且结尾没有‘;' 13.数据结构中常用的排序方法? 答案: 插入排序: 直接插入排序、二分插入排序、表插入排序、shell排序; 选择排序: 直接选择排序、树形选择排序、堆排序; 交换排序: 起泡排序、快速排序; 分配排序: 基数排序; 归并排序; 14.int(*s[10])(int)表示的是什么啊? 答案: int(*s[10])(int)函数指针数组,每个指针指向一个intfunc(intparam)的函数。 15.交换两个变量的值,不使用第三个变量。 即a=3,b=5,交换之后a=5,b=3; a=a+b; b=a-b; a=a-b; 16.c和c++中的struct有什么不同? 答案: c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。 c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private. 17.纯虚函数如何定义? 使用时应注意什么? 答案: virtualvoidf()=0;是接口,子类必须要实现 18.数组和链表的区别? 答案: 数组: 数据顺序存储,固定大小;连表: 数据可以随机存储,大小可动态改变。 19.要对绝对地址0x100000赋值,我们可以用(unsignedint*)0x100000=1234;那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做? 答案: *((void(*)())0x100000)(); 首先要将0x100000强制转换成函数指针,即: (void(*)())0x100000然后再调用它: *((void(*)())0x100000)()。 用typedef可以看得更直观些: typedefvoid(*)()voidFuncPtr;*((voidFuncPtr)0x100000)(); 20.已知一个数组table,用一个宏定义,求出数据的元素个数。 答案: #defineNTBL(sizeof(table)/sizeof(table[0])) 21.用两个栈实现一个队列的功能? 要求给出算法和思路! 答案: 设2个栈为A,B,一开始均为空。 入队: 将新元素push入栈A;出队: (1)判断栈B是否为空; (2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;(3)将栈B的栈顶元素pop出;这样实现的队列入队和出队的平摊复杂度都还是O (1),比上面的几种方法要好。 22.unsignedchar*p1;unsignedlong*p2;p1=(unsignedchar*)0x801000;p2=(unsignedlong*)0x810000;请问p1+5=;p2+5= 答案: 801005;810014。 不要忘记了这个是16进制的数字,p2要加20变为16进制就是14. 23.程序的局部变量存在于()中,全局变量存在于()中,动态申请数据存在于()中。 答案: 栈静态区堆 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。 其操作方式类似于数据结构中的栈。 2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。 注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 -程序结束后有系统释放 4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。 24.设有以下说明和定义: typedefunion{longi;intk[5];charc;}DATE;structdata{intcat;DATEcow;doubledog;}too;DATEmax;则语句printf(“%d”,sizeof(too)+sizeof(max));的执行结果是: ______ 答案: DATE是一个union,变量公用空间。 里面最大的变量类型是int[5],占用20个字节。 所以它的大小是20。 data是一个struct,每个变量分开占用空间。 依次为int4+DATE20+double8=32.所以结果是20+32=52.当然…在某些16位编辑器下,int可能是2字节,那么结果是int2+DATE10+double8=20。 *****根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。 函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。 25.已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此结点,然后删除。 答案: slnodetype*Delete(slnodetype*Head,intkey) { if(Head->number==key) {Head=Pointer->next; free(Pointer); break; } Back=Pointer; Pointer=Pointer->next; if(Pointer->number==key) { Back->next=Pointer->next; free(Pointer); break; } voiddelete(Node*p) { if(Head=Node) while(p) } } 26.预处理器标识#error的目的是什么? 错误抛出语句 27.用变量a给出下面的定义 a)一个整型数(Aninteger) b)一个指向整型数的指针(Apointertoaninteger) c)一个指向指针的的指针,它指向的指针是指向一个整型数(Apointertoapointertoanintege)r 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 28.关键字static的作用是什么? 这个简单的问题很少有人能回答完全。 在C语言中,关键字static有三个明显的作用: 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。 它是一个本地的全局变量。 3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。 那就是,这个函数被限制在声明它的模块的本地范围内使用。 29.const关键字的使用含义 constinta; intconsta; constint*a; int*consta; intconst*aconst; 前两个的作用是一样,a是一个常整型数。 第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。 第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。 最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。 30.嵌入式系统总是要用户对变量或寄存器进行位操作。 给定一个整型变量a,写两段代码,第一个设置a的bit3,第二个清除a的bit3? #defineBIT3(0x1<<3) staticinta; voidset_bit3(void) { a|=BIT3; } voidclear_bit3(void) { a&=~BIT3; } 31.嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。 在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。 编译器是一个纯粹的ANSI编译器。 写代码去完成这一任务。 int*ptr; ptr=(int*)0x67a9; *ptr=0xaa55; 32.中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。 具代表事实是,产生了一个新的关键字__interrupt。 下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。 __interruptdoublecompute_area(doubleradius) { doublearea=PI*radius*radius; printf("\nArea=%f",area); returnarea; } 1)ISR不能返回一个值。 如果你不懂这个,那么你不会被雇用的。 2)ISR不能传递参数。 如果你没有看到这一点,你被雇用的机会等同第一项。 3)在许多的处理器/编译器中,浮点一般都是不可重入的。 有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。 此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的 4)与第三点一脉相承,printf()经常有重入和性能上的问题。 33.下面的代码输出是什么,为什么? voidfoo(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 试题 解答 总结