1994年高级程序员下午试题及答案

来源:网络发布时间:2007-05-12
试题 l

阅读下列说明和流程图,回答问题 1 至问题 3,将解答写在答卷的对应栏内。

[说明]

流程图 l 描述了某电信局数据通信专线计费业务管理系统的部分处理流程。

1.凡申请专线者,均需填写专线申请表。系统把申请表存储在专线申请登记文件中,等待分 配专线号。

2.系统为申请者指定专线号,并根据通信距离( 按地区计算 )、通信速率计算初装费和月租费 ,然后发初装通知单绐用户,并产生施工单交有关部门施工。同时产生专线处理文件。专线号是 专线的唯一标识。

3.施工结束后,系统更新用户文件.并产生专线计费文件,作为以后收费的依据。

4.一个用户可以租用多条专线,用户可用现金或银行托付两种方式支付租金,但一个用户只能使用一种付款方式。系统每月按用户( 而不是专线 )为单位计费出帐。

5.流程图中各数据文件及有关单据所含的数据项如下:

专线申请表及专线申请登记文件:

用户名称,付款卞式,开户银行代码,帐号,主端名称,主端地址,申请号,对端地址,端所在地区,通洁速率,设备接门,申请日期

专线处理文件:

申清号,专线号,用户名称,付款方式,开户银行代码,帐号,初装费,月租费,完工日期 初装费收据: 专线号,初装费,交费日期

施工单:

施工单号,专线号,主端名称,主端地址,对端地址,对端所在地区,通信速率,设备接口, 申请日期,施工期限 完工单: 施工单号,专线号,完工日期

用户文件:

用户编号,用户名称,付款方式,开户银行代码,帐号

专线计费文件:

专线号,用户编号,月租金,开通日期

[问题 1]

专线价目文件由哪些数据项组成。

[问题 2]

为了避免在用户尚未支付初装费时就去施工,有人提议将图中从处理 2 产生施工单改成从处理 3 产生施工单。试问从处理 3 能否产生施工单? 为什么?

[问题 3]

当一个用户租用多条专线时,若允许该用户对其中的一些专线采用现金支付,对另一些专线 采用银行托付方式,则在尽量减少数据冗余的前提下,应如何调整有关的数据文件。

[流程图1]

 

试题 2

阅读下列说明和流程图,回答问题1和问题2,把解答写在答卷的对应栏内。

[说明]

流程图 2-1 用来实现在数组 A(n) 中寻找第K大的元素。 算法思想是通过比较和交换,在区间 1~n 中找到一个 m,使 A(1)~A(m-1) 的值均大于 A(m), A(m+1)~A(n) 的值均小于 A(m)。若 m=K,则 A(m) 即为第 K 大的元素,否则调整查找区间,继续上述 查找。

[问题 1]

填充流程图 2-l 中的①~⑤,使之成为完整的流程图。

[问题 2]

若将流程图 2-1 中的虚框部分改成图 2-2 所示的框图,则当 A(1) 为数组 A 的最大元素时,修改后 的流程图能否正常运行? 为什么?

[流程图 2-1]

 

   

试题 3

阅读下列说明和流程图,回答问题 1 和问题 2,把解答写在答卷的对应栏内。

[说明]

流程图 3 用来将数组 A 中的 n( n≥2 ) 个数经变换后存储到数组B中。变换规则如下:

1.若 A 中有连续 t 个相同的元素( t>1 ),则在 B 中存入 t 和该元素的值;

2.若 A 中有连续 t 个元素( t≥1 ),其中每个元素都与相邻的元素不相同,则在 B 中存入 -t 和这 t 个元素的值。

例如:

A = { 3,3,3,3,5,5,7,6,3,6,2,2,2,2,1,2 } 则变换后 B = { 4,3,2,5,-4,7,6,3,6,4,2,-2,l,2 } 流程图中,逻辑变量 C 用来区分正在进行连续相同元的计数还是连续不等元的计数,K1 用来记 录数组 B 中存放 t 或 -t 的元素的下标。

[问题 1]

填充流程图中的 ①~⑤,使之成为完整的流程图。

 

[NextPage]

[问题 2]

如果删除流程图中的判断框 t+1,那末,当数组 A={ 5,5,4,4 }时,经改变后的流程图的变换,数组 B 将会有什么样的元素值?

[流程图3]

 

试题4

阅读下列说明和流程图,回答问题 1 至问题 3,把解答写在答卷的对应栏内。

