C语言笔试面试题_第1页
C语言笔试面试题_第2页
C语言笔试面试题_第3页
C语言笔试面试题_第4页
C语言笔试面试题_第5页
已阅读5页,还剩235页未读 继续免费阅读

下载本文档

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

文档简介

表示已有答案表示没有处理表示答案不确定C++笔试题1.多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?答案:虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐藏成员一虚拟函数表指针是在运行期一也就是构造函数被调用时进行初始化的,这是实现多态的关键..main主函数执行完毕后,是否可能会再执行一段代码?(朗讯的一道笔试题)答案:可以,可以用onexit注册一个函数,它会在main之后执行;如果你需要加入一段在main退出后执行的代码,可以使用atexit()函数,注册一个函数。语法:4include<stdlib.h>intatexit(void("function")(void));ttinclude<stdlib.h>#include<stdio.h>voidfnl(void),fn2(void),fn3(void),fn4(void);intmain(void)(atexit(fnl);atexit(fr)2);atexit(fn3);atexit(fn4);printf("Thisisexecutedfirst.\n*);}voidfnl()(printf("next.\n");}voidfn2()(printf("executed");}voidfn3()(printf("is");Jvoidfn4()(printf("This");}结果:Thisisexecutedfirst.Thisisexecutednext..一个父类写了一^virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?在子类的空间里,有没有父类的这个函数,或者父类的私有变量?(华为笔试题)答案:只要基类在定义成员函数时已经声明了virtue关键'九在派生类实现的时候覆盖该函数时,virtue关罐字可加可不加,不影响多态的实现。子类的空间里有父类的所有变量(static除外).

