1992年度高级程序员级下午试题

试题 l

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

[说明]

(1)流程图描述了某电话局长途电话业务及计费管理系统中的计费数据处理流程。

(2)每个用户在系统的“长话用户档案”中有一个记录,该记录由用户编码唯一标识。…-

个用户可能拥有多个可使用长途直拨业务的电话号码(称为有权电话号码)。每个有权电话号码在“长话业务档案”中有一个记录。它们分别含有以下数据项:

“长话用户档案”:用户编码,用户名称,用户地址

“长话业务档案”:电话号码,用户编码,国内长途许可标志,国际长途许可标志

(3)计费详细数据由电话程控交换机自动记录在磁带上,用作系统的输入。系统每天晚上零时处理计费详细数据磁带,计算通话次数、电话费,产生“日计费文件”,并把这些数据累计到“月计费文件”中。

“计费详细数据”包括以下数据项:

电话号码,受话电话号码,日期,通话开始时间,通话持续时间

系统根据受话电话号码可以区分国内长途和国际长途。

(4)系统每月1日上午进行出帐处理,给每个用户提交一份上月的包括以下内容的“缴费通知单”。每个有权电话号码每月还需向电话局付“门号费”10元。

XXX电话局长途电话用户缴费通知单

用户编码: 用户名称: 用户地址:
电话号码 国内通话次数 国内金额 国际通话次数 国际金额 门号费 金额合计
日期 XX 年 XX 月 金额总计

[问题 1]

除了上述说明中指明的文件外,流程图中还需用到文件A,指出文件A应是什么文件?

[问题 2]

指出“日计费文件”至少应包括哪些数据项?

[问题 3]

①指出处理 5 分类的第一、第二关键项。

②指出“长话业务档案文件”应按哪一个关键项分类?
[流程图]

 

试题 2

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

[说明]

在字符数组 S 中存放着一行长度为 L 的正文,每个数组元素存放一个字符。现假定正文仅由单词、空格和句号组成,单词由连续的英文字母组成。单词与单词之间可以有1个或多个空格、单词至句号之间或句号至单词之间可以有。个或。个以上的空格,两上句号之间除空格符外至少有一个单词。S 的第一个非空格字符不能是句号,最后一个非空格字符不一定是句号,S 的两端可以有。个或。个以上的空格。现准备对 S 中的字符串进行编辑,使得空格尽可能均匀地分布在单词之间。

该流程图实现编辑前的预处理。流程图中,首先统计S中单词和句号的总数NW、空格,总数NB、句号或每个单词的第’一个字母在S中的位置(存放在数组 SW 中)和每个单词或句号的长度(存放在数组 HW 中,句号的长度置为 -1)。然后,计算单词至单词以及句号至单词间的间隔总数B,最后计算每个间隔的于均空格数 N( 整数 )和剩余的空格数 M。

[问题 1]

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

[问题 2]

为了检查正文中句号的用法是否正确,需要在流程图的 ① 处增设判断及报错处理( 见右图 )。试用题中的有关符号填写判断框 ⑧ 和 ⑨ 的内容。

[流程图]  

试题 3

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

[说明]

流程图用来按递增顺序产生由数字1,2,3组成的非空序列。规定其产生的每个序列均不存在两个相同的相邻子序列。例如,该流程图产生的前五个序列为:

1

1 2

l 2 1

1 2 l 3

l 2 1 3 l

序列 1211,1212 等均因含有两个相同的相邻子序列,故未被流程图产生。

产生一个序列的方法是,在前一个合理的序列尾部之后添加数字 1,构成一个新序列,然后进行合理性检验。当新的序列不合理时,若新序列尾部为 1,则改为 2;若为 2,则改为 3,然后继续进行检验以寻求下一个合理的序列。当尾部已为 3 时,则删去该数字后,继续进行上述的更改和检验。

本流程图寻找长度小于等于N( 4≤N≤60 )的合理序列。二维数组 A 的每一行用于存放找到的一个序列,其中数组元素 A[I,61] 存放第 I 个序列的长度。

[问题1]

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

[问题2]

现对流程图中虚线所围的部分给出了下·图所示的简化形式,试填充其中的 ③~⑧,使之成为正确的简化。

 

[流程图] 

试题4

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

本流程图描述了某子程序的处理流程,现要求用白盒测试法对子程序进行测试。
[问题]

根据判定覆盖、条件覆盖、判定/条件覆盖、多重条件覆盖(条件组合覆盖)、路径覆盖五种覆盖标准,从供选择的答案中分别找出满足相应覆盖标准的最小的测试数据组( 用 ①一⑩ 表示 )。
供选择的答案

a=5 b=1 a=5 b=-1

a=5 b=1

a=-5 b=-1

a=5 b=1

a=0 b=-l

a=5 b=-1

a=-5 b=1

a=-5 b=-1

a=5 b=1

a=0 b=0

a=-5 b=-1

a=5 b=1

a=0 b=1

a=0 b=-1

a=-5 b=l

a=5 b=1

a=0 b=-1

a=-5 b=1

a=-5 b=-l

a=5 b=1

a=0 b=-1

a=0 b=1

a=-5 b=1

a=-5 b=-1

a=5 b=1

a=5 b=0

