1992年度程序员级下午试卷

试题 2

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

(1)本子程序是对 15 位二进制串,求其偶校验位,形成 16 位二进制串,使其中 1 的个数为偶数。

(2)进入此子程序时,15 位二进制串放在 GR1 的第 1 位至第 15 位(假设 GR1 的第 0 位是 0 ),求出的偶校验位放在 GR1 的第 0 位。
[程序]

标号 操作码 操作数
START
BEG __①__
__②__
LEA GR3,0
LEA GR2,0,GR1
L1 __③__
__④__
LEA GR3,1,GR3
L2 __⑤__
JMP L1
L3 __⑥__
ST GR3,WORK
ADD GR1,WORK
POP GR3
POP GR2
RET
WORK DS 1
END

 

试题 3

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

本程序采用筛选法求质数。程序用一个无符号整数数组代表筛,它的每一位对应一个整数。因除 2 以外,其余所有的质数都是奇数,约定数组按位的顺序,依次对应整数 3,5,7,9,11。程序首先将数组所能容纳的上述奇数放入筛中,即将数组的全部位置成 1。从筛中找出最小的数,该数即为质数,然后将该质数的倍数从筛中去掉,即将在数组中与它们对应的位置成 0。因偶数不在筛中,去掉的数是找到的质数的 1 倍,3 倍,5 倍……等整数。反复上述过程,直至筛为空。程序就能找到指定范围内的全部质数。

【程序】

#include <stdio.h>

#define N 50

#define LN 16

main()

