历届试题 - 1997年度高级程序员级 下午试卷


日期: 2004-06-14 14:00 | 联系我
关注我: Telegram, Twitter

试题一

阅读以下说明和流程图,回答问题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]

,其结点是与部件i直接相连的所有部件号。

程序依次处理各链表。在处理s[i]链表中,用top工作链表重新构造s[i]链表,使s[i]链表对应系统中的一个部件组,其中结点按部件号从小到大连结。

[程序]

# 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[i]; s[i]=p;

p=(NODE *)malloc(sizeof(NODE));

P->data=i; p->link=s[j]; s[j];=p;

}

for(i=0;ibr> for(top=s[i],____(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[i];____(4)____;x=y,y=y->link);

if(y!=NULL && y ->data= =q->data)

free(q);/*因重新生成的第i链表已有当前结点,当前结点删除* /

else { /* 当前结点插入重新生成的i链表*/

__-__(5)____;

if(y= =s[i]) s[i]=q;

else x->link=q;

}

}

for(i=0;ibr> { /*输出结果*/

if (s[i]= =NULL)continue;

for(p=s[i];p!=NULL;)

{ printf(“\t%d”,p->data);

q=p->link; free(p); p=q;

}

printf(“\n”);

}

}

试题七

阅读以下程序说明和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[i][j]表示i号小区域与j 号小区域之间的邻接关系:

0 j小区域与i小区域不邻接

bordering[i][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(“\n%s;\n”,colortb1[color]);

for(i=0;ibr> if(colored[color][i]) printf(“\t%d”,i);

printf(“\n”);

}

}

int colored[CN][N],bordering[N][N];

main()

{ int c,i,j,n;

printf(“Enter number of areas.”); scanf(“%d”,&n);

printf(“Enter bordering:\n”);

for(i=0;ibr> for(j=0;jbr> for(i=0;ibr> { printf(“Enter areas to link %d area(<0 to next).\n”,i);

scanf(“&d”,&j);

while(j>=0)

{ if(i !=j) bordering[i][j]=bordering[j][i]=1;

scanf(“%d”,&j);

}

}

if(colorcountry(bordering,colored,n,CN))

print(colored,n,CN);

else printf(“No Solution.\n”);

}


 文章评论

第 1 楼  发表于 2004-07-29 22:48 | dongwubing 的所有评论
我何时能写这样的程序?

第 2 楼  发表于 2005-05-02 22:41 | 屈带兵 的所有评论
我想问一下就这套试题要学哪些知识啊

第 3 楼  发表于 2005-07-14 21:34 | 碧水蓝天 的所有评论
我想问一下就这套试题要学哪些知识啊?我何时能写这样的程序?

共有评论 3 条, 显示 3 条。

当前页面是本站的 Google AMP 版本。
欲查看完整版本和发表评论请点击:完整版 »

 

程序员小辉 建站于 1997
Copyright © XiaoHui.com; 保留所有权利。