.给一个字符串、例如“ababc”要求返回“ab”.因为“ab”连续重复出现且最长。用C/C++语言写一函数完成该算法,给出复杂度.对序列1、1、2、3、5、8、13是Fab..数列2、3、5、13...是Fab..质数数列,因为他们与自己前面的Fab...数列都互质给出k,返回第k小的Fab..质数.101个硬币100真、1假,真假区别在于重量。请用无祛码天平称两次给出真币重还是假币重的结论。.完成字符串拷贝可以使用sprintf、strcpy及memcpy函数,请问这些函数有什么区别,你喜欢使用哪个,为什么?答案:这些函数的区别在于实现功能以及操作对象不同。strcpy函数操作的对象是字符串,完成从源字符串到目的字符串的拷贝功能。snprintf函数操作的对象不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现(字符串或基本数据类型)向字符串的转换功能。如果源对象是字符串,并且指定%s格式符,也可实现字符串拷贝功能。memcpy函数顾名思义就是内存拷贝,实现将一个内存块的内容复制到另一个内存块这•功能。内存块山其首地址以及长度确定。程序中出现的实体对象,不论是什么类型,其最终表现就是在内存中占据一席之地(一个内存区间或块)。因此,memcpy的操作对象不局限于某一类数据类型,或者说可适用于任意数据类型,只要能给出对象的起始地址和内存长度信息、并且对象具有可操作性即可。鉴于memcpy函数等长拷贝的特点以及数据类型代表的物理意义,memcpy函数通常限于同种类型数据或对象之间的拷贝,其中当然也包括字符串拷贝以及基本数据类型的拷贝.对于字符串拷贝来说,用上述三个函数都可以实现,但是其实现的效率和使用的方便程度不同:strcpy无疑是最合适的选择:效率高且调用方便。snprintf要额外指定格式符并且进行格式转化,麻烦且效率不高。memcpy虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大的话(最优长度是源字符串长度+1),还会带来性能的下降。其实strcpy函数•般是在内部调用memcpy函数或者用汇编直接实现的,以达到高效的目的。因此,使用memcpy和strcpy拷贝字符串在性能上应该没有什么大的差别。对于非字符串类型的数据的复制来说,strcpy和snprintf一般就无能为力了,可是对memcpy却没有什么影响。但是,对于基本数据类型来说,尽管可以用memcpy进行拷贝,由于有赋值运算符可以方便且高效地进行同种或兼容类型的数据之间的拷贝,所以这种情况下memcpy几乎不被使用。memcpy的长处是用来实现(通常是内部实现居多)对■结构或者数组的拷贝,其H的是或者高效,或者使用方便,甚或两者兼有。.变录的声明和定义有什么区别?.请写出下面代码在32位平台上的运行结果,并说明sizeof的性质:#include<stdio.h>9include<stdlib.h>intmain(void)chara[30];printf(飞d\n”,sizeof(a));char*b=printf(飞d\n”,sizeof(a));printf("%d\n”,sizeof(b));printf("%d\n”,sizeof(a[3]));printf("%d\n”,sizeof(b+3));printf("%d\n",sizeof(*(b+4)));return0;.请完成以下题目。注意,请勿直接调用ANSIC函数库中的函数实现。a)请编写一个C函数,该函数给出一个字节中被置1的位的个数,并请给出该题的至少一个不同解法。第,种unsignedintTestAsOneO(charlog)(inti;unsigned int num=0, val;for(i=0; i<8; i++)(val=log»i;〃移位val &二 0x01;〃与1相与if(val)num++;}returnnum;)第二种unsignedintTestAsOnel(charlog)(inti;unsignedintnum=0,val;for(i=0; i<8; i++)(val= Clog) »i;〃反码?val &= 0x00; 〃与。相与if(!val)num++;}returnnum;)b)请编写一个c函数,该函数将给定的一个字符串转换成整数。intInvert(char*str)(intnum=0;while(*str!=,\0*)(intdigital=*str-48;num=num*10+digital;str=str+l;)returnnum;}c)请编写一个C函数,该函数将给定的一个整数转换成字符串。void IntToCharChange(int num,char*pval)charstrval[100];inti,j;intvalO=0;intvail=o;valO=num;for(i=0;i<100; i++)(vail=valO% 10;//取余valO=valO/ 10;〃取整strval[i]=vail+48;〃数字一字符if(val0< 10)(i++;strval[i]=valO+48;break;}}for(j=0;j<=i; j++)〃倒置(pval[j]=strval[i-j];}pval[j]=,\0';d)请编写一个C函数,该函数将一个字符串逆序。void AntitoneValue(char* father,char*child)(inti;charsource[100];intj= 0;while(father[j])〃放入source,[j]为长度{source[j] =father[j];j++;if(j>99)(return;source[j] = '\0';for(i=0;i<j;i++)(child[i] = source[j-i-l]; 〃反序}child[i] = '\0';e)请编写一个C函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。intsearch(char*cpSource,intn,charch)〃起始地址,搜索长度,目标字符for(i=0;i<n&&*(cpSource+i)!=ch;++i);returni;)f)请编写一个C函数,该函数在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的。intChildString(char*p)〃自己写(Char*q=p;intstringlen=O,i=0,j=l,len=0,maxlen=l;while(*q!=,\0") 〃不能用strlen,求得长度stringlen(Stringlen++;q++;)while(i<Stringlen)(if(*(p+i)-=*(p+j)&&j<Stringlen)(len++; 〃统计子串长度i++;j++;)else(if(len>maxlen) //统计最大子串长度(maxlen=len+l;len=0;}else{len=0;)i++;j++;returnmaxlen;)给出演示上述函数功能的一个简单程序,并请编写对应的Makefile文件.我们需要编写一个图形相关的应用程序,需要处理大量图形(Shape)信息,图形有矩形(Rectangle),正方形(Square),圆形(Circle)等种类,应用需要计算这些图形的面积,并且可能需要在某个设备上进行显示(使用在标准输出上打印信息的方式做为示意)。a)请用面向对象的方法对以上应用进行设计,编写可能需要的类b)请给出实现以上应用功能的示例性代码,从某处获取图形信息,并且进行计算和绘制c)如果你的Square继承自Rectangle,请给出理山,如果不是,请给出理由,并且请比较两种方式的优劣d)请问你所编写的类,在如下代码中会有何表现,请解释voidtestrectanglearea(Rectangle&r)r.set_width(10);r.set_height(15);assert(r.areaO==150);.假设现有一个单向的链表,但是只知道只有一个指向该节点的指针p,并且假设这个节点不是尾节点,试编程实现删除此节点参考:将卜一个节点的内容复制到本节点上,然后删除下一个节点;.写一个程序,把一个100以内的自然数分解因数。(自然数分解因数就是将一个自然数分解为几个素数的乘积,提示,由于该数不是很大,所以可以将质数保存在数组中,以加快计算速度).编写一个Identify的分配、释放的函数,为1一10000之间的自然数。.分别实现itoa和atoi..Considerthefollowingcode:#include<stdio.h>ttinclude<string.h>intmain(intargc,char*argv[]){inti=1;charbuf[4];strcpy(buf,"AAAA");printf("%d\n",i);return0;}Whencompiledandexecutedonx86,whydoesthisprogramusuallynotoutputwhattheprogrammerintended?在x86上为什么不能得到预期结果NameseveralwaysinwhichthesecurityproblemthatcausesthisprogramnottooutputwhattheprogrammerintendedcanbepreventedWITHOUTchangingthecode.参考:第一个问题:32位情况:x86下,栈方向向上生长.在main的栈中,先分配i空间(4byte),然后分配4个字节的buf(地址在i的上面,比i小).strcpy越界,用0把buf开始的第4(0开始)个字节覆盖掉了.而x86是LSB排列顺序,所以真好覆盖了i的内个数字1.所以显示出数字0.16位情况同样分析即可.第2问?.intw=l,x=2,y=3,z=4;m=(w<x)?w:x;m=(m<y)?m:y;m=(m<2)?m:z;printfm); 说出结果答案:1.说出结果 ???#include<stdio.h>main()FILE*fp;inti,a[4]={l,2,3,4},b;fp=fopen("data.dat","wb");〃这里帮忙解释一下for(i=0;i<4;i++)fwrite(&a[i],sizeof(int),1,fp);〃这里也帮忙看一下fclose(fp);fp二fopen("data.dat","rb");fseek(fp,-2L*sizeof(int),SEEK_END);〃还有这里fread(&b,sizeof(int),1,fp);〃这里还有也看一下fclose(fp);printf("b=%d\n”,b);}.有双向循环链表结点:(华为面试题)typedefstructnode{intdate;structnode*front,*next;}_Node;有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两上链表中date值相同的结点删除参考算法:.取出A的一个元素d.收集B中有相同元素d的结点到垃圾箱,并从B里删除.收集A中有相同元素d的结点到垃圾箱,并从A里删除.删除垃圾箱中的所有元素.A链的指针指向下一个.重复广5,直到A链循环到头了注意的是第3步,在2步执行后垃圾箱不为空时才执行。上述算法还可以做一点点优化:1.加入两个变量cA, cB,分别记录当前A中和B中的元素个数每次从较长者中取出一个元素来,先从较小者中找起若没有,则不必在较长者中浪费时间了#include<iostream.h> ?structNODE{intdate;NODE*front,*next;);voidredel(NODE*&ahead,NODE*&bhead)(intboy=0;NODE*pa=ahead,*pb=bhead,*paa,*paaa,*paaaa,*pbb;while(pa->next!=ahead)(intboys=pa->date; 〃取pa中一个值paaaa=pa;paa=pa;pb=bhead;while(pb->next!=bhead)if(boys==pb->date) 〃如果pa,pb中有值相同cout<<endl;cout«*deleteB:*«paa->date«*if(pb==bhead)(boy=l;pb->front->next=pb->next;pb->next->front=pb->front;bhead=bhead->next;pbb=pb;pb=pb->next;deletepbb;)else(boy=l;pb->front->next=pb->next;pb->next->front=pb->front;pbb=pb;pb=pb->next;deletepbb;}}elsepb=pb->next;)while(paa->next!=ahead&&boy==l)(if(paa->date==boys)(cout<<*deleteA:*<<paa->date«>rif(paa==pa)(pa=pa->next;ahead=pa;paa->front->next=paa->next;paa->next->front=paa->front;paaa=paa;paa=paa->next;deletepaaa;)else(paa->front->next=paa->next;paa->next->front=paa->front;paaa=paa;paa=paa->next;deletepaaa;}elsepaa=paa->next;boy=0;if(paaaa==pa)pa=pa->next;}cout<<endl;}intmain()(NODE*A,*pHeadA,*B,*pHeadB;A=newNODE;B=newNODE;pHeadA=A;pHeadB=B;for(inti=l;i<21;++i) 〃生成链表A,并赋初值!(A->date=i;A->next=newNODE;A->next->front=A;A=A->next;)A=A->front;deleteA->next;A->next=pHeadA;pHeadA->front=A;for(inti=l;i<33;i+=2) 〃生成链表B,并赋初值!(B->date=i;B->next=newNODE;B->next->front=B;B=B->next;}B=B->front;deleteB->next;B->next=pHeadB;pHeadB->front=B;redel(pHeadA,pHeadB); 〃调用函数删除相同结点!)22.char*GetStr()(char*tmp;tmp="123"returntmp;printf("%s”,GetStr());)会输出123吗?123创建在堆上还是栈上呢?123的空间是什么时候释放的?参考:"123”是常量字符串,存储在全局变量区,和静态变量一起。即不在堆,也不在栈在程序结束时自动释放23.1)字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大?为什么?答案:指针变量也占用内存单元,而且所有指针变量占用内存单元的数量都是相同的。就是说,不管是指向何种对象的指针变量,它们占用内存的字节数都是•样的,并且要足够把程序中所能用到的最大地址表示出来(通常是一个机器字长)。2)类ClassB从ClassA派生,那么ClassA*a=newClassB(…);试问该表达是否合法?为什么?答案:派生类的指针指向基类的对象是错误的,不能通过编译的;基类的指针可以指向派生类的对象,调用派生类的函数鸡是动物,没错。(动物的指针指向鸡的实例)鸡可以执行所有动物都具有的方法,例如“死亡”反过来,动物一定是鸡吗?(鸡的指针指向动物或者动物的某个派生类的实例)动物都能执行鸡的某个方法吗?比如说“下蛋”?3)如果ClassA中定义并实现虚函数intfunc(void),ClassB中也实现该函数,那么上述变量a->func()将调用哪个类里面的函数?如果intfunc(void)不是虚函数,情况又如何?为什么?答案:第一问调用的是B的。第二问调用A的。虚函数的一个典型应用,虚函数只能借助于指针或者引用来达到多态的效果如果没有定义成虚函数: classA{public:voidprint(){cout<<wThisisAM«endl;});classB:publicA{public:voidprint(){cout<<wThisisB**«endl;});intmain(){ //为了在以后便于区分,我这段main。代码叫做mainlAa;Bb;A*pl=&a;A*p2=&b:pl->print();p2->print();)结果是两个ThisisA如果定义成虚函数: classA{public:virtualvoidprint(){cout«wThisisAw«endl:}〃现在成了虚函数了);classB:publicA(public:voidprint(){cout«wThisisBM«endl;}〃这里不需要在前面加上关犍字virtual,只需在把基类的成员函数设为virtual,其派生类的相应的函数也会自动变为虚函数);再运行main输出的结果就是ThisisA和ThisisB测试:char**p,a[16][8];问:p=a是否会导致程序在以后出现问题?为什么?参考:这个不会导致出现问题,但是要注意P的使用,如a[l][2]等价的为*(*(p+l)+2)而不是*(p+ll),会的,这样会出现编译错误正确的是:chara[5][5];char(*p)[5];p=a;如下所述的ifelse和switch语句哪个的效率高?为什么?5)在同•个进程中,•个模块是否可以通过指针操作破坏其它模块的内存,为什么?(华为)6)应用程序在运行时的内存包括代码区和数据区,其中数据区又包括哪些部分?参考:对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”o栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。.Assignment2:PictureProcessingUseC++,Java,orsimilarlanguagesor/andanymiddlewaresuchasEJBandJ2EEtoprocessapicturewithahighresolution(3MegaPixelsforexample).Usesomemethodologiestodegradetheresolutionofthepicturetomakeitquickerforbrowsing.Thendividethedegradedpictureinto9sectorsequally.Clickanyofthe9sectorswillresultadetailedpictureforthissectorwiththesameresolutionasthatoftheoriginalpicture.Thisassignmentisdesignedforyoutodemonstrateyourabilitytohandlepictures..用|&实现一个WORD(2个字节)的高低位交换!!intmain()(unsigned short a = OxABCD;TOC\o"1-5"\h\zunsigned short b ;unsigned short c ,d;b=(a«8)&0xff00;c=(a»8)&0x00ff;d=b c;printf('\n%x”,b);printf("\n%x”,c);printf('\n%x”,d);return0;}结果是CDAB2俩个字节是16位前八位为高位后八位为低位然后结合.要开辟Pl,P2,P3,P4内存来做缓冲,大小自定,但这四个缓冲的大小要一样,并且是连续的.有一浮点型数组A,用C语言写一函数实现对浮点数组A进行降序排序,并输出结果,要求要以数组A作为函数的入口.(建议用冒泡排序法)voidBubbleSort(doublearr[],intn){inti,j;intexchange= 1;〃交换标志for(i=l;i<n;i++){〃最多做n-l趟排序exchanged; 〃本趟排序开始前,交换标志应为假for(j=n-l;j>=i;j—) 〃对当前无序区R[i..n]自下向上扫描if(arr[j+l]>air[j]){〃交换记录arr[0]=arr[j+1]; //R[0]不是哨兵,仅做暂存单元arr[j+l]=arr[j];arr[j]=arr[0];exchange=l;〃发生了交换,故将交换标志置为真}if(!exchange)〃本趟排序未发生交换,提前终止算法return;) 〃endfor(外循环).找错:#include<string.h>#include<stdio.h>classBase{private:char*name;public:Base(char*className)(name=newchar[strlen(className)];strcpy(name,className);}~Base(){deletename;}char*copyName(){charnewname[256];strcpy(newname,name);returnnewname;}char*getName(){returnname;}staticvoidprint(Basebase){printf("name:%s\n〃,base,name);));classSubclass:publicBase{public:Subclass(char*className):Base(className)intmain()Base*pBase=newSubclass("test");Base::print(*pBase);printf(,zname:%s\n”,pBase->getName());printf(zznewname:%s\n〃,pBase->copyName());return0;.编写一个函数,函数接收一个字符串,是由十六进制数组成的一组字符串,函数的功能是把接到的这组字符串转换成十进制数字.并将十进制数字返回.答案:BOOLHexToDec(LPCTSTRshex,int&idee)(inti,mid;intlen=lstrlen(shex);if(len>8)returnFALSE;TOC\o"1-5"\h\zmid= 0;idee= 0;for( i=0;i<len;i++ ){if( shex[i]>='O'&&shex[i]<='9' )mid = shex[i]-'O';else if( shex[i]>=,a*&&shex[i]<=,f? )mid = shex[i]-'a' +10;else if( shex[i]>=,A*&&shex[i]<=*F* )mid = shex[i]-'A' +10;elsereturnFALSE;mid«= ((len-i-1)«2); //移位表示变为2的n次方倍idee=idc+mid;)returnTRUE;).编写一个函数将一条字符串分成两部分,将前半部分按ASCH码升序排序,后半部分不变,(如果字符串是奇数则中间的字符不变,)最后再将前后两部分交换,然后将该字符串输出,测试字符串“ADZDDJKJFIEJHGI”.找错Voidtestl(){charstring[10];char*strl="0123456789”;strepy(string,strl);)Voidtest2(){charstring[10],strl[10];for(1=0;K10;I++){strl[i]='a';}strepy(string,strl):Voidtest3(char*strl){charstring[10];if(strlen(strl)<=10){strcpy(string,strl);).找错#defineMAX_SRM256DSNget_SRM_no(){staticintSRMno;intI;for(1=0;I{SRM_no%=MAX_SRM;if(MY_SRM.state==IDLE){break;})if(I>=MAX_SRM)return(NULL_SRM);elsereturnSRM_no;. 写出程序运行结果intsum(inta){autointc=0;staticintb=3;c+=l;b+=2;return(a+b+C);}voidmain(){intI;inta=2;for(I=0;I<5;I++){printf(*%d, sum(a));}}.intfunc(inta){intb;switch(a){case1:30;20;16;default:0}returnb;则func⑴=?:inta[3];a[0]=0;a[l]=l;a[2]=2;int*p,*q;P=a;q=&a⑵;则a[q-p]=?.定义int**a[3][4],则变量占有的内存空间为:.编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。.写一个函数,判断一个int型的整数是否是2的事,即是否可以表示成2cx的形式(不可以用循环) 我只知道是用递推,大概写了一下,如下:intIsTwoPow(ints){if(s==l)returnFALSE;s=s»l;if(s>l)IsTwoPow(s);return(s=l)?TRUE:FALSE;〃大概是这个意思,但是这一句似乎不该这么返回!A,B从一堆玻璃球(共100个)里向外拿球,规则如下:(1)A先拿,然后一人一次交替着拿;(2)每次只能拿1个或2个或4个;(3)谁拿最后一个球,谁就是最后的失败者;问A,B谁将是失败者?写出你的判断步骤。.已知:无序数组,折半查找,各元素值唯一。函数原型是:Binary_Seach(intarray[],intiValue,intiCount)array是数组,在里面用折半查找的方法找等于iValue的值,找到返回1否则0,iCount是元素个数.统计一个字符串中字符出现的次数.100位以上的超大整数的加法(主要考虑数据结构和加法的实现).对如下电文:"CASTCASTSATATATASA”给出Huffman编码。.int(*(*f)(int,int))(int)表示什么含义?.x=x+l,x+=l,x++,为这三个语句的效率排序。并说明为什么。.中缀表达式A-(B+C/D)*E的后缀形式是什么?.structS1{charc;inti;);sizeof(SI)=?classX{public:X();virtual〜X();voidmyMemberFunc();staticvoidmyStaticFunc();virtualvoidmyVirtualFunc0;private:inti;char*pstr;chara;}sizeof(X)=?.找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey”的最大子串为"actyet*.有一百个整数,其中有负数,找出连续三个数之和最大的部分..写一程序实现快速排序,假设数据输入为一文件快速算法描述如下AlgorithmPartitionInput:sequenceaO,...,an-lwithnelementsOutput:permutationofthesequencesuchthatallelementsaO,...,ajarelessthanorequaltoallelementsai,...,an-l(i>j)Method:choosetheelementinthemiddleofthesequenceascomparisonelementxleti=0andj=nTwhileijsearchthefirstelementaiwhichisgreaterthanorequaltoxsearchthelastelementajwhichislessthanorequaltoxifijexchangeaiandajleti=i+1andj=j-1Afterpartitioningthesequence,Quicksorttreatsthetwopartsrecursivelybythesameprocedure.Therecursionendswheneverapartconsistsofoneelementonly..写一算法检测单向链表中是否存在环(whetherthereisaloopinalinklist),要求算法复杂度(Algorithm'scomplexity是。(n))并只使用常数空间(spaceis0(c)).注意,你只知道一个指向单向链表头的指针。链表的长度是不定的,而且环出现的地方也是不定的,环有可能在头,有可能在中间。而且要求是检测,不能破坏环的结构.(M0T0)答:用两个指针来遍历这个单向链表,第一个指针P1,每次走一步;第二个指针P2,每次走两步;当P2指针追hpl的时候,就表明链表当中有环路了。inttestLinkRing(Link*head)(Link*tl=head,*t2=head;while(tl->next&&t2->next)tl=tl->;next;if(NULL—(t2=t2->next->next))return0;〃无环if(tl==t2)return1;}return0;}如果要定位环路在链表当中的开始点发现P2和pl重合,确定了单向链表有环路了。接下来,让p2回到链表的头部,重新走,P1也继续走,每次步长都走1,那么当pl和p2再次相遇的时候,就是环路的入口了。.设下列函数已经通过了调试boolSortArray(ArrayType*Pinputarray,ArrayType*Poutarray);该函数在内存中排序,能把字节数最大为100M字节的ArrayType类型的数组排序。其中ArrayType是一个预定义的数组类型(细节无关紧要),Pinputarray,Poutarray分别为排序前的指针和排序后的指针。请用c语言的伪码风格设计•个算法,他调用上面给出的函数完成下列从输入到输出的任务输入:排序前的大文件,名称为char*pinoutfilename,其内容为用分号分隔的ArrayType类型的数组元素,可装满4个100M字节的数组。输出:排序后的大文件char*poutoutfilenameo.用最有效率的方法算出2乘以8等於几?移位.选择题.错误的转义字符是(a)A.'\091'B.'\\'C.''0'D.'\''Strings—、”";//s=*charc=';〃c=''是转移字符.若数组名作实参而指针变量作形参,函数调用实参传给形参的是(d)A.数组的长度B.数组第一个元素的值C.数组所有元素的值D.数组第一个元素的地址.变量的指针含意是指变量的(b)A.值B.地址C.存储D.名字5.某文件中定义的静态全局变量(或称静态外部变量)其作用域是(d)??A.只限某个函数B.本文件C.跨文件D.不限制作用域静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。山于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。.解二次方程:a*x*x+b*x+cintQuadratic(doublea,doubleb,doublec,double&xl,doubleftx2);返回值:解的个数.最大公约数DWORDDivisor(DWORDdwFirst,DWORDdwSecond):返回值:最大公约数.根据蒙特卡洛算法计算圆周率doublePI(DOWRDdwCount/*测试次数*/);返回值:PI.无符号整数乘法,乘数为32bit,结果为64bit提示:32bit整数分解为16bit相乘voidMultiply(DWORDdwFirst,DWORDdwSecond,DWORD&dwHigh,DWORD&dwLower);.链表排序(从小到大)节点定义为:structNode{intnValue;structNode*pNext;);最后一个节点的pNext=NULL.Node*SortChain(Node*pHead);返回值:链表头冒泡排序,插入排序等。为避免繁琐可以不交换指针,只交换值;也可以将值存入数组,对数组排序,再存入链表中。改错并说明原因file:1.cinta[10]={0};file:2.cintmain(){externint*a;printf("%d\n",a[0]);return0;)ftinclude"filename,h"和#include〈filename.h>的区别?对于#include<filename.h〉编译器从标准库开始搜索filename,h;对于#include**filename,h”编译器从用户工作路径开始搜索filename.h2头文件的作用是什么?一、通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。二、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。3C++函数中值的传递方式有哪几种?C++函数的三种传递方式为:值传递、指针传递和引用传递。4内存的分配方式的分配方式有几种?答:一、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。三、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。5实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;〃删除操作StatusListDelete_DuL(DuLinkList&L,inti,ElemType&e){if(!(p=GetElemP_DuL(L,i)))〃此处得到i位置的节点指针,如果有需要也得写出具体函数实现returnERROR;e=p->data;p->prior->next=p->next;p->next->prior=p->pror;free(p);returnOK;}〃插入操作StatusListinsertDuL(DuLinkList&L,inti,ElemType&e){if(!(p=GetElemP_DuL(L,i)))returnERROR;if(!(s=(DuLinkList)malloc(sizeof(DuLNode))))//生成新节点returnERROR;s->data=e;s->prior=p;p->next->prior=s;p->next=s;s->next=p->next->next;returnOK;6写一个函数,将其中的\t都转换成4个空格。7Windows程序的入口是哪里?写出Windows消息机制的流程.8如何定义和实现一个类的成员函数为回调函数?C++里面是不是所有的动作都是main。引起的?如果不是,请举例.比如全局变量的初始化,就不是由main函数引起的举例:classA{};Aa;//a的构造函数限执行intmain(){}C++里面如何声明constvoidf(void)函数为C程序中的库函数(华为)11下列哪两个是等同的intb;Aconstint*a=&b;Bconst*inta=&b;Cconstint*consta=&b;Dintconst*consta=&b;12内联函数在编译时是否做参数类型检查内联函数要做参数类型检查, 这是内联函数跟宏相比的优势13三个float:a,b,c问值(a+b)+c=二(b+a)+c (a+b)+c==(a+c)+b两者都不行。在比较float或double时,不能简单地比较。由于计算误差,相等的概率很低。应判断两数之差是否落在区间(-e,e)内。这个e应比浮点数的精度大一个数量级。14把•个链表反向填空(lucent)voidreverse(test*head){test*pe=head;test*ps=head->next;while(ps)(pe->next=ps->next;ps->next=head;head=ps;ps=pe->next;))从第一个元素开始,ps指向他,将他(ps)指向头节点(ps-〉next=head),将ps设为头节点(head=ps;)操作下一个元素(ps=pe->next;)等于是依次将每个元素翻到原头节点前面。15设计一个重采样系统,说明如何anti-alias16某个程序在一个嵌入式系统(200M的CPU,50M的SDRAM)中已经最化了,换到另一个系统(300M的CPU,50M的SDRAM)中运行,还需要优化吗?17.下面哪种排序法对12354最快aquicksortb.bublesortc.mergesort18.哪种结构,平均来讲,获取一个值最快binarytreehashtablestack19请问C++的类和C里面的struct有什么区别?class中默认的成员访问权限是private的,而struct中则是public的20请讲一讲析构函数和虚函数的用法和作用?析构函数是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。有适放内存空间的做用。虚函数是C++多态的一种表现,使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。21全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?生命周期不同:全局变量随主:程序创建和创建,随生程序销毁而销毁

