106 銀行招考不分職等 合作金庫-大型主機程式設計人員 合庫金控 大型主機程式設計 程式設計(以COBOL語言為主) 考古題詳解

106 年・銀行招考・不分職等・合作金庫-大型主機程式設計人員
試題代碼 106合庫金控_大型主機程式設計 程式設計(以COBOL語言為主)

第 一 題25 分

試寫 COBOL 程式:

(一)撰寫一 PERFORM 常式將 XX 加到 YY 十次使用下列不同用法?

  1. TIMES 選擇項【3 分】
  2. UNTIL 選擇項【3 分】
  3. VARYING 選擇項【4 分】 註:作答時只需撰寫 PROCEDURE DIVISION 部分即可。

(二)假設 XX 是第 1 位運動員的某次測試成績,此運動員會有 10 次的測試成績(每次成績可能不一樣),而 YY 是這 1 位運動員經過 10 次的總測試成績,請用 PERFORM…VARYING 敘述說明如何被用來印出 10 位運動員的每一位運動員 10 次測試平均成績。【15 分】 註:作答時只需撰寫 DATA DIVISION 以及 PROCEDURE DIVISION 兩部分即可。

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 COBOL 的 PERFORM 迴圈控制方式:

  • TIMES:固定執行指定次數。
  • UNTIL:條件成立時停止執行,屬於條件控制迴圈。
  • VARYING:以控制變數依指定起始值、增量逐次變化,直到終止條件成立。
  • ADD X TO Y:將 XX 累加至 YY,即:
Y←Y+XY \leftarrow Y+X

若執行十次,結果為:

Y新=Y原+10XY_{\text{新}}=Y_{\text{原}}+10X

(一)以三種 PERFORM 用法將 XX 加到 YY 十次

以下假設已宣告:

  • X:欲累加的數值
  • Y:累加結果
  • COUNT:迴圈控制變數

1. TIMES 選擇項

TIMES 適用於執行次數固定且不需要依條件判斷的情況。

 PERFORM ADD-X 10 TIMES.
 STOP RUN.

 ADD-X.
 ADD X TO Y.

執行流程如下:

  1. 第 1 次執行 ADD-X,將 XX 加到 YY。
  2. 重複執行 ADD-X。
  3. 共執行 10 次後結束 PERFORM。

2. UNTIL 選擇項

UNTIL 適用於執行次數由條件控制的情況。此處先將 COUNT 設為 0,每次累加後增加 1,當 COUNT 等於 10 時停止。

 MOVE 0 TO COUNT.
 PERFORM ADD-X
 UNTIL COUNT >= 10.
 STOP RUN.

 ADD-X.
 ADD X TO Y
 GIVING Y.
 ADD 1 TO COUNT.

執行流程:

  • 初始值:COUNT = 0
  • 每執行一次 ADD-X:
Y←Y+XY \leftarrow Y+X

並且:

COUNT←COUNT+1COUNT \leftarrow COUNT+1
  • 當 COUNT >= 10 時結束,因此恰好累加 10 次。

若採用預設的 TEST BEFORE,條件會在每次執行前判斷。本題因為初值為 0,不會一開始就達到終止條件。


3. VARYING 選擇項

VARYING 適用於需要控制變數依序遞增或遞減的情況。

 PERFORM ADD-X
 VARYING COUNT FROM 1 BY 1
 UNTIL COUNT > 10.
 STOP RUN.

 ADD-X.
 ADD X TO Y.

控制變數變化如下:

COUNT=1,2,3,…,10COUNT=1,2,3,\ldots,10

因此 ADD-X 共執行 10 次。當控制變數增加為 11 時,因為 COUNT > 10 成立,迴圈結束。


(二)以 PERFORM…VARYING 印出 10 位運動員各自 10 次測試平均成績

解題方法

本題有兩層重複工作:

  1. 外層迴圈:處理第 1 位至第 10 位運動員。
  2. 內層迴圈:處理每位運動員第 1 次至第 10 次測試。

對每一位運動員:

  1. 先將總成績 Y 歸零。
  2. 讀入 10 次測試成績,每次存入 X。
  3. 將每次的 X 累加至 Y。
  4. 以總成績除以 10,求出平均成績。
  5. 印出該運動員的平均成績。

