热门关键字:  项目经理  分析师  CEO  中间件  报名费
当前位置 :| 主页>软考>试题大全>程序员>





1993年度程序员级试题(附答案)

来源: 作者: 时间:2008-05-23 点击:

1993年度程序员级下午试卷

试题 2

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

子程序 UPDATE 每隔一秒被调用一次,届时对存贮单元 HOUR( 时 ),MINUTE( 分 )以及SECOND( 秒 )的当前值予以更新处理。

SECOND 与 MINUTE 均为六十进制, HOUR 为廿四进制。HOUR,MINUTE 和 SECOND 的递加与复零均由公用子程序 ADDONE 进行。

[程序]

  标号 操作码 操作数
  UPDATE START  
    PUSH 0,GR1
    PUSH 0,GR2
    PUSH 0,GR3
    LEA GR2, ①
    LEA GR3, ②
    CALL ADDONE
     
     
    CALL ADDONE
     
    LEA GR2, ⑥
    LEA GR3, ⑦
    CALL ADDONE
  UPTOK POP GR3
    POP GR2
    POP GR1
    RET  
  HOUR DC 0
  MINUTE DC 0
  SECOND DC 0
  ADDONE  
    CPA GR2,0,GR3
    JZE ADDOK
    LD GR1,0,GR3
    LEA GR1,1,GR1
  ADDOK   ST GR1,0,GR3
    RET  
    END  

 

试题 3

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

数列 A={ 1,1,3,7,17,4l,……} 有以下性质:

a0=a1=1

ai=ai-2+2ai-l ( i≥2 )

对于给定的 n,数列 X 有 n 个元素,各元素的值为

xi=ai/ai+1 ( i=0,1,……,n-1 )

·且按升序排列,其中 X 的各元素值以分数形式表示。

函数 makex()首先在枚举数列 A 的元素时,生成 X 的元素,然后对 X 的元素进行排序,最后顺序输出排序后的 X 的各元素。

例:当 n=5 时,X={ 1/3,7/17,17/41.3/7.1/1 }。
[程序]

#include<stdio.h>

structfact{

1ong m ;

long n ;

};

int test_1ist[]={ 4,5,8 } ;

main()

{ int i ;

for ( i;0;i<3;i++ )

makex( test_list[i] )

}

makex( int n )

{ int i;long a,b,c;struct fact * x,* y;

x=( struct fact * )malloc ( sizeof( struct fact ) *n );

x→m = 1L;K→n = 1L;

a = 1L; b = 1L;

for ( i=2;i<=n;i++ )

{ c=a+2L,*b ;a=b ;b=c ;

__①__=a ;__②__ =b ;

}

sort(n,x);

printf( "%d={%1d/%1d",n,xm,xn );

for( __③__ ;y++)

printf( "%ld/%1d",ym,yn );

printf( "}\n");free(x) ;

}

sort( int n,struct fact * p)

{ int b;1ong s,t,u,v;struct fact * q,* end ;

end = __④__ ;b=1;

while (b)

 { b=0 ;

for ( q=p ;q<end ;q++ )

{ s=q→m; t=q→n ;

u=(q+1)→m ; V=(q+1)→n ;

if ( s*v > t*u )

{(q+1)→m=s; (q+1)→n=t ;

q→m = u ; q→n = v ;

__⑤__ ;

}

}

__⑥__ ;

}

}

 

试题 7

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

子程序 ENCRPT 用来对给定字符串进行加密处理。

子程序使用密钥字符串与待加密字符串按顺序逐个字符进行异或操作以实现加密处理。在加密过程中如已经使用了密钥字符串的最后一个字符,则再从密钥字符串的第一个字符起重复取用,待加密字符串的全部字符处理完毕后,子程序返回其调用程序。

子程序所需的全部参数( 待加密字符串长度及字符串首址,密钥字符串长度及字符串首址 )均通过栈来传递。以下是一个调用实例:

