3.下列哪些是可能引起错误的代码?
()
A.charc=233;tables[c]=c;
B.#defineequal(a,b)a==b;inta=3,b=7;printf(“a&3%sb&3\n”,equal(a&3,b&3)?
“==”:
“!
=”);
C.已知Derived是Base的派生类Base*p=newDerived;delete(Derived*)p;
D.std:
:
stringstr1(“hello”),str2;memcpy(&str2,&str1,sizeof(str1));
4.下列哪些指令执行之后,标志寄存器的ZF一定会置位为1?
()
A.XOREAXEAX
B.CMPEAXEAX
C.MOVEAX0H
D.TESTEAXEAX
5.下列哪些数据结构最适合医疗仪器设备中的大型数据量插入、查找?
()
A.数组
B.哈希表
C.红黑树/二叉平衡树
D.链表
6.下列哪些排序算法的平均时间复杂度是O(Nlog2N)(),哪些是稳定排序()
A.冒泡排序
B.希尔排序
C.快速排序
D.插入排序
E.堆排序
7.下列哪些说法是正确的:
()
A.二分查找法在一个长度为1000的有序整数数组查找一个整数,比较次数不超过100次
B.在二叉树中查找元素的时间复杂度为O(log2N);
C.对单向链表,可以使用冒泡法排序;
D.对双向链表,可以使用快速排序.
8.已知Derived是Base的派生类,且Base、Derived都有缺省构造函数,Base有个成员函数fool,原型为:
voidBase:
:
fool(),Derived有个成员函数foo2,原型为:
voidDerived:
:
foo2().请问下述哪些代码是可以正常编译通过的?
()
A.Derived*p=newBase;
B.Base*p=newDerived;
C.void(Derived:
:
*pfn)()=&Base:
:
foo1;
D.void(Base:
:
*pfn)()==&Derived:
:
foo2;
9.下列哪些函数调用之后,buf一定是以’\0’结束(假设src是字符串,buf足够长):
()
A.memcpy(buf,src,strlen(src));
B.strcpy(buf,src);
C.strncpy(buf,src,strlen(src));
D.strcat(buf,src);
10.X86平台,下列哪几种情况下需要对全局变量I的访问进行加锁:
()
A.A线程:
if(I++)return;B线程:
if(I++)return;
B.A线程:
if(I)return;B线程if(I)return;
C.A线程:
if(I++)return;B线程:
if(I)return;
D.A线程:
I=1;B线程:
I=0;
二、填空题(每题2分,共20分)
1.下列程序的运行结果是:
_________
voidfun(int*pa,int&b,intc)
{
*pa=5;
b=5;
c=5;
}
intmain()
{
inta=1;
intb=2;
intc=3;
fun(&a,b,c);
printf(“%d%d%d\n”,a,b,c);
return0;
}
2.数值转换:
十进制123转成十六进制_______
十六进制F3转成十进制______
八进制456转成十六进制______
3.位运算(32位X86平台)
1)0x321&0x2f=______
2)0x321^0x3f=______
3)~0x321=______
4.调用printf函数可以分解为九个过程,请写出它们的排列顺序_________
A.call指令
B.EBP出栈
C.函数参数压栈
D.收回局部变量空间
E.在栈上保留局部变量空间
F.EBP压栈
G.函数参数出栈
H.ret指令
I.打印输出字符串
5.请挑出下述代码执行过程中会发生的事件,并按顺序排列______
structBase{
intval;
Base():
val(0){}
~Base();
};
structDerived:
publicBase{
Derived(){}
~Derived(){}
};
Base*p=newDerived;
deletep;
6.下列代码的运行结果是:
______
structFoo{
Foo(constchar*name,int*p):
m_name(name),m_p(p)
{
printf(“%s:
%d”,name,++*p);
}
~Foo()
{
printf(“%s:
%d”,m_name,--*p);
}
constchar*m_name;
int*m_p;
};
voidfun(int*p)
{
Fooa(“a”,p);
newFoo(“b”,p);
}
intmain()
{
inta=1;
fun(&a);
printf(“%d\n”,a);
return0;
}
输出结果
a:
2
b:
3
a:
2
2
用new创建的对象必须要用delete才销毁不然不会调用对象析构函数
若改程序:
voidfun(int*p)
{
Fooa(“a”,p);
Foo*b=newFoo(“b”,p);
Deleteb;
}
则程序输出为:
a:
2
b:
3
b:
2
a:
1
1
7.下列程序的运行结果是______
intmain()
{
inta[5][2]={
0,1,2,3,4,5,6,7,8,9
};
int*p=a[0];
int(*p2)[2]=&a[1];
++p;
++p2;
printf("%d",*p);1
printf("%d",**p2);4
printf("%d",p2[1][2]);8
8.32位X86平台,4字节对齐,下列代码的执行结果是:
______
unionuni{
struct{
char*p1;
intn2;
charc;
}s1;
struct{
intn3;
char*p4;
}s2;
};
intmain()
{
unionuniu;
printf(“%d%d%d%d\n”,sizeof(u),sizeof(&u),(int*)&u.s2.p4-(int*)&u.s1.p1,
(char*)&u.s2.n3–(char*)&u.s1.p1):
return0;
}
9.将C语言表达式a*(b-c)/d+e转成后缀表达式是______
10.已知某二叉树的后序遍历是DFBEGCA,中序遍历的顺序是DBFACEG,其前序遍历顺序是______
三、代码补全题(每空1分,共15分)
1.下述函数的作用是:
消除字符串首尾空白符(仅指跳格符和空格符),中间出现的连续空白符合并为一个空格,请补充其中缺失的行。
#defineISWHITE(x)(__________________________________)
voidtrim(char*pStr)
{
char*pR=pStr;
char*pW=pStr;
while(ISWHITE(*pR))
{
++pR;
}
for(;;)
{
while(________________)
{
*pW++=*pR++;
If(*pR==‘\0’)
break;
}
while(________________)
{
++pR;
If(*pR==‘\0’)
break;
}
__________________;
}
____________________;
}
2.下列代码将两个有序链表接合为一个,链表中的元素的排列顺序为从大到小。
请补充其中的空缺。
structnode{
structnode*pnext;
Intval;
};
structnode*splice(structnode*plhs,structnode*prhs){
if(_____________)
returnprhs?
prhs:
plhs;
structnode*phead,*plast;
if(_____________){
phead=plast=plhs;
plhs=plhs->pnext;
}
else{
phead=plast=prhs;
prhs=prhs->pnext;
}
while(_____________){
if(plhs->valval)
{
plast->pnext=plhs;
plast=plhs;
plhs=plhs->pnext;
}
else{
plast->pnext=prhs;
plast=prhs;
prhs=prhs->pnext;
}
}
plast->pnext=_______________;
return___________________;
}
3.一个正整数n,可以分解为多个小于等于n的正整数的和,表达式右部的各个正整数要求都是2的幂,例如给定正整数4、7,它们可以分解得到如下表达式:
4=1+1+1+17=1+1+1+1+1+1+1
4=1+1+27=1+1+1+1+1+2
4=2+27=1+1+1+2+2
4=47=1+1+1+4
7=1+2+2+2
7=1+2+4
因此,正整数4、7可以得到的表达式个数分别是4个和6个,下列程序可以计算给定正整数n(0__int64calc(intn)
{
inti;
intsize=________________;
__int64*w=(__int64*)malloc(size);
if(!
w)
abort():
__int64ret=0;
___________;
___________;
for(i=3;i<=n;i++)
{
if(i%2)
w[i]=_________;
else
w[i]=_________;
}
ret=w[n];
free(w);
returnret;
}
四、问答题(每题5分,共25分)
1.下列代码期望输出结果是1111,请找出fun1….fun4中存在的问题,并简单说明原因:
1)int*fun1(inta){问题1:
返回局部变量的地址问题2第二次调用时将覆盖第一次的结果所以等到的是0
2)intret=a;
3)Return&ret;
4)}
5)int*fun2(inta){
6)int*p=(int*)malloc(sizeof(int));可以得到1但是没有释放在堆中分配的内存
7)*p=a;
8)returnp;
9)}
10)int*fun3(inta){等到的是0因为静态局部变量只在第一次调用时分配空间初始化一次,以后调用孔用此空间
11)staticintret;staticinta=5;这个是初始化a=6这个是赋值
12)ret=a;
13)return&ret;
14)}
15)int*fun4(inta){
16)return&a;
17)}
18)intmain()
19){
20)printf(“%d”,*fun1
(2)-*fun1
(1));
21)printf(“%d”,*fun2
(2)-*fun2
(1));
22)printf(“%d”,*fun3
(2)-*fun3
(1));
23)printf(“%d”,*fun4
(2)-*fun4
(1));
24)return0;
25)}
2.怎么查找产生内存泄漏的代码位置,请至少写出三种不同类型的方法:
3.C语言中的main函数的返回值有什么作用?
如何通过C代码取得该返回值?
main函数的返回值类型必须是int,这样返回值才能传递给操作系统。
如果main函数的最后没有写return语句的话,C99规定编译器要自动在生成的目标文件中(如exe文件)加入return0,表示程序正常退出。
不过,我还是建议你最好在main函数的最后加上return语句,虽然没有这个必要,但这是一个好的习惯。
注意,vc6不会在生成的目标文件中加入return0,大概是因为vc6是98年的产品,所以才不支持这个特性。
现在明白我为什么建议你最好加上intmain()返回整数(通常和return0)连用,返回0,告诉系统程序正常终止,返回非零值告诉系统程序异常关闭.
打开附件里的“命令提示符”,在命令行里运行刚才编译好的可执行文件,然后输入“echo%ERRORLEVEL%”,回车,就可以看到程序的返回值为0。
假设刚才编译好的文件是a.exe,如果输入“a&&dir”,则会列出当前目录下的文件夹和文件。
但是如果改成“return-1”,或者别的非0值,重新编译后输入“a&&dir”,则dir不会执行。
因为&&的含义是:
如果&&前面的程序正常退出,则继续执行&&后面的程序,否则不执行。
也就是说,利用程序的返回值,我们可以控制要不要执行下一个程序。
这就是intmain的好处。
如果你有兴趣,也可以把main函数的返回值类型改成非int类型(如float),重新编译后执行“a&&dir”,看看会出现什么情况,想想为什么会出现那样的情况。
顺便提一下,如果输入a||dir的话,则表示如果a异常退出,则执行dir
4.汉诺塔问题:
有A、B、C三个台子,每个台子上面可放若干个盘子,要求每个盘子下面的盘子都比自己大。
现在要从A台移10个盘子到B台,每次只能移动一个盘子,可以借助C台,问:
一共要移动几次盘子,请写出计算过程。
5.近来有人声称发明了一类神奇的直角三角形,其每一条边的长度都是互不相等的Fibonacci数,聪明的你能找到这样的三角形吗?
如果能,请写出符合条件的三个数值,如果不能,请写出分析过程,Fibonacci数:
满足:
f
(1)=1,f
(2)=1,f(n)=f(n-1)+f(n-2)。
五、编程题(20分)
1.编写函数align_n,将size的低n位(即:
0到n-1位)清零,如果size的低n位不为函数原型:
unsignedintalign_n(unsignedintsize,intn)
2.计算a的n次方是许多加密算法的基本操作,蛮力计算方法的复杂度是O(n),请设计一个时间复杂度小于O(n)的算法,(假设计算结果可以使用long型存储)。
(6分)
3.不调用库函数实现split_ext,该函数作用是从WINDOWS格式路径中提取文件的后缀名,函数原型:
char*split_ext(constchar*pszPath,char*ext)
需要正确处理以下格式路径:
C:
\DlanFindmeclient\xxxx
C:
\DlanFindmeclient\hello.jpg.doc
C:
\DlanFindmeclient\test.test\hello
C:
\DlanFindmeclient\test.test\hello.c