1997年度高级程序员级下午试卷

发表于:2007-05-26来源:作者:点击数: 标签:
试题一 阅读以下说明和流程图,回答问题1至问题4,将解答写在答卷的对应栏内。 [说明] 某公司将其生产的商品通过若干个销售点进行销售。销售点在收到商品后的规定时间内把货款汇给公司。 流程图描述了该公司发货、收款、催款的处理过程。其中部分文件和单据
试题一
阅读以下说明和流程图,回答问题1至问题4,将解答写在答卷的对应栏内。
[说明]
某公司将其生产的商品通过若干个销售点进行销售。销售点在收到商品后的规定时间内把货款汇给公司。
流程图描述了该公司发货、收款、催款的处理过程。其中部分文件和单据的格式如下:
商品文件:商品代号,商品名称,单价
销售点文件:销售点代号,销售点名称,地址
发货单:发货日期,销售点代号,商品代号,数量,金额
收款单:收款日期,销售点代号,商品代号,数量,金额,该商品的发货日期
处理1~3把当天的发货单合并到发货文件。处理4~6把当天的收款单合并到收款文件。处理7在发货文件中当天已收款的记录上加上已收款标记。处理8和处理9在月末执行一次,主要用于输出月发货报、催款通知单、月收款报告。
[问题1]
详细写出流程图中商品文件和销售点文件对处理1的作用。
[问题2]
说明处理8为何要写发货文件。
[问题3]
说明处理9除制作月收款报告外还对收款文件做什么操作。
[问题4]
为了提高处理效率,流程图需作何改动。























试题二
阅读以下说明和流程图,回答问题1至问题3,将解答写在答卷的对应栏内。
[说明]
本流程图用来实现一组正整数的加权舍位平衡。已知正整数组
A(a1,a2,…,an)

满足条件a1= (n>3)。现将数组A中的每个数舍P位(P为正整数)后,得到另一正整数数组
B(b1,b2,…,bn)
它满足如下条件:
1、 b1是a1舍P位后四舍五入所得,即b1=INT(a1/10p0.5)

2、 b1 =

3、 bi=INT(ai/10P)+ei(i=2,3,…,n), 其中ei取值为0或1,当ei=1时,称ei是第i项数据的进位

4、 ei(i=2,3,……,n)之值根据余数MOD(ai,10P)乖上权fi(fi>0)后的数值大小来决定(其算法见流程图),权fi存放在数组F中。
其中INT是取整数函数,MOD是余数函数。例如正整数78965舍P=3位,则
INT(78965/103)=78
MOD(78965,103)=965
[问题1]
填充流程图中①~④ ,把解答写在答卷纸的相应位置上。
[问题2]
若 N=5,P=1,A=(1586,985,26,247,328)
F=(1,1,1,1,1)
则数组B的值是多少?
[问题3]
若N=3,P=1,A=(41,16,25),F=(1,0,0),则数组B的值是多少?
























试题三
阅读以下说明和流程图,回答问题1至问题3,将解答写在答卷的对应栏内。
[说明]
下面给出的是某房产管理系统的一套分层数据流图。其功能描述如下:
(1) 系统随时根据住房送来的入信单更新信户基本信息文件;
(2) 每月初系统根据物业管理委员会提供的月附加费(例如清洁费、保安费、大楼管理费等—)表和房租调整表,计算每家住户的月租费(包括月附加费),向住户发出交费通知单。住户交费时,系统输入交费凭证,核对后输出收据给住户;
(3) 系统定期向物业管理委员会提供住房分配表和交费情况表;
(4) 住户因分户或换房,在更新住户基本信息文件的同时,系统应立即对这些住户做月租费计算,以了结分户或换房前的房租。
假定题中提供的顶层图是正确的,请回答下列问题:
[问题1]
指出哪张图中的哪些文件可不必画出。
[问题2]
指出在哪些图中遗漏了哪些数据流。回答时请用如下形式之一:
1) ××图中遗漏了××加工(或文件)流向××加工(或文件)的××数据流;
2) ××图中加工××遗漏了输入(或输出)数据流××。
[问题3]
指出加工2图中加工2.3能检查出哪些不合格交费凭证。

[流程图]

顶层图









试题四
在COMET型计算机上可以使用试卷上所附的CASL汇编语言。阅读下列程序说明和CASL程序,将应填入__(n)__处的字句,写在答卷的对应栏内。
[程序说明]
本子程序将一个非负二进整数翻译成五位十进整数字符。
进入子程序时,在GR0中给出被翻译的非负二进整数,在GR2中给出存放五位十进整数数字字符的起始地址。
十进制数字字符用ASCII码表示。当结果小于五位时,左边无空白符替换;当二进整数为零时,在(GR2)+4中存放0的ASCII码。
数字字符0至9的ASCII码是48至57,空白符的ASCII码是32。
[程序]

