1998年高级程序员级下午试题

 

 

从以下的3道试题(试题一至试题三)中任选2道解答。如果解答的试题数超过2道,则解答的前2道有效。

试题一

阅读以下说明和流程图,回答问题1至问题3,将解答写在答卷的对应栏

【说明

  本流程图描述某超市销售数据的部分处理流程。超市中有若干台收款机和若干名收款员。这里,我们把一个收款员开始使用一台收款机到离开这台收款机称为该收款员的一次作业。作业开始时,收款员先在收款机上输入收款员号和作业前金额。作业前金额是为了销售时的找零而在作业前预先放入钱箱的金额数。作业结束时,收款员要找开钱柜,取走全部现金,并把这些现金的金额数(称为作业后金额)输入收款机。当

    作业前金额+本次作业售货总金额-本次作业退货总金额≠作业后金额

时,表示这次作业存在金额差错。

  本流程图已作简化,并作以下假定;该超市只有现金交易(不用信用卡和礼券);一个收款员因某种原因(如吃饭)在一天中可以有多个作业;销售方式只有售货和退货两种。

  整个超市分成若干部门(如食品部、服装部),系统按部门统计一个月中各类货物的销售数量和金额,最后根据月销售计划文件分析各部门完成销售计划的情况。系统还统计每个收款员的差错情况和退货情况。

  图中处理4和处理8每月的最后一天执行一次(营业结束后),其它处理每天执行一次。

  图中部分数据、文件的记录格式如下:

  日销售数据:收款机号十收款员号十作业前金额十

        {(售货标记|退货标记)十货号十数量十单价十金额}+作业后金额

  日销售文件记录:(作业开始标记十收款机号十收款员号十作业前金额)

          |(售货标记|退货标记)十货号十数量十金额))

          |(作业结束标记十收款机号十收款员号十作业后金额

  部门日销售文件记录:部门号十(售货标记|退货标记)十货号十数量+金额

  部门月销售计划文件记录;部门号十月计划金额

  收款员差错月报:月份十收款员号十差错作业数十差错总金额

  收款员退货月报..月份十收款员号十退货次数十退货总金额

其中{W}表示W重复出现多次;A|B表示ABAB表示AB

【流程图

 

[问题1]

分别写出收款员日销售文件、商品文件、部门日销售汇总文件至少应包含哪些数据项。

[问题2]

处理1能检查出日销售数据中的哪些错误。

[问题3

处理4对收款员月销售文件作何种操作。

 

试题二

阅读以下说明和流程图,回答问题,将解答写在答卷的对应栏内。

【说明

本流程图描述了某子程序的处理流程,现要求用白盒测试法为该子程序设计测度数据。

【流程图

 

 

[问题]

根据判定覆盖、条件覆盖、判定一条件覆盖、条件组合覆盖(即多重条件覆盖)、路径覆盖等五种覆盖标准,从供选择的答案中分别找出满足相应覆盖标准的最小测试数据组(用①~⑩回答)

供选择的答案

      ①X90Y90 ②X90Y70 ③X90Y90 ④X90Y75

       X70Y70  X70Y90  X90Y75  X75Y90

                        X75V90  X70Y70

      ⑤X90Y90 ⑥X80Y80 ⑦X80Y80 ⑧X80Y80

       X90Y75  X90Y70  X90Y75  X90Y70

       X75Y90  X70Y90  X90Y90  X70Y90

       X70Y70  X70Y70  X75Y90  X70Y70

                        X70Y70  X70Y75

      ⑨X80Y80 ⑩X90Y90   X80Y80   X80Y80

       X90Y75  X90Y75  X90Y75  X80Y70

       X90Y70  X90Y70  X90Y70  X70Y80

       X70Y80  X75Y90  X70Y80  X70Y70

       X70Y75  X70Y70  X70Y75  X90Y75

       X70Y70  X70Y90  X70Y70  X90Y70

                        X70Y90  X70Y75

                                 X75Y90

                                 X75Y80

                                 X70Y90

 

试题三

阅读以下说明和流程图,回答问题1至问题2,将解答写在答卷的对应栏内。

【说明

本流程图描述了某种字符序列的变换过程。变换前的字符序列以字符""结尾,它存放在数组OLD中,变换后的字符序列存放在数组NEW中,它不包含结束标志""。流程图按下列规则进行变换:

1.删除字符序列中的注解。注解用一对"!"字符分隔,注解中可出现除""外的任何字符。

2.字符常数完整地保留。字符常数用一对""字符分隔,字符常数中可出现、外的任何字符。  值得注意的是:当字符""需要出现在字符常数中时,通常用二个连续的""表示,在保留字符常数时,这二个连续的""都被保留。此外,作为字符常数分隔符的一对""也被保留。

3.除字符常数和注解外,出现在其它地方的连续多个空格压缩成一个空格,但字符序列中先导的空格则全部删除。

4.注解和字符常数之外的非空格字符均保持不变。

  本流程图对原字符序列从左到右扫描,根据遇到的当前字符来搜索连续空格、注解或字符常数,然后按上述变换规则变换。若遇到的当前字符是"",则寻找下一个""字符(若找不到则作出错处理),这二个""间的字符全部看作为注解。若当前字符是""字符则寻找与之配对的下一个""字符(若找不到则作出错处理),其间的字符全部看作为字符常数。

  例如:

  原字符序列:

  └┘└┘A└┘└┘└┘BCD&&└┘└┘!EF└┘└┘GH&└┘└┘!└┘└┘J

  变换后的字符序列:A└┘BDCD&&└┘└┘!EF└┘G└┘J

本流程图假定在数组OLD中一定存在""字符。

【流程图

 

[问题1]

填充流程图中的①~⑤,把解答写在答卷的相应位置上。

[问题2]

当原字符序列中汪解的前后均是连续空格时,本流程图将注解前后的连续空格分别压缩成一个空格,删除注解后,将导致变换后的新字符序列出现二个连续的空格。如;

           G└┘└┘!H&└┘└┘I!└┘└┘J

本流程图将变换成G└┘└┘J

为使变换后的新序列中除字符常数外没有连续的空格,图中的虚线框需作何改动(只需画出修改后的流程图)

 

试题四为必答题。

试题四

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

【程序说明

本程序是统计字符串中数字字符"0""9"的出现次数。

字符串中的每个字符是用ASCII码存贮。一个存贮单元存放两个字符,每个字符占8位二进位。

程序中,被统计的字符串从左至右存放在STR开始的连续单元中,并假定其长度不超过200,字符串以'·'符作为结束。NCH开始的10个单元存放统计结果。

   STARTMIN

MIN LEAGR29

   LEAGR00

L1  _(1)_

   LEAGR2,-1GR2

   LEAGR40

   LEAGR10

L2  LD GR2STRGR1

   EORGR4,C1

   JNZRL

   _(2)_

RL  SRLGR2,8

   LEAGR30GR2

   SUBBR3C9

   JNZL4

L3  LEAGR30GR2

   SUBGR3CO

   JM1L5

   LEAGR21

   _(3)_

   _(4)_

L4  GR40GR4

   JNZL2

   _(5)_

   JMPL2

L5  SUBGR2C

   JNZL4

   EXIT

C1  DC1

C  DC'·'

C0  DC'0'

C9  DC9

STR DS200

NCH DS10

END

 

 

从以下的4道试题(试题五至试题八)中任选2道解答。如果解答的试题数超过2道,则解答的前2道有效。

试题五

阅读以下程序说明和C程序,将应填入_(N)_处的字句,写在答卷的对应栏内。

【程序说明

这里给出的程序逐一从指走课程成绩文件中读入学生的学号和成绩,对同一学生汇总他的总成绩,并按以下格式输出名次(按总成绩由高到低的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小到大的顺序)。

  程序约定学生学习课程不超过30种,课程成绩文件的第一个数字就是课程号,统计过程中,同一课程号的成绩文件不能重复输入。

  程序采用链表结构存储学生有关信息,链表中的每个表元对应一位学生。程序在数据输入过程中,形成一个按学生学号从小到大顺序链接的有序链表。当数据输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表排序。程序最后按指定格式输出链表中的信息。程序的输出格式如下例所示:

名 次

1

3

6

7

总成绩

470

450

430

401

人 数

2

3

1

3

学 号

12

15

14

13

 

25

24

 

18

 

 

50

 

45

【程序

INCLUDESTDIO.H

DEFINEM30

DEFINENLEN10

TYPEDEFSTRUCTNODE{INTCUR_S*最近输入成绩的科目*/

          CHARNO[NLEN]INTSCORE

          STUCTIONNODE*NEXT

           }NODE

N0DE*BUBBLESORT(N0DE*HEAD)

{NODE*Q*TAIL*P(MODE*)MALLOC(SIZEOF(NODE)

 PNEXTHEADHEADPTAILNULL

 WHILE(TAIL!=___(1)___)

 {P=HEAD;Q=PNEXT;

  WHILE(QENXT=TAIL)

  {IF(PNEXTSCORE→〈QNEXTSCORE||

    PNEXTSCOR==QNEXTSCORE&&

    STRCMP(PNEXTNOQNEXTNO)0)

   {PNEXT_(2)_/*两相邻表元链接关系前后颠倒*/

    _(3)_QNEXTNEXTPNEXTNEXTQ

   }

   PPNEXT/*调整PQ*/Q_(4)_

  }

  TAILQ

 }

 PHEADNEXTFREE(HEAD)RETURNP

}

INTS[M]SP

MAIN()

{FILE*FP

 NODE*H*U*V*P

 INTSS,,MARKORDERC

 CHARFNAME[80]NO[NLEN]ANS

 FOR(HNULLSP0;;)

 {PRINT(''输入科目成绩文件名(输入AAAA表示强行结束)/N")

  WHILE(1)

  {SCANF("S",FNAME)

   IF(STRCMP(FNAME"AAAA")==0)BREAK

   IF((FPFOPEN(FNAME"R"))==NULL)

    PRINTF("不能打开文件%S,请重新输入科目文件名。/NFNAME)

   ELSEBREAK

  }

  IF(STRCMP(FNAME"AAAA")==0)BREAK

  FSCANF(FP"D",&SS)/·输入科目号·/S[SP]SS

  FOR(I0S[I]!=SSI++)

  IF(I<SP)

  {PRINTF("该科目的成绩已输入,请输入别的科目成绩文件。/N")

   CONTINUE;

  }

  SP++;

  WHILE(FSCANF(FP,"SD"NO,&MARK)==2)

  {/*在链表中寻找最近输入的学号*/

   FOR(VH;V!NULL,&&STRCMP(VNO,NO)0;UV,VVNEXT)

   IF(V!=NULL&&STRCMP(VNONO)==0)

   {IF(VCUR_S!==SS)

    {VSCORE+=MARKVCUR_SSS

    }/*同一科目成绩的重复输入,后输入成绩被忽略*/

   }ELSE{P(NODE*)MALLOC(SIZEOF(NODE)/*一位新的学生*/

       STRCPY(PNONO)PSCOREMARKPCUR_SSS

       PNEXTV

       IF(V==H)HPELSEUNEXTP

  }FCLOSE(FP)

  PRINTF("还有科目成绩文件要输入吗?(Y/N)")SCANF("C",&ANS)

  IF(ANNS=='N'||ANS=='N')BREAK

 }

 HBUBBLESORT(H)

 PRINTF("名次总成绩人数学号/N")/*以下按格式要求输出*/

 VHORDER1

 WHILE(V!=NULL)

 {FOR(C1,UVNEXT;U!NULL&&USCORE==VSCORE;C++,UUNEXT)

  PRINTF("4D7D8D"ORDERVSCOREC)

  FOR(ORDER+=CI1_(5)_VVNEXTI++)

  {IF(I1&&I5==1)PRINTF("/N23C"'')

   PRINTF("S"VNO)

  }PRINTF("/N")

 }

}

 

 

试题六

阅读以下程序说明和FORTRAN程序,将应填入_(N)_处的字句,写在答卷的对应栏内。

【程序说明

本程序用以将M+N个元素的数组A中的前M个元素(A(1)-A(M))与后N个元素(A(ML)-A(MN))互换位置,并保持其各自原有的内部顺序。

  程序中把数组的各元素看成首尾相连的序列,并将数组元素分成G(GMN的最大公因子),每组中的元素序列是从数组某元素起由间隔为M的元素组成,再将每组元素依次循环向左传送,即得所需结果。

  例如原数组A为:

  由M=4N=2,求得G=2,将A中的元数分成两组。按上述说明,第一组元素序列依次为A(1)A(5)A(3),将它们循环向左传送后的结果为897264

  第二组元素序列依次为以A(2)A(6)A(4),将它们循环向左传送后的结果为 847962 即得所需结果。

【程序

INTEGETA(1000)GH

   READ(**)MN

   READ(**)(A(1)11MN)

   GM

   HN

20  IF(GNEH)THEN

    IF(GGTT)THEN

     GGH

    ELSE

     HHG

    ENDIF

    GOTO20

   ENDIF

   DO100I_(1)_

    TEMPA(1)

    K1

30   J_(2)_

    IF(JNE1)THEN

     A(K)_(3)_

     KJ

     _(4)_

    ELSE

     AK_(5)_

    ENDIF

100 CONTINUE

   WRITE(*200)(A(I)I=1M+N)

200 FORMANT(1016)

   END

试题七

阅读以下程序说明和C程序,将应填入_(N)_处的字句,写在答卷的对应栏内。

【程序说明

本程序的函数SUM(INT,IINTTOTAL,INTSIGMA,INTREAR,INTD[],INTN)用来从已知数组D的前N个元素中找出所有部分元素序列之和等于TOTAL的元素序列,约定数组D的元素都是正整数,且都小于等于TOTAL。

  函数SUM使用递归方法找出全部解答。参数I表示递归函数当前考虑元素D[I],参数SIGMA是调用前已选取的部分序列的元素和,参数REAR是后面还未考虑的那部分元素的元素和。

  函数对元素D[I]有两种可能的选择方案:

  1.考虑元素D[I]被包含在新的部分元素序列中的可能性。如果在当前部分元素序列之后接上D[I],新序列的元素和不超过TOTAL,则函数将D[I]包含在当前部分元素序列中。如果新的部分元素序列的元素和等于TOTAL时,新的部分元素序列就是一个解答,函数将其输出;否则,若继续考虑后面的元素还有可能找到解答时,函数就递归去考虑后面的元素,寻找解答。最后,函烽就恢复原来部分元素序列中不包含D[I]的状态。

2.考虑元素D[I]不被包含在新的部分元素序列中的可能性。如果继续向D[I]之后考虑还是有希望能得到和为TOTAL的部分元素序列时,函数将新序列不包含D[I]也作为一种可能的选择,并递归去考虑后面的元素,寻找解答。

【程序

INCLUDESTDIO.H

DEFINEN100

INTA[N]

INTFLG[N]

SUM(INTIINTTOTALINTSIGMAINTREARINTD[]INTT)

{INTJ

 /*考虑元素D[I]被包含在新的部分元素序列中的可能性*/

 IF(SIGMAD[I]TOTAL/*如果D[I]与当前序列的和不超过TOTAL*/

 {FLG[I]1/*D[I]被考虑在被部分元素序列中*/

  IF(_(1)_==TOTAL)

  {/*输出解*/

   FOR(J0FLG[J]==0J++)

   PRINTF("4D=%D"TOTALD[J])

   FOR(J++;<=IJ++)

     IF(FLG[J])

       PRINTF("+%D",D[J])

   PRINTF("/")

  }

  ELSE/*并且继续考虑后面的元素有可能找到解答时*/

  IF(IN1&&REARD[I]SIGMA>=TOTAL)

    SUM(I1TOTAL_(2)_REARD[I]DN);

  _(3)_

 /*考虑元素D[I]不被包含在新的部分元素序列中的可能性。*/

 IF(IN1&&REARD[I]TIGMA>=TOTAL)

     SUM(I1TOTAL_(4)REARD[I]DN)

}

MAIN()

{INTIJNTOTALSD

 PRINTF("输入TOTAL/N")SCANF("D",&TOTAL)

 PRINTF("输入N/N")SCANF("D",&N)

 FOR(SI0IN)

 {PRINTF("输入第%D个元素>0且<=%D)/N"I1TOTAL)

  SCANF("D"&D)

  IF(D1||DTOTAL)

   {PRINTF("出错,请重新输入!/N")

     CONTNUE

   }

   S+=A[I++]D

 }

 SUM(0TOTAL0,_(5)_AN)

 PRINTF("/N/N")

}

试题八

阅读以下程序说明和FORTRAN程序,将应填入_(N)_处的字句,写在答卷的对应栏内。

【程序说明

本程序用以查找给定数组A的第K小元素。程序执行后,第K小元素存放在数组元素A(K)中。

  设给定的数组中各元素A(I)=(I=1,2…N)互为不相等。它的第K(1≤K≤N)小元素是指这样的元素;它大于N个元素中的K-1个元素,而小于其余的N-K个元素。假如,假设N=8,数组A为:

449412505561867

它的第5小元素(即K=5)是50。

  本程序的处理过程如下:

  将A(K)的值(此例为A(5),此时值为55)存入X,从左向右扫描,直至遇以第一个不小于X的元素(此时为94),再从右向左扫描,直到遇见第一个不大于X的元素(此时为18),然后交换这两个元素,数且A成为:

441812505569467

继续这一"扫描与交换"的过程,直到两个方向的扫描在数组中间的某处汇合。此时数组被分成两段,汇合点左边的元素均小于汇合点右边的元素。然后选取存在第K小元素的一段,重复上述扫描、交换和调整扫描范围的处理过程。程序中采用L、R来表示扫描的范围的左右边界。开始时L为1,R为N,以后逐次调整。当变成为L值不小于R值时,A[K]即是第K小元素。

【程序

SUBROUTINTFIND(ANK)

   INTEGETA(N)RXW

   L=1

   R=N

20  IF(LLTR)THEN

    XA(K)

    I=L

    J=R

30   IF(A(1)LTX)THEN

     II1

     GOTO30

    ENDIF

40   IF(___(1)___)THEN

    ___(2)___

     GOTO40

    ENDIF

    IF(I,LE,J)THEN

     WA(I)

     ___(3)___

     I=I+1

     ___(4)___

    IF(I,LE,J)___(5)___

    ENDIF

    IF(J,LT,K)L=I

    IF(___(6)___)R___(7)___

    GOTO20

   ENDIF

   RETURN

 END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值