2001年度高级程序员级下午试题
试题一
阅读下列说明和流程图,回答问题1至问题3,把解答填入答题纸的对应栏内。
[说明]
某计算机厂生产多种型号的计算机,通过分布在世界各地的销售点销售,销售点应在收到计算机商品后的规定时间内把货款汇给该计算机厂。
流程图 1 描述了该厂发货、收款、催款的处理过程。其中商品文件、销售点文件、发货文件和收款文件的记录格式如下:
商品文件 = 商品代号 + 计算机规格名称 + 单价
销售点文件 = 销售点代号 + 销售点名称 + 地址
发货文件 = 发货单号 + 发出日期 + 销售点代号 + 商品代号 + 数量 + 金额
收款文件 = 收款单号 + 收款日期 + 销售点代号 + 商品代号 + 数量 + 金额 + 发货单号
在流程图中,处理 1~处理 3 把当天的发货单合并到发货文件。处理 4~处理 6 把当天的收款单合并到收款文件。每天在处理 3 和处理 5 完成之后,由处理 7 在发货文件中当天已收款的记录上加上已收款标记。处理 8 在月末执行一次,它有三个功能:
①汇总输出本月发货清单;
②删除发货文件中已收款的所有记录,形成一个新的发货文件,作为下月初处理时的初始文件
③产生催款通知单,以便对那些一个月以前已发货但至今仍未收到货款的销售点催款。
[问题1]
指出流程图 l 中应在哪几个处理框中检查发货单和收款单的错误,并分别说明它们各能指出什么错误。
[问题2]
如果把流程图 1 中从日收款分类文件到处理 7 的连线改成从日收款文件到处理 7 的连线,则有什么缺点,理由是什么?
[问题3]
处理 9 每月末执行一次如流程图所示,利用收款文件产生月收款报告并更新收款文件。要求指出它对收款文件做什么更新操作。
试题二
阅读下列说明和流程图,回答问题 1 至问题 3 ,把解答填入答题纸的对应栏内。
[说明]
某考务处理系统具有以下功能:
1.输入报名单;
2.自动编制准考证号;
3.输出准考证;
4.输入成绩清单;
5.输出成绩通知单;
6.输出成绩分布表;
7.输入合格标准、输出录取通知单;
8.试题难度分析,并输出试题难度分析表。
这里给出了实现上述要求的部分不完整的数据流图,其中部分数据流的组成如下所示:
报名单 = 报名号 + 姓名 + 通信地址
考生名册 = 报名号 + 准考证号 + 姓名 + 通信地址
成绩册 = 准考证号 + { 课程号 + 成绩 } (其中{W}表示W重复多次)
准考证 = 报名号 + 姓名 + 准考证号
[问题1]
指出 0 层图中可以删去的部分。
[问题2]
在加工 1 子图中将遗漏的数据流添加在答题纸上。
[问题3]
加工 2 子图分解成如图所示的 4 个子加工及相关的文件(即数据存储)。试在此基础上将相关的DFD 成份添加在答题纸上,以完全该加工子图。
[数据流图]
顶层
试题三
在COMET型计算机上可以使用试卷上所附的 CASL 汇编语言。阅读程序说明和 CASL 程序,将应填入__(n)__处的字句,写在答题纸的对应栏内。
[程序3说明]
子程序 DEHZ 用来对 HZ 编码的字串做解码处理。
HZ 编码是海外华人创造的一种将含有高位为 1 的汉字双字节字串转换成易于在网络中传输的ASCII 字符串的变换方式。编码过程中,被转换字符串中的原汉字子字符串各字节高位作清零处理,使之成为 ASCII 子字符串,并在其前后两端分别添加 ~{ 和 ~} 作为标记;而对于原 ASCII 子字符串,则将其中的 ~ 改写为 ~~,其余字符不变。
DEHZ 解码子程序则是 HZ 编码的复原过程。复原 ASCII 子字符串过程中遇有 ~~ 字符则改写为一个 ~ ,遇有 ~{ 则将其后直至 ~} 标记前的各字节高位置1,复原为汉字子字符串,同时删除其前后标记。~的后续字符不属于以上情况均作为错误处理。
调用该子程序时, GR1 存放原始字符串首地址, GR2 存放还原后的目标字符串首地址。工作寄存器 GR3 用作处理汉字子字符串的识别标志,进入子程序时应初始化为处理 ASCII 子字符串。程序按照 CASL 语言的标准约定,字符串的每个字符只占用一个存储字的低八位。原始字符串和目标字符串均以 0 作为结束标志。
[程序3]
START
DEHZ PUSH 0,GR3
PUSH 0,GR2
PUSH 0,GR1
LEA GR3,0
LOOP __(1)__
CPA GR0,MARK0
JNZ GOON
LEA GR1,1,GR1
LD GR0,0,GR1
CPA GR0,MARK0
__(2)__
CPA GR0,MARK1,GR3
JNZ ERROR
__(3)__
LEA GR1,1,GR1
JMP LOOP
ERROR OUT ERS1R,ERLEN
JMP EXIT
GOON __(4)__
ST GR0,0,GR2
LEA GR2,1,GR2
LEA GR1,1,GR1
CPA GR0,VO
__(5)__
EXIT P0P GR1
P0P GR2
P0P GR3
RET
V1 DC 1
V0 DC O
DC #0080
MARK0 DC '~ '
MARK1 DC '{ }'
ERSTR DC 'ERROR!'
ERLEN DC 6
END
试题四
阅读下列程序说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。
[程序4说明]
设 M 叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根结点的值部分 (设为一个字符) 和用“( )”,括起来的各子树的列表 (如有子树的话) ,各子列表间用“,”,分隔。例如下面的三叉树可用列表 a( b( c,d ),e,f( g,h,i ))表示。
本程序输入列表,生成一棵 M 叉树,并由 M 叉树输出列表。假定输入无错误。
[程序4]
#include〈stdio.h〉
#include〈stdlib.h〉
#define M 3
typedef struct node{ char val;
struct node *subTree[M];
} NODE;
char buf[255] ,*str = buf
NODE *d = NULL
NODE *mackTree( ) /*由列表生成M叉树*/
{ int k; NODE *s ;
s = __(1)__
s -> val = *str++ ;
for ( k = 0 ; k < M ; k++ ) s-> subTree[k] = NULL ;
if(*str='( '){
k = 0;
do { str++;
s -> subTree[k] = __(2)__ ;
if ( *str == ')' ) { str++; break ; }
k = k+l ;
} while ( __(3)__ );
}
return s ;
}
void walkTree( NODE *t ) /*由 M 叉树输出列表*/
{ int i ;
if t != NULL ) {
__(4)__
if ( t -> subTree[0] == NULL ) return ;
putchar ( '( ' ) ;
for ( i = 0 ; i < m ; i++) {
__(5)__
if ( i! = M - l && t -> subTree[i+l] != NULL )
putchar ( ', ' ) ;
}
putchar ( ') ' ) ;
}
}
void main( )
{ printf( "Enter exp:" ) ;
scanf( "%S" , str ) ;
d = makeTree() ;
walkTree( d ) ; putchar( '/n') ;
}
试题五
阅读下列程序说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。
[程序5说明]
著名的四色定理指出任何平面区域图均可用四种颜色着色,使相邻区域着不同的颜色。本程序对给定的区域图找出所有可能的不超过四种颜色的着色方案。程序中用 1~4 表示四种颜色。要着色的 N 个区域用 0~N一1编号,区域相邻关系用 adj[][] 矩阵表示,矩阵的 i 行 j 列的元素为 1 ,表示区域 i 与区域 j 相邻;矩阵的 i 行 j 列的元素为 0 ,表示区域 i 与区域 j 不相邻。数组 color[] 用来存储着色结果, color[i] 的值为区域 i 所着颜色。
【程序5】
#include〈stdio.h〉
#define N 10
void output(int color[])/*输出一种着色方案*/
{ int i ;
for ( i = 0 ; i < N ; i++ )
printf( "%4d" , color[i] ) ;
printf( "/n" ) ;
}
int back( int *ip ,int color[] ) /*回溯*/
{ int c = 4 ;
while ( c == 4 ){
if ( *ip <= 0 ) return 0 ;
--(*ip) ;
c = __(1)__ ;
color[*ip] = -1 ;
}
return c ;
}
/*检查区域i,对c种颜色的可用性*/
int color0k( int i , int c , int[][N] , int color[ ] }
{ int j ;
for ( j = 0 ; j < i ; j++ }
if ( __(2)__ )
return 0 ;
return 1 ;
}
/*为区域i选一种可着的颜色*/
int select( int i ,int c ,int adj[][N] , int color[ ] )
{ int k ;
for ( k = c ; k <= 4 ; k++ )
if ( colorOK( __(2)__ ) )
return k ;
return 0 ;
}
int coloring( int adj[][N] ) /*寻找各种着色方案*/
{ int color[N] , i , c , cnt ;
for ( i = 0 ; i < N ; i++ ) color[i] = -1 ;
i = c = 0 ; cnt = 0 ;
while ( 1 ) {
if ( ( c = __(4)__ ) == 0 ){
c = back( &i , color) ;
if ( c == 0) return cnt ;
} else { __(5)__ ; i++ ;
if ( i == N ) {
output(color) ;
++cnt ;
c = back( &i , color ) ;
} e1se c = 0 ;
}
}
}
void main()
{ int adj[N][N] =
{ {0,1,0,1,1,1,1,1,1,1},
{1,0,1,1,0,1,1,1,1,0},
{0,1,0,1,0,1,1,0,1,1},
{1,1,1,0,1,1,0,0,1,1},
{1,0,0,1,0,1,0,0,0,0},
{1,1,1,1,1,0,1,0,0,1},
{1,1,1,0,0,1,0,0,1,0},
{1,1,0,0,0,0,0,0,1,1},
{1,1,1,1,0,0,1,1,0,1},
{1,0,1,1,0,1,0,1,1,0}
} ;
printf( "共有%d组解./n",coloring( adj ) ) ;
}