平均成績公式為:

平均成績=10次測試總成績10平均成績=\frac{10次測試總成績}{10}

DATA DIVISION

 DATA DIVISION.
 WORKING-STORAGE SECTION.

 01 ATHLETE-NO PIC 99 VALUE 0.
 01 TEST-NO PIC 99 VALUE 0.

 01 X PIC 9(5)V99 VALUE 0.
 01 Y PIC 9(7)V99 VALUE 0.
 01 AVERAGE-SCORE PIC 9(5)V99 VALUE 0.

欄位用途如下:

  • ATHLETE-NO:運動員編號,範圍為 1 至 10。
  • TEST-NO:測試次數編號,範圍為 1 至 10。
  • X:目前讀入的某一次測試成績。
  • Y:目前運動員 10 次測試的總成績。
  • AVERAGE-SCORE:目前運動員的平均成績。

PROCEDURE DIVISION

🔒

後續完整解題步驟與【答案】

免費註冊,2026/11/15 前全站完整詳解免費看。

免費註冊

第 二 題25 分

試寫 COBOL 程式:

(一)有一個銀行帳戶交易系統,其資料紀錄包括帳號、客戶名稱、銀行名稱、存款餘額等項目內容存到磁碟中,請試寫增刪記錄的程式?【10 分】 註:作答時只需撰寫 DATA DIVISION 以及 PROCEDURE DIVISION 兩部分即可。

(二)在這個銀行帳戶交易,產生輸入交易記錄,其交易代碼有:1-新帳戶、2-修改帳戶、3-刪除帳戶。請寫一個依照輸入資料來新增、修改、刪除主檔。若遇到 INVALID KEY 時則停止執行。【15 分】 註:作答時只需撰寫 PROCEDURE DIVISION 部分即可。

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 COBOL 的「索引檔案」與檔案異動處理:

  • 主檔以帳號作為 RECORD KEY。
  • 新增使用 WRITE。
  • 修改使用「先 READ,再 REWRITE」。
  • 刪除使用「先 READ,再 DELETE」。
  • WRITE、READ、REWRITE、DELETE 均可搭配 INVALID KEY,處理重複鍵值或找不到鍵值的情況。
  • 主檔必須使用 ORGANIZATION IS INDEXED,才能依帳號直接存取。

以下假設:

  1. 主檔名稱為 ACCOUNT-FILE。
  2. 交易檔名稱為 TRANS-FILE。
  3. 帳號為主檔索引鍵。
  4. 交易資料包含交易代碼、帳號、客戶名稱、銀行名稱、存款餘額。
  5. 交易代碼為:
  • 1:新增
  • 2:修改
  • 3:刪除
  1. 遇到任何 INVALID KEY,立即停止執行。

(一)增刪銀行帳戶記錄

解題方法

資料部分需完成三項定義:

  1. 主檔的檔案控制與記錄格式。
  2. 工作區的交易代碼與輸入欄位。
  3. 主檔索引鍵及錯誤處理用欄位。

程序部分依交易代碼分支:

  • 新增:將輸入資料搬入主檔記錄,執行 WRITE。
  • 刪除:先依帳號執行 READ,找到後執行 DELETE。
  • 修改:先依帳號執行 READ,再更新欄位並執行 REWRITE。
  • INVALID KEY 時執行 STOP RUN。

