cc++面试题集锦.docx
《cc++面试题集锦.docx》由会员分享,可在线阅读,更多相关《cc++面试题集锦.docx(13页珍藏版)》请在冰点文库上搜索。
cc++面试题集锦
c/c++面试题集锦
1.多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?
2.将一个1M-10M的文件,逆序存储到另一个文件,就是前一个文件的最后一个
字符存到新文件的第一个字符,以此类推。
3.main主函数执行完毕后,是否可能会再执行一段代码?
4.一个父类写了一个virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?
在子类的空间里,有没有父类的这个函数,或者父类的私有变量?
5.给一个字符串、例如“ababc”要求返回“ab”.因为“ab”连续重复出现且最长。
用C/C++语言写一函数完成该算法,给出复杂度
6.对序列1、1、2、3、5、8、13。
。
。
。
是Fab..数列
2、3、5、13...是Fab..质数数列,因为他们与自己前面的Fab...数列都互质
给出k,返回第k小的Fab..质数
7.101个硬币100真、1假,真假区别在于重量。
请用无砝码天平称两次给出真币重还是假币重的结论。
8.完成字符串拷贝可以使用sprintf、strcpy及memcpy函数,请问这些函数有什么区别,你喜欢使用哪个,为什么?
9.变量的声明和定义有什么区别?
10.请写出下面代码在32位平台上的运行结果,并说明sizeof的性质:
#include
#include
intmain(void)
{
chara[30];
char*b=(char*)malloc(20*sizeof(char));
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;
}
12.请完成以下题目。
注意,请勿直接调用ANSIC函数库中的函数实现。
a)请编写一个C函数,该函数给出一个字节中被置1的位的个数,并请
给出该题的至少一个不同解法。
b)请编写一个C函数,该函数将给定的一个字符串转换成整数。
c)请编写一个C函数,该函数将给定的一个整数转换成字符串。
d)请编写一个C函数,该函数将一个字符串逆序。
e)请编写一个C函数,该函数在给定的内存区域搜索给定的字符,并返回
该字符所在位置索引值。
f)请编写一个C函数,该函数在一个字符串中找到可能的最长的子字符串,
该字符串是由同一字符组成的。
给出演示上述函数功能的一个简单程序,并请编写对应的Makefile文件
13.我们需要编写一个图形相关的应用程序,需要处理大量图形(Shape)信息,
图形有矩形(Rectangle),正方形(Square),圆形(Circle)等种类,应用
需要计算这些图形的面积,并且可能需要在某个设备上进行显示(使用在标准
输出上打印信息的方式做为示意)。
a)请用面向对象的方法对以上应用进行设计,编写可能需要的类
b)请给出实现以上应用功能的示例性代码,从某处获取图形信息,
并且进行计算和绘制
c)如果你的Square继承自Rectangle,请给出理由,如果不是,
请给出理由,并且请比较两种方式的优劣
d)请问你所编写的类,在如下代码中会有何表现,请解释
voidtest_rectangle_area(Rectangle&r)
{
r.set_width(10);
r.set_height(15);
assert(r.area()==150);
}
14.假设现有一个单向的链表,但是只知道只有一个指向该节点的指针p,并且假设这个节点不是尾节点,试编程实现删除此节点
15.写一个程序,把一个100以内的自然数分解因数。
(自然数分解因数就是将一个自然数分解为几个素数的乘积,提示,由于该数不是很大,所以可以将质数保存在数组中,以加快计算速度)
16.编写一个Identify的分配、释放的函数,为1-10000之间的自然数。
17.分别实现itoa和atoi.
18.Considerthefollowingcode:
#include
#include
intmain(intargc,char*argv[]){
inti=1;
charbuf[4];
strcpy(buf,"AAAA");
printf("%d\n",i);
return0;
}
a)Whencompiledandexecutedonx86,whydoesthisprogramusuallynot
outputwhattheprogrammerintended?
b)Nameseveralwaysinwhichthesecurityproblemthatcausesthis
programnottooutputwhattheprogrammerintendedcanbeprevented
WITHOUTchangingthecode.
19.intw=1,x=2,y=3,z=4;
m=(ww:
x;
m=(mm:
y;
m=(m<2)?
m:
z;
printf("m=%d",m); 说出结果
20.说出结果
#include
main()
{
FILE*fp;
inti,a[4]={1,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);
}
21.有双向循环链表结点:
typedefstructnode
{
intdate;
structnode*front,*next;
}_Node;
有两个双向循环链表A,B,知道其头指针为:
pHeadA,pHeadB,请写一函数将两上链表中date值相同的结点删除
22.
char*GetStr()
{
char*tmp;
tmp="123"
returntmp;
}
voidmain()
{
printf("%s",GetStr());
}
会输出123吗?
123创建在堆上还是栈上呢?
123的空间是什么时候释放的?
23.
字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大?
为什么?
类ClassB从ClassA派生,那么ClassA*a=newClassB(…);试问该表达是否合法?
为什么?
如果ClassA中定义并实现虚函数intfunc(void),ClassB中也实现该函数,那么上述变量a->func()将调用哪个类里面的函数?
如果intfunc(void)不是虚函数,情况又如何?
为什么?
char**p,a[16][8]; 问:
p=a是否会导致程序在以后出现问题?
为什么?
如下所述的ifelse和switch语句哪个的效率高?
为什么?
在同一个进程中,一个模块是否可以通过指针操作破坏其它模块的内存,为什么?
应用程序在运行时的内存包括代码区和数据区,其中数据区又包括哪些部分?
24.Assignment2:
PictureProcessing
UseC++,Java,orsimilarlanguagesor/andanymiddlewaresuchasEJBandJ2EEtoprocessa picturewithahighresolution(3MegaPixelsforexample).Usesomemethodologiestodegrade theresolutionofthepicturetomakeitquickerforbrowsing.Thendividethedegraded pictureinto9sectorsequally.Clickanyofthe9sectorswillresultadetailedpicturefor thissectorwiththesameresolutionasthatoftheoriginalpicture.Thisassignmentis designedforyoutodemonstrateyourabilitytohandlepictures.
25.用<<,>>,|,&实现一个WORD(2个字节)的高低位交换!
!
26.要开辟P1,P2,P3,P4内存来做缓冲,大小自定,但这四个缓冲的大小要一样,并且是连续的!
27.有一浮点型数组A,用C语言写一函数实现对浮点数组A进行降序排序,并输出结果,要求要以数组A作为函数的入口.(建议用冒泡排序法)
28.找错:
#include
#include
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("name:
%s\n",pBase->getName());
printf("newname:
%s\n",pBase->copyName());
return0;
}
29.编写一个函数,函数接收一个字符串,是由十六进制数组成的一组字符串,函数的功能是把接到的这组字符串转换成十进制数字.并将十进制数字返回.
30.编写一个函数将一条字符串分成两部分,将前半部分按ASCII码升序排序,后半部分不变,(如果字符串是奇数则中间的字符不变,)最后再将前后两部分交换,然后将该字符串输出,
测试字符串“ADZDDJKJFIEJHGI”
31.找错
Voidtest1()
{
charstring[10];
char*str1="0123456789";
strcpy(string,str1);
}
Voidtest2()
{
charstring[10],str1[10];
for(I=0;I<10;I++)
{
str1[i]='a';
}
strcpy(string,str1);
}
Voidtest3(char*str1)
{
charstring[10];
if(strlen(str1)<=10)
{
strcpy(string,str1);
}
}
32. 找错
#defineMAX_SRM256
DSNget_SRM_no()
{
staticintSRM_no;
intI;
for(I=0;I{
SRM_no%=MAX_SRM;
if(MY_SRM.state==IDLE)
{
break;
}
}
if(I>=MAX_SRM)
return(NULL_SRM);
else
returnSRM_no;
}
33. 写出程序运行结果
intsum(inta)
{
autointc=0;
staticintb=3;
c+=1;
b+=2;
return(a+b+C);
}
voidmain()
{
intI;
inta=2;
for(I=0;I<5;I++)
{
printf("%d,",sum(a));
}
}
34.
intfunc(inta)
{
intb;
switch(a)
{
case1:
30;
case2:
20;
case3:
16;
default:
0
}
returnb;
}
则func
(1)=?
35:
inta[3];
a[0]=0;a[1]=1;a[2]=2;
int*p,*q;
p=a;
q=&a[2];
则a[q-p]=?
36.
定义int**a[3][4],则变量占有的内存空间为:
_____
37.
编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。
如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。
38.写一个函数,判断一个int型的整数是否是2的幂,即是否可以表示成2^X的形式(不可以用循环)
我只知道是用递推,大概写了一下,如下:
intIsTwoPow(ints)
{
if(s==1)returnFALSE;
s=s>>1;
if(s>1)IsTwoPow(s);
return(s==1)?
TRUE:
FALSE;//大概是这个意思,但是这一句似乎不该这么返回!
}
39A,B从一堆玻璃球(共100个)里向外拿球,规则如下:
(1)A先拿,然后一人一次交替着拿;
(2)每次只能拿1个或2个或4个;
(3)谁拿最后一个球,谁就是最后的失败者;
问A,B谁将是失败者?
写出你的判断步骤。
40.已知:
无序数组,折半查找,各元素值唯一。
函数原型是:
Binary_Seach(intarray[],intiValue,intiCount)
array是数组,在里面用折半查找的方法找等于iValue的值,找到返回1否则0,iCount是元素个数
41.统计一个字符串中字符出现的次数
42.100位以上的超大整数的加法(主要考虑数据结构和加法的实现)。
43.对如下电文:
"CASTCASTSATATATASA"给出Huffman编码。
44.int(*(*f)(int,int))(int)表示什么含义?
45.x=x+1,x+=1,x++,为这三个语句的效率排序。
并说明为什么。
46.中缀表达式A-(B+C/D)*E的后缀形式是什么?
47.structS1
{
charc;
inti;
};
sizeof(S1)=?
classX{
public:
X();
virtual~X();
voidmyMemberFunc();
staticvoidmyStaticFunc();
virtualvoidmyVirtualFunc();
private:
inti;
char*pstr;
chara;
}
sizeof(X)=?
48.找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey"的最大子串为"actyet"
49.有一百个整数,其中有负数,找出连续三个数之和最大的部分.
50.写一程序实现快速排序.假设数据输入为一文件
快速算法描述如下
AlgorithmPartition
Input:
sequencea0,...,an-1withnelements
Output:
permutationofthesequencesuchthatallelementsa0,...,ajarelessthanorequaltoall
elementsai,...,an-1(i>j)
Method:
choosetheelementinthemiddleofthesequenceascomparisonelementx
leti=0andj=n-1
whileij
searchthefirstelementaiwhichisgreaterthanorequaltox
searchthelastelementajwhichislessthanorequaltox
ifij
exchangeaiandaj
leti=i+1andj=j-1
Afterpartitioningthesequence,Quicksorttreatsthetwopartsrecursivelybythesameprocedure.
Therecursionendswheneverapartconsistsofoneelementonly.
51.写一算法检测单向链表中是否存在环(whetherthereisaloopinalinklist),
要求算法复杂度(Algorithm'scomplexity是O(n))并只使用常数空间(spaceisO(c)).
注意,你只知道一个指向单向链表头的指针。
链表的长度是不定的,而且环出现的地方也是不定的,环有可能在头,有可能在中间。
而且要求是检测,不能破坏环的结构.
52.设下列函数已经通过了调试
boolSort_Array(ArrayType*Pinputarray,ArrayType*Poutarray);
该函数在内存中排序,能把字节数最大为100M字节的ArrayType类型的数组排序。
其中ArrayType是一个
预定义的数组类型(细节无关紧要),Pinputarray,Poutarray分别为排序前的指针和排序后的指针。
请用c语言的伪码风格设计一个算法,他调用上面给出的函数完成下列从输入到输出的任务:
输入:
排序前的大文件,名称为char*pinoutfilename,其内容为用分号分隔的ArrayType类型的数组元素,可装满4个100M字节的数组。
输出:
排序后的大文件char*poutoutfilename。
53.用最有效率的方法算出2乘以8等於几?
54.
1.错误的转义字符是(c)
A.'\091'B.'\\'
C.'\0'D.'\''
2.若数组名作实参而指针变量作形参,函数调用实参传给形参的是(d)
A.数组的长度B.数组第一个元素的值
C.数组所有元素的值D.数组第一个元素的地址
3.变量的指针含意是指变量的(b)
A.值B.地址
C.存储D.名字
5.某文件中定义的静态全局变量(或称静态外部变量)其作用域是(d)
A.只限某个函数B.本文件
C.跨文件D.不限制作用域
55.
1.解二次方程:
a*x*x+b*x+c
intQuadratic(doublea,doubleb,doublec,double&x1,double&x2);
返回值:
解的个数
2.最大公约数
DWORDDivisor(DWORDdwFirst,DWORDdwSecond);
返回值:
最大公约数
3.根据蒙特卡洛算法计算圆周率
doublePI(DOWRDdwCount/*测试次数*/);
返回值:
PI
4.无符号整数乘法,乘数为32bit,结果为64bit
提示:
32bit整数分解为16bit相乘
voidMultiply(DWORDdwFirst,DWORDdwSecond,DWORD&dwHigh,DWORD&dwLower);
5.链表排序(从小到大)
节点定义为:
structNode{
intnValue;
structNode*pNext;
};
最后一个节点的pNext=NULL.
Node*SortChain(Node*pHead);
返回值:
链表头
Trackback: