********************************
* CASE TWO 九九乘法 *
********************************
*>識別部
IDENTIFICATION DIVISION.
PROGRAM-ID. HRWYY2KF.
*>環境部
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
CRT STATUS IS W-KEY-ENTERED.
*>資料部(定義工作變數及螢幕變數)
DATA DIVISION.
WORKING-STORAGE SECTION.
*>宣告工作變數區
01 W-WRK.
02 W-WRK1.
03 W-WRK-NUM1 PIC 9(2) VALUE 0.
03 W-WRK-NUM2 PIC 9(2) VALUE 0.
03 W-WRK-ANS PIC 9(2) VALUE 0.
03 W-WRK-FUN PIC X(1).
88 W-WRK-FUN-OK VALUE "1","2","3","4","5","6","7","8".
03 W-ERR PIC X(40).
78 W-ERR-FUN VALUE "請輸入數字1~8,或按ESE跳出!".
01 W-KEY-ENTERED PIC 9(3).
88 W-WRAP-DKY VALUE 0.
88 W-ESC-KEY VALUE 27.
88 W-CR-KEY VALUE 13.
88 W-LF-KEY VALUE 10.
88 W-RETURN-EKY VALUE 10,13.
88 W-UP-KEY VALUE 52,1.
88 W-DOWN-KEY VALUE 53,2.
88 W-PGUP-KEY VALUE 67,3.
88 W-PGDN-KEY VALUE 68,4.
88 W-HOME-KEY VALUE 65,7.
88 W-END-KEY VALUE 66,8.
88 W-LEFT-KEY VALUE 50.
88 W-RIGHT-KEY VALUE 51.
01 W-WINDOW-INQ PIC X(10).
*>使用78值設定畫面大小(不用變數以免被塞入其他值)
78 W-WIN-LINE VALUE 7.
78 W-WIN-COL VALUE 1.
78 W-MENU-LINE VALUE 15.
78 W-MENU-SIZE VALUE 80.
78 W-MENU-TITLE VALUE "<九九乘法>".
SCREEN SECTION.
*>畫面設定
01 S-SCR.
*> 123456789012345678901234567890
02 LINE 2, COL 2 "請輸入數字1~8,或按ESC跳出:".
*>設定畫面接收變數
01 S-ACCEPT, AUTO.
02 S-ACCEPT-FUN LINE 2 COL 31 PIC X(1) USING W-WRK-FUN.
* 02 S-ACCEPT-ANS LINE 4 COL 2 PIC -- USING W-WRK-ANS.
*>設定錯誤訊息變數
01 S-ERR LINE 14, COL 24 PIC X(40) FROM W-ERR.
*>程式結束訊息
01 S-CONTINUE LINE 14,COL 10 "請按任意鍵繼續....".
PROCEDURE DIVISION.
*>主程式段
F-MAIN-RTN.
*>呼叫畫面程式段
PERFORM F-OPEN-WIN-RTN.
*>輸入及計算程式段
PERFORM F-PROC-RTN THRU F-PROC-EXIT.
*>結束程式
F-MAIN-EXIT.
DISPLAY S-CONTINUE.
ACCEPT OMITTED,LINE 14,COL 35 CONTROL KEY IN W-KEY-ENTERED.
CLOSE WINDOW W-WINDOW-INQ.
*>回上一程式畫面
GOBACK.
*>開啟程式畫面
F-OPEN-WIN-RTN.
DISPLAY WINDOW LINE W-WIN-LINE,COL W-WIN-COL,
LINES W-MENU-LINE, SIZE W-MENU-SIZE,BOXED,SHADOW,
CENTERED TITLE IS W-MENU-TITLE,
WITH NO WRAP NO SCROLL,
*> 將視窗部分原有的資料存起來
POP-UP AREA IS W-WINDOW-INQ.
*>清空畫面並顯示初始狀態
F-PROC-RTN.
DISPLAY " " BLANK SCREEN.
DISPLAY S-SCR.
DISPLAY S-ACCEPT.
*>選擇數字1~8,按ESC時結束程式 (必需有ON EXCEPTION才能接收到功能鍵值)
F-INFUN-RTN.
ACCEPT S-ACCEPT-FUN ON EXCEPTION CONTINUE.
*>輸入錯誤時(非1~8),顯示錯誤訊息,並要求重新輸入
IF W-ESC-KEY THEN
GO TO F-PROC-EXIT
END-IF.
IF NOT W-WRK-FUN-OK THEN
MOVE "FUN" TO W-ERR
*>顯示錯誤訊息段F-ERR-RTN
PERFORM F-ERR-RTN
INITIALIZE W-WRK-FUN
DISPLAY S-ACCEPT-FUN
GO TO F-INFUN-RTN
END-IF.
*>開始運算結果
F-CAL-RTN
*>開始運算結果(EVALUATE寫法)
EVALUATE W-WRK-FUN
WHEN "1"
DISPLAY " "
PERFORM VARYING W-WRK-NUM1 FROM 1 BY 1 UNTIL W-WRK-NUM1 > 9
PERFORM VARYING W-WRK-NUM2 FROM 1 BY 1 UNTIL W-WRK-NUM2 > 9
COMPUTE W-WRK-ANS = W-WRK-NUM1 * W-WRK-NUM2
DISPLAY W-WRK-NUM1"*"W-WRK-NUM2"="W-WRK-ANS" " WITH NO ADVANCING
END-PERFORM
DISPLAY " "
END-PERFORM
* PERFORM VARYING W-WRK-NUM1 FROM 1 BY 1 UNTIL W-WRK-NUM1 > 9
* PERFORM VARYING W-WRK-NUM2 FROM 1 BY 1 UNTIL W-WRK-NUM2 > 9
* COMPUTE W-WRK-ANS = W-WRK-NUM1 * W-WRK-NUM2
* DISPLAY W-WRK-NUM1"*"W-WRK-NUM2"="W-WRK-ANS" "
* END-PERFORM
*
* INITIALIZE W-WRK1
* DISPLAY S-ACCEPT
* GO TO F-INFUN-RTN
* END-PERFORM
WHEN "2"
DISPLAY " "
PERFORM VARYING W-WRK-NUM1 FROM 1 BY 1 UNTIL W-WRK-NUM1 > 9
PERFORM VARYING W-WRK-NUM2 FROM 1 BY 1 UNTIL W-WRK-NUM2+W-WRK-NUM1 > 10
COMPUTE W-WRK-ANS = W-WRK-NUM1 * W-WRK-NUM2
DISPLAY W-WRK-NUM1"*"W-WRK-NUM2"="W-WRK-ANS" " WITH NO ADVANCING
END-PERFORM
DISPLAY " "
END-PERFORM
WHEN "3"
DISPLAY " "
PERFORM VARYING W-WRK-NUM1 FROM 1 BY 1 UNTIL W-WRK-NUM1 > 9
PERFORM VARYING W-WRK-NUM2 FROM 1 BY 1 UNTIL W-WRK-NUM2 > W-WRK-NUM1
COMPUTE W-WRK-ANS = W-WRK-NUM1 * W-WRK-NUM2
DISPLAY W-WRK-NUM1"*"W-WRK-NUM2"="W-WRK-ANS" " WITH NO ADVANCING
END-PERFORM
DISPLAY " "
END-PERFORM
WHEN "4"
DISPLAY " "
PERFORM VARYING W-WRK-NUM1 FROM 1 BY 1 UNTIL W-WRK-NUM1 > 9
PERFORM VARYING W-WRK-NUM2 FROM 1 BY 1 UNTIL W-WRK-NUM2 > 9
COMPUTE W-WRK-ANS = W-WRK-NUM1 * W-WRK-NUM2
IF W-WRK-NUM1 <= W-WRK-NUM2
DISPLAY W-WRK-NUM1"*"W-WRK-NUM2"="W-WRK-ANS" " WITH NO ADVANCING
ELSE
DISPLAY " " WITH NO ADVANCING
END-IF
END-PERFORM
DISPLAY " "
END-PERFORM
WHEN "5"
DISPLAY " "
PERFORM VARYING W-WRK-NUM1 FROM 1 BY 1 UNTIL W-WRK-NUM1 > 9
PERFORM VARYING W-WRK-NUM2 FROM 1 BY 1 UNTIL W-WRK-NUM2 > 9
COMPUTE W-WRK-ANS = W-WRK-NUM1 * W-WRK-NUM2
IF W-WRK-NUM1 <= W-WRK-NUM2
DISPLAY W-WRK-NUM1"*"W-WRK-NUM2"="W-WRK-ANS" " WITH NO ADVANCING
ELSE
DISPLAY " " WITH NO ADVANCING
END-IF
END-PERFORM
DISPLAY " "
END-PERFORM
WHEN "6"
COMPUTE W-WRK-ANS = 6*6
WHEN "7"
COMPUTE W-WRK-ANS = 7*7
WHEN "8"
COMPUTE W-WRK-ANS = 8*8
END-EVALUATE.
GO TO F-INFUN-RTN.
F-PROC-EXIT.
EXIT.
F-ERR-RTN.
* IF NOT W-WRK-SURE-OK THEN
* DISPLAY S-ERR FROM W-ERR-SURE
* DISPLAY "請輸入數字1~8,或按ESE跳出:" AT LINE 20, COL 10
* ACCEPT OMITTED, LINE 20, COL 20 CONTROL KEY IN W-KEY-ENTERED
* MOVE " " TO W-WRK SURE
* INITIALIZE W-ERR
* DISPLAY S-ERR FROM W-ERR
* GO TO F-INNUM-RTN.
*>輸入錯誤訊息
EVALUATE W-ERR
WHEN "FUN"
MOVE W-ERR-FUN TO W-ERR
END-EVALUATE.
DISPLAY S-ERR.
ACCEPT OMITTED, LINE 14, COL 24 CONTROL KEY IN W-KEY-ENTERED.
INITIALIZE W-ERR.
DISPLAY S-ERR.
F-ERR-EXIT.
EXIT.