CC++语言程序设计笔试面试题16.docx
《CC++语言程序设计笔试面试题16.docx》由会员分享,可在线阅读,更多相关《CC++语言程序设计笔试面试题16.docx(21页珍藏版)》请在冰点文库上搜索。
CC++语言程序设计笔试面试题16
3.内功题
试题1:
分别给出BOOL,int,float,指针变量与“零值”比较的if语句(假设变量名为var)
解答:
BOOL型变量:
if(!
var)
int型变量:
if(var==0)
float型变量:
constfloatEPSINON=0.00001;
if((x>=-EPSINON)&&(x<=EPSINON)
指针变量:
if(var==NULL)
剖析:
考查对0值判断的“内功”,BOOL型变量的0判断完全可以写成if(var==0),而int型变量也可以写成if(!
var),指
针变量的判断也可以写成if(!
var),上述写法虽然程序都能正确运行,但是未能清晰地表达程序的意思。
一般的,如果想让if判断一个变量的“真”、“假”,应直接使用if(var)、if(!
var),表明其为“逻辑”判断;
如果用if判断一个数值型变量(short、int、long等),应该用if(var==0),表明是与0进行“数值”上的比较;而
判断指针则适宜用if(var==NULL),这是一种很好的编程习惯。
浮点型变量并不精确,所以不可将float变量用“==”或“!
=”与数字比较,应该设法转化成“>=”或“<=”
形式。
如果写成if(x==0.0),则判为错,得0分。
试题2:
以下为WindowsNT下的32位C++程序,请计算sizeof的值
voidFunc(charstr[100])
{
sizeof(str)=?
}
void*p=malloc(100);
sizeof(p)=?
解答:
sizeof(str)=4
sizeof(p)=4
剖析:
Func(charstr[100])函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个
指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
数组名的本质如下:
(1)数组名指代一种数据结构,这种数据结构就是数组;
例如:
charstr[10];
cout<<sizeof(str)<<endl;
输出结果为10,str指代数据结构char[10]。
(2)数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;
charstr[10];
str++;//编译出错,提示str不是左值
(3)数组名作为函数形参时,沦为普通指针。
WindowsNT32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof(str)、sizeof(p)都为4。
试题3:
写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。
另外,当你写下面的代码时会发生什么
事
least=MIN(*p++,b);
解答:
#defineMIN(A,B)((A)<=(B)?
(A):
(B))
MIN(*p++,b)会产生宏的副作用
剖析:
这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定
义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。
程序员对宏定义的使用要非常小心,特别要注意两个问题:
(1)谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。
所以,严格地讲,下述解答:
#defineMIN(A,B)(A)<=(B)?
(A):
(B)
#defineMIN(A,B)(A<=B?
A:
B)
都应判0分;
(2)防止宏的副作用。
宏定义#defineMIN(A,B)((A)<=(B)?
(A):
(B))对MIN(*p++,b)的作用结果是:
((*p++)<=(b)?
(*p++):
(*p++))
这个表达式会产生副作用,指针p会作三次++自增操作。
除此之外,另一个应该判0分的解答是:
#defineMIN(A,B)((A)<=(B)?
(A):
(B));
这个解答在宏定义的后面加“;”,显示编写者对宏的概念模糊不清,只能被无情地判0分并被面试官淘汰。
试题4:
为什么标准头文件都有类似以下的结构?
#ifndef__INCvxWorksh
#define__INCvxWorksh
#ifdef__cplusplus
extern"C"{
#endif
解答:
头文件中的编译宏
#ifndef __INCvxWorksh
#define __INCvxWorksh
#endif
的作用是防止被重复引用。
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。
函数被C++编译后在symbol库中的名字与
C语言的不同。
例如,假设某个函数的原型为:
voidfoo(intx,inty);
该函数被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是要求移动的n
voidLoopMove(char*pStr,intsteps)
{
//请填充...
}
解答:
正确解答1:
voidLoopMove(char*pStr,intsteps)
{
intn=strlen(pStr)-steps;
chartmp[MAX_LEN];
strcpy(tmp,pStr+n);
strcpy(tmp+steps,pStr);
*(tmp+strlen(pStr))='0';
strcpy(pStr,tmp);
}
正确解答2:
voidLoopMove(char*pStr,intsteps)
{
intn=strlen(pStr)-steps;
chartmp[MAX_LEN];
memcpy(tmp,pStr+n,steps);
memcpy(pStr+steps,pStr,n);
memcpy(pStr,tmp,steps);
}
剖析:
这个试题主要考查面试者对标准库函数的熟练程度,在需要的时候引用库函数可以很大程度上简化程序编写的工
作量。
最频繁被使用的库函数包括:
(1)strcpy
(2)memcpy
(3)memset
试题6:
已知WAV文件格式如下表,打开一个WAV文件,以适当的数据结构组织WAV文件头并解析WAV格式的各项信息
。
WAVE文件格式说明表
1#include“filename.h”和#include的区别?
答:
对于#include编译器从标准库开始搜索filename.h
对于#include“filename.h”编译器从用户工作路径开始搜索filename.h
2头文件的作用是什么?
答:
一、通过头文件来调用库功能。
在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和
二进制的库即可。
用户只需
要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。
编译器会从库中提取相应的代码。
二、头文件能加强类型安全检查。
如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就
会指出错误,这一简单的规
则能大大减轻程序员调试、改错的负担。
3C++函数中值的传递方式有哪几种?
答:
C++函数的三种传递方式为:
值传递、指针传递和引用传递。
4内存的分配方式的分配方式有几种?
答:
一、从静态存储区域分配。
内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。
例如全局变量。
二、在栈上创建。
在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元
自动被释放。
栈内
存分配运
算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
三、从堆上分配,亦称动态内存分配。
程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在
何时用free
或delete释放
内存。
动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
5实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;
答:
双向链表删除一个节点P
templatevoidlist:
:
delnode(intp)
{
intk=1;
listnode*ptr,*t;
ptr=first;
while(ptr->next!
=NULL&&k!
=p)
{
ptr=ptr->next;
k++;
}
t=ptr->next;
cout<<"你已经将数据项"ptr->next=ptr->next->next;
length--;
deletet;
}
在节点P后插入一个节点:
templateboollist:
:
insert(typet,intp)
{
listnode*ptr;
ptr=first;
intk=1;
while(ptr!
=NULL&&k{
ptr=ptr->next;
k++;
}
if(ptr==NULL&&k!
=p)
returnfalse;
else
{
listnode*tp;
tp=newlistnode;
tp->data=t;
tp->next=ptr->next;
ptr->next=tp;
length++;
returntrue;
}
}
6写一个函数,将其中的\t都转换成4个空格。
voidchange(char*pstr)
{
while(*pstr++!
='\0')
{
if(*pstr=='\t')
}
}
7Windows程序的入口是哪里?
写出Windows消息机制的流程.
答:
Winmain(),它定义窗口界面和消息循环。
设置全局资源->登记实例->调入全局资源->初始化应用->消息循环
(解释消息,分发消息)
8如何定义和实现一个类的成员函数为回调函数?
1).不使用成员函数,直接使用普通C函数,为了实现在C函数中可以访问类的成员变量,可以使用友元操作符
(friend),在C++中将该C函数说明为类的友元即可。
这种处理机制与普通的C编程中使用回调函数一样。
2).使用静态成员函数,静态成员函数不使用this指针作为隐含参数,这样就可以作为回调函数了。
9C++里面是不是所有的动作都是main()引起的?
如果不是,请举例.
答:
在运行c++程序时,通常从main()函数开始执行。
因此如果没有main(),程序将不完整,编译器将指出未定义
main()函数。
例外情况:
如,在windows编程中,可以编写一个动态连接库(dll)模块,这是其他windows程序可以使用的代码
。
由于
DLL模块不是独立的程序,因此不需要main().用于专用环境的程序--如机器人中的控制器芯片--可能不需要main
().但常规的
独立程序都需要main().
10C++里面如何声明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
14把一个链表反向填空
voidreverse(test*head)
{
test*pe=head;
test*ps=head->next;
while(ps)
{
pe->next=ps->next;
ps->next=head;
head=ps;
ps=pe->next;
}
}
15设计一个重采样系统,说明如何anti-alias
16某个程序在一个嵌入式系统(200M的CPU,50M的SDRAM)中已经最化了,换到另一个系统(300M的CPU,50M的SDRAM)
中运行,还需要优化吗?
17.下面哪种排序法对12354最快
aquicksort
b.bublesort
c.mergesort
18.哪种结构,平均来讲,获取一个值最快
a.binarytree
b.hashtable
c.stack
19请问C++的类和C里面的struct有什么区别?
答:
c++的类的成员默认情况下是私有的,c的struct的成员默认情况下是公共的.
20请讲一讲析构函数和虚函数的用法和作用?
答:
析构函数的作用是当对象生命期结束时释放对象所占用的资源。
析构函数用法:
析构函数是特殊的类成员函
数
它的名字和类名相同,没有返回值,没有参数不能随意调用也没有重载。
只是在类对象生命期结束时有系统自动
调用。
虚函数用在继承中,当在派生类中需要重新定义基类的函数时需要在基类中将该函数声明为虚函数,作用为使程
序支持动态联遍。
21全局变量和局部变量有什么区别?
是怎么实现的?
操作系统和编译器是怎么知道的?
答:
一些变量整个程序中都是可见的,它们称为全局变量,一些变量在函数内部定义且只在函数中可知,则称为
局部变量。
全局变量由编译器建立且存放在内存的全局数据区,局部变量存放在栈区
22一些寄存器的题目,主要是寻址和内存管理等一些知识。
238086是多少尉的系统?
在数据总线上是怎么实现的?
24多态。
overload和override的区别。
答:
重载在相同范围(同一个类中),函数名字相同,参数不同,virtual关键字可有可无。
覆盖是指派生类函数覆盖基类函数,不同的范围,函数名字相同,参数相同,基类函数必须有virtual关键字。
<>
25.完成下列程序
*
*.*.
*..*..*..
*...*...*...*...
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
*......*......*......*......*......*......*......
*.......*.......*.......*.......*.......*.......*.......*.......
#include
usingnamespacestd;
constintn=8;
main()
{
inti;
intj;
intk;
for(i=n;i>=1;i--)
{
for(j=0;j{
cout<<"*";
for(k=1;k{
cout<<".";
}
}
cout<}
system("pause");
}
26完成程序,实现对数组的降序排序
#include
usingnamespacestd;
voidsort(int*arr,intn);
intmain()
{
intarray[]={45,56,76,234,1,34,23,2,3};
sort(array,9);
for(inti=0;i<=8;i++)//曾经在这儿出界
cout<}
voidsort(int*arr,intn)
{
inttemp;
for(inti=1;i<9;i++)
{
for(intk=0;k<9-i;k++)//曾经在这儿出界
{
if(arr[k]{
temp=arr[k];
arr[k]=arr[k+1];
arr[k+1]=temp;
}
}
}
}
27费波那其数列,1,1,2,3,5……编写程序求第十项。
可以用递归,也可以用其他方法,但要说明你选择的
理由。
非递归
#include
usingnamespacestd;
intPheponatch(intn);
main()
{
intPh=Pheponatch(10);
cout}
intPheponatch(intn)
{
intelem;
intn1=1;
intn2=1;
if(n==1||n==2)
return1;
else
{
for(inti=3;i<=n;i++)
{
elem=n1+n2;
n1=n2;
n2=elem;
}
returnelem;
}
}
递归
#include
usingnamespacestd;
intPheponatch(intn);
main()
{
intn;
cin>>n;
intph=Pheponatch(n);
cout}
intPheponatch(intn)
{
if(n<=0)
exit(-1);
else
if(n==1||n==2)
return1;
else
returnPheponatch(n-1)+Pheponatch(n-2);
}
28下列程序运行时会崩溃,请找出错误并改正,并且说明原因。
#include
#include
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
))
{
while(N>=temp.value&&temp.left!
=NULL)
temp=temp.left;
while(N
temp=temp.right;
}
if(N>=temp.value)
temp.left=NewNode;
else
temp.right=NewNode;
return;
}
}
29.AclassBnetworkontheinternethasasubnetmaskof255.255.240.0,whatisthemaximum
numberofhostspersubnet.
a.240b.255c.4094d.65534
30.Whatisthedifference:
betweeno(logn)ando(logn^2),wherebothlogarithemshavebase2.
a.o(logn^2)isbiggerb.o(logn)isbigger
c.nodifference
31.Foraclasswhatwouldhappenifwecallaclass’sconstructorfromwiththesameclass’s
constructor.
a.compilationerrorb.linkingerror
c.stackoverflowd.noneoftheabove
32.“new”inc++isa:
.
a.libraryfunctionlikemallocinc
b.keywordc.operator
d.noneoftheabove
33.Whichofthefollowinginformationisnotcontainedinaninode.
a.fileownerb.filesize
c.filenamed.diskaddress
34.What’sthenumberofcomparisonsintheworstcasetomergetwosortedlistscontainingn
elementseach.
a.2nb.2n-1c.2n+1d.2n-2
35.TimecomplexityofnalgorithmT(n),wherenistheinputsize,isT(n)=T(n-1)+1/nifn>1
otherwise1theorderof
thisalgorithmis.
a.log(n)b.nc.n^2d.n^n
36.Thenumberof1’sinthebinaryrepresentationof3*4096+15*256+5*16+3are.
a.8b.9c.10d.12
37.设计函数intatoi(char*s)。
38.inti=(j=4,k=8,l=16,m=32);printf(“%d”,i);输出是多少?
39.解释局部变量、全局变量和静