[说明]

流程图 4-1 用于把文件 A 和文件 B 合并成按上升顺序分类(排序)的文件 C。 已知文件 A 和 B 中的关键码均小于 M。

[问题 1]

为使流程图 4-1 能正确工作,文件 A 和文件 B 诸记录的关键码必须满足什么条件?

[问题2]

按流程图 4-1 的处理方式,分别指出文件 A 和文件 B 至少应含有的记录个数。

[问题3]

若将流程图 4-1 中的虚线部分改成框图 4-2,则图中的“判断条件”应是什么?

[流程图 4-1 ]

 


试题5

阅读下列说明和 E—R 图,回答问题,把解答写在答卷的对应栏内。

[说明]

设有下列关于学生成绩管理系统的 E—R 图。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体间的联系。假定已通过下列 SQL 语言建立了基本表: 

CREATE TABLE STUDENT 

( SNO CHAR(6)NOT NULL,

SNAME CHAR(20),

DEPT CHAR(20),

AGE SMALLINT);

CREATE TABLE COURSE

( CNO CHAR(6)NOT NULL,

CNAME CHAR(20),

HOUR SMALLINT);

CREATE TABLE S—C

( SNO CHAR(6),

CNOefIAR(6),

GRADE SMALLINT );

为了答题的方便,图中的实体和属性同时给出了中英两种名字,回答问题时只须写出英文名即可。

[E-R]图

 

 

 

[问题]

填充下列 SQL 程序 5.1~5.4 中的 ①~⑥,使它们分别完成以下查询功能:

程序 5.1:检索选读所有课程的学生姓名。

程序 5.2:给出全体学生人数。

程序 5.3:按学号给出每个学生的平均成绩。

程序 5.4:按学号给出每个学生选读课程的门数。

[程序 5.1]

SELECT STUDENT.SNAME

FROM STUDENT

WHERE[__①__]

( SELECT * 

FROM COURSE

WHERE[__②__]

( SELECT *

FROM S-C

WHERE[__③__]))

[程序 5.2]

SELECT [__④__]

FROM STUDENT

[程序 5.3]

SELECT [__⑤__]

FROM S-C

GROUP BY SNO

[程序 5.4]

SELECT [__⑥__]

FROM S-C

GROUPBY SNO

 

必 答 题


试题6

在 COMET 型计算机上可以使用试卷上所附的 CASL 汇编语言。阅读下列程序说明和 CASL 程序,把应填入其中[__n__]处的字句,写在答卷的对应栏内。

[程序说明]

子程序 DIVIDE 将真分数 a/b ( 0<a<b )转换成 N 位小数( 0<N≤20 ),并输出结果。

子程序从栈中接受参数。参数的入栈顺序为:分子 (a)、分母 (b) 和小数位数 (N)。进入子程序已保证 0<a<b 且 0<N≤20,子程序不再对参数作合法性检查。

由于需要将结果输出,所以子程序中计算出每一位小数后直接用字符方式顺次存放在标号 OUTPUT 之后的存储区域中。数字字符 0~9 的 ASCII 编码依次是 48~57。

[程序]

STARTDIVIDE
DIVIDELEAGR3,2
LDGRl,l,GR4
LEAGRl,2,GRl
STGRl,OUTLEN
LDGR0,[__1__]
DICITLEAGR2,48
SLAGR0,1
STGR0,WORK
SLAGR0,2
ADDGR0,WORK
SUBSTCPAGR0,[__2__]
JMIGOOD
[__3__]
[__4__]
JMPSUBST
GOODSTGR2,OUTPUT,GR3
LEAGR3,1,GR3
SLL[__5__]
JZEOUT
CPAGR3,OUTLEN
JMIDIGIT
OUTSTGR3,OUTLEN
OUTOUTPUT,OUTLEN
RET
OUTPUTDC'0·'
DS20
OUTLENDS1
WORKDS1
END

 

从下列的4道试题(试题7至试题10)中任选l道解答。 如果解答的试题数超过1道,则解答的前1道有效。

 

试题7

阅读下列程序说明和 C 程序,把应填入其中[__n__]处的字句,写在答卷的对应栏内。

[程序说明]

由二叉树的前序遍历和中序遍历两个遍历序列能唯一确定一棵二叉树。

前序遍历为:访问根结点、访问左子树、访问右子树;

中序遍历为:访问左子树、访问根结点、访问右子树。

