Ajout des numéros de lignes

This commit is contained in:
rick 2021-03-17 22:30:41 +01:00
parent 883b2a19e6
commit ddf165db95
Signed by: Rick
GPG key ID: 2B593F087240EE99

View file

@ -1,211 +1,211 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. jour-cinq.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILE1 ASSIGN TO "input"
ORGANIZATION LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD FILE1.
01 INPUT-FILE.
02 STR PIC A(17).
WORKING-STORAGE SECTION.
01 MY-FILE.
02 MY-STR PIC A(17).
01 FILE-STATUS PIC X VALUE 'N'.
88 EOF VALUE 'Y'.
77 NB-NICE-PREM PIC 9(4) VALUE 0.
77 NB-NICE-DEUX PIC 9(4) VALUE 0.
PROCEDURE DIVISION.
main.
OPEN INPUT FILE1.
PERFORM UNTIL EOF
READ FILE1 RECORD INTO MY-FILE
* Lorsquon arrive à la fin du fichier, on met Y pour le signaler
AT END MOVE 'Y' TO FILE-STATUS
NOT AT END CALL "hub" USING
BY CONTENT MY-STR,
BY REFERENCE NB-NICE-PREM
BY REFERENCE NB-NICE-DEUX
* On passe par référence NB-NICE pour les incrémenter
END-CALL
END-READ
END-PERFORM.
DISPLAY "Nombres de bonnes chaines :" END-DISPLAY.
DISPLAY "Dans la partie 1 : " NB-NICE-PREM END-DISPLAY.
DISPLAY "Dans la partie 2 : " NB-NICE-DEUX END-DISPLAY.
CLOSE FILE1.
STOP RUN.
*****************************************************************
* hub : exécute les 2 fonctions pour les 2 parties
* STR : la chaine à passer en paramètre aux deux fonctions
* NB-PREM : (REFERENCE) nombre bonnes chaines partie 1
* NB-DEUX : (REFERENCE) nombre bonnes chaines partie 2
* Ces 2 variables seront incrémentées
*****************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. hub.
DATA DIVISION.
LINKAGE SECTION.
77 STR PIC A(17).
77 NB-PREM PIC 9(4).
77 NB-DEUX PIC 9(4).
PROCEDURE DIVISION USING STR, NB-PREM, NB-DEUX.
route.
CALL "parse-prem" USING
BY CONTENT STR,
BY REFERENCE NB-PREM
END-CALL.
CALL "parse-deux" USING
BY CONTENT STR,
BY REFERENCE NB-DEUX
END-CALL.
EXIT PROGRAM.
******************************************************************
* parse-prem : parse la chaine de caractères pour voir le nombre de
* bonnes chaines pour la partie 1. Prend en paramètres 2 arguments :
* STR : chaine de caractères de taille 17 à analyser.
* NB : (REFERENCE) le nombre de bonnes chaines. Sera incrémenter.
*****************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. parse-prem.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 CHAR PIC A.
88 VOY VALUE 'a','e','i','o','u'.
77 I PIC 99.
88 END-P VALUE 17.
77 NB-VOY PIC 99.
77 PRED PIC A.
77 TMP PIC AA.
88 BAD VALUE 'ab', 'cd', 'pq', 'xy'.
77 DOUBLE PIC X.
*****************************************************************
* NB-VOY contient le nombre de voyelles
* PRED le caractère précédent
* TMP forme la chaine contenant le caractère précédent et courant
* BAD les mauvaises formes de chaines
* DOUBLE est mit à Y lorsque CHAR = PRED
*
* LINKAGE SECTION contient les paramètres du programme parse-str
*****************************************************************
LINKAGE SECTION.
77 STR PIC A(17).
77 NB PIC 9(4).
PROCEDURE DIVISION USING STR, NB.
parse.
MOVE 0 TO NB-VOY.
MOVE 'N' TO DOUBLE.
PERFORM VARYING I FROM 1 BY 1 UNTIL END-P
MOVE STR(I:1) TO CHAR
IF VOY THEN
ADD 1 TO NB-VOY END-ADD
END-IF
IF I >= 2
THEN
STRING PRED CHAR INTO TMP END-STRING
IF BAD THEN
EXIT PERFORM
END-IF
IF PRED = CHAR THEN
MOVE 'Y' TO DOUBLE
END-IF
END-IF
MOVE CHAR TO PRED
END-PERFORM.
IF NOT BAD AND NB-VOY >= 3 AND DOUBLE = 'Y' THEN
ADD 1 TO NB END-ADD
END-IF.
EXIT PROGRAM.
END PROGRAM parse-prem.
******************************************************************
* parse-deux : parse la chaine de caractères pour voir le nombre de
* bonnes chaines pour la partie 2. Prend en paramètres 2 arguments :
* STR : chaine de caractères de taille 17 à analyser.
* NB : (REFERENCE) le nombre de bonnes chaines. Sera incrémenter.
*****************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. parse-deux.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 CHAR PIC A.
77 I PIC 99.
88 STR-LENGTH VALUE 17.
77 J PIC 99.
77 K PIC 99.
88 DOUBLE-STR-LENGTH VALUE 16.
77 PRED PIC A.
77 MYNEW PIC A.
77 DOUBLE-CHAR PIC AA.
77 DOUBLE-CHAR-NEXT PIC AA.
77 BETWEEN PIC X.
77 DOUBLE PIC X.
******************************************************************
* PRED le caractère précédent
* MYNEW le caractère suivant
* DOUBLE-CHAR la paire à vérifier
* DOUBLE-CHAR-NEXT les paires suivantes
* DOUBLE est mit à Y lorsque 2 pairs sont trouvées
* BETWEEN est mit à Y lorsque 2 memes lettres en encadrent une
******************************************************************
LINKAGE SECTION.
77 STR PIC A(17).
77 NB PIC 9(4).
PROCEDURE DIVISION USING STR, NB.
deuxieme-part.
MOVE 'N' TO BETWEEN.
MOVE 'N' TO DOUBLE.
PERFORM VARYING I FROM 1 BY 1 UNTIL STR-LENGTH
COMPUTE J = I + 1 END-COMPUTE
MOVE STR(I:1) TO CHAR
IF I > 1 AND I < (LENGTH OF STR - 1) THEN
MOVE STR(J:1) TO MYNEW
IF PRED = MYNEW THEN
MOVE 'Y' TO BETWEEN
END-IF
END-IF
IF I < ((LENGTH OF STR) - 2) AND DOUBLE = 'N' THEN
MOVE STR(I:2) TO DOUBLE-CHAR
ADD 1 TO J END-ADD
PERFORM VARYING K FROM J BY 1 UNTIL DOUBLE-STR-LENGTH
MOVE STR(K:2) TO DOUBLE-CHAR-NEXT
IF DOUBLE-CHAR = DOUBLE-CHAR-NEXT THEN
MOVE 'Y' TO DOUBLE
END-IF
END-PERFORM
END-IF
MOVE CHAR TO PRED
END-PERFORM.
IF BETWEEN = 'Y' AND DOUBLE = 'Y'
THEN
ADD 1 TO NB END-ADD
END-IF.
EXIT PROGRAM.
END PROGRAM parse-deux.
END PROGRAM hub.
END PROGRAM jour-cinq.
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. jour-cinq.
000003
000004 ENVIRONMENT DIVISION.
000005 INPUT-OUTPUT SECTION.
000006 FILE-CONTROL.
000007 SELECT FILE1 ASSIGN TO "input"
000008 ORGANIZATION LINE SEQUENTIAL.
000009
000010 DATA DIVISION.
000011 FILE SECTION.
000012 FD FILE1.
000013 01 INPUT-FILE.
000014 02 STR PIC A(17).
000015
000016 WORKING-STORAGE SECTION.
000017 01 MY-FILE.
000018 02 MY-STR PIC A(17).
000019 01 FILE-STATUS PIC X VALUE 'N'.
000020 88 EOF VALUE 'Y'.
000021 77 NB-NICE-PREM PIC 9(4) VALUE 0.
000022 77 NB-NICE-DEUX PIC 9(4) VALUE 0.
000023
000024 PROCEDURE DIVISION.
000025 main.
000026 OPEN INPUT FILE1.
000027 PERFORM UNTIL EOF
000028 READ FILE1 RECORD INTO MY-FILE
000029* Lorsquon arrive à la fin du fichier, on met Y pour le signaler
000030 AT END MOVE 'Y' TO FILE-STATUS
000031 NOT AT END CALL "hub" USING
000032 BY CONTENT MY-STR,
000033 BY REFERENCE NB-NICE-PREM
000034 BY REFERENCE NB-NICE-DEUX
000035* On passe par référence NB-NICE pour les incrémenter
000036 END-CALL
000037 END-READ
000038 END-PERFORM.
000039 DISPLAY "Nombres de bonnes chaines :" END-DISPLAY.
000040 DISPLAY "Dans la partie 1 : " NB-NICE-PREM END-DISPLAY.
000041 DISPLAY "Dans la partie 2 : " NB-NICE-DEUX END-DISPLAY.
000042 CLOSE FILE1.
000043 STOP RUN.
000044
000045*****************************************************************
000046* hub : exécute les 2 fonctions pour les 2 parties
000047* STR : la chaine à passer en paramètre aux deux fonctions
000048* NB-PREM : (REFERENCE) nombre bonnes chaines partie 1
000049* NB-DEUX : (REFERENCE) nombre bonnes chaines partie 2
000050* Ces 2 variables seront incrémentées
000051*****************************************************************
000052
000053 IDENTIFICATION DIVISION.
000054 PROGRAM-ID. hub.
000055
000056 DATA DIVISION.
000057 LINKAGE SECTION.
000058 77 STR PIC A(17).
000059 77 NB-PREM PIC 9(4).
000060 77 NB-DEUX PIC 9(4).
000061
000062 PROCEDURE DIVISION USING STR, NB-PREM, NB-DEUX.
000063 route.
000064 CALL "parse-prem" USING
000065 BY CONTENT STR,
000066 BY REFERENCE NB-PREM
000067 END-CALL.
000068
000069 CALL "parse-deux" USING
000070 BY CONTENT STR,
000071 BY REFERENCE NB-DEUX
000072 END-CALL.
000073 EXIT PROGRAM.
000074
000075******************************************************************
000076* parse-prem : parse la chaine de caractères pour voir le nombre de
000077* bonnes chaines pour la partie 1. Prend en paramètres 2 arguments :
000078* STR : chaine de caractères de taille 17 à analyser.
000079* NB : (REFERENCE) le nombre de bonnes chaines. Sera incrémenter.
000080*****************************************************************
000081
000082 IDENTIFICATION DIVISION.
000083 PROGRAM-ID. parse-prem.
000084
000085 DATA DIVISION.
000086 WORKING-STORAGE SECTION.
000087 77 CHAR PIC A.
000088 88 VOY VALUE 'a','e','i','o','u'.
000089 77 I PIC 99.
000090 88 END-P VALUE 17.
000091 77 NB-VOY PIC 99.
000092 77 PRED PIC A.
000093 77 TMP PIC AA.
000094 88 BAD VALUE 'ab', 'cd', 'pq', 'xy'.
000095 77 DOUBLE PIC X.
000096
000097*****************************************************************
000098* NB-VOY contient le nombre de voyelles
000099* PRED le caractère précédent
000100* TMP forme la chaine contenant le caractère précédent et courant
000101* BAD les mauvaises formes de chaines
000102* DOUBLE est mit à Y lorsque CHAR = PRED
000103*
000104* LINKAGE SECTION contient les paramètres du programme parse-str
000105*****************************************************************
000106
000107 LINKAGE SECTION.
000108 77 STR PIC A(17).
000109 77 NB PIC 9(4).
000110
000111 PROCEDURE DIVISION USING STR, NB.
000112 parse.
000113 MOVE 0 TO NB-VOY.
000114 MOVE 'N' TO DOUBLE.
000115 PERFORM VARYING I FROM 1 BY 1 UNTIL END-P
000116 MOVE STR(I:1) TO CHAR
000117 IF VOY THEN
000118 ADD 1 TO NB-VOY END-ADD
000119 END-IF
000120 IF I >= 2
000121 THEN
000122 STRING PRED CHAR INTO TMP END-STRING
000123 IF BAD THEN
000124 EXIT PERFORM
000125 END-IF
000126 IF PRED = CHAR THEN
000127 MOVE 'Y' TO DOUBLE
000128 END-IF
000129 END-IF
000130 MOVE CHAR TO PRED
000131 END-PERFORM.
000132 IF NOT BAD AND NB-VOY >= 3 AND DOUBLE = 'Y' THEN
000133 ADD 1 TO NB END-ADD
000134 END-IF.
000135 EXIT PROGRAM.
000136 END PROGRAM parse-prem.
000137
000138******************************************************************
000139* parse-deux : parse la chaine de caractères pour voir le nombre de
000140* bonnes chaines pour la partie 2. Prend en paramètres 2 arguments :
000141* STR : chaine de caractères de taille 17 à analyser.
000142* NB : (REFERENCE) le nombre de bonnes chaines. Sera incrémenter.
000143*****************************************************************
000144
000145 IDENTIFICATION DIVISION.
000146 PROGRAM-ID. parse-deux.
000147
000148 DATA DIVISION.
000149 WORKING-STORAGE SECTION.
000150 77 CHAR PIC A.
000151 77 I PIC 99.
000152 88 STR-LENGTH VALUE 17.
000153 77 J PIC 99.
000154 77 K PIC 99.
000155 88 DOUBLE-STR-LENGTH VALUE 16.
000156 77 PRED PIC A.
000157 77 MYNEW PIC A.
000158 77 DOUBLE-CHAR PIC AA.
000159 77 DOUBLE-CHAR-NEXT PIC AA.
000160 77 BETWEEN PIC X.
000161 77 DOUBLE PIC X.
000162
000163******************************************************************
000164* PRED le caractère précédent
000165* MYNEW le caractère suivant
000166* DOUBLE-CHAR la paire à vérifier
000167* DOUBLE-CHAR-NEXT les paires suivantes
000168* DOUBLE est mit à Y lorsque 2 pairs sont trouvées
000169* BETWEEN est mit à Y lorsque 2 memes lettres en encadrent une
000170******************************************************************
000171
000172 LINKAGE SECTION.
000173 77 STR PIC A(17).
000174 77 NB PIC 9(4).
000175
000176 PROCEDURE DIVISION USING STR, NB.
000177 deuxieme-part.
000178 MOVE 'N' TO BETWEEN.
000179 MOVE 'N' TO DOUBLE.
000180 PERFORM VARYING I FROM 1 BY 1 UNTIL STR-LENGTH
000181 COMPUTE J = I + 1 END-COMPUTE
000182 MOVE STR(I:1) TO CHAR
000183 IF I > 1 AND I < (LENGTH OF STR - 1) THEN
000184 MOVE STR(J:1) TO MYNEW
000185 IF PRED = MYNEW THEN
000186 MOVE 'Y' TO BETWEEN
000187 END-IF
000188 END-IF
000189
000190 IF I < ((LENGTH OF STR) - 2) AND DOUBLE = 'N' THEN
000191 MOVE STR(I:2) TO DOUBLE-CHAR
000192 ADD 1 TO J END-ADD
000193 PERFORM VARYING K FROM J BY 1 UNTIL DOUBLE-STR-LENGTH
000194 MOVE STR(K:2) TO DOUBLE-CHAR-NEXT
000195 IF DOUBLE-CHAR = DOUBLE-CHAR-NEXT THEN
000196 MOVE 'Y' TO DOUBLE
000197 END-IF
000198 END-PERFORM
000199 END-IF
000200 MOVE CHAR TO PRED
000201 END-PERFORM.
000202
000203 IF BETWEEN = 'Y' AND DOUBLE = 'Y'
000204 THEN
000205 ADD 1 TO NB END-ADD
000206 END-IF.
000207 EXIT PROGRAM.
000208 END PROGRAM parse-deux.
000209
000210 END PROGRAM hub.
000211 END PROGRAM jour-cinq.