COBOL 程式結構嚴謹,PROCEDURE DIVISION 作為程式執行核心,定義了程式邏輯和流程控制。理解 COBOL 的資料處理方式和指令用法對於維護既有系統或開發新功能至關重要。本文從 MOVE、數學運算指令開始,逐步深入條件判斷和迴圈操作,並提供程式碼範例,幫助讀者快速掌握 COBOL 程式設計的精髓。特別是在金融和商業應用中,這些基礎知識能協助開發者更有效地處理資料和設計程式邏輯。
COBOL 程式結構:PROCEDURE DIVISION 指令詳解
COBOL 語言是一種歷史悠久的程式語言,其結構化設計使其在金融和商業應用中依然佔有一席之地。在本章中,我們將探討 COBOL 的 PROCEDURE DIVISION,學習其基本指令和工作流程。
PERIOD-LESS 編碼風格與段落結構
在 COBOL 中,程式被組織成段落(paragraphs),每個段落都有一個描述性標題。以下是一個簡單的 COBOL 程式範例:
PROCEDURE DIVISION.
100-GET-USER-INPUT.
DISPLAY "Enter the user name"
ACCEPT USER-NAME.
200-PRINT-USER-NAME.
DISPLAY "The user name is " USER-NAME.
300-PRINT-PROGRAM-END.
GOBACK.
內容解密:
PROCEDURE DIVISION是 COBOL 程式的執行部分,定義了程式的邏輯流程。DISPLAY和ACCEPT用於與使用者互動,分別用於輸出訊息和接收輸入。GOBACK結束程式執行。- COBOL 的段落結構允許程式碼模組化,每個段落負責特定的任務。
MOVE 指令詳解
COBOL 使用 MOVE 指令進行變數指定,這與現代語言中的指定陳述式不同。以下是一些範例:
MOVE "SMITH" TO LAST-NAME.
MOVE LAST-NAME TO LAST-NAME-2.
MOVE 0 TO COUNTER X Y.
內容解密:
MOVE指令 將右側的值或變數內容複製到左側的變數中。- 當將字串指定給
PIC X(n)欄位時,如果字串長度不足,COBOL 會在末尾補上空格;如果字串過長,則會被截斷。 - 對於數值型別,如果指定的小數位數與定義不符,COBOL 會進行對齊並可能截斷多餘的部分。
數學運算指令
COBOL 提供了基本的數學運算指令,包括 ADD、SUBTRACT、MULTIPLY 和 DIVIDE,以及更靈活的 COMPUTE。
ADD DEPOSIT TO BALANCE.
SUBTRACT WITHDRAWAL FROM BALANCE.
ADD 100 125 359 TO DEPOSIT GIVING BALANCE.
SUBTRACT 50 125 200 FROM DEPOSIT GIVING BALANCE.
內容解密:
ADD和SUBTRACT用於進行加法和減法運算,可以直接對變數進行操作或使用GIVING子句將結果存入指定變數。- COBOL 的數學運算指令可以處理多個運算元,使程式碼簡潔易讀。
- 使用
GIVING可以避免修改原始變數的值,使程式邏輯更清晰。
資料型別轉換注意事項
在使用 MOVE 指令時,需要注意資料型別的轉換規則。例如,將字母數字型別轉換為數值型別,或反之。範例如下:
01 ALPHA-NUM PIC X(2) VALUE '50'.
01 NUM-VALUE PIC 9(2) VALUE 0.
MOVE ALPHA-NUM TO NUM-VALUE.
內容解密:
- 字母數字到數值轉換 需要確保字母數字欄位包含有效的數值字元。
- 型別匹配 在進行資料轉換時務必小心,以避免資料截斷或錯誤。
COBOL 數學運算指令詳解
COBOL 語言提供了豐富的數學運算指令,包括 MULTIPLY、DIVIDE、COMPUTE 等,用於處理各種數值計算需求。本文將探討這些指令的使用方法及其應用場景。
MULTIPLY 指令
MULTIPLY 指令用於執行乘法運算。基本語法如下:
MULTIPLY .10 BY INCOME GIVING NET-INCOME
在這個例子中,.10 乘以 INCOME 的結果儲存在 NET-INCOME 中。
程式碼範例
DATA DIVISION.
01 INCOME PIC 9(5)V99 VALUE 500.
01 NET-INCOME PIC 9(5)V99 VALUE 0.
PROCEDURE DIVISION.
MULTIPLY .10 BY INCOME GIVING NET-INCOME
DISPLAY "NET-INCOME: " NET-INCOME
內容解密:
MULTIPLY .10 BY INCOME GIVING NET-INCOME這行程式碼將INCOME乘以0.10,並將結果儲存在NET-INCOME中。- 使用
GIVING子句可以將運算結果儲存在指定的變數中,避免覆寫原始變數的值。
DIVIDE 指令
DIVIDE 指令用於執行除法運算,支援兩種語法:DIVIDE INTO 和 DIVIDE BY。
DIVIDE INTO 語法
DIVIDE UNITS INTO SALES GIVING SALES-PER-UNIT
DIVIDE BY 語法
DIVIDE SALES BY UNITS GIVING SALES-PER-UNIT ROUNDED
在這個例子中,SALES 除以 UNITS 的結果儲存在 SALES-PER-UNIT 中,並進行四捨五入。
程式碼範例
DATA DIVISION.
01 SALES PIC 9(5) VALUE 10000.
01 UNITS PIC 9(4) VALUE 500.
01 SALES-PER-UNIT PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
DIVIDE UNITS INTO SALES GIVING SALES-PER-UNIT
DISPLAY "SALES-PER-UNIT: " SALES-PER-UNIT
內容解密:
DIVIDE UNITS INTO SALES GIVING SALES-PER-UNIT將SALES除以UNITS,結果儲存在SALES-PER-UNIT中。- 使用
ROUNDED子句可以對結果進行四捨五入處理。
COMPUTE 指令
COMPUTE 指令提供了一種更靈活的數學運算方式,類別似於其他現代程式語言中的表示式。
程式碼範例
DATA DIVISION.
01 DISCOUNTED-PRICE PIC 9(5) VALUE 0.
01 RETAIL-PRICE PIC 9(5) VALUE 0.
01 DISCOUNT PIC 9(2)V99 VALUE 0.
PROCEDURE DIVISION.
MOVE 0.25 TO DISCOUNT
MOVE 100 TO RETAIL-PRICE
COMPUTE DISCOUNTED-PRICE = RETAIL-PRICE * (1 - DISCOUNT)
DISPLAY "DISCOUNTED-PRICE: " DISCOUNTED-PRICE
內容解密:
COMPUTE DISCOUNTED-PRICE = RETAIL-PRICE * (1 - DISCOUNT)這行程式碼計算折扣後的價格。- 使用括號可以控制運算順序,確保表示式的正確性。
數學函式
COBOL 提供了豐富的數學函式,如 SUM、SQRT、MEAN 等,用於處理各種數學運算需求。
程式碼範例
PROCEDURE DIVISION.
DISPLAY FUNCTION SUM (50 59 109 32 99)
DISPLAY FUNCTION SQRT (100)
內容解密:
FUNCTION SUM (50 59 109 32 99)計算給定數值的總和。FUNCTION SQRT (100)計算給定數值的平方根。
條件判斷
COBOL 中的條件判斷陳述式使用 IF/THEN/ELSE 結構,用於控制程式流程。
程式碼範例
DATA DIVISION.
01 TEMPERATURE PIC 9(3) VALUE 0.
PROCEDURE DIVISION.
DISPLAY "Enter the temperature : "
ACCEPT TEMPERATURE
IF TEMPERATURE <= 32 THEN
DISPLAY "It is freezing"
ELSE
DISPLAY "It is not freezing"
END-IF
GOBACK.
內容解密:
- 使用
ACCEPT陳述式接收使用者輸入的溫度值。 IF TEMPERATURE <= 32 THEN判斷溫度是否低於或等於 32 度,並根據結果輸出相應的訊息。
COBOL 程式控制結構:條件判斷與迴圈
COBOL 語言提供豐富的控制結構來處理程式邏輯,包括條件判斷和迴圈操作,這些結構對於開發複雜的商業應用至關重要。
條件判斷
COBOL 中的條件判斷主要透過 IF 和 EVALUATE 陳述式來實作。
簡單條件判斷:IF 陳述式
在 COBOL 中,IF 陳述式用於根據特定條件執行不同的程式碼區塊。以下是一個簡單的範例,用於判斷發票金額是否需要審核:
DATA DIVISION.
WORKING-STORAGE SECTION.
01 INVOICE-AMOUNT PIC 9(4) VALUE 0.
PROCEDURE DIVISION.
DISPLAY "Enter the invoice amount : "
ACCEPT INVOICE-AMOUNT
IF INVOICE-AMOUNT > 0 AND INVOICE-AMOUNT < 5000 THEN
DISPLAY "No approval is needed"
ELSE
DISPLAY "There must be approval"
END-IF
GOBACK.
內容解密:
IF陳述式檢查INVOICE-AMOUNT是否在 0 至 5000 之間。- 若條件成立,則顯示「No approval is needed」;否則顯示「There must be approval」。
- 使用
END-IF結束條件判斷區塊。
類別條件與 EVALUATE 陳述式
COBOL 中的 EVALUATE 陳述式類別似於其他語言中的 switch/case 結構,用於處理多種可能的情況。例如,根據輸入的業務編號來確定業務型別:
DATA DIVISION.
WORKING-STORAGE SECTION.
01 BUSINESS-NUMBER PIC 99 VALUE ZERO.
01 BUSINESS-TYPE PIC X(20).
PROCEDURE DIVISION.
DISPLAY "Enter the business number"
ACCEPT BUSINESS-NUMBER
EVALUATE BUSINESS-NUMBER
WHEN 1 MOVE "Sole Proprietor" TO BUSINESS-TYPE
WHEN 2 MOVE "Single-Member LLC" TO BUSINESS-TYPE
WHEN 3 MOVE "S Corporation" TO BUSINESS-TYPE
WHEN 4 MOVE "C-Corporation" TO BUSINESS-TYPE
WHEN 5 MOVE "Partnership" TO BUSINESS-TYPE
WHEN 6 MOVE "Trust/Estate" TO BUSINESS-TYPE
WHEN OTHER MOVE "Unknown" TO BUSINESS-TYPE
END-EVALUATE
DISPLAY "The business type is " BUSINESS-TYPE
GOBACK.
內容解密:
EVALUATE陳述式根據BUSINESS-NUMBER的值來決定BUSINESS-TYPE。- 使用
WHEN子句來匹配不同的業務編號,並賦予對應的業務型別至BUSINESS-TYPE。 WHEN OTHER用於處理未預期的輸入值,將BUSINESS-TYPE設定為「Unknown」。
複合條件判斷
COBOL 的 EVALUATE 陳述式也支援複合條件判斷,例如結合多個欄位進行評估:
DATA DIVISION.
WORKING-STORAGE SECTION.
01 UNITS PIC 9(3).
01 VIP-CUSTOMER PIC X.
01 DISCOUNT PIC 9(2)V9(2).
PROCEDURE DIVISION.
DISPLAY "Enter the number of units sold"
ACCEPT UNITS
DISPLAY "A VIP customer (Y/N)?"
ACCEPT VIP-CUSTOMER
EVALUATE UNITS ALSO VIP-CUSTOMER
WHEN 1 THRU 20 ALSO "Y"
MOVE .20 TO DISCOUNT
WHEN 21 THRU 50 ALSO "Y"
MOVE .25 TO DISCOUNT
WHEN GREATER THAN 50 ALSO "Y"
MOVE .30 TO DISCOUNT
WHEN OTHER
MOVE 0 TO DISCOUNT
END-EVALUATE
DISPLAY "The discount is " DISCOUNT
GOBACK.
內容解密:
- 使用
EVALUATE同時評估UNITS和VIP-CUSTOMER。 - 根據不同的銷售單位數量和客戶是否為 VIP,設定不同的折扣比例。
- 使用
ALSO關鍵字來組合多個條件。
巢狀條件判斷
COBOL 允許使用巢狀的 IF/THEN/ELSE 結構來處理更複雜的邏輯:
DATA DIVISION.
WORKING-STORAGE SECTION.
01 USERNAME PIC X(20).
01 PASSWORD PIC X(20).
PROCEDURE DIVISION.
DISPLAY "Enter your user name"
ACCEPT USERNAME
DISPLAY "Enter your password"
ACCEPT PASSWORD
IF USERNAME = "Tom68"
IF PASSWORD = "12345"
DISPLAY "Login successful!"
ELSE
DISPLAY "Incorrect password."
END-IF
ELSE
DISPLAY "Incorrect user name."
END-IF
GOBACK.
內容解密:
- 首先檢查使用者名稱是否正確。
- 若使用者名稱正確,則進一步檢查密碼是否正確。
- 使用巢狀的
IF/THEN/ELSE結構來處理登入驗證邏輯。
迴圈操作
COBOL 中的迴圈主要透過 PERFORM 陳述式來實作。
PERFORM TIMES
用於指定迴圈執行的次數:
DATA DIVISION.
WORKING-STORAGE SECTION.
01 COUNTER PIC 9(1) VALUE 0.
PROCEDURE DIVISION.
PERFORM 5 TIMES
ADD 1 TO COUNTER
DISPLAY "Loop number " COUNTER
END-PERFORM
GOBACK.
內容解密:
- 使用
PERFORM 5 TIMES指定迴圈執行 5 次。 - 在迴圈中,每次將
COUNTER加 1,並顯示目前的迴圈次數。
PERFORM 段落
也可以使用 PERFORM 呼叫特定的段落來實作迴圈:
DATA DIVISION.
WORKING-STORAGE SECTION.
01 COUNTER PIC 9(1) VALUE 0.
PROCEDURE DIVISION.
100-PARAGRAPH-LOOP.
PERFORM 200-PRINT-COUNTER 5 TIMES.
GOBACK.
200-PRINT-COUNTER.
ADD 1 TO COUNTER
DISPLAY "Loop number " COUNTER.
內容解密:
- 在主程式段落中,使用
PERFORM 200-PRINT-COUNTER 5 TIMES呼叫子段落並執行 5 次。 - 在子段落中,將
COUNTER加 1,並顯示目前的迴圈次數。