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

}

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