參考程式

 DATA DIVISION.
 FILE SECTION.

 FD ACCOUNT-FILE
 LABEL RECORDS ARE STANDARD.
 01 ACCOUNT-REC.
 05 ACCT-NO PIC X(10).
 05 CUSTOMER-NAME PIC X(30).
 05 BANK-NAME PIC X(30).
 05 BALANCE PIC S9(9)V99 COMP-3.

 WORKING-STORAGE SECTION.

 01 WS-TRANS-CODE PIC 9.
 01 WS-ACCT-NO PIC X(10).
 01 WS-CUSTOMER-NAME PIC X(30).
 01 WS-BANK-NAME PIC X(30).
 01 WS-BALANCE PIC S9(9)V99 COMP-3.
 01 WS-END-FLAG PIC X VALUE 'N'.

 PROCEDURE DIVISION.

 MAIN-LOGIC.
 OPEN I-O ACCOUNT-FILE

 PERFORM UNTIL WS-END-FLAG = 'Y'

 DISPLAY '1-新增 2-修改 3-刪除 9-結束'
 ACCEPT WS-TRANS-CODE

 EVALUATE WS-TRANS-CODE

 WHEN 1
 DISPLAY '輸入帳號:'
 ACCEPT WS-ACCT-NO
 DISPLAY '輸入客戶名稱:'
 ACCEPT WS-CUSTOMER-NAME
 DISPLAY '輸入銀行名稱:'
 ACCEPT WS-BANK-NAME
 DISPLAY '輸入存款餘額:'
 ACCEPT WS-BALANCE

 MOVE WS-ACCT-NO
 TO ACCT-NO
 MOVE WS-CUSTOMER-NAME
 TO CUSTOMER-NAME
 MOVE WS-BANK-NAME
 TO BANK-NAME
 MOVE WS-BALANCE
 TO BALANCE

 WRITE ACCOUNT-REC
 INVALID KEY
 DISPLAY '新增失敗:INVALID KEY'
 STOP RUN
 END-WRITE

 WHEN 2
 DISPLAY '輸入帳號:'
 ACCEPT WS-ACCT-NO
 DISPLAY '輸入新的客戶名稱:'
 ACCEPT WS-CUSTOMER-NAME
 DISPLAY '輸入新的銀行名稱:'
 ACCEPT WS-BANK-NAME
 DISPLAY '輸入新的存款餘額:'
 ACCEPT WS-BALANCE

 READ ACCOUNT-FILE
 KEY IS WS-ACCT-NO
 INVALID KEY
 DISPLAY '查無此帳戶'
 STOP RUN
 END-READ

 MOVE WS-CUSTOMER-NAME
 TO CUSTOMER-NAME
 MOVE WS-BANK-NAME
 TO BANK-NAME
 MOVE WS-BALANCE
 TO BALANCE

 REWRITE ACCOUNT-REC
 INVALID KEY
 DISPLAY '修改失敗:INVALID KEY'
 STOP RUN
 END-REWRITE

 WHEN 3
 DISPLAY '輸入欲刪除的帳號:'
 ACCEPT WS-ACCT-NO

 READ ACCOUNT-FILE
 KEY IS WS-ACCT-NO
 INVALID KEY
 DISPLAY '查無此帳戶'
 STOP RUN
 END-READ

 DELETE ACCOUNT-FILE RECORD
 INVALID KEY
 DISPLAY '刪除失敗:INVALID KEY'
 STOP RUN
 END-DELETE

 WHEN 9
 MOVE 'Y' TO WS-END-FLAG

 WHEN OTHER
 DISPLAY '交易代碼錯誤'

 END-EVALUATE

 END-PERFORM

 CLOSE ACCOUNT-FILE
 STOP RUN.

程式重點

1. 新增

 WRITE ACCOUNT-REC
 INVALID KEY
 STOP RUN
 END-WRITE

若帳號已存在,會發生重複鍵值,進入 INVALID KEY。

2. 修改

REWRITE 前必須先以 READ 讀出該筆記錄:

 READ ACCOUNT-FILE
 KEY IS WS-ACCT-NO
 END-READ

 REWRITE ACCOUNT-REC
 END-REWRITE

直接執行 REWRITE 而沒有先讀取目前記錄,屬於錯誤寫法。

3. 刪除

刪除前也先讀取欲刪除的記錄:

 READ ACCOUNT-FILE
 KEY IS WS-ACCT-NO
 END-READ

 DELETE ACCOUNT-FILE RECORD
 END-DELETE

DELETE 刪除的是目前由檔案指標定位的記錄。


(二)依交易代碼新增、修改、刪除主檔

解題方法

本小題已假設資料定義完成,因此只需撰寫 PROCEDURE DIVISION。

交易檔採循序讀取:

 READ TRANS-FILE
 AT END ...
 END-READ

