📄 历届试题 - 一九九八年度高级程序员级 下午试卷.htm
字号:
<BR><BR> x=70,y=70 x=70,y=90 x=70,y=70 x=90,y=70
<BR><BR> x=70,y=90 x=70,y=75
<BR><BR> x=75,y=90
<BR><BR> x=75,y=80
<BR><BR> x=70,y=90 <BR><BR>试题三
<BR><BR> 阅读以下说明和流程图,回答问题1至问题2,将解答写在答卷的对应栏内。 <BR><BR>[说明]
<BR><BR> 本流程图描述了某种字符序列的变换过程。变换前的字符序列以字符“#”结尾,它存放在数组old中,变换后的字符序列存放在数组new中,它不包含结束标志“#”。流程图按下列规则进行变换:
<BR><BR>1.删除字符序列中的注解。注解用一对“!”字符分隔,注解中可出现除“#”外的任何字符。
<BR><BR>2.字符常数完整地保留。字符常数用一对“&”字符分隔,字符常数中可出现、外的任何字符。
<BR><BR> 值得注意的是:当字符“&”需要出现在字符常数中时,通常用二个连续的“&”表示,在
<BR><BR> 保留字符常数时,这二个连续的“&”都被保留。此外,作为字符常数分隔符的一对“&” <BR><BR> 也被保留。
<BR><BR>3.除字符常数和注解外,出现在其它地方的连续多个空格压缩成一个空格,但字符序列中先导
<BR><BR> 的空格则全部删除。 <BR><BR>4.注解和字符常数之外的非空格字符均保持不变。
<BR><BR> 本流程图对原字符序列从左到右扫描,根据遇到的当前字符来搜索连续空格、注解或字符常
<BR><BR> 数,然后按上述变换规则变换。若遇到的当前字符是“!”,则寻找下一个“!”字符(若
<BR><BR> 找不到则作出错处理),这二个“!”间的字符全部看作为注解。若当前字符是“&”字符
<BR><BR> 则寻找与之配对的下一个“&”字符(若找不到则作出错处理),其间的字符全部看作为字 <BR><BR> 符常数。
<BR><BR> 例如: <BR><BR> 原字符序列:
<BR><BR> └┘└┘a└┘└┘└┘b&cd&&└┘└┘!e&f└┘└┘ g!h& └┘└┘!└┘└┘j#
<BR><BR> 变换后的字符序列:a└┘bdcd&&└┘└┘!e&f└┘g└┘j
<BR><BR> 本流程图假定在数组old中一定存在“#”字符。 <BR><BR>[问题1]
<BR><BR> 填充流程图中的①~⑤,把解答写在答卷的相应位置上。 <BR><BR>[问题2]
<BR><BR> 当原字符序列中汪解的前后均是连续空格时,本流程图将注解前后的连续空格分别压缩成一个空格,删除注解后,将导致变换后的新字符序列出现二个连续的空格。如;
<BR><BR> g└┘└┘!h&└┘└┘i!└┘└┘j <BR><BR>本流程图将变换成g└┘└┘j。
<BR><BR> 为使变换后的新序列中除字符常数外没有连续的空格,图中的虚线框需作何改动(只需画出修改后的流程图)
<BR><BR>试题四
<BR><BR> 在COMET型计算机上可以使用试卷上所附的CASL汇编语言。阅读以下程序说明和CASL程序,将应填入_(n)_处的字句,写在答卷的对应栏内。
<BR><BR>[程序说明] <BR><BR> 本程序是统计字符串中数字字符“0”至“9”的出现次数。
<BR><BR> 字符串中的每个字符是用ASCII码存贮。一个存贮单元存放两个字符,每个字符占8位二进位。
<BR><BR> 程序中,被统计的字符串从左至右存放在STR开始的连续单元中,并假定其长度不超过200,字符串以‘·’符作为结束。NCH开始的10个单元存放统计结果。<BR><BR> START
MIN <BR>MIN LEA GR2,9 <BR><BR> LEA GR0,0 <BR><BR>L1 _(1)_
<BR><BR> LEA GR2,-1,GR2 <BR><BR> LEA GR4,0 <BR><BR> LEA GR1,0
<BR><BR>L2 LD GR2,STR,GR1 <BR><BR> EOR GR4,C1 <BR><BR> JNZ RL
<BR><BR> _(2)_ <BR><BR>RL SRL GR2,8 <BR><BR> LEA GR3,0,GR2
<BR><BR> SUB BR3,C9 <BR><BR> JNZ L4 <BR><BR>L3 LEA GR3,0,GR2
<BR><BR> SUB GR3,CO <BR><BR> JM1 L5 <BR><BR> LEA GR2,1
<BR><BR> _(3)_ <BR><BR> _(4)_ <BR><BR>L4 GR4 0,GR4
<BR><BR> JNZ L2 <BR><BR> _(5)_ <BR><BR> JMP L2 <BR><BR>L5 SUB
GR2,C <BR><BR> JNZ L4 <BR><BR> EXIT <BR><BR>C1 DC 1 <BR><BR>C
DC '·' <BR><BR>C0 DC Ɔ' <BR><BR>C9 DC 9 <BR><BR>STR DS 200
<BR><BR>NCH DS 10 <BR><BR> END <BR><BR><BR>试题五
<BR><BR> 阅读以下程序说明和C程序,将应填入_(n)_处的字句,写在答卷的对应栏内。 <BR><BR>[程序说明]
<BR><BR> 这里给出的程序逐一从指走课程成绩文件中读入学生的学号和成绩,对同一学生汇总他的总成绩,并按以下格式输出名次(按总成绩由高到低的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小到大的顺序)。
<BR><BR> 程序约定学生学习课程不超过30种,课程成绩文件的第一个数字就是课程号,统计过程中,同一课程号的成绩文件不能重复输入。
<BR><BR> 程序采用链表结构存储学生有关信息,链表中的每个表元对应一位学生。程序在数据输入过程中,形成一个按学生学号从小到大顺序链接的有序链表。当数据输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表排序。程序最后按指定格式输出链表中的信息。程序的输出格式如下例所示:<BR><BR>名 次
总成绩 人 数 学 号 <BR>1 470 2 12 25 <BR>3 450 3 15 24 50 <BR>6 430 1
14 <BR>7 401 3 13 18 45 <BR> …
<BR><BR>[程序]<BR><BR>#include 〈stdio.h〉 <BR><BR>#define M 30
<BR><BR>#define NLEN 10 <BR><BR>typedef struct node {int
cur_s/*最近输入成绩的科目 */ <BR><BR> char no[NLEN];int score;
<BR><BR> stuction node *next; <BR><BR> }NODE;
<BR><BR>N0DE*bubblesort(N0DE*head) <BR><BR>{NODE
*q,*tail,*p=(MODE*)malloc(sizeof(NODE);
<BR><BR> p→next=head;head=p;tail=NULL; <BR><BR> while
(tail!=___(1)___) <BR><BR> {p=head;q=p→next; <BR><BR> while
(q→enxt!=tail) <BR><BR> {if (p→next→score→〈q→next→score||
<BR><BR> p→next→scor==q→next→score&& <BR><BR>
strcmp(p→next→no,q→next→no)〉0)
<BR><BR> {p→next=_(2)_,/*两相邻表元链接关系前后颠倒*/
<BR><BR> _(3)_=q→next→next;p→next→next=q; <BR><BR> }
<BR><BR> p=p→next;/*调整p和q*/ q=_(4)_; <BR><BR> } <BR><BR> tail=q;
<BR><BR> } <BR><BR> p=head→next;free(head);return p; <BR><BR>}
<BR><BR>int s[M],sp; <BR><BR>main() <BR><BR>{FILE*fp;
<BR><BR> NODE*h,*u,*v*p; <BR><BR> int ss,,mark,order,c;
<BR><BR> char fname[80],no[NLEN],ans; <BR><BR> for(h=NULL,sp=0;;)
<BR><BR> {print(''输入科目成绩文件名(输入aaaa表示强行结束)。\n"); <BR><BR> while (1)
<BR><BR> {scanf("%s",fname);
<BR><BR> if(strcmp(fname,"aaaa")==0)break;
<BR><BR> if((fp=fopen(fname,"r"))==NULL)
<BR><BR> printf("不能打开文件%s,请重新输入科目文件名。\n,fname); <BR><BR> else
break; <BR><BR> } <BR><BR> if(strcmp(fname,"aaaa")==0)break;
<BR><BR> fscanf(fp,"%d",&ss);/·输入科目号·/s[sp]=ss;
<BR><BR> for(i=0;s[i]!=ss;i++); <BR><BR> if(i<SP) <br>
<BR> {printf("该科目的成绩已输入,请输入别的科目成绩文件。\n"); <BR><BR> continue;
<BR><BR> } <BR><BR> sp++;
<BR><BR> while(fscanf(fp,"%s%d",no,&mark)==2)
<BR><BR> {/*在链表中寻找最近输入的学号*/ <BR><BR> for(v=h;v!=NULL,&&
strcmp(v→no,no)<0;u=v,v=v→next); <BR><BR> if(v!=NULL &&
strcmp(v→no,no)==0) <BR><BR> {if (v→cur_s!==ss)
<BR><BR> {v→score+=mark;v→cur_s=ss;
<BR><BR> }/*同一科目成绩的重复输入,后输入成绩被忽略*/ <BR><BR> }else
{p=(NODE*)malloc(sizeof(node);/*一位新的学生*/
<BR><BR> strcpy(p→no,no);p→score=mark;p→cur_s=ss;
<BR><BR> p→next=v; <BR><BR> if(v==h) h=p;else u→next=p;
<BR><BR> } <BR><BR> } fclose(fp);
<BR><BR> printf("还有科目成绩文件要输入吗?(Y/N)");scanf("%c",&ans);
<BR><BR> if(anns=='N'||ans=='n')break; <BR><BR> }
<BR><BR> h=bubblesort(h); <BR><BR> printf("名次 总成绩 人数
学号\n");/*以下按格式要求输出*/ <BR><BR> v=h;order=1; <BR><BR> while(v!=NULL)
<BR><BR> {for (c=1,u=v→next;u!NULL
&&u→score==v→score;c++,u=u→next);
<BR><BR> printf("%4d%7d%8d ",order,v→score,c);
<BR><BR> for(order+=c,i=1;_(5)_;v=v→next,i++) <BR><BR> {if (i>1 &&
i%5==1) printf("\n%23c",''); <BR><BR> printf("%s",v→no);
<BR><BR> }printf("\n"); <BR><BR> } <BR><BR>} <BR><BR><BR>试题六
<BR><BR> 阅读以下程序说明和FORTRAN程序,将应填入_(n)_处的字句,写在答卷的对应栏内。 <BR><BR>[程序说明]
<BR><BR> 本程序用以将m+n个元素的数组A中的前m个元素(A(1)-A(m))与后n个元素(A(m+l)-A(m+n))互换位置,并保持其各自原有的内部顺序。
<BR><BR> 程序中把数组的各元素看成首尾相连的序列,并将数组元素分成G组(G为m和n的最大公因子),每组中的元素序列是从数组某元素起由间隔为m的元素组成,再将每组元素依次循环向左传送,即得所需结果。
<BR><BR> 例如原数组A为: <BR><BR> <BR><BR> 由m=4,n=2,求得
G=2,将A中的元数分成两组。按上述说明,第一组元素序列依次为A(1)、A(5)、A(3),将它们循环向左传送后的结果为<BR><BR>8
9 7 2 6 4
<BR><BR> 第二组元素序列依次为以A(2)、A(6)、A(4),将它们循环向左传送后的结果为<BR><BR>8 4 7 9 6
2 <BR><BR>即得所需结果。<BR><BR> INTEGET A(1000), G,H
<BR><BR> READ(*,*)M,N <BR><BR> READ(*,*)(A(1),1=1,M+N)
<BR><BR> G=M <BR><BR> H=N <BR><BR>20 IF (G,NE,H)THEN
<BR><BR> IF(G,GT,T)THEN <BR><BR> G=G-H <BR><BR> ELSE
<BR><BR> H=H-G <BR><BR> ENDIF <BR><BR> GOTO 20
<BR><BR> ENDIF <BR><BR> DO 100 I=_(1)_ <BR><BR> TEMP=A(1)
<BR><BR> K=1 <BR><BR>30 J=_(2)_ <BR><BR> IF(J,NE,1)THEN
<BR><BR> A(K)=_(3)_ <BR><BR> K=J <BR><BR> _(4)_
<BR><BR> ELSE <BR><BR> A=K=_(5)_ <BR><BR> ENDIF
<BR><BR>100 CONTINUE <BR><BR> WRITE(*,200)(A(I),I=1,M+N)
<BR><BR>200 FORMANT(1016) <BR><BR> END <BR><BR><BR>试题七
<BR><BR> 阅读以下程序说明和C程序,将应填入_(n)_处的字句,写在答卷的对应栏内。 <BR><BR>[程序说明]
<BR><BR> 本程序的函数 <BR><BR> sum(int,i int total,int sigma,int
rear,int d[],int n)
<BR><BR>用来从已知数组d的前n个元素中找出所有部分元素序列之和等于total的元素序列,约定数组d的元素都是正整数,且都小于等于total。
<BR><BR> 函数sum使用递归方法找出全部解答。参数i表示递归函数当前考虑元素d[i],参数sigma是调用前已选取的部分序列的元素和,参数rear是后面还未考虑的那部分元素的元素和。
<BR><BR> 函数对元素d[i]有两种可能的选择方案:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -