1994年度程序员级下午试卷
试题 1
阅读下列说明和流程图,把应填入其中
①~⑤ 处的字句,写在答卷的对应栏内。
[说明]
有 10 张卡片,分别写有数字 l~10,它们按顺时针方向依次放在一张圆桌上,每张卡片对应一个座位。有 10 个客人,每个客人有一编号,分别记为 l~10。入座前,客人们并未注意到桌上的卡片,当他们入座后,才发现并非每个客人的编号均与他面前的卡片号一致。转动圆桌可改变客人号与卡片号的匹配数。本流程图用来寻找当圆桌顺时针旋转多少个座位后,客人号与卡片号的匹配数最大。
流程图
流程图中,卡片号存放在数组A中,客人号存放在数组B中,MAX存放最大匹配数,S存放圆桌顺时针转动的座位数。寻找过程如下:
1.计算 T=A(1)-B(1),若 T<0,则 T 加 10;否则不加。此时得到的 T ( 称为顺差座位数 )即表示第 1 个客人与它所对应的卡片相差的座位数(按顺时针旋转圆桌计算),也就是说,当圆桌顺时针旋转 T 个座位后,第1个客人就与它所对应的卡片匹配了。图中T的值仍存放在 A(1) 中。
2.在数组
A 中,统计每个不同顺差座位数的出现次数 JS,其中与最大的出现次数
MAX 对应的顺差座位数就是圆桌应顺时针转动的座位数 S。也就是说,当圆桌顺时针旋转
S 个座位后,就有 MAX 个客人号与卡片号匹配。若对应于 MAX 的座位数
S 有多个,则本流程图只输出其中的一个 S。为避免重复统计,流程图中,若数组
A 的元素已改成 -1,则标志该元素已被统计过。
|
从下列的 5 道试题( 试题 2 至试题 6 )中任选 l 道解答。如果解答的试题 数超过 1 道,则解答的前 1 道有效。 |
试题 2
在
COMET 型计算机上可以使用试卷上所附的 CASL 汇编语言。阅读下列程序说明和
CASL 程序,把应填入程序中__(n)__ 处的字句,写在答卷的对应栏内。
[程序说明]
子程序MUL用来计算正整数N和正整数M的乘积。乘法是通过移位、判断和加法
来实现的。假定M和N的乘积不会超出2’‘一1。
主程序在调用MUL时,需将被乘数M存入GRl,将乘数N存入GR2。子程序将乘
积存于GR0。
[程序]
| 标号 | 操作码 | 操作数 | |
| START | MUL | ||
| MUL | PUSH | 0,GRl | |
| PUSH | 0,GR2 | ||
| PUSH | 0,GR3 | ||
| (1) | |||
| NEXBIT | ST | GR1,WORK2 | |
| LEA | GR3,0,GR2 | ||
| (2) | |||
| JZE | NEWBIT | ||
| ADD | (3) | ||
| NEWBIT | SLL | (4) | |
| (5) | |||
| JNZ | NEXBIT | ||
| POP | GR3 | ||
| POP | GR2 | ||
| POP | GR1 | ||
| RET | |||
| WORK2 | DS | 1 | |
| NUM01 | DC | l | |
| END |
试题 3
阅读下列程序说明和
C 程序,将应填入程序中__(n)__处的字句写在答卷纸的对应栏内。
[程序说明]
本程序用于对一系列考生进行考试成绩的评定及统计。设试卷共有10道试题,考生从中任选解答5道。每道满分均为20分,试卷满分100分。
每个考生的考号及依次10道试题得分在一行内输入。约定未选的试题得分厨负数标识。选答试题多于5道,按前5道得分评定成绩。如有不合理的得分或输入错误,程序要求重新输入。程序以输入的考号为负数表示输入结束。
程序输出各考生的考号、总分和成绩等级。其中成绩等级按下表所示规则评定:
| 总分 | 等级 |
| 90100 | A |
| 80~89 | B |
| 70~79 | C |
| 60~69 | D |
| 0~59 | E |
程序还对实考人数、各等级得分人数及各试题解答人数与平均得分(保留小数两位)进行统计和输出。
[程序]
#define MAXSCORE 20
#define QUESTION 10
#define ORDERS 5
main()
{
int p[QUESTION]={0,0,0,0,0,0,0,0,0,0},
n[QUESTION]={0,0,0,0,0,0,0,0,0,0},
s[QUESTION]={0,0,0,0,0,0,0,0,0,0};
int f[ORDERS]={0,0,0,0,0};
int i,score,c,number,pn=0;
char fig,ch[120];
char *title[]={ "90--100 A",
"80--89 B",
"70--79 C",
"60--69 D",
"0--59 E" }
while(1)
{
printf( "Enter number && score1 -- score10 \n" );
if ( scanf( "%d",&number ) == 0 )
{
gets(ch);
printf("Error! Input again!\n");
continue;
}
__ (1)__;
for ( c=0,i=1;i<QUESTION && c == i; i++)
if ( scanf("%d",&p[i] ))
if ( p[i] <= MAXSCORE )
__(2)__
if ( __(3)__ )
{
gets(ch);
printf("Error! Input again!\n");
continue;
}
for (c=0,score=0,i=0;i<QUESTION;i++)
if ( __(4)__ )
{
c++;
score += p[i];
n[i]++;
s[i] += p[i];
}
fig = ( score ==100 ) ?
'A': (score < 60) ? __(5)__;
f[ __(6)__ ]++;
pn++;
printf("Number = %d Score = %d Mark = %c\n",number,score,fig);
}
printf("STUDENTS = %d\n",pn);
for ( i=0;i<ORDERS;i++ )
printf( "%s%7d\n",title[i],f[i] );
printf( "\n Question Students Average\n" );
for (i=0;i<QUESTION;i++)
if (n[i])
printf("%6d%10d%10.2f\n",i+1,n[i], __(7)__ );
else
pritnf ("6d%10d%10s\n",i+1,n[i]," --");
}
|
从下列的5道试题(试题7至试题11)中任选1道解答。如果解答的试题数超过1道,则解答的前1道有效。 |
试题 7
在
COMET 型计算机上可以使用试卷上所附的 CASL 汇编语言,阅读下列程序说明和
CASL 程序,把应填入程序中__(n)__处的字句,写在答卷的对应栏内。
[程序说明]
本程序将输入的数字字符串转换成二进制整数,并把结果存放在标号为RESULT的存储字内。
输入的字符串仅含有数字字符,其长度不允许超过4。数字字符。一9的ASCII编码依次是48~57。程序对输入字符进行合法性检查,若含有0~9以外的字符或长度超过
4,则输出错误信息,并要求重新输入。若输入空串则退出程序。
[程序]
| 标号 | 操作码 | 操作数 | |
| START | |||
| INPUT | IN | BUFFER,DIGIT | |
| LD | GRl,DIGIT | ||
| LEA | GRl,0,GRl | ||
| JZE | ENDPGM | ||
| LEA | GR0,__(1)__ | ||
| JPZ | ERROUT | ||
| LEA | GR3,0 | ||
| ST | GR3,RESULT | ||
| NEXNUM | __(2)__ | ||
| LEA | GR0,-58,GR2 | ||
| JPZ | ERROUT | ||
| __(3)__ | |||
| JMI | ERROUT | ||
| ST | GR0,TEMP | ||
| LD | GR0,RESULT | ||
| __(4)__ | |||
| ADD | GR0,RESULT | ||
| ADD | GR0,RESULT | ||
| ADD | GR0,TEMP | ||
| ST | GR0,RESULT | ||
| __(5)__ | |||
| CPA | GR3,DIGIT | ||
| __(6)__ | |||
| ENDPGM | EXIT | ||
| ERROUT | OUT | WRONG,WRLEN | |
| __(7)__ | |||
| RESULT | DS | 1 | |
| DIGIT | DS | 1 | |
| BUFFER | DS | 20 | |
| WRONG | DC | 'INVALID INPUT' | |
| WRLEN | DC | 13 | |
| TEMP | DS | 1 | |
| END |
试题 8
阅读下列程序说明和
C 程序,将应填入程序中__(n)__ 处的字句,写在答卷纸的对应栏内。
[程序说明]
本程序实现安照每页宽 80 列平均分左右两栏的格式印出正文文件内容。
程序引入数组 buff[] [] [] 和 ln [] [], 将从文件读出的字符按行存储于 buff[0],行号存于 ln[0](对应左栏), 或buff[1]、ln[1](对应右栏)。约定,文件内容先填左栏填满后,再填右栏.或左右两栏填满,或文件内容填完,输出一页的内容。
欲输出的正文文件( 小于1000行 )的文件名作为主函数的参数.主函数以文件名为参数调用函数 dprint() 输出一个文件。函数dprint() 读取文件内容,控制栏中的一行内容的填写,当一行填满时,调用函数 nextline()。函数 nextline() 控制栏中行的变化,左右栏的变化。待左右栏都填满时,调用函数 printout() 完成整页输出。函数 printout() 完成页面排版,取 ln[0]、buff[0] 和ln[1]、 buff[1],将对应行号及内容填入 line[],逐行输出。
【程 序】
#include <stdio.h>
#define LL 80
#define COL 2
#define CSIZE LL/COL-9
#define PL 50
#define MARGIN 3
char buff[COL][PL][CSIZE];
int ln[COL][PL];
int col,row,p;
dprint(char *fname)
{ FILE *fp;
int lin,c;
if ((fp=fopen(fname,"r"))==NULL) return;
lin =0; p=0; col=0; c=getc(fp);
while (c!=EOF)
{ ln[col][row]=++lin;
while (c != '\n' && c != EOF)
{ if (p>= CSIZE)
{ __(1)__ ;
ln[col][row] = 0;
}
__(2)__ = c ;
c = getc(fp);
}
__(3)__ ;
if (c != EOF) c = getc(fp);
}
while( col != 0 || row != 0 )
{ ln[col][row] = 0;
nextline();
}
fclose(fp);
}
nextline()
{ while(p < CSIZE)
buff[col][row][p++] = ' ';
if ( __(4)__ )
{ if ( ++col >= COL )
{ printout();
__(4)__;
}
row = 0;
}
p = 0;
}
printout()
{ int k, i, lpos, col, d;
char line[LL];
for(k=0;k<MARGIN;k++) putchar('\n');
for(k=0;k<PL;k++)
{ for(i=0;i<LL-1;i++)
for(lpos=0,col=0;col<COL;lpos += CSIZE+9,
col++)
{ d = __(5)__;
p = lpos + 4;
while (d>0)
{ line[p--] = _______________;
d /= 10;
}
for(p=lpos+7,i=0;i<CSIZE;i++)
line[p++] = buff[col][k][i];
}
puts(line);
}
for(k=0;k<MARGIN;k++) putchar('\n');
}
main(int argc, char **argv)
{ int f;
for(f=1;f<argc;f++)
dprint(argc[f]);
}
|
从下列的5道试题(试题12至试题16)中任选1道解答。如果解答的试题数超过1道,则解答的前1道有效。 |
试题 12
在 COMET 型计算机上可以使用试卷上所附的 CASL 汇编语言。阅读下列程序说明和
CASL 程序,把应填入程序中__(n)__
处的字句,写在答卷的对应栏内。
[程序说明]
本程序用来对压缩的英文、数字字符串作复原处理。复原处理是以下压缩算法的逆运算。
由于 COMET 机的一个存储字只使用 16 位中的低 8 位存放字符的 ASCII 编码,而英文、数字字符的 ASCII 编码只有 7 位有效数位。为提高存储效率,压缩算法采用按位连续使用一段连续存储区域,存放数字、英文字符。即从连续存储区域的首宇的最高位开始,每 7 位存放一个英文、数字字符的 7 位有效数位,一存储字余下的位不足 7 位时继续使用下一存储字的高位,最后用 7 位二进位。作为压缩数据的结束标记。
程序中对标号为 PACK 的连续存储区域存放的压缩数据作复原处理,复原后的字符串放在标号为
STRING 的存储区域内,并输出至输出设备。
[程序]
| 标号 | 操作码 | 操作数 | |
| START | |||
| LEA | GR1,0 | ||
| LEA | GR2,0 | ||
| LEA | GR3,9 | ||
| CLEAR | LEA | GR0,0 | |
| ST | GR0,WORK | ||
| MAKE | LD | GR0,PACK,GRl | |
| SRL | GR0,0,GR3 | ||
| OR | GR0,WORK | ||
| AND | GR0,MASK | ||
| JZE | ENDOK | ||
| ST | GR0,STRING,GR2 | ||
| __(1)__ | |||
| __(2)__ | |||
| JPZ | CLEAR | ||
| ST | GR3,WORK | ||
| LEA | GR3,0 | ||
| SUB | GR3,WORK | ||
| LD | GR0,PACK,GRl | ||
| __(3)__ | |||
| LEA | GR3,16 | ||
| ADD | GR3,WORK | ||
| ST | GR0,WORK | ||
| __(4)__ | |||
| JMP | MAKE | ||
| ENDOK | __(5)__ | ||
| OUT | STRING,OUTLEN | ||
| EXIT | |||
| WORK | DS | 1 | |
| STRING | DS | 16 | |
| OUTLEN | DS | 1 | |
| MASK | __(6)__ | ||
| PACK | DC | #AFl6 | |
| DC | #6439 | ||
| DC | #F362 | ||
| DC | #AOA9 | ||
| DC | #3D04 | ||
| DC | #3834 | ||
| DC | #E600 | ||
| END |
试题13
阅读下列程序说明和 C 程序,将应填入程序中__(?)__处的字句,写在答卷纸的对应栏内。
[程序说明]
本程序给出两个函数.函数create()根据已知整数数组构造一个线性链表。函数sort()采用选择排序方法对已知链表进行排序。为排序方便,函数sort()于排序前在链表首表元之前生成一个辅助表元。排序完成后,将该辅助表元筛去。
【程 序】
#include <stdio.h>
#include <stdlib.h>
struct node{
int value;
struct node *next;
};
struct node *create(int a[], int n)
{ struct node *h, *q;
for(h=NULL;n;n--)
{ q = ( struct node *)malloc(sizeof(struct node ));
q->value = __(1)__;
__(2)__;
__(3)__;
}
return h;
}
void sort( struct node **h )
{ struct node *p,*q,*r,*s,*hl;
hl = p = ( struct node*)malloc(sizeof(struct node ));
p->next = *h;
while( p->next != NULL )
{ q = p->next;
r = p;
while( p->next != NULL )
{ if ( q->next->value < __(4)__ )
r = q;
q = q->next;
}
if( r != p )
{ s = __(5)__;
__(6)__ = s->next;
s->next = __(7)__;
___________ = s;
}
p = p->next;
}
*h = hl->next;
free(hl);
}
int text_data[] = {5,9,3,4,5,7,8};
main()
{ struct node *h, *p;
h = create(test_data,
sizeof test_data/size of test_data);
for(p=h;p;p=p->next) printf("%5d",p->value);
printf("\n");
sort(&h);
for(p=h;p;p=p->next) printf("%5d",p->value);
printf("\n");
}