       IDENTIFICATION DIVISION.
       PROGRAM-ID. carmag0.
       
       AUTHOR. OD.
      ***---------------------------------------------------------------

      *----------------------------------------------------------------*
      *                         PROGRAMME                              *
      *                  CREATION TABLEAU IMPAIR                       *
      *----------------------------------------------------------------*

       ENVIRONMENT DIVISION.
      ***---------------------------------------------------------------

       DATA DIVISION.
       WORKING-STORAGE SECTION.
      *--------------------------*
      * DEFINITION DES VARIABLES *
      *--------------------------*
      * Nombre entre au clavier
       77 NBR-DPRT PICTURE 999 VALUE ZERO.
      * Tableau du carre magique
       01 TABLE-CARMAG.
      * - Numero de ligne
           05 LGN OCCURS 25.
      * - Colonnes de la ligne
               10 CLN OCCURS 25.
      * - - Contenu de chaque colonne : chiffre
                   15 CNTN PICTURE 999.
      * Nombre pour verifier le nombre saisie
       77 NBR PICTURE 999 VALUE ZERO.
           88 IMPAIR VALUE 1.
      * Valeur a inserer dans le tableau final
       77 VALEUR PICTURE 999 VALUE 1.
      * Curseur ligne
       77 CRSR-LGN PICTURE 999 VALUE 1.
      * Curseur colonne
       77 CRSR-CLN PICTURE 999 VALUE 1.
      * Total d'un calcul puis reutilisation pour diverses taches
       77 TOTAL PICTURE 999 VALUE ZERO.
      * Nombre de cases dans le tableau a afficher
       77 NBR-CRR PICTURE 999 VALUE ZERO.
      * Reste dans la division euclidienne
       77 RST PICTURE 999 VALUE ZERO.
      ***---------------------------------------------------------------

       PROCEDURE DIVISION.
      *
      * Nom du programme
      *
       PROGRAMME SECTION.
      * Debut du programme (initialisation)
       DEBUT.
           DISPLAY "Debut de la saisie...".
           PERFORM SAISIE UNTIL IMPAIR.
           DISPLAY "Saisie terminee !".
      * Corps du programme (contenu)
       CORPS.
           DISPLAY "Taille du tableau : " NBR-DPRT.
           PERFORM REMPLISSAGE.
      * Fin du programme
       FIN.
           DISPLAY "Carre magique fini !!!".
           STOP RUN.

      *
      * Arborescence de niveau 2 : Saisie de l'utilisateur
      *
       SAISIR SECTION.
       SAISIE.
           DISPLAY "Saisissez un chiffre impair inferieur a 26 : "
           WITH NO ADVANCING.
           ACCEPT NBR-DPRT.
           PERFORM VERIF.
        VERIF.
           DIVIDE NBR-DPRT BY 2 GIVING TOTAL REMAINDER RST.
           IF (RST NOT EQUAL TO ZERO AND NBR-DPRT LESS THAN 26) THEN
               MOVE 1 TO NBR.

      *
      * Arborescence niveau 2 : REMPLISSAGE PUIS AFFICHAGE
      *
       REMPLISSAGE SECTION.
      * Affectation de la premiere valeur, ligne une, colonne du milieu
       VAL-UNE.
           DISPLAY "Affectation valeur une...".
      *     COMPUTE TOTAL ROUNDED = NBR-DPRT / 2.
           DIVIDE 2 INTO NBR-DPRT GIVING TOTAL ROUNDED.
      * Affectation de la premiere valeur a la colonne trouvee
           MOVE 1 TO CNTN(1,TOTAL).
      * Affectation du numero de colonne vers le curseur des colonnes
           MOVE TOTAL TO CRSR-CLN.
           DISPLAY "Affectation terminee ! Colonne actuelle : " TOTAL.
       VAL-SUIV.
           DISPLAY "Affectation des valeurs suivantes...".
           MULTIPLY NBR-DPRT BY NBR-DPRT GIVING TOTAL.
           MOVE TOTAL TO NBR-CRR.
           PERFORM TRAITEMENT UNTIL VALEUR EQUAL TO NBR-CRR.
           DISPLAY "Affectations terminees ! Total : " VALEUR.
       AFFICHAGE.
           DISPLAY "AFFICHAGE DU TABLEAU".
           MOVE 1 TO CRSR-LGN.
           MOVE 1 TO CRSR-CLN.
           PERFORM PARCOURS VARYING CRSR-LGN FROM 1 BY 1 UNTIL CRSR-LGN
                 > NBR-DPRT.
      * AFTER CRSR-CLN FROM 1 BY 1 UNTIL CRSR-CLN
      *           > NBR-DPRT.
           DISPLAY "AFFICHAGE TERMINE".

      *
      * Arborescence niveau 3 : TRAITEMENT PLACEMENT
      *
       TRAITEMENT SECTION.
       INCREMENTE.
           ADD 1 TO VALEUR.
       MLTPL.
           DIVIDE VALEUR BY NBR-DPRT GIVING TOTAL REMAINDER RST.
           IF (RST EQUAL TO 1) THEN
               PERFORM SS-PLCMT
               ELSE PERFORM SR-PLCMT.
       VERIFICATION.
           PERFORM VERIFIER.
       PLACEMENT.
           DISPLAY "|_Affectation de : " VALEUR.
           MOVE VALEUR TO CNTN(CRSR-LGN,CRSR-CLN).
           DISPLAY "|  Affectee a : " CRSR-LGN ", "CRSR-CLN.

      *
      * Arborescence niveau 3 : Affichage du tableau
      *
       AFFICHER SECTION.
       PARCOURS.
           PERFORM AFFICHE VARYING CRSR-CLN FROM 1 BY 1 
               UNTIL CRSR-CLN >= NBR-DPRT.
           DISPLAY "|" CNTN(CRSR-LGN,CRSR-CLN) "|".
       AFFICHE.
           DISPLAY "|" CNTN(CRSR-LGN,CRSR-CLN) "|"
               WITH NO ADVANCING.

      *
      * Arborescence niveau 4 : MULIPLE + 1
      *
       MULTPL SECTION.
       SS-PLCMT.
           ADD 1 TO CRSR-LGN.
       SR-PLCMT.
           SUBTRACT 1 FROM CRSR-LGN.
           SUBTRACT 1 FROM CRSR-CLN.

      *
      * Arborescence niveau 4 : VERIFICATION LIGNE / COLONNE
      *
       VERIFIER SECTION.
       LIGNE.
           IF (CRSR-LGN < 1) THEN
               MOVE NBR-DPRT TO CRSR-LGN.
           IF (CRSR-LGN > NBR-DPRT) THEN
               MOVE 1 TO CRSR-LGN.
       COLONNE.
           IF (CRSR-CLN < 1) THEN
               MOVE NBR-DPRT TO CRSR-CLN.
           IF (CRSR-CLN > NBR-DPRT) THEN
               MOVE 1 TO CRSR-CLN.
