diff --git a/jour05/jour5.cob b/jour05/jour5.cob index c9da89e..605c671 100644 --- a/jour05/jour5.cob +++ b/jour05/jour5.cob @@ -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 - * Lorsqu’on 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* Lorsqu’on 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.