福州大学863大数据结构与程序设计模拟题3问题详解Word文件下载.docx

上传人:b****6 文档编号:18797935 上传时间:2023-01-01 格式:DOCX 页数:12 大小:843.99KB
下载 相关 举报
福州大学863大数据结构与程序设计模拟题3问题详解Word文件下载.docx_第1页
第1页 / 共12页
福州大学863大数据结构与程序设计模拟题3问题详解Word文件下载.docx_第2页
第2页 / 共12页
福州大学863大数据结构与程序设计模拟题3问题详解Word文件下载.docx_第3页
第3页 / 共12页
福州大学863大数据结构与程序设计模拟题3问题详解Word文件下载.docx_第4页
第4页 / 共12页
福州大学863大数据结构与程序设计模拟题3问题详解Word文件下载.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

福州大学863大数据结构与程序设计模拟题3问题详解Word文件下载.docx

《福州大学863大数据结构与程序设计模拟题3问题详解Word文件下载.docx》由会员分享,可在线阅读,更多相关《福州大学863大数据结构与程序设计模拟题3问题详解Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。

福州大学863大数据结构与程序设计模拟题3问题详解Word文件下载.docx

一个含有n个顶点和e条边的简单无向图的邻接矩阵为n×

n矩阵,共有n2个元素,其中非零元素个数为2e,则零元素个数为n2-2e。

10.D。

n个顶点构成连通图至少需要n-1条边(生成树),但若再增加1条边,则必然会构成环。

如果一个无向图有n个顶点和n-1条边,可以使它连通但没有环(即生成树),但再加一条边,在不考虑重边的情形下,就必然会构成环。

11.C。

【解析】考查散列表的性质。

不同冲突处理方法对应的平均查找长度是不同的,I错误。

散列查找的思想是通过散列函数计算地址,然后再比较关键字确定是否查找成功,II正确。

平均查找长度与填装因子(即表中记录数与表长之比)有关,III错误。

在开放定址的情况下,不能随便删除表中的某个元素(只能标记为删除状态),否则可能会导致搜索路径被中断,IV错误。

12.C。

【解析】考查各种部排序算法的性能。

选择排序在最好、最坏、平均情况下的时间性能均为O(n2),归并排序在最好、最坏、平均情况下的时间性能均为O(nlog2n)。

各种排序方法对应的时间复杂度见下表。

13.C。

【解析】考查初始堆的建立。

首先对以第n/2个结点为根的子树(也即最后一个结点的父结点为根的子树)筛选,使该子树成为堆,之后向前依次对各结点为根的子树进行筛选,直到筛选到根结点。

14.A。

【解析】考查查折半查找的平均查找长度。

假设有序表中元素为A[0…11],不难画出对它所对应的折半查找判定树如下图所示,圆圈是查找成功结点,方形是虚构的查找失败结点。

从而可以求出查找成功的ASL=(1+2×

2+3×

4+4×

5)/12=37/12,查找失败的ASL=(3×

3+4×

10)/13。

15.B。

【解析】考查快排过程。

以28为基准元素,首先从后向前扫描比28小的元素,此元素位置为L0,把此元素放到前面基准元素位置,而后再从前向后扫描比28大的元素,此元素位置L1,并将其放到L0位置,从而得到了(5,16,L1,12,60,2,32,72)。

而后继续重复从后向前扫描,记录找到的比28小的元素位置L2,把此元素放到L1,再从前往后扫描的操作找到比28大的元素,此元素位置L3,并将其放到L2位置,直到扫描到相同元素,一趟排序完毕。

最后得到(5,16,2,12)28(60,32,72).

16.D构造函数没有类型说明修饰符的,他是一类特殊的函数。

函数名跟类名一样。

17.D。

首先A肯定错的,int表示整型,char表示字符型,都不是答案。

无返回值的话,就用void来修饰,表示返回类型是空的。

18.B。

复用不能派生出新的类,只有继承才可以派生新类,多继承和单继承都是继承,最佳答案是B。

19.C。

默认参数必须是从形参表的右边开始定义的,答案C违背了这个原则。

20.B。