每讀取一筆交易,即依交易代碼處理:

  • 1:將交易記錄寫入主檔。
  • 2:依帳號讀取主檔,修改欄位後 REWRITE。
  • 3:依帳號讀取主檔後 DELETE。
  • INVALID KEY:呼叫停止程序,立即終止。

參考程式

以下欄位名稱假設如下:

  • TR-CODE:交易代碼
  • TR-ACCT-NO:交易帳號
  • TR-CUSTOMER-NAME:客戶名稱
  • TR-BANK-NAME:銀行名稱
  • TR-BALANCE:存款餘額
  • ACCOUNT-REC:主檔記錄
  • ACCT-NO:主檔帳號
🔒

後續完整解題步驟與【答案】

免費註冊,2026/11/15 前全站完整詳解免費看。

免費註冊

第 三 題25 分

試寫 COBOL 程式:

(一)請撰寫輸入業務員產品銷售檔,每位業務員銷售兩種產品,擬計算每位業務員所銷售產品的總營業額,之後再按總營業額由小到大作 SORT 排列。【10 分】

(二)根據上述已 SORT 過的產品銷售檔,其中記錄有包括交易序號和銷售毛利和產品單價折扣比率,請撰寫以下運算程式:如果記錄內銷售毛利大於 5,000 元者,則將產品單價折扣比率之值改成 0.2,請利用 SORT 功能(交易序號由小到大 SORT)來處理此運算。【10 分】

(三)請撰寫併入新增記錄檔程式:在上述原有的產品銷售檔,欲併入另一產品銷售檔的資料記錄檔中,此時必須將所有這些資料記錄依交易序號形成一個新增資料輸入檔。【5 分】

註:以上作答時只需撰寫 PROCEDURE DIVISION 部分即可。

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 COBOL 的檔案處理與排序功能:

  • SORT:將資料依指定欄位排序。
  • INPUT PROCEDURE:讀取原始檔,整理資料後以 RELEASE 放入排序檔。
  • OUTPUT PROCEDURE:以 RETURN 取出已排序資料,再寫入輸出檔。
  • MERGE:將兩個以上已依相同鍵值排序的檔案合併成一個排序檔。
  • 營業額計算公式:
總營業額=第1種產品銷售金額+第2種產品銷售金額總營業額 = 第1種產品銷售金額 + 第2種產品銷售金額

本題只要求撰寫 PROCEDURE DIVISION,以下假設相關 FD、SD、WORKING-STORAGE SECTION 已預先定義。

假設使用下列資料名稱:

  • PRODUCT-IN:原始產品銷售檔
  • PRODUCT-OUT:依業務員總營業額排序後的輸出檔
  • SORT-REC:排序檔記錄
  • SALESMAN-ID:業務員代號
  • PRODUCT-AMOUNT:單筆產品銷售金額
  • SALESMAN-TOTAL:業務員總營業額
  • TRANS-NO:交易序號
  • GROSS-PROFIT:銷售毛利
  • DISCOUNT-RATE:產品單價折扣比率

(一)計算每位業務員總營業額,並依總營業額由小到大排序

解題方法

每位業務員固定有兩筆產品銷售資料,因此輸入程序每次讀取兩筆:

  1. 讀取第一筆產品資料,保存業務員代號及銷售金額。
  2. 讀取第二筆產品資料。
  3. 將兩筆銷售金額相加。
  4. 將業務員代號及總營業額放入排序記錄。
  5. 使用 RELEASE 交給 SORT。
  6. 在輸出程序中使用 RETURN 取出排序結果,再寫入輸出檔。

ON ASCENDING KEY SALESMAN-TOTAL 表示依總營業額遞增排序。

程式碼

PROCEDURE DIVISION.

MAIN-PROCEDURE.

 SORT SORT-FILE
 ON ASCENDING KEY SALESMAN-TOTAL
 INPUT PROCEDURE IS INPUT-SALES
 OUTPUT PROCEDURE IS OUTPUT-SALES.

 STOP RUN.

