Codierbeispiel: Das 8-Damen-Problem.


Kommen wir nun zum bisherigen Highlight unter den Codierbeispielen.
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.
Autor: Daniel Heinrich

...

... zurück