回忆一下视频里面讲过的,虚基类之所以被提出来就是为了解决在一个多继承体系中,对于一个派生类多次继承于某个类,当调用某个继承而来的函数时,如果他的父类们都有这个函数,编译器不知道要调用哪个的问题。

比如有一个类D,他继承与B和C,而B和C又继承于A,同时A里面有个函数叫display,当我们调用d.display时,就有可能会出错,这时候就要考虑用虚基类了。

21.B。

B之外的其他操作符都是逻辑操作符,&

与操作,|或操作,^异或操作。

可以参考一下操作符优先级的表。

一般优先级的表我们记不住也没必要记,对于这题,逻辑运算的&

,|,^肯定比逻辑判断&

&

更高级,毕竟一个是运算一个是判断。

22.C.这道题比较简单了。

C++的输出到屏幕的语句也就是输出流ostream的对象,cout就是ostream的对象。

C只不过是个普通的运算语句。

23.C.函数的定义形式是类似这样的voidfun(){},其中void就是题目中提到的所谓的函数的类型,事实上很少有什么函数的类型这种说法。

一般都说函数的返回类型。

函数的返回类型除了void外,还有int,char等置类型,还可以是自定义的类类型。

24.D.友元函数函数可以申明在一个类A的任意位置,他没有共有私有的区别,什么在什么地方都是一样的;

友元函数可以是这个类A外面的某个函数,所以他没有this指针,因为他不是类的成员,只是一个函数,this指针只有类的成员函数才有。

友元函数是具有特权的函数,他可以访问定义了他为友元函数的类的私有成员。

25.A.在while(inti=0)这句里面,定义了一个变量i,并且给他赋值0,然后编译器就会把i和0进行比较,如果i==0,那么就直接跳过循环体了,没在循环体里面执行,所以答案是0次。

这道题比较怪,如果有兴趣知道为什么这样的话请继续看下去,否则可以直接跳过。

我们建立一个工程test,源程序只有while(inti=0)i--;

这行代码,然后编译运行,发现程序很快就运行结束了。

然后找到这个程序的PE文件,也就是test.exe,对他进行反汇编。

其中[ebp-8]就是变量i。

分析汇编代码

movdwordptr[ebp-8],0//将0赋值给i

Cmpdwordptr[ebp-8],0//将i和0比较

Jeshort009F1386//如果i和0相等则跳转到009F1386继续执行

好了,分析完毕。

跳转到009F1386也就是xoreax,eax所在那行,程序再执行几行代码也就返回了。

由此可以看出,程序没有跳入到循环体里面,也就是009F137B~009F1384所在的代码,因此循环体没有被执行,循环0次。

26.A。

你会发现这道题在两份试卷里面都有,意思就是要让你分清楚const修饰函数和变量的区别。

做个总结:

指针使用cosnt:

(1)指针本身是常量不可变

(char*)constpContent;

const(char*)pContent;

(2)指针所指向的容是常量不可变

const(char)*pContent;

(char)const*pContest;

(3)两者都不可变

constchar*constpContent;

(4)还有其中区别方法,沿着*号划一条线:

如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;

如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

函数中使用CONST

(1)const修饰函数参数

a.传递过来的参数在函数不可以改变(无意义,因为Var本身就是形参)

voidfunction(constintVar);

b.参数指针所指容为常量不可变

voidfunction(constchar*Var);

c.参数指针本身为常量不可变(也无意义,因为char*Var也是形参)

voidfunction(char*constVar);

d.参数为引用,为了增加效率同时防止修改。

修饰引用参数时:

voidfunction(constClass&

Var);

 

//引用参数在函数不可以改变