局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在;内存中分配在全局数据区使用方式不同:通过声明后全局变量程序的各个部分都可以用到局部变量只能在局部使用;分配在栈区操作系统和编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面。一些寄存器的题目,主要是寻址和内存管理等一些知识。8086是多少位的系统?在数据总线上是怎么实现的?多态。overload和override的区别。overload是重载,重载是一种参数多态机制,即代码通过参数的类型或个数不同而实现的多态机制。是•种静态的绑定机制(在编译时已经知道具体执行的是哪个代码段)。override是覆盖。覆盖是一种动态绑定的多态机制。即在父类和子类中同名元素(如成员函数)有不同的实现代码。执行的是哪个代码是根据运行时实际情况而定的。重载Overload特点publicboolwithdraw(doubleamt,stringname)publicdoublewithdraw(doubleamt)1、方法名必须相同2、参数列表必须不相同3、返回值类型可以不相同注意:override存在于继继承的关系类中。覆写Override特点(三相同):publicoverrideboolwithdraw(...)1、方法名相同2、参数列表相同3、返回值类型相同注意:存在于同一类中,但是只有虚方法和抽象方法才能被覆写.«Sony笔试题>>25.完成下列程序**.*.Sinclude<stdio.h>#defineN8intmain(){inti;intj;intk;

