Codierbeispiel: 8-Damen-Problem
Autor: Daniel Heinrich

Der Autor kontaktierte mich vor einiger Zeit, da er wissen wollte, wie das 8-Damen-Problem in Cobol zu lösen sei. Es handelt sich dabei um das 1850 von C.F. Gauß gestellte Problem, daß 8 Damen so auf einem Schachfeld verteilt werden sollen, daß keine die andere bedrohen kann.
Nach einiger Zeit meldete sich der Autor mit folgendem Ergebnis:


IDENTIFICATION DIVISION.
PROGRAM-ID. HPRO-SCHACH.
AUTHOR. DANIEL-HEINRICH.
DATE. 14/04/99.

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 SCHACHBRETT VALUE ZEROES.
   02 ZEILE    OCCURS 8.
       03 SPALTE    OCCURS 8.
           04 FELD PIC 9.

01 ZSUB     PIC 9 VALUE ZERO.
01 SSUB     PIC 9 VALUE 1.

PROCEDURE DIVISION.
DISPLAY SPACE UPON CRT.
PERFORM VARYING ZSUB FROM 1 BY 1 UNTIL ZSUB > 8
   MOVE 1 TO SPALTE(ZSUB, SSUB)
   CALL "UP-SPAL2" USING SCHACHBRETT
   MOVE 0 TO SPALTE(ZSUB, SSUB)
END-PERFORM.
STOP RUN.
IDENTIFICATION DIVISION.
PROGRAM-ID. UPRO-SCHACH-PRUEF.
AUTHOR. DANIEL-HEINRICH.
DATE. 14/04/99.

ENVIRONMENT DIVISION.

DATA DIVISION.
FILE SECTION.

WORKING-STORAGE SECTION.

01 Z-O-SUB     PIC 9 VALUE ZERO.
01 Z-U-SUB     PIC 9 VALUE ZERO.
01 S-O-SUB     PIC 9 VALUE ZERO.
01 S-U-SUB     PIC 9 VALUE ZERO.
01 S-HILF-SUB  PIC 9 VALUE ZERO.

LINKAGE SECTION.
01 SCHACHBRETT.
   02 ZEILE    OCCURS 8.
       03 SPALTE    OCCURS 8.
           04 FELD PIC 9.

01 OK       PIC 9.
01 ZSUB     PIC 9 VALUE ZERO.
01 SSUB     PIC 9 VALUE ZERO.

PROCEDURE DIVISION USING SCHACHBRETT ZSUB SSUB OK.
VORLAUF.
   MOVE 0 TO OK
   MOVE ZSUB TO Z-O-SUB, Z-U-SUB
   MOVE SSUB TO S-O-SUB, S-U-SUB.

PRUEF1.
   PERFORM VARYING S-HILF-SUB
       FROM 1 BY 1 UNTIL S-HILF-SUB = SSUB
       IF FELD(ZSUB, S-HILF-SUB) = 1
           THEN MOVE 1 TO OK
                PERFORM ENDE
       END-IF
   END-PERFORM.

PRUEF2.
   PERFORM UNTIL Z-O-SUB = 1 OR S-O-SUB = 1
       COMPUTE Z-O-SUB = Z-O-SUB - 1
       COMPUTE S-O-SUB = S-O-SUB - 1
       IF FELD(Z-O-SUB, S-O-SUB) = 1
           THEN MOVE 1 TO OK
                PERFORM ENDE
       END-IF
   END-PERFORM.

PRUEF3.
   PERFORM UNTIL Z-U-SUB = 8 OR S-U-SUB = 1
       COMPUTE Z-U-SUB = Z-U-SUB + 1
       COMPUTE S-U-SUB = S-U-SUB - 1
       IF FELD(Z-U-SUB, S-U-SUB) = 1
           THEN MOVE 1 TO OK
                PERFORM ENDE
       END-IF
   END-PERFORM.

ENDE.
   EXIT PROGRAM.
IDENTIFICATION DIVISION.
PROGRAM-ID. UPRO1-SCHACH.
AUTHOR. DANIEL-HEINRICH.
DATE. 14/04/99.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.

