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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章