如右图所示的二叉树,其前序和中序遍历序列分别为:

       pred[  ]:A、B、D、E、C、F、G。

       inod[  ]:D、B、E、A、C、G、F。

本程序实现已知某二叉树的前序遍历和中序遍历序列,生成一棵链接表示的二叉树。

构造二叉树的算法要点是:由前序遍历序列,该序列的第一个元素是根结点元素( 例中为 A )。该元素将中序遍历序列分成左、右两部分,那些位于该元素之前的元素是它的左子树上的元素 ( 例中为D 、B、E ),位于该元素之后的元素是它的右子树上的元素( 例中为 C、G、F )。对于左、右 子树,由它们的前序遍历序列的第一个元素可确定左、右子树的根结点,参照中序遍历序列又可进一步确定子树的左、右子树元素。如此递归地参照两个遍历序列,最终构造出二叉树。

两个遍历序列作为主函数 main( )的参数。为简单起见,程序假定两个遍历序列是相容的。 主函数调用函数 restore( ) 建立二叉树。函数 restore( ) 以树( 子树 )的前序遍历和中序遍历两序列及序列长为参数,采用递归方法建立树( 子树 )。 函数 postorder( )实现二叉树的后序遍历序列输出,用来验证函数restore( )建立的二叉树。

[程序]

#include (stdio.h>

#include <stdlib.h>

#define MAX 100

typedef struct node{

char info;

struct node * llink,*rlink;

} TNODE;

charpred[MAX],inod[MAX];

TNODE * restore( Char * ,char *,int );

main( int argc,Char * * argv )

{

TNODE * root;

if ( argc<3 ) exit(0);

strcpy( pred,argv[l] );

strcpy( inod,argv[2] );

root = restore( pred,inod,strlen( pred )) postorder( root );

printf(”\n\n”);

}

TNODE * restore( Char * ppos,char * ipos,int n )

{

TNODE * ptr;

Char * rpos;

int k;

if ( n <= 0 ) return NULL;

ptr = ( TNODE * ) malloc( sizeof( TNODE ));

ptr->info = [__1__] ;

for ( [__2__];rpos < ipos+n;rpos++ )

if ( *rpos == * ppos ) break;

k = [__3__];

ptr->llink = restore( ppos+1,[__4__],k );

ptr->rlink = restore( [__5__] + k,

[__6__] + 1,

n-1-k );

return ptr;

}

 

postorder( TNODE * ptr )

{ if ( ptr == NULL ) return;

postorder( ptr->llink );

postorder( ptr->r1ink );

prinft( ”%c”,ptr->info );

}

 

 

答案

 

试题一

[问题1]

对端所在地区,通信速率,初装费,月租费

[问题2]

不能,因为处理3的输入文件及单据中缺少施工单位所需的主端名称,主端地址,对端地址,对端所在地区,通信速率,设备接口等数据项。

[问题3]

在专线计费文件中加上付款方式数据项,取消用户文件中的付款方式数据项。

试题二

[问题1]

① i+1→i 或 m+1→i

② i:j

③ j-1→j 或 m-1→j

④ m+1→low

⑤ m-1→high

[问题2]

不能,因为A(1)为数组A的最大元时,修改后的流程图将始终执行j-1→j;以致数组下标越界。

试题三

[问题1]

① 1→t

② 1-t

③ 'tree'→C

④ 'false'→C

⑤ -t→B(K1)

[问题2]

B={2,5,0,2,4}

试题四

[问题1]

文件A和文件B必须均按升序排列,并且文件A的最后一个记录的关键码应小于或等于文件B的最后一个记录的关键码。

[问题2]

文件A至少有零个记录;当文件A非空时,文件B至少有1个记录;当文件A为空时,文件A至少有零个记录.

[问题3]

A的关键码等于M并且B的关键码等于M。

试题五

① NOT EXISTS

② NOT EXISTS

③ STUDENT.SNO=S-C.SNO AND COURSE.CNO=S-C.CNO

④ COUNT(*)

⑤ SNO,AVG(GRADE)

⑥ SNO,COUNT(CNO)

试题六

(1)3,GR4
(2)2,GR4
(3)SUBGR0,2,GR4
(4)LEAGR2,1,GR2
(5)GR0,0

试题七

(1) *ppos 或 ppos[0]

(2) rpos=ipos

(3) rpos-ipos

(4) ipos 或 rpos-k

(5) ppos+1

(6) rpos 或 ipos-k