01 OK       PIC 9 VALUE ZERO.
01 ZSUB     PIC 9 VALUE ZERO.
01 SSUB     PIC 9 VALUE 2.

LINKAGE SECTION.
01 SCHACHBRETT.
   02 ZEILE    OCCURS 8.
       03 SPALTE    OCCURS 8.
           04 FELD PIC 9.

PROCEDURE DIVISION USING SCHACHBRETT.
PERFORM VARYING ZSUB FROM 1 BY 1 UNTIL ZSUB > 8
   MOVE 1 TO SPALTE(ZSUB, SSUB)
   CALL "PRUEFUNG" USING SCHACHBRETT ZSUB SSUB OK
   IF OK = 0
       THEN CALL "UP-SPAL3" USING SCHACHBRETT
   END-IF
   MOVE 0 TO SPALTE(ZSUB, SSUB)
END-PERFORM.
EXIT-PROGRAM.
IDENTIFICATION DIVISION.
PROGRAM-ID. UPRO2-SCHACH.
AUTHOR. DANIEL-HEINRICH.
DATE. 13/04/99.

******************************************************************
*Unterprogramm: 8-Damen Problem
******************************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.
01 OK       PIC 9 VALUE ZERO.
01 ZSUB     PIC 9 VALUE ZERO.
01 SSUB     PIC 9 VALUE 3.

LINKAGE SECTION.
01 SCHACHBRETT.
   02 ZEILE OCCURS 8.
       03 SPALTE OCCURS 8.
           04 FELD PIC 9.

PROCEDURE DIVISION USING SCHACHBRETT.
   PERFORM VARYING ZSUB FROM 1 BY 1 UNTIL ZSUB > 8
       MOVE 1 TO SPALTE(ZSUB, SSUB)
       CALL "PRUEFUNG" USING SCHACHBRETT ZSUB SSUB OK
       IF OK = 0
           THEN
           CALL "UP-SPAL4" USING SCHACHBRETT
       END-IF
       MOVE 0 TO SPALTE (ZSUB, SSUB)
   END-PERFORM.

ENDE.
   EXIT-PROGRAM.
IDENTIFICATION DIVISION.
PROGRAM-ID. UPRO3-SCHACH.
AUTHOR. DANIEL-HEINRICH.
DATE. 13/04/99.

******************************************************************
*Unterprogramm: 8-Damen Problem
******************************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.
01 OK       PIC 9 VALUE ZERO.
01 ZSUB     PIC 9 VALUE ZERO.
01 SSUB     PIC 9 VALUE 4.

LINKAGE SECTION.
01 SCHACHBRETT.
   02 ZEILE OCCURS 8.
       03 SPALTE OCCURS 8.
           04 FELD PIC 9.

PROCEDURE DIVISION USING SCHACHBRETT.
   PERFORM VARYING ZSUB FROM 1 BY 1 UNTIL ZSUB > 8
       MOVE 1 TO SPALTE(ZSUB, SSUB)
       CALL "PRUEFUNG" USING SCHACHBRETT ZSUB SSUB OK
       IF OK = 0
           THEN
           CALL "UP-SPAL5" USING SCHACHBRETT
       END-IF
       MOVE 0 TO SPALTE (ZSUB, SSUB)
   END-PERFORM.

ENDE.
   EXIT-PROGRAM.
IDENTIFICATION DIVISION.
PROGRAM-ID. UPRO4-SCHACH.
AUTHOR. DANIEL-HEINRICH.
DATE. 13/04/99.

******************************************************************
*Unterprogramm: 8-Damen Problem
******************************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.

01 OK       PIC 9 VALUE ZERO.
01 ZSUB     PIC 9 VALUE ZERO.
01 SSUB     PIC 9 VALUE 5.

LINKAGE SECTION.
01 SCHACHBRETT.
   02 ZEILE OCCURS 8.
       03 SPALTE OCCURS 8.
           04 FELD PIC 9.

