C 笔试题汇总

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1表示已有答案表示没有处理表示答案不确定C++笔试题1.多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?答案:虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐藏成员--虚拟函数表指针是在运行期--也就是构造函数被调用时进行初始化的,这是实现多态的关键.2.将一个1M-10M的文件,逆序存储到另一个文件,就是前一个文件的最后一个字符存到新文件的第一个字符,以此类推。//实现对一个文本文件内容的反向显示。#includestdio.h#includestdlib.hvoidmain(){charc;FILE*fp;if((fp=fopen(test.txt,r))==NULL)//以读方式打开文本文件{printf(Cannotopenfile.\n);exit(1);}fseek(fp,0L,2);//定位文件尾。注意此时并不是定位到文件的最后一字符,//而是在定位文件最后一个字符之后的位置while((fseek(fp,-1L,1))!=-1)//相对当前位置退后一个字节{c=fgetc(fp);putchar(c);//如果定位成功,读取当前字符并显示/*读取字符成功,文件指针会自动移到下一字符位置*/if(c=='\n')/*若读入是\n字符*/fseek(fp,-2L,1);/*由于DOS在文本文件中要存回车0x0d和换*//*行0x0a两个字符,故要向前移动两个字节*/elsefseek(fp,-1L,1);/*文件指针向前移动一个字节,使文*/}/*件指针定位在刚刚读出的那个字符*/fclose(fp);/*操作结束关闭文件*/}3.main主函数执行完毕后,是否可能会再执行一段代码?(朗讯的一道笔试题)答案:可以,可以用_onexit注册一个函数,它会在main之后执行;如果你需要加入一段在main退出后执行的代码,可以使用atexit()函数,注册一个函数。语法:#includestdlib.hintatexit(void(*function)(void));#includestdlib.h#includestdio.hvoidfn1(void),fn2(void),fn3(void),fn4(void);intmain(void){atexit(fn1);atexit(fn2);atexit(fn3);atexit(fn4);printf(Thisisexecutedfirst.\n);}voidfn1(){printf(next.\n);}voidfn2(){printf(executed);}voidfn3()2{printf(is);}voidfn4(){printf(This);}结果:Thisisexecutedfirst.Thisisexecutednext.4.一个父类写了一个virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?在子类的空间里,有没有父类的这个函数,或者父类的私有变量?(华为笔试题)答案:只要基类在定义成员函数时已经声明了virtue关键字,在派生类实现的时候覆盖该函数时,virtue关键字可加可不加,不影响多态的实现。子类的空间里有父类的所有变量(static除外)。5.给一个字符串、例如“ababc”要求返回“ab”.因为“ab”连续重复出现且最长。用C/C++语言写一函数完成该算法,给出复杂度从对一个字符开始,假设其为最长的串的第一个,向后查找下一个与它相同的字符,确定单循环的长度,再验证是否是连续出现的(类似于循环节),如后面不重复,则向后取一个字符,重复开始判断,当取得一个循环节并且后面重复时,记录其总长度,向后开继续判断,如找到更长的,则输出最长的,否则,把第一个结果输出。6.对序列1、1、2、3、5、8、13。。。。是Fab..数列,2、3、5、13...是Fab..质数数列,因为他们与自己前面的Fab...数列都互质,给出k,返回比k小的Fab..质数#includestdio.h#includevector#includeiostreamusingnamespacestd;voidfindFib(intk){vectorintfib1;vectorintfib2;fib1.push_back(1);fib1.push_back(1);fib1.push_back(2);fib2.push_back(2);boolfound=false;intlen=fib1.size();intf=0;while(fib1[len-1]k){f=fib1[len-2]+fib1[len-1];fib1.push_back(f);len++;}for(inti=2;ifib1.size()-1;i++){found=true;for(intj=0;jfib2.size();j++){if(fib1[i]%fib2[j]==0){found=false;break;}//endif}//endfor2if(found){fib2.push_back(fib1[i]);}}//endfor1for(i=0;ifib2.size();i++){printf(%d,fib2[i]);}printf(\n);}voidmain(){intk;printf(inputk\n);scanf(%d,&k);while(k2){findFib(k);printf(inputk\n);scanf(%d,&k);}}7.101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。硬币分成三堆,俩堆50个,和另外一个1,称俩堆50个,如果重量相等。则说明假币是那单独的一个,随便取一个真币和这个假币做比较,即可得出哪个硬币更重如果重量不相等,说明剩下那个硬币是真的,然后俩堆50个里面有一个必然是假的,同时天平不平衡。用一个真币跟这俩堆比较显然得不出结果。3另外一个思路,如果分出假币在哪一堆,又由于假币只有一个,则可以得出是假币重还是真币重,所以可以任取一堆,分成俩份25个,称一次,如果重量相等,那么假币在另外一堆,否则假币在原先的50个一堆里,然后再结合先前一次称的时候俩堆50个币的轻重大小即可得知是假币重还是真币重8.完成字符串拷贝可以使用sprintf、strcpy及memcpy函数,请问这些函数有什么区别,你喜欢使用哪个,为什么?答案:这些函数的区别在于实现功能以及操作对象不同。1.strcpy函数操作的对象是字符串,完成从源字符串到目的字符串的拷贝功能。2.sprintf函数操作的对象不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现(字符串或基本数据类型)向字符串的转换功能。如果源对象是字符串,并且指定%s格式符,也可实现字符串拷贝功能。3.memcpy函数顾名思义就是内存拷贝,实现将一个内存块的内容复制到另一个内存块这一功能。内存块由其首地址以及长度确定。程序中出现的实体对象,不论是什么类型,其最终表现就是在内存中占据一席之地(一个内存区间或块)。因此,memcpy的操作对象不局限于某一类数据类型,或者说可适用于任意数据类型,只要能给出对象的起始地址和内存长度信息、并且对象具有可操作性即可。鉴于memcpy函数等长拷贝的特点以及数据类型代表的物理意义,memcpy函数通常限于同种类型数据或对象之间的拷贝,其中当然也包括字符串拷贝以及基本数据类型的拷贝。对于字符串拷贝来说,用上述三个函数都可以实现,但是其实现的效率和使用的方便程度不同:strcpy无疑是最合适的选择:效率高且调用方便。snprintf要额外指定格式符并且进行格式转化,麻烦且效率不高。memcpy虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大的话(最优长度是源字符串长度+1),还会带来性能的下降。其实strcpy函数一般是在内部调用memcpy函数或者用汇编直接实现的,以达到高效的目的。因此,使用memcpy和strcpy拷贝字符串在性能上应该没有什么大的差别。对于非字符串类型的数据的复制来说,strcpy和snprintf一般就无能为力了,可是对memcpy却没有什么影响。但是,对于基本数据类型来说,尽管可以用memcpy进行拷贝,由于有赋值运算符可以方便且高效地进行同种或兼容类型的数据之间的拷贝,所以这种情况下memcpy几乎不被使用。memcpy的长处是用来实现(通常是内部实现居多)对结构或者数组的拷贝,其目的是或者高效,或者使用方便,甚或两者兼有。9.变量的声明和定义有什么区别?声明是向编译器介绍名字--标识符。它告诉编译器“这个函数或变量在某处可找到,它的模样象什么”。而定义是说:“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都要为它们在定义点分配存储空间。对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据,对于函数,编译器会生成代码,这些代码最终也要占用一定的内存。在C和C++中,可以在不同的地方声明相同的变量和函数,但只能有一个定义(有时这称为ODR,单一定义规则)。。。定义也可以是声明,如果有intx;,之前编译器未发现标识符x,编译器则把这一标识符看成是定义并立即为它分配存储空间。。。。。。对“变量声明”的解释向来模糊且自相矛盾。。。函数声明包括函数类型、函数名、参数列表和一个分号,这些信息足以编译器认出它是一个函数声明并可识别出这个函数的外部特征。由此推断,变量声明应是类型标识后面跟一个标识符。如inta;但这产生了一个矛盾,这段代码有足够的信息让编译器为之分配存储空间,而且编译器也确实给之分配了存储空间。要解决这个问题,对于C和C++需要一个关键字来说明“这是一个声明,它的定义在别的地方”,这个关键字就是extern,它表示变量是在文件以外定义的,或在文件后面定义的。在变量定义前加extern表示声明一个变量但不定义它,如:externinta;extern也可用于函数声明,如:externintfunc1(intlength,intwidth);但由于没有函数体,编译器必把它当成声明而非定义,extern对于函数来说是多余的、可选的。C语言的设计者并不要求函数声明使用extern,这可能有些令人遗憾,如果函数声明也要求用extern,那么形式上与变量声明更加一致了,从而减少了混乱(但这就需要更多的输入,这也许能解释为什么不要求函数声明使用extern的原因)。。。10.请写出下面代码在32位平台上的运行结果,并说明sizeof的性质:#includestdio.h#includestdlib.hintmain(void){chara[30];char*b=(char*)malloc(20*sizeof(char));printf(%d\n,sizeof(a));//304printf(%d\n,sizeof(b));//4printf(%d\n,sizeof(a[3]));//1printf(%d\n,sizeof(b+3));//4printf(%d\n,sizeof(*(b+4)));//1return0;}sizeof就是要求一种数据(类型)所占内存的字节数.对于4.1中的s和psizeof(s)应为6,而sizeof(p)应为一个指针的大小.12.请完成以下题目。注意,请勿直接调用ANSIC函数库中的函数实现。a)请编写一个C函数,该函数给出一个字节中被置1的位的个数,并请给出该题的至少一个不同解法。第一种unsignedintTestAsOne0(charlog){inti;unsignedintnum=0,val;for(i=0;i8;i++){val=logi;//移位val&=0x01;//与1相与if(val)num+

1 / 194
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功