*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 |