START
LEA GR1,0
LEA GR3,32
L1 ____(1)____
JPZ L2
ST GR3,0,GR2
LEA GR2,1,GR2
LEA GR1,1,GR1
JNZ L1
L2 ___(2)___
L3 ___(3)___
JMI L4
SUB GR0,SN0,GR1
LEA GR3,1,GR3
___(4)___
L4 ST GR3,0,GR2
LEA GR2,1,GR2
LEA GR1,1,GR1
___(5)___
JNZ L2
RET
SON NC 10000
DC 1000
DC 100
DC 10
DC 1
END




试题五
阅读以下程序说明和FORTRAN程序,将应填入__(n)__处的字句,写在答卷的对应栏内。
[程序说明]
对称矩阵通常只需存储其下三角部分,例如,下列对称矩阵

可用一维数组(1,2,3,4,5,6,7,8,9,10)存储其下三角部分。N阶对称矩阵下三角部分的元素个数为(N*N+N)/2。
本子程序用来计算N阶对称矩阵A的平方B,B也是一个N阶对称矩阵。程序中X,Y是分别存入A,B下三角部分的一维数组。
[程序]

SUBROUTINE P(X,Y,N)
INTEGER X(N*N+N)/2,Y(N*N+N)/2),S
M=1
DO 10 JJ=__(1)__
DO 10 II =__(2)__
I=II
J=JJ
L=__(3)__
S=0
DO 30 K=1,N
S=S+X(I)*X(J)
IF(____(4)____)THEN
I=I+L
ELSE
I=I+1
ENDIF
IF(____(5)____)THEN
J=J+L
ELSE
J=J+1
ENDIF
L=L-1
30 CONTINUE
Y(M)-S
M=M+1
10 CONTINUE
END

试题六
阅读以下程序说明和C程序,将应填入__(n)__ 处的字句,写在答卷的对应栏内。
[程序说明]
某系统由n个部件组成,这些部件被物理地分成若干个分离的部件组。同一组内的两件部件i和j,它们或直接相连,或间接相连(部件i和部件j间接相连是指在这两件部件之间有一个部件相连序列,其中部件i和j分别与这相连序列中的某个部件直接相连)。系统的n个部件被统一编号为0,1,…,n-1。本程序输入所有直接相连的部件号对,分别求出系统各分离部件组中的部件号并输出。
程序根据输入的直接相连的两件部件号,建立n个链表,其中第i个链表的首指针为s
,其结点是与部件i直接相连的所有部件号。
程序依次处理各链表。在处理s链表中,用top工作链表重新构造s链表,使s链表对应系统中的一个部件组,其中结点按部件号从小到大连结。

[程序]