INPUT-SALES.

 PERFORM UNTIL END-PRODUCT-IN = 'Y'

 READ PRODUCT-IN
 AT END
 MOVE 'Y' TO END-PRODUCT-IN
 NOT AT END

 MOVE SALESMAN-ID
 TO WS-SALESMAN-ID

 MOVE PRODUCT-AMOUNT
 TO WS-AMOUNT-1

 READ PRODUCT-IN
 AT END
 MOVE 'Y' TO END-PRODUCT-IN
 NOT AT END

 MOVE PRODUCT-AMOUNT
 TO WS-AMOUNT-2

 COMPUTE WS-TOTAL-AMOUNT =
 WS-AMOUNT-1 + WS-AMOUNT-2

 MOVE WS-SALESMAN-ID
 TO SORT-SALESMAN-ID

 MOVE WS-TOTAL-AMOUNT
 TO SORT-SALESMAN-TOTAL

 RELEASE SORT-REC

 END-READ
 END-READ

 END-PERFORM.

OUTPUT-SALES.

 PERFORM UNTIL END-SORT-FILE = 'Y'

 RETURN SORT-FILE
 AT END
 MOVE 'Y' TO END-SORT-FILE
 NOT AT END
 WRITE PRODUCT-OUT-REC
 FROM SORT-REC
 END-RETURN

 END-PERFORM.

程式重點

SORT-FILE 的排序鍵必須存在於 SD 記錄中,例如:

SD SORT-FILE.
01 SORT-REC.
 05 SORT-SALESMAN-ID PIC X(10).
 05 SORT-SALESMAN-TOTAL PIC 9(9)V99.

若輸入檔中的 PRODUCT-AMOUNT 是由單價及數量計算而來,則應先計算:

COMPUTE WS-AMOUNT-1 =
 PRODUCT-UNIT-PRICE-1 * PRODUCT-QUANTITY-1

(二)銷售毛利大於 5,000 元時,將折扣比率改為 0.2,並依交易序號排序

解題方法

本小題必須使用 SORT,排序鍵為交易序號:

ON ASCENDING KEY TRANS-NO

處理流程如下:

  1. 使用 INPUT PROCEDURE 讀取原有產品銷售檔。
  2. 將每筆資料以 RELEASE 放入排序檔。
  3. 使用 OUTPUT PROCEDURE 取出已依交易序號排序的資料。
  4. 判斷:
銷售毛利>5,000銷售毛利 > 5{,}000
  1. 條件成立時:
MOVE 0.2 TO DISCOUNT-RATE
  1. 將修改後的資料寫入新檔。

程式碼

🔒

後續完整解題步驟與【答案】

免費註冊,2026/11/15 前全站完整詳解免費看。

免費註冊

第 四 題25 分

有一個資料檔案,記錄著 7 組團隊銷售利潤(每一團隊有 10 個銷售員和每個銷售員的銷售利潤):

(一)試寫一個 COBOL 程式,使用 PERFORM…VARYING 敘述來印出 7 組團隊的每一團隊銷售平均利潤?【15 分】 註:作答時只需撰寫 DATA DIVISION 以及 PROCEDURE DIVISION 兩部分即可。

(二)在計算每一團隊有 10 個銷售員 PERFORM 敘述中,請分別用:

  1. TIMES 選擇項更換 VARYING 選擇項,重新撰寫此敘述的 COBOL 程式。【5 分】
  2. UNTIL 選擇項更換 VARYING 選擇項,重新撰寫此敘述的 COBOL 程式。【5 分】

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 COBOL 的三種迴圈控制方式:

  1. PERFORM VARYING:以控制變數逐次改變數值,適合處理固定次數的巢狀資料。
  2. PERFORM TIMES:固定執行指定次數,不需要控制變數。
  3. PERFORM UNTIL:當條件成立時停止執行,使用前必須先設定控制變數初值,並在迴圈內更新控制變數。

每一組有 10 位銷售員,因此團隊平均利潤為:

團隊平均利潤=10 位銷售員利潤總和10\text{團隊平均利潤} = \frac{\text{10 位銷售員利潤總和}}{10}

本解答採用以下合理資料格式:

  • 檔案共有 7 筆資料,每筆代表 1 組團隊。
  • 每筆資料包含該團隊 10 位銷售員的利潤。
  • 利潤欄位名稱為 IN-PROFIT(1) 至 IN-PROFIT(10)。

