中国科学院计算技术研究所
一九九二年招收硕士学位研究生入学考试试题答案
试题名称:软件基础
填空
顺序结构、链表结构
有向无环图
程序共行(并发)、资源共享(共享)
综合属性、继承属性
互斥、同步
系统资源不足、进程推进顺序非法
严格计算(直接计算)、短路计算
O(m+n)
先序、中序、后序、深度优先、广度优先
由关键字直接计算记录存放位置的查找方法称为哈希查找。(3分)
UNIX系统中设备管理的特点有:(4分)
块设备管理和字符设备管理具有相似的层次结构;
把字符设备作为特别文件处理;
采用了完善的缓冲技术;
引入了“预先读”、“异步写”和“延迟写”方式。
直接插入排序第二趟的结果
[38 49] 65 97 76 13 27 49
快速排序第二趟的结果
[13] 27 [38] 49 [49 65] 76 [97]
由于一个作业装入到与其地址空间不一致的存储空间所引起的、有关地址部分的填整过程,称之为地址重定位。动态重定位的特点是:在程序执行时才进行重定位,它需要硬件的支持。
逻辑结构指数据元素之间的逻辑关系;物理结构指数据结构在计算机存储中的映像。
活动记录包含(答对4个即可得分)
临时工作单元:用于存放计算过程中所需的临时变量;
局部数据:用于存放对应当前活动记录的程序单元的局部数据;
保存机器态部分:用于保存当前的程序计数器、寄存器的值等等;
访问链:把当前执行的程序单元可访问的活动记录联结起来;
控制链:把所有活动记录按它们生成的次序联结起来;
实在参数
返回值
该变量在编译时被优化掉了,所以无法检查其值。
问答题:
Fortran的词法分析比Pascal的词法分析复杂;
Fortran语言将一行分为标号、续行、语句、注释四个区,出现在不同区域的符号具有不同的含义。词法分析器必须结合符号出现的位置才可判定其属性;而Pascal语言中的记号识别则与位置无关;
Fortran语言认为空格无意义,使得对某些符号的识别取决于后面的符号;而在Pascal语言中,每遇过一个空白字符,则认为一个记号已识别完毕。
该文法不是LR(1)文法。因为其为二义文法。
S A1A2
可将任意输入串aa……a截取任意长度的前缀归约为A1,而将剩下的全部归约为A2。
发送进程在发送消息之前,先在自己的内存空间设置一发送区,填入消息正文等信息,然后调用发送原语(Send)。进入发送程序后,先找到接受进程的PCB,再申请获得一消息缓冲区空间,然后互斥进入接受进程的消息队列,找到队尾,把消息缓冲区挂在队尾,把消息正文及长度等从发送区复制到消息缓冲区,最后通过V操作通知接收进程,并退出发送程序,发送进程继续执行。
接收进程在读取消息之前,先在自己的内存空间设置一接收区,然后使用Read原语,在进入读取程序后,先通过P操作检查有无消息,然后互斥进入消息队列,移出队列中的第一个消息,并把消息从缓冲区复制到接收区,最后释放缓冲区,退出读取程序,接收进程继续执行。
锁原语的原定义:
Lock(w):
L:if w = 1 then goto L else w :=1
Unlock(w):
w:=0
用SWAP指令实现的锁原语:
Lock(w):
key:=1;
repeat
swap(w,key)
until key=0;
Unlock(w)
key:=0;
swap(w,key);
算法设计
设全局变量n存放当前树的最大深度,则程序为:
procedure visit(lev:integer;root:bitreptr);
begin
case
root↑.left = nil and root↑.right =nil:
if lev > n then n := lev;
return;
root↑.left = nil:
call visit(lev+1;root↑.right);
root↑.right = nil:
call visit(lev+1;root↑.left);
else
call visit(lev+1;root↑.left);
call visit(lev+1;root↑.right);
end /*case*/
end
begin /* main */
n := 0;
call visit(0 , root);
write(n);
end /*main*/
堆排序的算法
数据结构定义
type rectype = record
key : keytype
end;
filetype = array [0..n] of rectype;
算法描述
procedure heapsort(var r : filetype);
begin
for i := n div 2 downto 1 do call sift(r , i , n);
for i :=n downto 2 do
[ r[1] ( r[i]; call sift(r , 1 , i-1);]
end; {heapsort}
procedure sift(var r : filetype; l , m : integer);
begin
i := l; j := 2*i; x := r[i];
while j≤m do
[ if (j<m) and (r[j].key>r[j+1].key) then j:=j+1;
if x.key>r[j].key
then [ r[i]:=r[j]; i:=j; j:=2*i;]
else j := m+1; ]
r[i] := x;
end; /*sift*/
最坏情况下的时间复杂度为O(nlogn)。