COBOL 編程語言中文教學網站 | 香港編程學院

COBOL 編程語言
詳細繁體中文教學

COBOL(Common Business-Oriented Language)是一門以商業資料處理為核心、語法偏向英文描述風格的程式語言, 常見於銀行、保險、批次報表與大型主機系統。這個網站將從程式結構、資料定義、流程控制一路教到實務範例與小測驗。

一、COBOL 語法教學

COBOL 的特色是語法接近英文敘述,程式結構清楚,非常適合表達商業流程。 初學時建議先掌握「四大 Division」、「PIC 資料描述」、「流程控制」三大主軸。

1. 四大 Division 是什麼?

  • IDENTIFICATION DIVISION:程式識別資訊,例如程式名稱。
  • ENVIRONMENT DIVISION:執行環境與檔案對應設定。
  • DATA DIVISION:資料欄位、變數、檔案記錄格式定義。
  • PROCEDURE DIVISION:實際執行邏輯與指令流程。
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. ENVIRONMENT DIVISION. DATA DIVISION. PROCEDURE DIVISION. DISPLAY "Hello World!". STOP RUN.

2. 程式的最小可執行範例

最簡單的 COBOL 程式通常至少會有程式識別與程序區塊。 在教學與測試環境中,常會用 DISPLAY 搭配 STOP RUN 驗證編譯器是否正常運作。

IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. PROCEDURE DIVISION. DISPLAY "Hello World!". STOP RUN.
某些環境中的 Hello World 範例也會保留 ENVIRONMENT DIVISION 與 DATA DIVISION, 讓程式結構更完整、便於後續擴充。

3. DATA DIVISION 與 PIC 子句

PICTURE(可簡寫為 PIC) 用來描述欄位格式,只能用在 elementary item(基本欄位)上, 是 COBOL 欄位設計的核心。常見用途包含定義文字欄位、數字欄位、含正負號數字等。

宣告 用途 說明
01 USER-NAME PIC X(20). 字串欄位 X 代表字元欄位,可容納 20 個字元。
01 AGE PIC 9(3). 整數欄位 9 代表數字,可存放 3 位數。
01 SALARY PIC 9(5)V99. 小數數值 V 代表隱含小數點,實際可表示 99999.99。
01 DELTA PIC S9(4). 有正負號數值 S 表示 signed numeric。
DATA DIVISION. WORKING-STORAGE SECTION. 01 USER-NAME PIC X(20). 01 USER-AGE PIC 9(3). 01 MONTHLY-SALARY PIC 9(5)V99. 01 ACCOUNT-BALANCE PIC S9(6)V99.

4. 等級號(Level Number)概念

COBOL 常使用等級號定義資料階層。最常見的是 01 作為主群組, 其下再用 0510 等切分子欄位。

01 EMPLOYEE-RECORD. 05 EMP-ID PIC 9(5). 05 EMP-NAME PIC X(30). 05 EMP-DEPT PIC X(10). 05 EMP-SALARY PIC 9(6)V99.

這種階層式資料設計很適合描述固定格式的商業資料記錄,例如員工資料、客戶主檔、交易紀錄等。

5. 基本輸出:DISPLAY

把文字或變數顯示到畫面上,是最入門也最常用的指令。

DISPLAY "歡迎學習 COBOL". DISPLAY USER-NAME.

6. 資料指派:MOVE

把資料從一個欄位搬到另一個欄位,是商業資料處理中的超高頻操作。

MOVE "王小明" TO USER-NAME. MOVE 25 TO USER-AGE.

7. 計算:COMPUTE

適合處理算術表達式,比單純 MOVE 更適合做數值計算。

COMPUTE YEARLY-SALARY = MONTHLY-SALARY * 12.

8. 條件判斷:IF / ELSE

當條件成立時執行某段程式,否則執行另一段。

IF USER-AGE >= 18 DISPLAY "已成年" ELSE DISPLAY "未成年" END-IF.
現代寫法常使用 END-IF,可讀性比只依賴句點結束更好。

9. 多分支判斷:EVALUATE

類似其他語言的 switch / case,用於多種條件分支。

