1996年高级程序员级下午试题.docx
《1996年高级程序员级下午试题.docx》由会员分享,可在线阅读,更多相关《1996年高级程序员级下午试题.docx(17页珍藏版)》请在冰豆网上搜索。
1996年高级程序员级下午试题
1996年高级程序员级下午试题
从以下的3道试题(试题一至试题三)中任选2道解答。
如果解答的试题数超过2道,则解答的前2道有效。
试题一
阅读下列说明和流程图,回答问题1至问题3,把解答写在答卷的对应栏内。
【说明】
本流程图描述了某行业分类电话号码簿(简称号簿)出版系统的处理流程。
全市所有电话的基本信息均存放在营业库中。
系统输入工单,工单中包括电话的新装、拆除、移机、更改(更改户名、地址、电话号码等)等信息。
为确保输入工单的正确性,每张工单均由两个录入员分别录入,由处理1进行输入和校对,然后更新营业库。
系统根据待出版号簿的行业类型从营业库中选取该类用户的电话信息,存放在号簿中。
同时向每个电话用户发布用户函,用户函上记录着将刊登在号簿上的该用户的户名、地址、电话号码等信息,用户函上的序号标志着该用户信息在号簿库中的位置。
用户收到用户函后自行校对,并将修改内容和印刷要求(字体大小和是否套红)填写在用户回执中,系统按收到用户回函的先后顺序依次输入用户回函,然后更新号簿库。
最后通过排版输出经用户校对并符合其印刷要求的号簿清样。
系统中部分单据和文件的格式如下:
工单=工单类型+原户名+新户名+原地址+新地址+原电话号码+新电话号码
营业库纪录=户名+地址+电话号码+分类信息
用户函=序号+户名+地址+电话号码
用户回函=序号+户名+地址+电话号码+套红标记+字体大小
【流程图】
【问题1】
流程图中哪些处理能发现工单的哪些错误,并举例说明。
【问题2】
指出号簿库文件的纪录至少应包括哪些数据项。
【问题3】
为提高处理速度,流程图需作何改进。
试题二
阅读下列说明和流程图,回答问题1至问题2,把解答写在答卷的对应栏内。
【说明】
本流程图将数字1,2,…,N2(N≥2)按逆时针方向依次写在N*N矩阵中,下图给出了N=4和N=5时的情况:
1
12
11
10
1
16
15
14
13
2
13
16
9
2
17
24
23
12
3
14
15
8
3
18
25
22
11
4
5
6
7
4
19
20
21
10
5
6
7
8
9
N=4时
N=5时
【问题1】
填充流程图中的①~⑥使之成为完整的流程图。
【问题2】
若将数字1,2,…,N2按顺时针方向依次写在N*N矩阵中,则只需将上述流程图中的__⑦__改成__⑧__即可。
【流程图】
注:
图中[W]表示不大于W的最大整数。
试题三
阅读以下说明和E-R图,回答问题,讲解答写在答卷的对应栏内。
【说明】
设有下列关于运动会管理系统的E-R图。
图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体之间的关系。
假定已通过下列SQL语言建立了基本表:
CREATETABLEATHLETE
(ANOCHAR(6)NOTNULL,
ANAMECHAR(20),
ASEXCHAR
(1),
ATEAMCHAR(20));
CREATETABLEITEM
(INOCHAR(6)NOTNULL,
INAMECHAR(20),
ITIMECHAR(10),
IPLACECHAR(20));
CREATETABLEGAMES
(ANOCHAR(6)NOTNULL,
INOCHAR(6)NOTNULL,
SCORRECHAR(10));
为了答题的方便,图中的实体和属性同时给出了中英文两种名字,回答问题时只需写出英文名即可。
【E-R图】
【问题】
填充下列SQL程序3.1~3.4中的①~⑦,使它们分别完成相应的功能:
程序3.1:
统计参加比赛时运动员人数
SELECT__①__
FROMATHLETE
WHEREASEX='M';
程序3.2:
查100872号运动员参加的所有项目及其比赛时间和地点
SELECTITEM,INO,INAME,ITIME,IPLACE
FROMGAMES,ITEM
WHERE__②__
AND__③__;
程序3.3:
查参加100035项目的所有运动员名单
SELSECTANO,ANAME,ATEAM
FROMATHLETE
WHERE__④__
(SELECT__⑤__
FROMGAMES
WHEREGAMES.ANO=ATHLETE.ANO
ANDINO='100035');
程序3.4:
建立运动员成绩视图
__⑥__ATHLETE_SCORE
ASSELECTATHLETE,ANO,ANAME,ATEAM,INAME,SCORE
FORM__⑦__
WHEREATHLETE,ANO=GAMES,ANO
ANDGAMES.INO=ITEM.INO;
试题四为必答题。
试题四
在COMET型计算机上可以使用试卷上所附的CASL汇编语言。
阅读下列程序说明和CASL程序,将应填入程序中__?
__处的字句,写在答卷的对应栏内。
【程序说明】
子程序OFFSET用二分法,查找无符号整数M在一个长度为N的有序(升序)无符号整数列表NTABLE中的位置。
程序中标号为LOW和UP的两个存储字分别用作存放查找区间的上下限。
进入子程序时,在GR1中给出存放子程序所需参数的起始地址。
参数的存放次序如下:
(GR1)+0
M
1
N
2
NTABLE的首址
从子程序返回时,GR0中存放查找结果,即M在此有序表中的位置序数,如表中找不到M,则GR0中返回0,其它寄存器的内容保持不变。
[程序]
START
OFFSET
PUSH
0,GR2
PUSH
0,GR3
LD
GR0,0,GR1
LEA
GR2,0
ST
GR2,LOW
___
(1)___
___
(2)___
ST
GR2,UP
LOOP
ADD
GR2,LOW
SRL
GR2,1
LEA
GR3,0,GR2
___(3)___
___(4)___
JZE
FOUND
JPZ
INCLOW
LEA
GR2,-1,GR2
;MST
GR2,UP
JMP
CMPLU
INCLOW
LEA
GR2,1,GR2
;M>NTABLE(K)
ST
GR2,LOW
;K+1→LOW
___(5)___
CMPLU
CPL
GR2,LOW
___(6)___
___(7)___
FOUND
LEA
GR0,1,GR2
POP
GR3
POP
GR2
RET
LOW
DS
1
UP
DS
1
END
从下列的2道试题(试题五至试题六)中任选1道解答。
如果解答的试题数超过1道,则解答的前1道有效。
试题五
阅读以下程序说明和C程序,将应填入程序中__?
__处的字句,写在答卷的对应栏内。
【程序说明】
本程序是一个简单的计算器模拟程序。
对任意给定的正确四则运算表达式,程序计算其结果值并输出。
表达式中运算分量为无正负号整数,运算符为+、_、*、/,圆括号按常规配对,表达式以字符"="结束。
函数getach()为获取表达式的一个合法字符,并将字符存入变量curch;函数指针数组func[]是为了统一加减乘除计算而设置的。
【程序】
#include
intadd(intx,inty){returnx+y;}
intsub(intx,inty){returnx-y;}
intmul(intx,inty){returnx*y;}
intdiv(intx,inty){returnx/y;}
int(*func[])()={add,sub,mul,div};
intnum,curch;
charchtbl[]="+-*/()=";
charcorch[]="+-*/()=0123456789";
intgetach()
{inti;
while
(1)
{curch=getchar();
if(curch==EOF)return-1;
for(i=0;corch[i]&&curch!
=corch[i];i++);
if(i}
returncurch;
}
intgetid()
{inti;
if(curch>='0'&&curch<='9')
{for(num=0;curch>='0'&&curch<='9';getach())
num=__①__;
return-1;
}
else{for(i=0;chtbl[i];i++)
if(chtbl[i]==curch)break;
if(i<=5)getach();
returni;
}
}
intcal()
{intx1,x2,x3,op1,op2,i;
i=getid();
if(i==4)x1=cal();elsex1=um;
op1=getid();
if(op1>=5)returnx1;
i=getid();
if(i==4)x2=cal();elsex2=num;
op2=getid();
while(__②__)
{i=getid();
if(i==4)x3=cal();elsex3=num;
if((op1/2==0)&&(op2/2==1))
x2=(*func[op2](x2,x3));
else{x1=__③__;
x2=x3;
__④__;
}
op2=getid();
}
return__⑤__(x1,x2);
}
voidmain()
{intvalue;
printf("Pleaseinputanexpression:
\n");
getach();
while(curch!
='=')
{value=cal();
printf("Theresultis:
%d\n",value);
printf("Pleaseinputanexpression:
\n");
getach();
}
}
试题六
阅读下列程序说明和FORTRAN程序,将应填入程序中__?
__处的字句,写在答卷纸的对应栏内。
【程序说明】
子程序SUM计算数列
1,1/2,1/3,…,1/n,…
的前n项和,并以M位小数形式输出(M≤60)。
为提高计算结果的精度,用分数形式计算并存放数列的部分和,求和结果记为
A+U/V
其中U/V是不可约真分数,A为整数。
例如:
n=5,M=10时,子程序输出为
1+1/2+1/3+1/4+1/5=2+17/60
2.283333333
整型函数GCD用辗转相除法计算U和V的最大公约数。
【程序】
SUBROUTINESUM(N,M)
INTEGERA,U,V,G,D(60),GCD
A=1
U=0
V=1
DO20K=2,N
U=__①__
V=__②__
A=__③__
U=MOD(U,V)
__④__
U=U/G
V=V/G
20 CONTINUE
WRITE(*,100)N,A,U,V
100 FORMAT(1X,'1+1/2+1/3+…+1/',I2,'=',I2,'+'I10,'/',I10)
DO40I=1,M
D(I)=__⑤__
__⑥__
40 CONTINUE
WRITE(*,200)A,(D(I),I=1,M)
200 FORMAT(1X,I2,'.',60I1)
END
INTEGERFUNCTIONGCD(U,V)
INTEGERU,V
K=V
L=U
10 IF(MOD(K,L).GT.0)THEN
J=MOD(K,L)
K=L
L=J
GOTO10
ENDIF
__⑦__
END
从下列的2道试题(试题七至试题八)中任选1道解答。
如果解答的试题数超过1道,则解答的前1道有效。
试题七
阅读下列程序说明和C程序,将应填入程序中__?
__处的字句,写在答卷纸的对应栏内。
【程序说明】
本程序先从文件读入各考生的准考证号(设为整型数)及成绩,并将其存放在一棵检索二叉树上,二
叉树的结点的键值是成绩,二叉树每个节点带一链表,链表结点存放取得该成绩的考生的准考证号。
然后,程序按中序遍历检索二叉树,从高到底分输出结果,使每行输出某成绩及其取得该成绩的各考生的准考证号。
【程序】
#include
typedefstructidnode{
intid;
structidnode*next;
}IdNode;
typedefstructmarknode{
intmark;
IdNode*head;
structmarknodeleft,right;
}MarkNode;
charfname[]="sp07.dat"'
main()
{intid,mark;
MarkNode*root=null;
FILE*fp=fopen(fname,"r");
if(!
fp){
printf("file%sopenerror.\n",fname);
exit(0);
}
while(!
feof(fp)){
fscanf(fp,"%d%d",&id,&mark);
btree(&root,id,mark);
}
fclose(fp);
print(root);
}
btree(MarkNode**mpptr,intid,intmark)
{IdNode*ip;
MarkNode*mp=mpptr;
if(__①__){
if(mark==mp->mark)addIdNode(__②__,id);
elseif(mark>mp->mark)btree(&mp->left,id,mark);
elsebtree(&mp->right,id,mark);
}else
{mp=(MarkNode*)malloc(sizeof(MarkNode));
mp->mark=mark;
mp->left=mp->right=NULL;
__③__
addIdNode(&mp->head,id);
__④__
}
}
addIdNode(IdNode**ipp,intid)
{IdNode*ip=ipp;
if(__⑤__)addIdNode(__⑥__,id);
else{
ip=(IdNode*)malloc(sizeof(IdNode));
sp->id=id;
ip->next=NULL;
__⑦__
}
}
print(MarkNode*mp)
{IdNode*ip,ip0;
if(mp){
print(mp->left);
printf("%6d:
\t",mp->mark);
ip=mp->head;
while(ip){
printf("%6d:
\t",ip->id);
ip0=ip;
ip=ip->next;
free(ip0);
}
printf("\n");print(mp->right);free(mp);
}
}
试题八
阅读下列程序说明和FORTRAN程序,将应填入程序中__?
__处的字句,写在答卷纸的对应栏内。
【程序说明】
某公司招聘M个工种(编号为1~M)的工作人员,每个工种有各自的计划招工数。
共有N位应聘者,每位应聘者有一报名号,且必须申报两个工种志愿,并参加公司组织的笔试和面试。
公司为每位应聘者评定一个综合考试成绩(0~100分)。
然后从高分到低分(分数相同者报名号小的优先)依次对每个应聘者进行录用。
录用的原则如下:
(1)对同一应聘者,第一志愿优于第二志愿。
(2)若应聘者的第一志愿工种已录满,则将其成绩减去5分后,立即参加第二志愿录用。
(3)在一个工种录取时,按申报该工种的应聘者"录用成绩"(第一志愿为考试成绩,第二志愿为考试成绩减5分)从高到底次序录用,"录用成绩"相同者,按报名号从小到大顺序优先录用。
(4)允许某工种未招满计划招工数。
程序中数组NO、MARK、ZY1、ZY2分别存放应聘者的报名号、考试成绩、第一志愿工种遍号和第二志愿工种编号,并假定它们已先按考试成绩降序、后按报名号升序的顺序排列,数组GZ存放各工种的计划招工数。
子程序RY按上述录用原则完成录用工作。
录用过程中使用了三维数组RYNO,数组的最终值即为各工种的录取顺序名单。
数组元素RYNO(K,J,1)和RYNO(K,J,2)分别存放第K个工种准备录用的第1名应聘者的报名号和"录用成绩"。
数组元素TOP(K)存放录用过程中第K个工种已存入数组RYNO的人数。
子程序INSERT将报名号NOI和成绩MARKI按"录用成绩"降序顺序插入到数组RYNO第K个工种的相应位置中。
【程序】
SUBROUTINERY(NO,MARK,ZY1,ZY2,GZ,RYNO,TOP,M,N)
INTEGERNO(N),MARK(N),ZY1(N),ZY2(N),GZ(N)
INTEGERRYNO(M,N,2),TOP(,M)
DO10I=__①__
10 TOP(I)=0
DO20I=1,N
K1=ZY1(I)
K2=ZY2(I)
IF(TOP(K1).LT.GZ(K1))THEN
__②__
CALLINSERT(RYNO,M,N,K1,TOP(K1),NO(I),MARK(I))
CALLINSERT(RYNO,M,N,K1,TOP(K1),NO(I),MARK(I))
ELSEIF(TOP(K20.LT.GZ(K2))THEN
TOP(K2)=__③__
RYNO(K2,TOP(K2),1)=NO(I)
RYNO(K2,TOP(K2),2)=__④__
ENDIF
20 CONTINUE
END
SUBROUTINEINSERT(RYNO,M,N,K,TOPK,NOI,MARKI)
INTEGERRYNO(M,N,2),TOPK
10 IF(J.EQ.0)THEN
RYNO(K,1,1)=NOI
RYNO(K,1,2)=MARKI
ELSEIF(MARKI__⑤__RYNO(K,J,2))THEN
RYNO(K,J+1,1)=NOI
RYNO(K,J+1,2)=MARKI
ELSE
__⑥__
__⑦__
J=J-1
GOTO10
ENDIF
END