{

unsigned int sieve[N],primes[N];

unsigned int j,w,p,c;

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

{ sieve[j] = 0xFFFFFFFF;

primes[j] = 0x00;

}

w=0; j=0;

do { while ((( 0x01<< ( j++ )) & sieve[w] == 0x00 );

p=__(1)__;

c=__(2)__;

primes[w] |= ( __(3)__ );

do

{ sieve[p/LN] &=(~( __(4)__ ));

p += c;

} while (p < N*LN-LN);

while (( sieve[w] == 0x00 ) && ( w < N-1 ))

{ w++;

j=0;

}

} while ( sieve[w] ) ;

printf("%5d",2);

for ( w=0;w<N;w++ )

{ for ( j=0;j<LN;j++ )

if(( 0x01 << j ) & primes[w] )

printf( "%5d",__(5)__ );

}

printf( "\n" );

}

试题 7

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

本程序用来将通算形式的日期转换为标准的年月日形式的日期。

所谓通算形式的日期,是指以当年的元月一日作为第一天,元月二日作为第二天,这样顺序计数的流水日期。例如,1992 年的第 32 天,转换为标准形式是 1992 年 2 月 1 日;1992 年 10 月18 日用通算形式来表示,就是 1992 年的第 292 天。

进入此子程序时,GR1 中存放年份,GR2 中存放要转换的通算日期。通过该子程序处理后,GRl,GR2,GR3 的内容分别为年、日、月。

子程序中考虑了闰年的情况。所谓闰年是指年份是 400 的倍数,或者是 4 的倍数但不是 100 的倍数的那些年份。闰年的二月是 29 天。

若年份不为正整数,或者通算日期超出了当年的天数,则子程序报告数据错误信息。
[程序] 

标号 操作码 操作数
START
MTHDAY PUSH 0,GR1
LEA GR3,0,GR1
JMI ERROUT
LEA GR1,0
SBLOOP SUB GR3,N100
JMI NOTX00
LEA GR1,1,GR1
__(1)__
JNZ SBLOOP
JMP IFLEAP
NOTX00 __(2)__
IFLEAP __(3)__
JZE TRYMTH
LEA GR1,1
TRYMTH LEA GR3,0
NXTMTH LD GR0,MNDAY,GR3
LEA GRl,0,GR1
JNZ A
__(4)__
A AND GR0,C00FF
ST GR0,-1,GR4
CPA GR2,-1,GR4
JMI FOUND
JZE FOUND
__(5)__
LEA GR3,1,GR3
LEA GR0,-12,GR3
JNZ NXTMTH
ERROUT OUT ERRTXT,ERRLEN
JMP RETURN
FOUND __(6)__
RETURN POP GR1
RET
MNDAY DC #lFlF
MNDAY2 DC #1D1C
DC #1F1F
DC #1E1E
DC #1F1F
DC #1E1E
DC #1F1F
DC #1F1F
DC #1E1E
DC #1F1F
DC #1E1E
DC #1F1F
N100 DC 100
LEAPNM DC 3
C00FF DC #00FF
ERRTXT DC "INVALID DATA"
ERRLEN DC 13
END



试题 8

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

设有两整数向量 A, B 的比较矩阵 M 可定义为:

1 a(j) > b(i);
m(i)(j) = -1 a(j) < b(i); (i,j=0,1,┄,n-1)
0 a(J) = b(I)

如图所示。

B\A 8 9 4 6 2 4
3 1 1 1 1 -1 1
7 1 1 -1 -1 -1 -1
7 1 1 -1 -1 -1 -1
5 1 1 -1 1 -1 -1
3 1 1 1 1 -1 1
8 0 1 -1 -1 -1 -1

(1) 本程序对给定的比较矩阵 M,确定满足 a(k)=x 条件的 A, B的一个整数解。

(2) 本程序的解法是: 读入 M,k,x后

1、填充A,B, 令b(i)=x-m(i)(k), a(i)=x (i=0,1,┄,n-1)

2、检查 a(j) 与b(i)是否满足 m(i)(j)

若满足检查下一个

●否则向上调整相应元素,并按以下约定回朔检查: 当B的第i个元素调整时,则回朔到A的第一个元素;当A的第j个元素调整时,则回朔到A的当前元素和B的第一个元素。

本程序对比较矩阵M的合理性未作检查,并假定在指定的条件下一定能找到一个解。

[程序]

#include <stdio.h>

#define MN 20

typedef int Vector[MN];

Vector Matrix[MN];

int N;

main( argc,argv )

int argc; char **argv;

{ Vector a,b;

int i,j,x,k;

void PrintVector();

void FillVector();

FILE *fp,*fopen();

if (( fp=fopen( argv[argc-1],"r" )) == NULL )

{ printf( "Cannot open file %s\n",argv[argc-1] );

exit(1);

}

fscanf( fp,"%d",&N );

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

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

fscanf( fp,"%d",&Matrix[i][j] );

fscanf( fp,"%d%d",&k,&x );

fclose( fp );

FillVector( a,b,k,x );

printf( "The Vector A is:\n" );

PrintVector( a );

printf( "The vector B is:\n" );

PrintVector( b );

}

void PrintVector(v)

Vector v;

{ int i;

printf( "[" );

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

printf( "%5d",v[i] );

printf( "]\n" );

}

void FillVector( a,b,k,x )

Vector a,b;

int k,x;

{ int i,j,temp; 

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

{ b[i]=x-Matrix[i][k];

a[i]=x;

}

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

{ for ( j=0;j<N;j++ )

{ Temp=b[i]+Matrix[i][j];

if ( Matrix[i][j]==1 && Temp > a[j] )

{ __(1)__; i=0;}

else if( Matrix[i][j]==-1 && Temp < a[j] )

{ b[i]=a[j]+1; __(2)__ ; }

else if ( a[j]>b[i] )

{ b[i]=a[j] ; __(3)__ ; }

else if( a[j] < b[i] )

{ __(4)__ ; __(5)__ ; }

}

}

}

 

试题 12

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

本题给出的程序是在输入装置上读入一个字符串,判断它是否为合法的某程序设计语言的变量名,并区分该变量名的类型(实型或整型)。判断和区分的规则如下:

(1)变量名的第一个字符必须是英文大写字母,从第二个字符起可以是英文大写字母或数字。

(2)变量名只能用6个以内的合法字符表示(包含6个合法字符)。

(3)变量名的第一个字符为英文大写字母I,J,K,L,M,N时,该变量名的类型为整型,其它英文大写字母开始的变量名的类型为实型。

(4)输入不符合上述规则的字符串,程序输出*ERR。

输入字符串和输出结果的关系举例如下:

输入字符串 输出字符
OR REAL
INTEN INTE
4BAS *ERR
FORTRAN *ERR

[程序]

标号 操作码 操作数
START BEG
BEG IN INBUF,INNUM
OUT INBUF,INNUM
LEA GR1,6
CPA GRl,INNUM
JMI ERR
LEA GR1,0
CPA GRl,INNUM
JPZ ENDD
AGN LD GR3,INBUF,GRl
CALL AZ09IN
DC 0
JMP NEXT
LEA GRl,0,GRl
JZE ERR
CALL AZ09IN
DC 2
JMP NEXT
ERR OUT EMSG,N4
JMP BEG
NEXT LEA GRl,1,GRl
CPA GRl,INNUM
JMI AGN
__①__
__②__
__③__
__④__
OUT RMSG,N4
JMP BEG
INT OUT IMSG,N4
JMP BEG
ENDD EXIT
AZ09IN LD GR2,0,GR4
LD GR2,0,GR2
CPA GR3,CHAR,GR2
JMI NO
LEA GR2,1,GR2
CPA GR3,CHAR,GR2
JMI YES
JNZ NO
YES __⑤__
__⑥__
ST GR2,0,GR4
RET
NO __⑦__
__⑧__
ST GR2,0,GR4
RET
N4 DC 4
EMSG DC '*ERR'
RMSG DC 'REAL'
IMSG DC 'INTE'
INNUM DS 1
INBUF DS  80
CHAR DC 'AZ09IN'
END

试题13

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

本子程序利用递归法判别用链表表示的两个非递归链表是否相等。

程序中的非递归列表定义为:

(1) 无元素的空列表;

(2) 由元素序列组成的一个列表,其中的元素可以是一个字符,或者是满足本定义的一个列表.

这种列表的一个例子是:

S

 
—→
0  
—→
1  

┌─

─────┘

└→

0 b  
—→
0 c

列表 S 由两个元素组成,第一个元素是字符 a ( 标志为 0 ),第二个元素是另一个列表(标志为1),该元素又有两个元素组成( 标志为 0 ),分别为字符 b 和字符 c。

在两个列表中,若它们的元素个数相等,且表中元素依次相同,则两个列表相等( 子程序回答 1 ),否则不相等(子程序回答 0 )。

【程序】

typedef struct lnode

{ int tag;

union

{ char data;

struct lnode *dlink;

} un;

struct lnode *link;

} listnode;

int equal(s,t)

listnode *s,*t;

{ int x,res;

if(s==t)

__(1)__ ;

else if( __(2)__ )

if( __(3)__ )

{ if ( !s->tag )

x = __(5)__ ;

else

x = __(6)__ ;

if (x) return (__(7)__);

}

return(0);

}

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