:

:

LD GRl,CHRL
PUSH 0,GRl
PUSH CHRS
LD GRl,KEYL
PUSH 0,GRl
PUSH KEYS
CALL ENCRPT
LEA GR4,4,GR4
: :

其中标号为 CHRL 的存贮单元内是待加密字符串的长度,从标号为 CHRS 的存贮单元起顺序存放待加密字符;标号为 KEYL 的存贮单元内是密钥字符串的长度,从标号为 KEYS 的存贮单元起顺序存放密钥字符串的字符。
[程序]

  标号 操作码 操作数
  ENCRPT START  
    PUSH 0,GR1
    PUSH 0,GR2
    PUSH 0,GR3
    LEA GR0,0
    CPA GR0,5,GR4
    JPZ ENDENC
    CPA  GR0,7,GR4
    JPZ ENDENC
    __①__  
  RESET LD GRl, ____
    LD GR2, ____
  IFEND LD GR0,7,GR4
    SUB GR0,NUMl
    JMI ENDENC
    ST __④__
  GOON LD GR0,0,GR3
    EOR GR0,0,GR1
    ST GR0,0,GR3
    LEA GRl,1,GR1
    __⑤__  
    LEA GR2,-1,GR2
    __⑥__  
    JMP RESET
  ENDENC POP GR3
    POP GR2
    POP GR1
    RET  
  NUMl DC 1
    END  



试题 8

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

这里给出的程序从指定数据文件中读入职工的工号和他完成产品个数的数据信息,对同一职工多次完成的产品个数进行累计,最后按以下格式输出:职工完成产品数量的名次,该名次每位职工完成的产品数量,同一名次的职工人数和他们的职工号( 同一名次的职工号以从小到大的顺序输出 )。

ORDER QUANTITY COUNT NUMBER    
1 375 3 10 20 21
4 250 2 3 5  
6 200 1 9    
7 150 2 11 14  
: :        

程序采用链表结构存贮有关信息,链表中的每个表元对应一位职工。在数据输入同时,形成一个有序链表(按完成的产品数量和工号排序)。当一个职工有新的数据输入,在累计他的完成数量时会改变原来链表的有序性,为此应对链表进行删除、查找和插入等处理。
[程序}

#include<stdio.h>

typedef struct ele {

int no,q ;

struct ele * next ;

} elem ;

main( int argc, char * * argv)

{ FILE *fp; elem *h, *u, *proc() ;

if ( argc == 2 && ( fp = fopen( argv[1],"r" )) !=NULL )

{ h = proc(fp)

fclose (fp) ;

output(h)

while (h I=NULL) { u=h→*next ;free(h) ; h=u ;)

}

}

elem * proc( FILE *fp )

{ intn, m; elem *u, *v, *p, *base ;

base = NULL ;

fscanf( fp, "%d', &m ) ;

while ( ! feof(fp) )

{ fscanf( fp, '%d', &m ) ;

for ( v = base ;v !=NULL && v→no != n ;u = v, v = v→next ) ;

if (__①__)

if (__②__) base=v→next ;

else u→next = v - next ;

v→q + - m ;

else v = ( elem * ) malloc( sizeof( elem )) ;

v→no = n ;

v→q = m ;p = base ;

while ( p != NULL )

if (__③__ )break ;

else { u = p ;p = p→next ;}

if ( __④__ ) base = v ;else u→next = v ;

__⑤__ ;

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

}

return base ;

}

output( elem * head )

{ int count,order;elem *u, *v ;

printf( "ORDER QUANTITY COUNT NUMBER\n" ) ;

u = head;order = 1 ;

while ( u != NULL )

{ for ( count = 1,v = u→next;__⑥__ ;count++ ,v=v→next );

printf( "%4d%9d%6d",order,u→q,count );

order += count;

for(; __⑦__ ;printf( "%4d",u→no),u=u→next); ·

printf( "\n");

}

}

 

试题 12

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

子程序NPUT将正整数N嵌入一存贮字WORD的第P位起的W位中,并使其余各位保持不变。

主程序在GRI中给出存放子程序所需参数的起始地址。参数的存放形式,如下图所示。

(GRl)+0

+1

+1
+3
WORD
P
W
N
 
0≤P≤15
0%W≤16一P
0≤N≤2’一1

例:

GRl)+0
+1
+2
+3
WORD
7
5
21


 
  7