a=5 b=-l

a=0 b=1

a=0 b=0

a=0 b=-1

a=-5 b=1

a=-5 b=0

a=-5 b=-1

[流程图]

  

试题5

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

[说明]

本流程图用来将自然数按右图所示的次序依次存放到 N×N 的二维数组 A 中,图中描述了 N=5 时 A 中各元素的值及其赋值次序。

流程图中省略了数据的输入和输出。
[问题1]

填充流程图中的 ①~⑦,使之成为完整的流程图。
{问题2]

若将流程图中的两个虚线框部分都改成下图所示的处理框,试写出 N =3 时该流程图所产生的数组 A 的各元素值。

D → A [ J,I ]

[流程图]

 

 

试题6

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

[程序说明]

本程序根据输入的姓名(字符串),在已有的线性表中查找其相应的通信地址(字符串),并予以输出。

标号为DATPTR的存贮字存放着线性表第一个结点的地址。结点的数据结构定义如下:

第K个结点
+0
+1
+2
+3
 
 
 
指向第K+1个结点
存放姓名字符串长度
存放通信地址字符串长度
自此连续存放姓名和通信地址

最后一个结点的指针字段为空指针( 内容为 0 )。
[程序]

START BEGIN
OTlONG DS 1
OTTEXT DS 80
NOlONG DC 10
NOTEXT DC 'NOT FONUD.'
INTEXT DS 80
INLONG DS 1
DATPTR DC FIRST
BEGIN IN INTEXT,INLONG
LEA GR0,0
CPA GR0,INLONG
JZE ENDSCH
LEA GR3,DATPTR
NXTMEM __①__
__②__
JZE NOTFND
LD GR0,1,GR3
CPA GR0,INLONG
JNZ NXTMEM
__③__
LEA GR2,INTEXT
CALL CMPSTR
__④__
LD GR0,2,GR3
ST GR0,OTlONG
__⑤__
__⑥__
LEA GR2,OTTEXT
CAlL CPYSTR
OUT OTTEXT,OTLONG
JMP BEGIN
NOTFND OUT NOTEXT,NOLONG
JMP BEGIN
ENDSCH EXIT
CMPSTR PUSH 0,GR3
CMPNXT LD GR3,0,GR1
CPL GR3,0,GR2
JNZ CMPEND
LEA GR1,1,GR1
LEA GR2,1,GR2
SUB GR0,CONST1
JNZ CMPNXT
CMPEND POP GR3
RET
CONSTl DC 1
CPYSTR PUSH 0,GR3
CPYNXT LD GR3,0,GR1
ST GR3,0,GR2
LEA GR1,1,GR1
LEA GR2,1,GR2
SUB GR0,ONE
JNZ CPYNXT
POP GR3
RET
ONE DC 1
END

 

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

 

试题7

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

[程序说明]

(1)本程序利用辗转相除法求两个均不超过100次的多项式A,B的最大公因式。

例: A(x)=x3一x2+x一1=(x2+1)(x一1)

B(x)=x5一7x4十7x3-3x2+6x+4=(x2+1) (x3-7x2十6x+4)

最大公因式为x2+1。

(2)辗转相除法的算法如下:

用其中的一个多项式去除另一个多项式;然后,将所得余式变成除式,原除式变成被除式。如此反复相除,当余式为。时,当前除式即为最大公因式。
[程序]

#include <stdio.h>

#include <math.h>

#define DECISE.0005

#define MAX_POWER 100

main( )

{ int i,a,b;

float Ca[MAX_POWER+1],Cb[MAX _POWER+1];

void Remainder();

scanf("%d",&a);

for ( i=0;i<=a;i++ )

scanf( "%f",&Ca[i] );

scanf( "%d",&b) ;

for ( i=0;i<=b;i++ )

scanf( "%d",&Cb[i] );

Remainder(Ca,Cb,a,b);

}

void Remainder(Pointer A,Pointer B,a,b)

float *Pointer A,*Pointer B;

int a,b;

{ float x,y,*Temp;

int i,j,F1ag=1;

while ( Flag )

{ i=0;

while ( PointerB[i]==0 )

{ i ++;b一-;

__①__ ;

}

x=Pointer[i];

while ( i<=b )

PointerB[i++]/=x;

for ( i=0;i<=a-b;i++ )

{ __②__ ;

for(j=0;j<b ; j++) 

{ y = PointerA[i+l+j]一x * PointerB[j+1];

PointerA[ __③__ ]=

( y<DECISE&&-y<DECISE )?0.0;y;

}

}

Temp=Pointer A;

PointerA=PointerB; ·

PointerB = __④__ ;

a=b--;

for ( Flag=0,i=0;i<b && Flag==0;i++ )

if ( PointerB[i] !=0.0 ) Flag=1;

}

printf( "The Greatest Common Factor is:\n");

for ( i=0;i<a;i++ )

if ( PointerA[i]!= 0.0)

printf( "%5.3f *x ∧%d%s",

PointerA[I],a-i,( PointerA[i+1]<0.0 ) ?"":"+" );

printf( "%5.3f\n",PointerA[a] );

}

 

 

试题8~10 略(COBOL、FORTRAN、PASCAL)

                                              回目录     老顽童校对整理  2003年4月