printf("%3d",a[j]);
printf("\n");
}
}
二、朗讯面试题:
Therearetwointvariables:
aandb,don’tuse“if”,“?
:
”,“switch”orotherjudgementstatements,findoutthebiggestoneofthetwonumbers.
参考答案:
方案一
intmax=((a+b)+abs(a-b))/2
方案二
intc=a-b;
char*strs[2]={"a大","b大"};
c=unsigned(c)>>(sizeof(int)*8-1);
三、朗讯面试题:
如何打印出当前源文件的文件名以及源文件的当前行号?
参考答案:
通常使用的就是__FILE__,__LINE__,在调试函数中利用“%s","%ld",打印就好了。
四、朗讯面试题:
main主函数执行完毕后,是否可能会再执行一段代码,给出说明?
参考答案:
crt会执行另一些代码,进行处理工作。
如果你需要加入一段在main退出后执行的代码,可以使用atexit()函数,注册一个函数。
语法:
#include
intatexit(void(*function")(void));
#include
#include
voidfn1(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()
{
printf("is");
}
voidfn4()
{
printf("This");
}
五、朗讯面试题:
如何判断一段程序是由C编译程序还是由C++编译程序编译的?
参考答案:
c++编译时定义了__cplusplus
c编译时定义了_STDC_
六、下面这道面试题怎么做(指针)?
#include
main(){
intc[3][3]={1,2,3,4,5,6,7,8,9};
for(inti=0;i<3;i++)
for(intj=0;j<3;j++)
printf("%ld\n",&c[j]);
printf("-------------------------\n");
printf("%ld\n",(c+1));
printf("%ld\n",(*c+1));
printf("%ld\n",&c[0][0]);
printf("%ld\n",**c);
printf("%ld\n",*c[0]);
if(int(c)==int(*c))
printf("equl");
}
为什么c,*c的值相等,(c+1),(*c+1)的值不等
c,*c,**c,代表什么意思?
参考答案:
c是第一个元素的地址,*c是第一行元素的首地址,其实第一行元素的地址就是第一个元素的地址,这容易理解。
**c是提领第一个元素。
为什么c,*c的值相等?
intc因为直接用c表示数组c[0][0]
printf("%ld\n",*c[0]);语句已将指针移到数组头。
int(*c)表示c0的值为1,所以相等。
数组c的存放空间示意如下:
(机器中是行优先存放的)
c[0][0]c[0][1]c[0][2]
c[1][0]c[1][1]c[1][2]
c[2][0]c[2][1]c[2][2]
c是一个二维数组名,实际上它是一个指针常量,不能进行自加、自减运算,即:
c++、c--、++c、--c
都是不允许的;
c:
数组名;是一个二维指针,它的值就是数组的首地址,也即第一行元素的首地址(等于*c),也
等于第一行第一个元素的地址(&c[0][0]);可以说成是二维数组的行指针。
*c:
第一行元素的首地址;是一个一维指针,可以说成是二维数组的列指针。
**c:
二维数组中的第一个元素的值;即:
c[0][0]
所以:
c和*c的值是相等的,但他们两者不能相互赋值,(类型不同);
(c+1):
c是行指针,(c+1)是在c的基础上加上二维数组一行的地址长度,即从&c[0][0]
变到了&c[1][0];
(*c+1):
*c是列指针,(*c+1)是在*c的基础上加上二数组一个元素的所占的长度,即从
&c[0][0]变到了&c[0][1]
从而(c+1)和(*c+1)的值就不相等了
七、定义int**a[3][4],则变量占有的内存空间为:
_____
参考答案:
int**p;/*16位下sizeof(p)=2,32位下sizeof(p)=4*/
总共3*4*sizeof(p)
八、编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。
如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。
参考答案:
判断年份是否是闰年,月份的大小月,
月(12进制)、日(与闰年、大小月有关)、时(24进制)、分(60进制)、妙(60进制)
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