WORD

1 0 1 0 1 0 1 0 l 0 1 0 1 0 1 0

调用子程序 NPUT 后 WORD 变成

 
  7
WORD

1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0

子程序返回时,若 GR0 的值为 0,则表示子程序已经正常执行。若 GR0 的值为 1,则表示参数不合理,子程序异常退出。进入子程序时,已确保 P≥0,W>0 。程序中工作单元 MASKEP 和 MASKCP 分别有如下形式的数值:

 
  |←W→|
MASKEP

1........1 0·...0

 
  P
MASKEP

1....l 0·...0 1...1

[程序]

  标号 操作码 操作数
  NPUT START  
    PUSH 0,GRl
    PUSH 0,GR2
    PUSH 0,GR3
    LD GR2,2,GR1
    LD GR0,FULLB
    __①__  
    ST GR0,MASKEP
    EOR GR0,FULLB
    LEA GR3,16
    SUB GR3,2,GRl
    __②__  
    JMI ERROR
    SLL GR0,0,GR3
    __③__  
    ST GR0,MASKCP
    LD GR0,3,GR1
    __④__  
    JNZ ERROR
    LD GR2,0,GR1
    __⑤__  
    AND GR0,MASKCP
    LD GR1,3,GR1
    SLL GR1, ____
    ST GR1,TEMP
    OR __⑦__
    ST GR0,0,GR2
    LEA GR0,0
  FIN POP GR3
    POP GR2
    POP GR1
    RET  
  ERROR LEA GR0,1
    JMP FIN
  LB DC #FFFF
  MASKEP DS 1
  MASKCP DS 1
  TEMP DS 1
    END  

 

试题13

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

程序中的函数 divisor() 设有四个参数:正整数 n,m,正整数数表 d 和正整数 dn。其作用是将 n分解成不多于 m(≤10)个数字的数字和。其中数字选自数表 d( d 中数字可重复选用);数表 d 共有 dn 个数字,并限定数表 d 中数字互不相同,且按递减顺序存放。

函数 divisor() 采用试探法找解,其中工作数组 b 用于存放试探过程中暂时确定的数字在数表 d 中的下标,p 为存于 b 中的下标个数,t 为那些暂时确定的数字的和。
[程序]

#define MAXN 10

divisor( int ,n ,int m ,int d[] ,int dh )

{ int s,p,t,b[MAXN];

for ( s=0;s<dn && d[s]>n ,s++ );

p=0;b[0]=s;t=d[b[p]]

while ( t != n && p2 >= 0 )

{ if  __①__ 

{ for ( s=b[p] ); __②__ ;s++ );

if ( s <= dn-1 && t+d[s] <= n )

{ b[ __③__ ]=s;

t += d[s];

____

}

}

t -= d[b[p]];

while ( p >=0 && ____ )

t -= d[ __⑥__ ]

if ( p >= 0 )

t += d[ ____ ]

}

if ( t==n )

{ printf( "%4d=%3d",n,d[b[0]] );

for ( s = 1;3 <= p;s++ )

printf( "+%3d",d[b[s]] );

printf( "\n" );

}

else printf( "No solution.\n" );

{

main()

{ static int list[]={ 100,81,64,49,36,25,16,9,4,1 };

int i;

  for ( i;50;i<300;i++ ) ;

divisor( i,4,list,sizeof list/sizeof(int) );

}





最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
企业电子商务

赞助商