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

试题 1

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

假定某地区的经济数据指标体系具备下述性质:

1、呈树状结构;

2、各叶结点(基础指标)的数据是从基层单位上报的数据中经分类汇总而获得,

3、非叶结点(集合指标)的数据是对其所属的下一级结点的数据求和而获得的。不难看出,下列指标体系具备上述性质。

例如:粮食、棉花、… 和农副产品产值(基础指标)可以从各县及各农场每月上报的数据中经分类汇总而获得,农业总产值(集合指标)=粮食产值+棉花产值+…+农副产品产值。

本流程图用来计算月基础指标数据和月集合指标数据,产生经济数据月报表,并把月经济数据加载到经济数据文件中,产生分析报表。
[流程图]

假定有关的文件和单据的记录格式如下:

指标体系文件:指标代码,指标名称,计量单位

基层单位上报数据:单位名称,指标名称,产值
[问题 1]

简述处理 l 的处理内容。
[问题2] 

指出月基础指标数据文件的记录格式至少应包含哪些内容。
[问题3]

简要叙述指标体系文件中的指标代码的主要作用。

试题2

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

本流程图输入正整数 p 和 q(q≥2),寻找满足下列条件的 q 对自然数(al,b1),(a2,b2),…,(aq,bq)及最小的整数 sum :

1. ai≥bi (i=1,2,…,q)

2. 当 i≠j 时,(ai,bi)≠(aj,bj),( i=1,2,…,q;j=l,2,…,q )

3.sum=a1p+b1p=a2p+b2p=…=aqp+bqp

例如:

当p=2,q=2 时,

sum=50=72+12=52+52

当p=3,q=2时,

sum=1729=123+13=103+93

当p=3,q=3时,

sum=87539319=4363+1673

=4233+2283=4143+2553

本流程图采用枚举法,列举各种 aip、bip(ai≥bi)及其和 sumi=aip+bip,当发现 q 个相同的和时,即输出结果。

图中,数组元素 tp(K)=Kp(K=l,2,…),枚举过程中产生的 sumi 按递增顺序存放在数组 SS 中,相应的 ai 和 bi 存放在数组 SA 和 SB 中。

[问题1]

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

若将流程图2-2中的虚框部分改成图2-1,则流程图中的③,④应作怎样的修改。

 

试题 3 

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

[说明]

当一元多项式aixi中有许多系数为零时,可用一个二维数组 D(M,2)来紧缩存储;其中 M 为多项式中非零系数的个数,数组的第一列存放非零系数的值,第二列存放该非零系数所对应的幂次。并且规定,数组元素按幂次的递减次序存放。

例如,对应于多项式 8X5-2X2+7 的二维数组内容如下所示:

8 5
-2 2
7 0

本流程图用来计算两个多项式的乘积,多项式的系数和幂次均按上述方式存放。数组 A、B 存放两个欲相乘的多项式,它们的非零系数个数分别为 NA(>0) 和 NB(>O),数组 C 存放结果(乘积)多项式,其非零系数个数用 NC 存储。
[问题1]

填充流程图中的①~⑤,使之实现上述功能。
[问题2]

若将流程图中的 J:2 改成 J:1,则流程图能否正常工作,为什么?

试题4

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

本流程图采用状态转换矩阵的方法来检验算术表达式(非空)的语法正确性,若发现错误,则指出发现错误的位置。

假定,算术表达式中的运算对象仅由自然数及变量名(用标识符标识)组成,运算符均是双目运算符,有 +、-、*、/、**(由两个连续的“*”组成,表示乘幂运算)等 5 种,表达式中可以出现左右圆括号,并以字符 # 作为结尾。

状态转换矩阵(见下表)中的行代表当前状态(state),列代表读入字符,矩阵的内容(本题中只给出部分内容,空白部分缺省)指出在当前状态下面临相应的读入字符时应执行的操作序列。
状态转换矩阵

当前状态

读入字符

数字

字母

+或-或*或/

(

)

#

0 1→State 2→State 7→State

n+1→n;

4→State

7→State 7→State
1 1→State 7→State 3→State
2
3 1→State 2→State

n+1→n

4→State

4 1→State 2→State 7→State

n+1→n;

4→State

5 7→State 7→State 3→State

7→State

 