return0;26完成程序,实现对数组的降序排序ttinclude<stdio.h>TOC\o"1-5"\h\zvoidsort( );intmain()(intarray[]={45,56,76,234,1,34,23,2,3);〃数字任〃意给出sort( );return0;}voidsort( )27费波那其数列,L1,2,3,5……编写程序求第十项。可以用递归,也可以用其他方法,但要说明你选择的理由。#include<stdio.h>intPheponatch(int);intmain(){printf(*The10this%d/z,Pheponatch(lO));return0;}intPheponatch(intN)28下列程序运行时会崩溃,请找出错误并改正,并且说明原因。#include<stdio.h>#include<malloc.h>typedefstruct{TNode*left;TNode*right;intvalue;}TNode;TNode*root=NULL;voidappend(intN);intmain(){append(63);append(45);append(32);append(77);append(96);append(21);append(17);//Again,数字任意给出)voidappend(intN){TNode*NewNode=(TNode*)malloc(sizeof(TNode));NewNode->value=N;if(root==NULL)(root=NewNode;return;)else(TNode*temp;temp=root;while((N>=temp.value&&temp,left!=NULL)||(N<temp.value&&temp,right!=NULL)){while(N>=temp.value&&temp.left!=NULL)temp=temp,left;while(N<temp.value&&temp,right!=NULL)temp二temp,right;)if(N>=temp.value)temp.left=NewNode;elsetemp.right=NewNode;return;})AclassBnetworkontheinternethasasubnetmaskof,whatisthemaximumnumberofhostspersubnet.-B类地址的子网掩码是,问每个子网内的最大主机数子网掩码与iP相与得到子网号,化成二进制11111111.11111111.11110000.00000000,即有12个"0〃,2^12-2=4096-2=4094a.240b.255c.4094d.6553Whatisthedifference:betweeno(logn)ando(logn*2),wherebothlogarithems(对数)havebase2.a.o(logn*2)isbiggerb.o(logn)isbiggerc.nodifferenceForaclasswhatwouldhappenifwecallaclass,sconstructorfromwiththesameclass'pilationerrorb.linkingerrorc.stackoverflowd.noneoftheabove"new“inc++isa:A.libraryfunctionlikemallocincB.keywordC.operatorD.noneoftheabovemalloc是库函数,不在编译器控制范围之内:new是运算符,在编译器控制范围之内。调用malloc时,从堆中申请内存;调用new时,从堆中申请内存并为内存调用构造函数。