PROCEDURE DIVISION USING SCHACHBRETT.
   PERFORM VARYING ZSUB FROM 1 BY 1 UNTIL ZSUB > 8
       MOVE 1 TO SPALTE(ZSUB, SSUB)
       CALL "PRUEFUNG" USING SCHACHBRETT ZSUB SSUB OK
       IF OK = 0
           THEN
           CALL "UP-SPAL6" USING SCHACHBRETT
       END-IF
       MOVE 0 TO SPALTE (ZSUB, SSUB)
   END-PERFORM.

ENDE.
   EXIT-PROGRAM.
IDENTIFICATION DIVISION.
PROGRAM-ID. UPRO5-SCHACH.
AUTHOR. DANIEL-HEINRICH.
DATE. 13/04/99.

******************************************************************
*Unterprogramm: 8-Damen Problem
******************************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.

01 OK       PIC 9 VALUE ZERO.
01 ZSUB     PIC 9 VALUE ZERO.
01 SSUB     PIC 9 VALUE 6.

LINKAGE SECTION.
01 SCHACHBRETT.
   02 ZEILE OCCURS 8.
       03 SPALTE OCCURS 8.
           04 FELD PIC 9.

PROCEDURE DIVISION USING SCHACHBRETT.
   PERFORM VARYING ZSUB FROM 1 BY 1 UNTIL ZSUB > 8
       MOVE 1 TO SPALTE(ZSUB, SSUB)
       CALL "PRUEFUNG" USING SCHACHBRETT ZSUB SSUB OK
       IF OK = 0
           THEN CALL "UP-SPAL7" USING SCHACHBRETT
       END-IF
       MOVE 0 TO SPALTE (ZSUB, SSUB)
   END-PERFORM.

ENDE.
   EXIT-PROGRAM.
IDENTIFICATION DIVISION.
PROGRAM-ID. UPRO6-SCHACH.
AUTHOR. DANIEL-HEINRICH.
DATE. 13/04/99.

******************************************************************
*Unterprogramm: 8-Damen Problem
******************************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.
WORKING-STORAGE SECTION.

01 OK       PIC 9 VALUE ZERO.
01 ZSUB     PIC 9 VALUE ZERO.
01 SSUB     PIC 9 VALUE 7.

LINKAGE SECTION.
01 SCHACHBRETT.
   02 ZEILE OCCURS 8.
       03 SPALTE OCCURS 8.
           04 FELD PIC 9.
PROCEDURE DIVISION USING SCHACHBRETT.
   PERFORM VARYING ZSUB FROM 1 BY 1 UNTIL ZSUB > 8
       MOVE 1 TO SPALTE(ZSUB, SSUB)
       CALL "PRUEFUNG" USING SCHACHBRETT ZSUB SSUB OK
       IF OK = 0
       THEN CALL "UP-SPAL8" USING SCHACHBRETT
       END-IF
       MOVE 0 TO SPALTE (ZSUB, SSUB)
   END-PERFORM.

ENDE.
   EXIT-PROGRAM.
IDENTIFICATION DIVISION.
PROGRAM-ID. UPRO7-SCHACH.
AUTHOR. DANIEL-HEINRICH.
DATE. 13/04/99.

******************************************************************
*Unterprogramm: 8-Damen Problem
******************************************************************

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.
01 OK       PIC 9 VALUE ZERO.
01 ZSUB     PIC 9 VALUE ZERO.
01 SSUB     PIC 9 VALUE 8.
*01 UEB      PIC X(8) VALUE (ABCDEFGH).
01 ZAEHLER  PIC 9(5) VALUE ZERO.

LINKAGE SECTION.

01 SCHACHBRETT.
   02 ZEILE OCCURS 8.
       03 SPALTE OCCURS 8.
           04 FELD PIC 9.

PROCEDURE DIVISION USING SCHACHBRETT.
   PERFORM VARYING ZSUB FROM 1 BY 1 UNTIL ZSUB > 8
       MOVE 1 TO SPALTE(ZSUB, SSUB)
       CALL "PRUEFUNG" USING SCHACHBRETT ZSUB SSUB OK
       IF OK = 0
           THEN ADD 1 TO ZAEHLER
           DISPLAY ZAEHLER AT 0101
       END-IF
       MOVE 0 TO SPALTE (ZSUB, SSUB)
   END-PERFORM.

ENDE.
   EXIT-PROGRAM.


...