EVALUATE GRADE WHEN "A" DISPLAY "優秀" WHEN "B" DISPLAY "良好" WHEN "C" DISPLAY "及格" WHEN OTHER DISPLAY "請再加強" END-EVALUATE.

10. 重複執行:PERFORM

PERFORM 是 COBOL 中非常重要的流程控制語法,可執行一個 paragraph/section, 也可寫成重複迴圈形式。

PERFORM SHOW-MESSAGE. SHOW-MESSAGE. DISPLAY "這是一個段落".
PERFORM VARYING IDX FROM 1 BY 1 UNTIL IDX > 5 DISPLAY IDX END-PERFORM.

11. PROCEDURE DIVISION 的層次

  • Section:較大區塊,可包含多個 paragraph。
  • Paragraph:具名稱的邏輯段落。
  • Sentence:由一個或多個 statement 組成,通常以句點終止。
  • Statement:單一敘述,例如 DISPLAY、MOVE、READ。
PROCEDURE DIVISION. MAIN-LOGIC. PERFORM INIT-PROCESS PERFORM CALC-PROCESS STOP RUN. INIT-PROCESS. DISPLAY "初始化完成". CALC-PROCESS. DISPLAY "開始計算".

二、初學重點與格式觀念

很多初學者不是敗在邏輯,而是敗在格式。尤其在某些 COBOL 編譯器或主機環境中, 原始碼欄位位置可能會影響語法判定。

1. Fixed Format 與 Free Format

GnuCOBOL 文件指出,預設常見為 fixed format; 在固定格式中,欄位位置有明確意義,例如欄 1–6 為序號區、欄 7 為指示區、 欄 8–72 為主要程式文字區。另一方面,也可使用較現代化的 free format

格式 特色 適合對象
Fixed Format 欄位位置嚴格、與傳統主機環境相容度高 維護舊系統、主機環境開發者
Free Format 較接近現代語言排版,閱讀與撰寫較方便 初學者、教學示範、GnuCOBOL 練習

2. Area A 與 Area B

GnuCOBOL 說明中提到,division、section、paragraph 名稱通常需從 Area A 開始, 而在 DATA DIVISION 中,0177 等級號也通常位於 Area A; PROCEDURE DIVISION 的一般語句則多位於 Area B

如果你未來要接觸大型主機或舊系統維護,理解 Area A / Area B 會很重要; 如果只是初學,先用 free format 建立概念,再回頭理解固定格式會更輕鬆。
常見初學錯誤
  • 忘記在段落結尾或敘述段加上適當句點。
  • 把數字欄位宣告成文字欄位,導致計算失敗。
  • 沒有理解 PIC 的位數,導致資料截斷或格式不符。
  • 把 DISPLAY、MOVE、COMPUTE 的用途混用。
  • 不清楚 paragraph 與 section 的差別,流程結構變亂。
學習建議路線
  1. 先學四大 Division 與 Hello World。
  2. 再學 PIC、01/05 階層結構與 WORKING-STORAGE。
  3. 接著學 MOVE、DISPLAY、COMPUTE、IF、EVALUATE。
  4. 之後學 PERFORM 與 paragraph/section 組織程式。
  5. 最後練習檔案處理與商業報表類範例。

三、範例應用

下列範例由淺入深,從最基礎輸出、到商業數值計算、再到檔案讀取概念, 幫助你把 COBOL 當成真正可用的商業程式語言來理解。

範例 1:Hello World

這是最基礎的 COBOL 程式,可用來測試編譯器與執行環境。

IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. ENVIRONMENT DIVISION. DATA DIVISION. PROCEDURE DIVISION. MAINLINE. DISPLAY "Hello World!". STOP RUN.

重點: 認識程式骨架、DISPLAY 輸出、STOP RUN 結束程式。

範例 2:員工年薪計算

模擬商業系統中常見的薪資計算流程。

