考研 计算机 答案解析,考研计算机答案解析.doc

本文提供了2009年计算机专业研究生入学考试的参考答案,包括选择题答案及部分综合应用题的解答过程。通过具体实例讲解了最短路径算法、单链表倒数第K个元素查找算法、中断与DMA方式下的CPU占用率计算等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PAGE

2009年计算机统考真题参考答案

一. 选择题

1

2

3

4

5

6

7

8

9

10

B

C

D

B

C

B

A

D

A

B

11

12

13

14

15

16

17

18

19

20

C

D

D

C

D

C

A

A

D

B

21

22

23

24

25

26

27

28

29

30

D

A

D

D

C

A

C

B

A

A

31

32

33

34

35

36

37

38

39

40

B

A

B

B

C

A

D

D

C

A

二. 综合应用题

41.该方法求得的路径不一定是最短路径。例如,对于下图所示的带权图,如果按照题中的原则, 从A到C的最短路径为A→B→C,事实上其最短路径为

A→D→C。

42.(1)算法基本思想如下:从头至尾遍历单链表,并用指针P指向当前节点的前K个节点。当遍历 到链表的最后一个节点时,指针P所指向的节点即为所查找的节点。

(2)详细实现步骤:增加两个指针变量和一个整型变量,从链表头向后遍历,其中指针P1指向当 前遍历的节点,指针P指向P1所指向节点的前K个节点,如果P1之前没有K个节点,那么P指向表头 节点。用整型变量i表示当前遍历了多少节点,当i>k时,指针p随着每次遍历,也向前移动一个节 点。当遍历完成时,p或者指向表头就节点,或者指向链表中倒数第K个位置上的节点。

(3)算法描述:

Int LocateElement(linklist list,int k

{

P1=list->link; P=list;

i=1;

while(P1)

{

P1=P1->link; i++;

if(i>k) p=p->next; //如果i>k,则p也往后移

}

if(p==list)return 0; //说明链表没有k个结点

else

{

printf(“%d\n“,p->data); return 1;

}

}

43. (1)在中断方式下,每32位(4B)被中断一次,故每秒中断 0.5MB/4B=0.5×106/4=12.5×104次

要注意的是,这里是数据传输率,所以1MB=106B。因为中断服务程序包含18条指令,中断服务的 其他开销相当于2条指令的执行时间,且执行每条指令平均需5个时钟周期,所以,1秒内用于中断 的时钟周期数为

(18+2)×5×12.5×104=12.5×106

(2)在DMA方式下,每秒进行DMA操作

5MB/5000B=5×106/5000=1×103 次因为DMA预处理和后处理的总开销为500个时钟周期,所以1秒 钟之内用于DMA操作的时钟周期数为

500×1×103=5×105

故在DMA方式下,占整个CPU时间的百分比是

((5×105)/(500×106))×100%=0.1%

44.指令执行阶段每个节拍的功能和有效控制信号如下所示

时钟

功能

有效控制信号

C5

MAR←(R1)

PCout,MARin

C6

MDR←M(MAR)

MemR,MDRinE

C7

A←(R0)

R0out,Ain

C8

AC←(MDR)+(A)

MDRout,Addr,ACin

C9

MDR←(AC)

ACout,MDRin

C10

M(MAR) ←MDR

MDRoutE,MemW

45.定义信号量S1控制P1与P2之间的同步;S2控制P1与P3之间的同步;empty控制生产者与消费者 之间的同步;mutex控制进程间互斥使用缓冲区。程序如下:

Var s1=0,s2=0,empty=N,mutex=1;

Parbegin

P1:begin

X=produce();

/*生成一个数*/

P(empty);

/*判断缓冲区是否有空单元*/

P(mutex);

/*缓冲区是否被占用*/

Put();

If x%2==0

V(s2);

/*如果是偶数,向P3发出信号*/

else

V(s1);

/*如果是奇数,向P2发出信号*/

V(mutex);

/*使用完缓冲区,释放*/

end.

P2:begin

P(s1);

/*收到P1发来的信号,已产生一个奇数*/

P(mutex);

/*缓冲区是否被占用*/

Getodd();

Countodd():=countodd()+1;

V(mutex);

/*释放缓冲区*/

V(empty);

/*向P1发信号,多出一个空单元*/

end.

P3:begin

P(s2)

/*收到P1发来的信号,已产生一个偶数*/

P(mutex);

/*缓冲区是否被占用*/

Geteven();

Counteven():=counteven()+1;

V(mutex);

/*释放缓冲区*/

V(empty);

/*向P1发信号,多出一个空单元*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值