(一)使用 PERFORM VARYING

解題方法

外層迴圈控制 7 組團隊:

PERFORM VARYING WS-TEAM FROM 1 BY 1
 UNTIL WS-TEAM > 7

每讀入一筆團隊資料後,內層迴圈控制 10 位銷售員:

PERFORM VARYING WS-SELLER FROM 1 BY 1
 UNTIL WS-SELLER > 10

內層迴圈負責累加利潤,迴圈結束後再計算平均值。

COBOL 程式

 DATA DIVISION.

 FILE SECTION.

 FD INPUT-FILE.
 01 INPUT-RECORD.
 05 IN-PROFIT OCCURS 10 TIMES
 PIC S9(7)V99.

 WORKING-STORAGE SECTION.

 01 WS-TEAM PIC 99 VALUE 0.
 01 WS-SELLER PIC 99 VALUE 0.
 01 WS-TOTAL-PROFIT PIC S9(9)V99 VALUE 0.
 01 WS-AVERAGE-PROFIT PIC S9(9)V99 VALUE 0.

 PROCEDURE DIVISION.

 MAIN-PROCEDURE.

 OPEN INPUT INPUT-FILE

 PERFORM VARYING WS-TEAM FROM 1 BY 1
 UNTIL WS-TEAM > 7

 READ INPUT-FILE
 AT END
 MOVE 7 TO WS-TEAM
 END-READ

 MOVE 0 TO WS-TOTAL-PROFIT

 PERFORM VARYING WS-SELLER FROM 1 BY 1
 UNTIL WS-SELLER > 10

 ADD IN-PROFIT(WS-SELLER)
 TO WS-TOTAL-PROFIT

 END-PERFORM

 COMPUTE WS-AVERAGE-PROFIT =
 WS-TOTAL-PROFIT / 10

 DISPLAY "TEAM "
 WS-TEAM
 " AVERAGE PROFIT = "
 WS-AVERAGE-PROFIT

 END-PERFORM

 CLOSE INPUT-FILE

 STOP RUN.

程式說明

  • IN-PROFIT OCCURS 10 TIMES 表示一筆輸入資料中有 10 個利潤欄位。
  • IN-PROFIT(WS-SELLER) 使用下標取得目前銷售員的利潤。
  • 每開始處理新團隊,必須先執行:
MOVE 0 TO WS-TOTAL-PROFIT

否則前一組團隊的總和會被累加到下一組。

  • COMPUTE 負責計算平均利潤。
  • WS-TOTAL-PROFIT 的整數位數應大於單一利潤欄位,以避免累加時溢位。

(二)改寫計算 10 位銷售員的 PERFORM

外層處理 7 組團隊的迴圈仍可使用 PERFORM VARYING;本小題只改寫內層「計算 10 位銷售員利潤」的迴圈。

1. 使用 TIMES 選擇項

程式片段

 PERFORM VARYING WS-TEAM FROM 1 BY 1
 UNTIL WS-TEAM > 7

 READ INPUT-FILE
 END-READ

 MOVE 0 TO WS-TOTAL-PROFIT

 MOVE 1 TO WS-SELLER

 PERFORM 10 TIMES

 ADD IN-PROFIT(WS-SELLER)
 TO WS-TOTAL-PROFIT

 ADD 1 TO WS-SELLER

 END-PERFORM

 COMPUTE WS-AVERAGE-PROFIT =
 WS-TOTAL-PROFIT / 10

 DISPLAY "TEAM "
 WS-TEAM
 " AVERAGE PROFIT = "
 WS-AVERAGE-PROFIT

 END-PERFORM

說明

PERFORM 10 TIMES 本身只負責執行 10 次,不會自動產生或增加下標,因此必須:

MOVE 1 TO WS-SELLER

並在每次執行後更新:

ADD 1 TO WS-SELLER

若省略下標遞增,程式會連續累加同一位銷售員的利潤。


2. 使用 UNTIL 選擇項

程式片段

🔒

後續完整解題步驟與【答案】

免費註冊,2026/11/15 前全站完整詳解免費看。

免費註冊