Whichofthefollowinginformationisnotcontainedinaninodea.fileownerb.filesizec.filenamed.diskaddresstomergetwosortedlid.2n-2What'sthenumberofcomparisonsintheworstcasestscontainingntomergetwosortedlid.2n-2a.2n b.2n-l c.2n+lTimecomplexityofnalgorithmT(n),wherenistheinputsize,isT(n)=T(n-l)+l/nifn>lotherwise1theorderofthisalgorithmis.a.log(n)b.n c.n2 d.n*nThenumberofPsinthebinaryrepresentationof3*4096+15*256+5*16+3a8910 d.128910 d.12设计函数intatoi(char*s)ointi=(j=4,k=8,1=16,m=32);printf(“%d”,i);输出是多少?解释局部变量、全局变量和静态变量的含义。解释堆和栈的区别。在传统的C中堆和栈实际是块物理内存,堆主要用来动态分配内存,从堆栈内存的低端向上分配;而栈主要用来传递函数参数、返回值和局部参数内存分配,是从堆栈内存的高端向下分配,俗称压栈和出栈;堆是动态分配,比如用new,malloc分配,需要手工释放,不然会导致memoryleak,栈是静态分配,比如函数调用是需要分配堆栈,但堆栈能自动释放.论述含参数的宏与函数的优缺点。宏是编译期的,函数是运行期的;宏不是实体,而函数是一个可寻址的实体;宏只是编译期替换,在程序里每遇到S(a,b),就用a*b代替,a和b两个实体并没有山宏实际产生,而函数S会在栈中定义两个对象a和b。宏没有生存期、作用域之类的概念,而函数就有。42.以下三条输出语句分别输出什么?[C易]charstrl[]〃 i 〃=abc;charstr2[]=abc;constcharstr3[]=abc;constcharstr4[]-abc;constchar*str5=abc;constchar*str6=abc;cout«boolalpha«(strl==str2)«endl;//输出什么?cout«boolalpha«(str3==str4)«endl;//输出什么?cout<<boolalpha<<(str5==str6)«endl;//输出什么?答:分别输出false,false,true。strl和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。43.非C++内建型别A和B,在哪几种情况下B能隐式转化为A?[C++中等]答:classB : publicA { } //B公有继承自A,可以是间接继承的classB { operator A( ); } //B实现了隐式转化为A的转化classA { A(const B& ); } //A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数A&operator=(constA&);//赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个44.以下代码中的两个sizeof用法有问题吗?[C易]voidUppercase(charstr[])//将str中的小写字母转换成大写字母(for(sizeti=0;i<sizeof(str)/sizeof(str[0]);++i)if(fa<=str[i]&&str[i]<=,z*)str[i]-=('a'」A');)charstr[]="aBcDe”;cout«"str字符长度为:"<<sizeof(str)/sizeof(str[0])<<endl;Uppercase(str);cout«str<<endl;答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。.以下代码有什么问题?[C难]voidchar2Hex(charc)//将字符以16进制表示(charch=c/0xl0+'O';if(ch〉'9')ch+=('A',9'T);charcl=c%0xl0+'O';if(cl>'9')cl+=('A'-'9'T);cout«ch«cl«*';}charstr[]=Tlove中国”;for(size_ti=0;i<strlen(str);++i)char2Hex(str[i]);cout«endl;.以下代码有什么问题?[C++易]structTest{Test(int){}TestO{)voidfun(){});voidmain(void)(Testa(l);fun();Testb();fun();)答:变量b定义出错。按默认构造函数定义对象,不需要加括号。.以下代码有什么问题?[C++易]cout«(true?l:*l*)«endl;答:三元表达式“?:”问号后面的两个操作数必须为同一类型。8.以下代码能够编译通过吗,为什么?[C++易]unsignedintconstsizel=2;charstrl[sizel];unsignedinttemp=0;cin»temp;unsignedintconstsize2=temp;charstr2[size2];答:定义出倡,si/7II编if器期间常;七而数组定义要求长度必须为编译期常.以下代码中的输出语句输出0吗,为什么?[C++易]structCLS{intm_i;CLS(inti):m_i(i){}CLS()(CLS(O);});CLSobj;cout«obj.mi«endl;答:不能。在欧认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。.C++中的空类,默认产生哪些类成员函数?[C++易]答:classEmpty(public:Empty(); 〃缺省构造函数Empty(constEmpty&); //拷贝构造函数"Empty(); 〃析构函数Emptyfeoperator=(constEmptyfe);//赋值运算符Empty*operator&(); //取址运算符constEmpty*operator&()const; //取址运算符const};.以下两条输出语句分别输出什么?[C++难]floata=1.Of;cout«(int)a<<endl;cout«(int&)a<<endl;cout«boolalpha«((int)a==(int&)a)«endl;//输出什么?floatb=0.Of;cout«(int)b<<endl;cout«(int&)b<<endl;cout«boolalpha«((int)b==(int&)b)«endl;//输出什么.以下反向遍历array数组的方法有什么错误?[STL易]vectorarray;array.push_back(1);array,pushback(2);array.push_back(3);for(vector::size_typei=array.size()-1;i>=0;-i)//反向遍历array数组(cout«array[i]«endl;答:首先数组定义有误,应加上类型参数:vector《int》array。其次vector::size_type被定义为unsignedint,即无符号数,这样做为循环变量的i为0时再减1就会变成最大的整数,导致循环失去控制。.以下代码有什么问题?[STL易]typedefvectorIntArray;IntArrayarray;array.push_back(1);array.push_back(2);array.push_back(2);array,pushback(3);〃删除array数组中所有的2for(IntArray::iteratoritor=array,begin。;itor!=array.end();++itor)(if(2==*itor)array,erase(itor);)答:同样有缺少类型参数的问题。另外,每次调用"array,erase(itor);",被删除元素之后的内容会自动往前移,导致迭代漏项,应在删除一项后使itor一,使之从已经前移的下一个元素起继续遍历。.写一个函数,完成内存之间的拷贝。[考虑问题是否全面]答:void*mymemcpy(void*dest,constvoid*src,size_tcount)(char*pdest=static_cast<char*>(dest);constchar*psrc=static_cast<constchar*>(src);if(pdest>psrc&&pdest<psrc+cout)能考虑到这种情况就行了(for(size_ti=count-1;i!=-l;-i)