# include
#define N 100
typeef struct node{
int data;
struct node *link;
} NODE;
NODE*s[N];
int i,j,n,t;
NODE *q,*p,*x,*y,*top;
main()
{ printf(“Enter number of parts.”);
scanf(“%d”,&n);
for(i=0;ibr> printf(“Enter pairs./n”);
white (scanf(“%d%d”,&i,&j)= =2)
{ /*输入相连部件对,生成相连部件结点链表*/
p=(NODE *)malloc(sizeof(NODE));
p->data=j; p->link=s; s=p;
p=(NODE *)malloc(sizeof(NODE));
P->data=i; p->link=s[j]; s[j];=p;
}
for(i=0;ibr> for(top=s,____(1)____;top!=NULL;)
{ /*将第i链表移入top工作链表,并顺序处理工作链表的各结点*/
q=top;____(2)____;
if(s[j=q->data]!=NULL)
{ /将j链表也移入工作链表*/
for(p=s[j];p->link !=NULL;p=p->link);
p->link=top; top=s[j];____(3)____;
}
/*在重新生成的第i链表中寻找当前结点的插入点*/
for(y=s;____(4)____;x=y,y=y->link);
if(y!=NULL && y ->data= =q->data)
free(q);/*因重新生成的第i链表已有当前结点,当前结点删除* /
else { /* 当前结点插入重新生成的i链表*/
__-__(5)____;
if(y= =s) s=q;
else x->link=q;
}
}
for(i=0;ibr> { /*输出结果*/
if (s= =NULL)continue;
for(p=s;p!=NULL;)
{ printf(“ %d”,p->data);
q=p->link; free(p); p=q;
}
printf(“ ”);
}
}

试题七
阅读以下程序说明和FORTRAN程序,将应填入__(n)__处的字句,写在答卷的对应栏内。
[程序说明]
本子程序实现地图的着钯。在地图上,一个国家所着的颜色必须与所有相邻的国家所着的颜色不同。现已证明,仅需四种不同的颜色就能解决地图的着钯
若地图上有N个国家,分别用1至N编号。子程序中用数组INDEX(N,2)和BORDER(M)存放N个国家的相邻情况。INDEX(I,1)和INDEX(I,2)分别表示与第I国相邻的国家编号在数组BORDER中的起始位置和终止位置,即这些邻国的编号存放在BORDER(INDEX(I,1))至BORDER(INDEX(I,2))中。例如,对应于图1所示的地图,数级INDEX和BORDER具有如下值:



INDEX=



BORDER-(2,3,4,5,1,3,1,2,4,5,1,3,5,1,3,4)


子程序中分别用1,2,3,4代表四种不同颜色,着色结果存放在数组COLOR中,即数组元素COLOR(I)的值为第I个国家所着的颜色。
子程序采用试控法找解。首先从第I个国家着第一种颜色开始,顺序为各个国家寻找着色方案。对第I个国家,当为它找到一种未被它的相邻国家着色的颜色时,就用该颜色对此国家着色,并准备处理下一国家;当不能为它找到一个未被它的相邻国家着色的颜色时,就回溯——即改变第I-1个国家的着色方案。直至最终为全部国家找到着色方案。

[程序]

SUBROUTINE P(INDEX,BORDER,COLOR,N,M)
INTEGER INDEX(N,2),BORDER(M),COLOR(N)
DO 10 I=1,N
COLOR(I)=0
I=1
IF(__(1)__)THEN
K=COLOR(I)+1
IF(__(2)__)THEN
J=INDEX(I,1)
IF(J.LE.INDEX(I,2))THEN
IF(__(3)__)THEN
J=J+1
GOTO 20
ELSE
K=K+1
____(4)____
ENDIF
___-(5)____
I=I+1
GOTO 40
ENDIF
COLOR9I)=0
_____(6)_____
GOTO 40
ENDIF
IF(I.EQ.0)THEN
WRITE(*,*)’NO SOLUTION’
ENDIF
END

试题八
阅读以下程序说明和C程序,将应填入__(n)__处的字句,写在答卷的对应栏内。
[程序说明]
一个相连的区域被不规则地分割成n个不同的小区域;每个小区域与若干其它小区域相邻接。现用cn种不同颜色为该区域着色,要求每个小区域着同一种颜色,相邻小区域着不同颜色。
设小区域被顺序编号为0,1,…,n-1。每个小区域与其它小区域的邻接关系用两维数组bordering表示,元素bordering[j]表示i号小区域与j 号小区域之间的邻接关系:

0 j小区域与i小区域不邻接
bordering[j]=
1 j小区域与i小区域相邻接

程序中,把计算结果存入于两维数组colored中,颜色编号为0,1,…,cn-1,元素colored[coler][j]的含义是

0 j小区域不用颜色color着色
colored[color][j]=
1 j小区域用颜色color着色

函数colorcountry(bordering,colored,n,cn)根据所给的小区域邻接关系数组bordering、小区域个数n 、颜色数cn,将找到的着色方案记录在数组colored中。函数采用试探法找解。首先从第一个小区域着第一种颜色开始顺序为各小区域找着色方案。对某个小区域,当为它找到一种未被它的相邻小区域着色的颜色时,就用该颜色对该小区域着色,并准备处理下一个小区域。当不能为某个小区域找到一个未被它的相邻小区域着色的颜色时,就回溯。如最终为全部小区域找到着色方案,函数返回1;否则,函数返回0。
程序假定小区域个数不超过20,颜色数为4。

[程序]

#include
#define n 20
#define CN 4
int colorcountry(int bordering[][N], int colored[][N], int n,int cn)
{ int color,used,i,c;
for(color=0;colorbr> for(i=0;ibr> c =0; /*从第1个小区域开始*/
color =0; /*从着第1种颜色开始试控*/
while(cbr> { /*还未对全部小区域着色时循环*/
while(___(1)___)/*顺序对每种颜色作试探*/
{/*检查当前颜色是否已被某相邻小区域着色*/
for (i=0, used=0; !used && ibr> if(____(2)____)used=1;
if(!used)break; /*当前颜色未被相邻小区域着色*/
color++
}
if(!used)
{ /*找到一种可用颜色,用此色着色,并准备处理下一个小区域*/
____(3)____=1; color=0;
}else{/*未找到一种可用颜色,回溯*/
c--;if (c<0)return 0; /*发现没有解的情况*/
for(color=0;____(4)____;color++);
____(5)____=0
}
}
return 1;
}
print(int colored[ ][N],int n,int cn) /*输出结果*/
{ char *colort[ ]={“RED”,”BLUE”,”GREEN”,”YELLOW”};
int color,i;
for(color=0;colorbr> { printf(“ %s; ”,colortb1[color]);
for(i=0;ibr> if(colored[color]) printf(“ %d”,i);
printf(“ ”);
}
}
int colored[CN][N],bordering[N][N];
main()
{ int c,i,j,n;
printf(“Enter number of areas.”); scanf(“%d”,&n);
printf(“Enter bordering: ”);
for(i=0;ibr> for(j=0;jbr> for(i=0;ibr> { printf(“Enter areas to link %d area(<0 to next). ”,i);
scanf(“&d”,&j);
while(j>=0)
{ if(i !=j) bordering[j]=bordering[j]=1;
scanf(“%d”,&j);
}
}
if(colorcountry(bordering,colored,n,CN))
print(colored,n,CN);
else printf(“No Solution. ”);
}

原文转自:http://www.ltesting.net