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 | 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);
}