pdest[i]=psrc[i];}else(for(size_ti=0;i<count;++i)pdest[i]=psrc[i];}returndest;)intmain(void)(charstr[]="0123456789”;mymemcpy(str+1,str+0,9);cout«str<<endl;system("Pause");return0;54线程与进程的区别55:请你分别划划OSI的七层网络结构图,和TCP/IP的五层结构图?56:请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用?TCP与UDP呢?57:请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?58:请问C++的类和C里面的struct有什么区别?59:请讲一讲析构函数和虚函数的用法和作用?60:全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?61:一些寄存器的题目,主要是寻址和内存管理等一些知识。62:8086是多少位的系统?在数据总线上是怎么实现的?73对于C++中类(class)与结构(struct)的描述正确的为:A,类中的成员默认是private的,当是可以声明为public,private和protected,结构中定义的成员默认的都是public;B,结构中不允许定义成员函数,当是类中可以定义成员函数;C,结构实例使用mallocO动态创建,类对象使用new操作符动态分配内存;D,结构和类对象都必须使用new创建;E,结构中不可以定义虚函数,当是类中可以定义虚函数.F,结构不可以存在继承关系,当是类可以存在继承关系.答:A,D.F74,两个互相独立的类:ClassA和ClassB,都各自定义了非景泰的公有成员函数PublicFunc()和非静态的私有成员函数PrivateFuncO;现在要在ClassA中增加定义一个成员函数ClassA::AdditionalPunction(ClassAa,ClassBb);则可以在AdditionalPunction(ClassAx,ClassBy)的实现部分(函数功能体内部)出现的合法的表达是最全的是:x.PrivateFunc();x.PublicFunc();y.PrivateFuncO;y.PublicFunc();x.PrivateFunc();x.PublicFunc();y.PublicFunc();x.PrivateFunc();y.PrivateFunc();y.PublicFunc();x.PublicFunc();y.PublicFunc();答:BC++程序下列说法正确的有:A,对调用的虚函数和模板类都进行迟后编译.B,基类与子类中函数如果要构成虚函数,除了要求在基类中用virtual声名,而且必须名字相同且参数类型相同返回类型相同C,重载的类成员函数都必须要:或者返回类型不同,或者参数数目不同,或者参数序列的类型不同.D,静态成员函数和内联函数不能是虚函数,友员函数和构造函数也不能是虚函数,但是析构函数可以是虚函数.答:AC++中的类与结构的区别?77,构造函数和析构函数是否可以被重载,为什么?78,一个类的构造函数和析构函数什么时候被调用,是否需要手工调用?几道题目及自做答案热忱期待高手的答案,我不怕丑!一天做几个,把答案贴出来,请高手指正!1#include"filename.hw和#include〈filename.h>的区别?答:ttinclude“filename,h”表明该文件是用户提供的头文件,查找该文件时从当前文件目录开始;#include〈filename』》表明这

温馨提示

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

评论

0/150

提交评论