106 銀行招考不分職等 合作金庫-大型主機程式設計人員 合庫金控 大型主機程式設計 程式設計(以COBOL語言為主) 考古題詳解
第 一 題25 分
試寫 COBOL 程式:
(一)撰寫一 PERFORM 常式將 加到 十次使用下列不同用法?
- TIMES 選擇項【3 分】
- UNTIL 選擇項【3 分】
- VARYING 選擇項【4 分】 註:作答時只需撰寫 PROCEDURE DIVISION 部分即可。
(二)假設 是第 1 位運動員的某次測試成績,此運動員會有 10 次的測試成績(每次成績可能不一樣),而 是這 1 位運動員經過 10 次的總測試成績,請用 PERFORM…VARYING 敘述說明如何被用來印出 10 位運動員的每一位運動員 10 次測試平均成績。【15 分】 註:作答時只需撰寫 DATA DIVISION 以及 PROCEDURE DIVISION 兩部分即可。
登入後即可作答並保存紀錄。
核心觀念
本題考查 COBOL 的 PERFORM 迴圈控制方式:
TIMES:固定執行指定次數。UNTIL:條件成立時停止執行,屬於條件控制迴圈。VARYING:以控制變數依指定起始值、增量逐次變化,直到終止條件成立。ADD X TO Y:將 累加至 ,即:
若執行十次,結果為:
(一)以三種 PERFORM 用法將 加到 十次
以下假設已宣告:
X:欲累加的數值Y:累加結果COUNT:迴圈控制變數
1. TIMES 選擇項
TIMES 適用於執行次數固定且不需要依條件判斷的情況。
PERFORM ADD-X 10 TIMES.
STOP RUN.
ADD-X.
ADD X TO Y.
執行流程如下:
- 第 1 次執行
ADD-X,將 加到 。 - 重複執行
ADD-X。 - 共執行 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:
並且:
- 當
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.
控制變數變化如下:
因此 ADD-X 共執行 10 次。當控制變數增加為 11 時,因為 COUNT > 10 成立,迴圈結束。
(二)以 PERFORM…VARYING 印出 10 位運動員各自 10 次測試平均成績
解題方法
本題有兩層重複工作:
- 外層迴圈:處理第 1 位至第 10 位運動員。
- 內層迴圈:處理每位運動員第 1 次至第 10 次測試。
對每一位運動員:
- 先將總成績
Y歸零。 - 讀入 10 次測試成績,每次存入
X。 - 將每次的
X累加至Y。 - 以總成績除以 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
第 二 題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,才能依帳號直接存取。
以下假設:
- 主檔名稱為
ACCOUNT-FILE。 - 交易檔名稱為
TRANS-FILE。 - 帳號為主檔索引鍵。
- 交易資料包含交易代碼、帳號、客戶名稱、銀行名稱、存款餘額。
- 交易代碼為:
1:新增2:修改3:刪除
- 遇到任何
INVALID KEY,立即停止執行。
(一)增刪銀行帳戶記錄
解題方法
資料部分需完成三項定義:
- 主檔的檔案控制與記錄格式。
- 工作區的交易代碼與輸入欄位。
- 主檔索引鍵及錯誤處理用欄位。
程序部分依交易代碼分支:
- 新增:將輸入資料搬入主檔記錄,執行
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:主檔帳號
第 三 題25 分
試寫 COBOL 程式:
(一)請撰寫輸入業務員產品銷售檔,每位業務員銷售兩種產品,擬計算每位業務員所銷售產品的總營業額,之後再按總營業額由小到大作 SORT 排列。【10 分】
(二)根據上述已 SORT 過的產品銷售檔,其中記錄有包括交易序號和銷售毛利和產品單價折扣比率,請撰寫以下運算程式:如果記錄內銷售毛利大於 5,000 元者,則將產品單價折扣比率之值改成 0.2,請利用 SORT 功能(交易序號由小到大 SORT)來處理此運算。【10 分】
(三)請撰寫併入新增記錄檔程式:在上述原有的產品銷售檔,欲併入另一產品銷售檔的資料記錄檔中,此時必須將所有這些資料記錄依交易序號形成一個新增資料輸入檔。【5 分】
註:以上作答時只需撰寫 PROCEDURE DIVISION 部分即可。
登入後即可作答並保存紀錄。
核心觀念
本題考查 COBOL 的檔案處理與排序功能:
SORT:將資料依指定欄位排序。INPUT PROCEDURE:讀取原始檔,整理資料後以RELEASE放入排序檔。OUTPUT PROCEDURE:以RETURN取出已排序資料,再寫入輸出檔。MERGE:將兩個以上已依相同鍵值排序的檔案合併成一個排序檔。- 營業額計算公式:
本題只要求撰寫 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:產品單價折扣比率
(一)計算每位業務員總營業額,並依總營業額由小到大排序
解題方法
每位業務員固定有兩筆產品銷售資料,因此輸入程序每次讀取兩筆:
- 讀取第一筆產品資料,保存業務員代號及銷售金額。
- 讀取第二筆產品資料。
- 將兩筆銷售金額相加。
- 將業務員代號及總營業額放入排序記錄。
- 使用
RELEASE交給SORT。 - 在輸出程序中使用
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
處理流程如下:
- 使用
INPUT PROCEDURE讀取原有產品銷售檔。 - 將每筆資料以
RELEASE放入排序檔。 - 使用
OUTPUT PROCEDURE取出已依交易序號排序的資料。 - 判斷:
- 條件成立時:
MOVE 0.2 TO DISCOUNT-RATE
- 將修改後的資料寫入新檔。
程式碼
第 四 題25 分
有一個資料檔案,記錄著 7 組團隊銷售利潤(每一團隊有 10 個銷售員和每個銷售員的銷售利潤):
(一)試寫一個 COBOL 程式,使用 PERFORM…VARYING 敘述來印出 7 組團隊的每一團隊銷售平均利潤?【15 分】 註:作答時只需撰寫 DATA DIVISION 以及 PROCEDURE DIVISION 兩部分即可。
(二)在計算每一團隊有 10 個銷售員 PERFORM 敘述中,請分別用:
- TIMES 選擇項更換 VARYING 選擇項,重新撰寫此敘述的 COBOL 程式。【5 分】
- UNTIL 選擇項更換 VARYING 選擇項,重新撰寫此敘述的 COBOL 程式。【5 分】
登入後即可作答並保存紀錄。
核心觀念
本題考查 COBOL 的三種迴圈控制方式:
PERFORM VARYING:以控制變數逐次改變數值,適合處理固定次數的巢狀資料。PERFORM TIMES:固定執行指定次數,不需要控制變數。PERFORM UNTIL:當條件成立時停止執行,使用前必須先設定控制變數初值,並在迴圈內更新控制變數。
每一組有 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
若省略下標遞增,程式會連續累加同一位銷售員的利潤。