*89012345678901234567890123456789012345678901234567890123456789012
*-----------------------------------------------------------------
IDENTIFICATION DIVISION.
PROGRAM-ID. prog-750.
AUTHOR. ALVIN PON.
INSTALLATION. PC.
DATE-WRITTEN. 18 Mar 1996.
DATE-COMPILED.
REMARKS.
* Multi-dimensional tables
* Use a table to represent a noughts and crosses grid.
* 'Moves' are input in the form RC where R is the row number
* (1, 2 or 3) and C is the column number (1, 2 or 3).
* After each move display the grid showing the number of moves
* made in each position. Allow a maximum of 9 moves.
* To stop the program before 9 moves, input 00.
*-----------------------------------------------------------------
*89012345678901234567890123456789012345678901234567890123456789012
*-----------------------------------------------------------------
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
*INPUT-OUTPUT SECTION.
*FILE-CONTROL.
*-----------------------------------------------------------------
*89012345678901234567890123456789012345678901234567890123456789012
*-----------------------------------------------------------------
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 W-AA01-MOVE-INP.
03 W-AA02-R-INP PIC X.
88 QUIT-R VALUE '0'.
03 W-AA03-C-INP PIC X.
88 QUIT-C VALUE '0'.
01 W-AB01-MOVE-VAL.
03 W-AB02-R-VAL PIC 9.
88 VAL-R VALUE 1 2 3.
03 W-AB03-C-VAL PIC 9.
88 VAL-C VALUE 1 2 3.
01 W-AC01-MOVE-TEMP.
03 W-AC02-R-TEMP PIC X.
03 W-AC03-C-TEMP PIC X.
01 W-AD01-MULT-DIM-TABLE.
03 W-AD02-ROW OCCURS 3.
05 W-AD03-BOX PIC 9 OCCURS 3.
01 W-AE01-GRID-LN.
03 W-AE02-COL1-DS PIC Z9.
03 FILLER PIC XX VALUE ' |'.
03 W-AE03-COL2-DS PIC Z9.
03 FILLER PIC XX VALUE ' |'.
03 W-AE04-COL3-DS PIC Z9.
01 W-AF04-HORIZONTAL-LN.
03 FILLER PIC X(11) VALUE '---+---+---'.
01 W-AG01-READ-FLAG PIC X(8).
88 READING VALUE 'reading'.
88 QUIT VALUE 'quit'.
01 W-AH01-ERROR-FLAG-RC PIC X(8).
01 W-AH02-ERROR-FLAG-COORD PIC X(8).
01 W-AI01-MOVE-COUNTER PIC 99.
01 W-AI02-ROW-COUNTER PIC 99.
01 W-AI03-INIT-COUNTER PIC 99.
01 W-ZZ99-C PIC X(30) VALUE
'prompt,tab,no beep,no convert'.
*-----------------------------------------------------------------
*89012345678901234567890123456789012345678901234567890123456789012
*-----------------------------------------------------------------
PROCEDURE DIVISION.
MAIN SECTION.
*Execute the program
A100-EXECUTE-PROGRAM.
PERFORM B100-START-PROGRAM.
PERFORM B200-EXECUTE-SPECIFICATION.
PERFORM B300-FINISH-PROGRAM.
STOP RUN.
*Start the program.
B100-START-PROGRAM.
DISPLAY '<<< prog-750 >>>' LINE 5 ERASE.
DISPLAY ' '.
*Execute the specification
B200-EXECUTE-SPECIFICATION.
MOVE 'reading' TO W-AG01-READ-FLAG.
MOVE ZEROS TO W-AD01-MULT-DIM-TABLE.
MOVE 0 TO W-AI01-MOVE-COUNTER
W-AI02-ROW-COUNTER
W-AI03-INIT-COUNTER.
PERFORM X100-DISPLAY-GRID.
DISPLAY ' '
DISPLAY 'Please enter a move beneath the mask'.
DISPLAY '(Maximum of 9 moves, use 00 to QUIT)'.
DISPLAY 'RC'.
ACCEPT W-AA01-MOVE-INP CONTROL W-ZZ99-C.
PERFORM C100-PROCESS-COORDS
UNTIL W-AI01-MOVE-COUNTER IS = 9 OR QUIT.
IF W-AI01-MOVE-COUNTER IS = 0 THEN
DISPLAY ' '
DISPLAY 'no valid moves were entered'
ELSE
DISPLAY ' '
DISPLAY 'end of input'.
*Finish the program
B300-FINISH-PROGRAM.
DISPLAY ' '.
DISPLAY 'prog-750 finished'.
*Process co-ordinates and getting next
C100-PROCESS-COORDS.
MOVE 'error' TO W-AH01-ERROR-FLAG-RC.
IF (QUIT-R AND QUIT-C) THEN
MOVE 'quit' TO W-AG01-READ-FLAG
ELSE
PERFORM D100-VALIDATE-MOVE-INPUT.
IF W-AA01-MOVE-INP IS NOT = W-AC01-MOVE-TEMP AND
W-AH01-ERROR-FLAG-RC = 'ok' THEN
PERFORM D200-INITIALISE-TABLE VARYING
W-AI03-INIT-COUNTER FROM 1 BY 1 UNTIL
W-AI03-INIT-COUNTER IS > 3.
IF W-AH01-ERROR-FLAG-RC = 'ok' THEN
ADD 1 TO W-AI01-MOVE-COUNTER
W-AD03-BOX(W-AB02-R-VAL W-AB03-C-VAL)
MOVE W-AB01-MOVE-VAL TO W-AC01-MOVE-TEMP
DISPLAY ' '
PERFORM X100-DISPLAY-GRID.
IF W-AI01-MOVE-COUNTER IS < 9 AND READING THEN
DISPLAY ' '
DISPLAY 'RC'
ACCEPT W-AA01-MOVE-INP CONTROL W-ZZ99-C.
*Validate move input
D100-VALIDATE-MOVE-INPUT.
IF W-AA02-R-INP IS NUMERIC AND W-AA03-C-INP IS NUMERIC THEN
MOVE W-AA01-MOVE-INP TO W-AB01-MOVE-VAL
PERFORM E100-CHECK-RANGE-MOVE
ELSE
DISPLAY '?? ERROR - Move co-ordinates are not numeric'.
*Initialise the table
D200-INITIALISE-TABLE.
MOVE 0 TO W-AD03-BOX(W-AI03-INIT-COUNTER 1).
MOVE 0 TO W-AD03-BOX(W-AI03-INIT-COUNTER 2).
MOVE 0 TO W-AD03-BOX(W-AI03-INIT-COUNTER 3).
*Check range of move co-ordinates
E100-CHECK-RANGE-MOVE.
MOVE 'ok' TO W-AH02-ERROR-FLAG-COORD.
IF NOT VAL-R THEN
DISPLAY '? ERROR - Row number should be 1, 2 or 3'
MOVE 'error' TO W-AH02-ERROR-FLAG-COORD.
IF NOT VAL-C THEN
DISPLAY ' ? ERROR - Column number should be 1, 2 or 3'
MOVE 'error' TO W-AH02-ERROR-FLAG-COORD.
IF W-AH02-ERROR-FLAG-COORD IS = 'ok' THEN
MOVE 'ok' TO W-AH01-ERROR-FLAG-RC.
*Display the noughts and crosses grid
X100-DISPLAY-GRID.
PERFORM Z100-DISPLAY-GRID-ROW VARYING W-AI02-ROW-COUNTER
FROM 1 BY 1 UNTIL W-AI02-ROW-COUNTER IS > 3.
*Display a row of grid
Z100-DISPLAY-GRID-ROW.
MOVE W-AD03-BOX(W-AI02-ROW-COUNTER 1) TO W-AE02-COL1-DS.
MOVE W-AD03-BOX(W-AI02-ROW-COUNTER 2) TO W-AE03-COL2-DS.
MOVE W-AD03-BOX(W-AI02-ROW-COUNTER 3) TO W-AE04-COL3-DS.
DISPLAY W-AE01-GRID-LN.
IF W-AI02-ROW-COUNTER IS < 3 THEN
DISPLAY W-AF04-HORIZONTAL-LN.
*-----------------------------------------------------------------
*89012345678901234567890123456789012345678901234567890123456789012
|