voidfunction(constTYPE&

//引用参数在函数为常量不可变

27.A.比较简单,不解释了。

28.B.经过编辑、编译、连接和运行四个步骤。

编辑是将C++源程序输入计算机的过程,保存文件名为cpp。

编译是使用系统提供的编译器将源程序cpp生成机器语言的过程,目标文件为obj,由于没有得到系统分配的绝对地址,还不能直接运行。

连接是将目标文件obj转换为可执行程序的过程,结果为exe。

运行是执行exe,在屏幕上显示结果的过程。

29.A。

This指针是隐藏的,比如说有一个类A,那么他的对象比如说有a,b,c。

非常多,那么这些对象,每一个都有一个this指针,可以用来访问他们自己的成员变量。

this指针跟他的子类没有一毛钱关系,他的子类的对象有他们自己的this指针。

30.C。

首先要看懂这句a=aa--,a--的返回值是a本身,--a的返回值是(a-1)。

剩下的没难度了,请自行分析。

二、填空题

1.继承,封装和多态性2.C

3.包含头文件

4.10

5.0解释:

AB 

*a[10]={&

a1,&

a2}这句话的意思是定义10个AB类型的指针。

其中a[0],a[1]指向a1和a2,其中a1,a2前面的&

是取址符号。

从a[3]~a[9]还没有指向任何对象,也就没有调用任何构造函数了。

调用构造函数的情况发生在类似这样的语句中a[3]=newAB()

6.intAB:

:

bb=10;

7.重载虚函数

8.抽象类

9.13

10.delete[]ptr;

三、阅读程序

1、1342

2.n=11

n=12

解析:

int*pn=&

n;

这句说明pn是个指针,并且他指向n。

int*&

rn=pn;

这句看起来比较复杂,我们可以这样理解,既然可以把pn的值赋值给rn,那rn首先是个指针,而且是整型指针也就是int*。

然后看到rn的前面有&

,这个符号位于等号的左边,所以他是个引用符号。

综上就是,rn是个指向整型指针的pn的引用,也就是pn的别名而已,可以把它们看成同一个东西。

所以(*pn)++;

(*rn)++;

这两句实际上都在操作n,因为他们都指向n。

3、A:

a=1

A:

其实这题就是看你对多态性质的理解。

B和C都继承于A,并且都定义了各自的show函数,所以B,C从A继承而来的show会被重写。

然后定义了一个A类型的指针p,分别用父类指针p去指向a,和他的子类对象b,c。

每次都调用一次show(),但是实际上调用的都是A类的show。

原因在于指针p是A类型的,他只懂得到A类中去找show函数。

其实这也是多态性质提出的原因,人们想通过父类指针来调用它真实对象的函数。

在A类的show函数中加上前缀virtual就形成多态了。

答案也会变得不同。

4、ConstructorofCBase.m_data=abcd

ConstructorofCDerived.m_data=abcd

DestructorofCBase.m_data=abcd

问题在于析构过程中只调用了基类的析构函数。

正确的析构应该是先执行CDerived的析构函数,再执行CBase的析构函数。

在~CBase()加上virtual关键字即可。

四、算法设计题

第一题解答

第二题解答:

(1)基本的基本设计思想:

设置二叉树的平衡标记balance,以标记返回二叉树bt是否为平衡二叉树,若为平衡二叉树,则返回1,否则返回0;

h为二叉树bt的高度。

采用前序遍历的递归算法:

①若bt为空,则高度为0,balance=1。

②若bt仅有根结点,则高度为1,balance=1。

③否则,对bt的左、右子树执行递归运算,返回左、右子树的高度和平衡标记,bt的高度为最高子树的高度加1。

若左、右子树的高度差大于1,则balance=0;

若左、右子树的高度差小于1,且左、右子树都平衡时,balance=1,否则balance=0。

(2)算法的实现如下:

voidJudge_AVL(BiTreebt,int&

balance,int&

h){

intbl,br,hl,hr;

//左、右子树的平衡标记和高度

if(bt==NULL){//空树,高度为0

h=0;

balance=1;

}

elseif(p->

lchild==NULL&

p->

rchild==NULL){//仅有根结点,则高度为1

h=1;

else{

Judge_AVL(bt->

lchild,bl,hl);

//递归判断左子树

rchild,br,hr);

//递归判断右子树

h=(hl>

hr?

hl:

hr)+1;

if(abs(hl,hr)<

2)//若高度绝对值小于2,则看左、右子树是否都平衡

balance=bl&

br;

//&

为逻辑与,即左、右子树都平衡时,二叉树平衡

else

balance=0;

}

第三题解答

第四题答案:

(1)该邻接表存储对应的带权有向图如下:

(2)以顶点V1为起点的广度优先搜索的顶点序列依次为V1,V2,V4,V6,V3,V5,对应的生成树如下:

(3)生成树:

顶点集合V(G)={V1,V2,V3,V4,V5,V6},边的集合E(G)={(V1,V2),(V2,V3),(V1,V4),(V4,V5),(V5,V6)}。

(图略)

(4)V1到V3最短路径为67:

(V1—V4—V3)。

从v1点开始,第一趟寻找v1和点集{v2,v3,v4,v5,v6}之间的最小权值的边。

(v5,v1)。

第二趟寻找点集{v1,v5}和点集{v2,v3,v4,v6}之间的最小权值的边。

(v5,v6)。

第三趟寻找点集{v1,v5,v6}和点集{v2,v3,v4}之间的最小权值的边。

(v1,v4)。

第四趟寻找点集{v1,v4,v5,v6}和点集{v2,v3}之间的最小权值的边。

(v4,v2)。

第五趟寻找点集{v1,v2,v4,v5,v6}和点集{v3}之间的最小权值的边。

(v2,v3)。

所以最小生成树的边集合为{(v5,v1),(v5,v6),(v1,v4),(v4,v2),(v2,v3)}(图形略)

第四题解答

(1)算法的基本设计思想如下。

分别求出序列A和B的中位数,设为a和b,求序列A和B的中位数过程如下:

1.若a=b,则a或b即为所求中位数,算法结束。

2.若a<

b,则舍弃序列A中较小的一半,同时舍弃序列B中较大的一半,要求舍弃的长度相等。

3.若a>

b,则舍弃序列A中较大的一半,同时舍弃序列B中较小的一半,要求舍弃的长度相等。

在保留的两个升序序列中,重复过程1)、2)、3),直到两个序列中只含一个元素时为止,较小者即为所求的中位数。