IDENTIFICATION DIVISION. PROGRAM-ID. SALARYCALC. DATA DIVISION. WORKING-STORAGE SECTION. 01 EMP-NAME PIC X(20) VALUE "CHEN". 01 MONTHLY-SALARY PIC 9(5)V99 VALUE 35000.50. 01 YEARLY-SALARY PIC 9(7)V99. 01 BONUS-RATE PIC 9V99 VALUE 0.10. 01 BONUS-AMOUNT PIC 9(6)V99. PROCEDURE DIVISION. COMPUTE YEARLY-SALARY = MONTHLY-SALARY * 12 COMPUTE BONUS-AMOUNT = YEARLY-SALARY * BONUS-RATE DISPLAY "員工: " EMP-NAME DISPLAY "月薪: " MONTHLY-SALARY DISPLAY "年薪: " YEARLY-SALARY DISPLAY "獎金: " BONUS-AMOUNT STOP RUN.

重點: WORKING-STORAGE、數值欄位、COMPUTE、多次 DISPLAY。

範例 3:成績等級判斷

使用 IF 與 EVALUATE 做商業規則或分級判斷。

IDENTIFICATION DIVISION. PROGRAM-ID. GRADECHK. DATA DIVISION. WORKING-STORAGE SECTION. 01 SCORE PIC 9(3) VALUE 82. 01 GRADE PIC X. PROCEDURE DIVISION. IF SCORE >= 90 MOVE "A" TO GRADE ELSE IF SCORE >= 80 MOVE "B" TO GRADE ELSE IF SCORE >= 70 MOVE "C" TO GRADE ELSE MOVE "D" TO GRADE END-IF END-IF END-IF EVALUATE GRADE WHEN "A" DISPLAY "等級 A:優秀" WHEN "B" DISPLAY "等級 B:良好" WHEN "C" DISPLAY "等級 C:及格" WHEN OTHER DISPLAY "等級 D:需加強" END-EVALUATE STOP RUN.

重點: IF/ELSE、巢狀條件、EVALUATE 多分支。

範例 4:PERFORM 迴圈與累加

示範重複執行與總和計算,常見於批次處理與統計邏輯。

IDENTIFICATION DIVISION. PROGRAM-ID. LOOPSUM. DATA DIVISION. WORKING-STORAGE SECTION. 01 IDX PIC 9(2) VALUE 1. 01 TOTAL PIC 9(4) VALUE 0. PROCEDURE DIVISION. PERFORM VARYING IDX FROM 1 BY 1 UNTIL IDX > 5 ADD IDX TO TOTAL DISPLAY "目前數字: " IDX END-PERFORM DISPLAY "總和為: " TOTAL STOP RUN.

重點: PERFORM VARYING、ADD、迴圈終止條件。

範例 5:簡化版檔案處理觀念

IBM 文件提到,line-sequential file 屬於循序檔案,記錄會依順序讀取; 因此常見流程是:在 ENVIRONMENT DIVISION 宣告檔案、在 FILE SECTION 描述記錄、 在 PROCEDURE DIVISION 中用 READ 順序讀取。

IDENTIFICATION DIVISION. PROGRAM-ID. READFILE. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INPUT-FILE ASSIGN TO "customer.txt" ORGANIZATION IS LINE SEQUENTIAL. DATA DIVISION. FILE SECTION. FD INPUT-FILE. 01 INPUT-RECORD PIC X(80). WORKING-STORAGE SECTION. 01 EOF-FLAG PIC X VALUE "N". PROCEDURE DIVISION. OPEN INPUT INPUT-FILE PERFORM UNTIL EOF-FLAG = "Y" READ INPUT-FILE AT END MOVE "Y" TO EOF-FLAG NOT AT END DISPLAY "讀到資料: " INPUT-RECORD END-READ END-PERFORM CLOSE INPUT-FILE STOP RUN.
這是一個教學化的簡化範例。不同編譯器與平台對檔案配置、路徑、編碼、執行環境的細節可能有所不同, 但核心概念都是:先定義檔案,再順序讀取,再在 AT END 處理檔案結束。

四、COBOL 小測驗

做完下列題目後按下「提交答案」,系統會立即顯示分數與評語。

1. 下列哪一個 Division 主要負責「程式實際執行邏輯」?

2. PIC X(20) 最常代表什麼欄位?

3. 若要做數值計算,哪個指令最合適?

4. 用來重複執行段落或迴圈的常用關鍵字是?

5. 下列哪一項最符合 line-sequential file 的概念?