例如,若当前状态为 0 时面临的读入字符为“(”,则应执行的操作序列是“n+1→n;4→state",即括号嵌套重数加 1,并把当前状态转为 4。

流程图中用字符串 S 存放被检验的算术表达式,用 S(i:j) 表示字符串 S 中第 i 个字符至第 j 个字符(j≥O)的子串,其中 S(i:i) 即为读入字符。state=5 表示退出一重括号嵌套;state=6 表示表达式语法正确;state=7 表示表达式语法出错。
[问题]

填充状态转换矩阵中的 ①~⑦,把相应的操作序列写在答卷的对应栏内。回答时可使用如下形式的操作:

if 条件 then 操作1 else 操作2;

或 if 条件 then操作;
[流程图]


试题5

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

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

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

① x=90,y=90 ② x=50,y=50

③ x=90,y=90

x=50,y=50

④ x=90,y=70

x=40,y=90

⑤ x=90,y=90

x=50,y=50

x=90,y=70

⑥ x=90,y=70

x=70,y=90

x=50,y=50

⑦ x=90,y=90

x=50,y=50

x=90,y=70

x=70,y=90

⑧ x=90,y=90

x=50,y=50

x=90,y=50

x=80,y=80

⑨ x=90,y=90

x=90,y=70

x=90,y=30

x=70,y=90

x=30,y:90

x=70,y=70

x=50,y=50

 

⑩ x=90,y=90

x=80,y=80

x=90,y=70

x=90,y=30

x=70,y=90

x=30,y=90

x=70,y=70

x=50,y=50


试题6

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

本程序是按某种规律自动生成 16×16 单色点阵图形。点阵图形中每行 16 点的信息排列在一个存储字中,16X16 点阵图形可以用连续的 16个存储字来表示。

程序中标号为 PTN 开始的 16 个存储字连续存放自动生成的 16×16 点阵图形,点阵图形中的第一行作为已知数据给定,其余 15 行按下述规则自动生成:

1.每个存储字的第 0 位和第 15 位(即边界点)恒为 0 。

2.一个存储字的第 n 位值 (0<n<15) 取决于前一存储字的第 (n-1) 位和第 (n+1) 位的值是否相同。若这两位的值相同,则第 n 位为 0;否则为 1。

例如,点阵图形第一行的存储字内容为 #35B4,按上述规则生成点阵图形第二行的存储字内容为     #71B2,余类推。

0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 0 #35B4
0 1 1 1 0 0 0 1 1 0 1 1 0 0 1 0 #71B2
0

 ········ 

0  ········

[程序]

START
LEA GRl,0
LD GR0,PTN,GRl
LOOP SLL GR0,2
__(1)__
__(2)__
__(3)__
LEA __(4)__
__(5)__
LEA GR2,-15,GRl
JMI LOOP
EXIT
PTN DC #35B4
DS 15
END


试题7

阅读下列程序说明和C程序,将应填入程序中__(n)__处的字句,写在答卷纸的对应栏内。
[程序说明]

本程序用回溯算法来产生由 0 或 1 组成的 2m个二进位串,使该串满足以下要求。

视串为首尾相连的环,则由 m 位二进制数字组成的2m 个子序列,每个可能的子序列都互不相同。例如,如果 m=3,在串 11101000 首尾相连构成的环中,由 3 位二进制数字组成的每个可能的子序列都在环中恰好出现一次,它们依次是111,110,101,010,100,000,001,011(见右图)。


[程序]

#define N l024

#define M 10

int b[N+M-1]

int equal( int k,int j,int m)

{ int i;

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

if ( b[ k + i] __(1)__ ) return 0;

return 1;

}

int exchange ( int k, int m , int v)

while ( b[ k + m - 1 ) == v ) 

{ b[ k+m-l]=! v __(2)__;}

__(3)__=v; return k;

init ( int v)

{  int k

for( k = 0 ; K = N + M - 1; k++) b[k] = v;

}

main ( )

{ int m,v,k,n,j;

printf ('Enter m( l<m<10) ,v( v=0,v=1 )\ n" );

scanf (" %d%d ,&m,&v);

n = 0x01 << ms init(!v); k=0;

while( __(4)__ < n)

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

if (equal(k,j,m))

{ k=exchange(k,m,v);

j=__(5)__;

}

for(k= 0 ;k<n ;k++ ) print{(" %d\ n" ,b[k]);

}

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