(2)算法的实现如下:

(3)算法的时间复杂度为O(log2n),空间复杂度为O

(1)。

预测题:

解题思路---->

显然并查集了。

思路可以很清晰的,一开始假设大家都各自信仰一个宗教,那么总的数目ans就是学生数目,每当发现有一对学生信仰同一个宗教,那么ans--;

1.#include 

<

iostream>

2.using 

namespace 

std;

3. 

4.const 

int 

MAXN 

50005;

/*结点数目上线*/ 

5.int 

pa[MAXN];

/*p[x]表示x的父节点*/ 

6.int 

rank[MAXN];

/*rank[x]是x的高度的一个上界*/ 

7.int 

n, 

ans;

8. 

9.void 

make_set(int 

x) 

10.{/*创建一个单元集*/ 

11. 

pa[x] 

x;

12. 

rank[x] 

0;

13.} 

14. 

15.int 

find_set(int 

16.{/*带路径压缩的查找*/ 

17. 

if(x 

!

pa[x]) 

18. 

find_set(pa[x]);

19. 

return 

pa[x];

20.} 

21. 

22./*按秩合并x,y所在的集合*/ 

23.void 

union_set(int 

x, 

y) 

24.{ 

25. 

find_set(x);

26. 

find_set(y);

27. 

== 

y)return 

;

28. 

ans--;

//统计 

29. 

if(rank[x] 

>

rank[y])/*让rank比较高的作为父结点*/ 

30. 

31. 

pa[y] 

32. 

33. 

else 

34. 

35. 

y;

36. 

rank[y]) 

37. 

rank[y]++;

38. 

39.} 

40.//answer 

to 

2524 

41.int 

main() 

42.{ 

43. 

m, 

i, 

1, 

44. 

while(scanf("

%d%d"

 

m)) 

45. 

46. 

if(n 

0) 

break;

47. 

for(i 

1;

i++) 

48. 

make_set(i);

49. 

ans 

50. 

m;

51. 

52. 

scanf("

y);

53. 

union_set(x, 

54. 

55. 

printf("

Case 

%d:

%d\n"

j, 

ans);

56. 

j++;

57. 

58. 

59.} 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1