cours0708/P5B1/carmag.cbl
2008-06-04 12:03:04 +02:00

164 lines
5.4 KiB
COBOL

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.