Listing du fichier s1p2.php
00001 <?php
00002 # (gH) -_- s1p2.php ; TimeStamp (unix) : 10 Novembre 2012 vers 20:24
00003
00004 error_reporting(E_ALL | E_NOTICE | E_STRICT) ;
00005 include("std.php") ;
00006 include("../xmlstd.php") ;
00007 include("scripts_inc.php") ;
00008
00009 $numSerie = 2 ;
00010 debutPageExoScr1($numSerie) ;
00011
00012 ## -------------------------------------------------------------------------------------------
00013
00014 sdl(3) ; echo cmt(' pour afficher toutes les solutions : wedrd01.php?solutions=1') ; sdl(3) ;
00015
00016 ## -------------------------------------------------------------------------------------------
00017
00018 debutSection() ;
00019
00020 $tableauDesRubriques = array() ;
00021 $idr = 0 ;
00022 $idr++; $tableauDesRubriques[$idr] = "AWK : compter les lignes d'un seul fichier" ;
00023 $idr++; $tableauDesRubriques[$idr] = "AWK : compter les fichiers par extension" ;
00024 $idr++; $tableauDesRubriques[$idr] = "AWK : créer les fichiers dictionnaires d'un texte" ;
00025 $idr++; $tableauDesRubriques[$idr] = "REXX : commandes en session interactive" ;
00026 $idr++; $tableauDesRubriques[$idr] = "REXX : implémenter range un peu comme en python" ;
00027 $idr++; $tableauDesRubriques[$idr] = "REXX : exécuter le même programme AWK sur un ensemble de fichiers" ;
00028 $idr++; $tableauDesRubriques[$idr] = "REXX : archivage incrémental de fichiers XML " ;
00029 $idr++; $tableauDesRubriques[$idr] = "REXX : que font ces programmes ? " ;
00030 $idr++; $tableauDesRubriques[$idr] = "REXX : fichiers dictionnaires d'un texte" ;
00031 $tdmCRLM = new tdm($tableauDesRubriques) ;
00032 $tdmCRLM->titre() ;
00033 $tdmCRLM->menu("oui","oui","nou") ;
00034
00035 pvide() ;
00036
00037 p("texte") ;
00038 echo "Il est possible d'afficher toutes les solutions via ".href("s1p$numSerie.php?solutions=1","?solutions=1","bouton_fin jaune_pastel nou").". " ;
00039 finp() ;
00040
00041 finSection() ;
00042
00043 debutSection() ;
00044 $numExo = 0 ;
00045
00046 ## -------------------------------------------------------------------------------------------
00047
00048 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # AWK : compter les lignes des fichiers
00049
00050 ## -------------------------------------------------------------------------------------------
00051
00052 blockquote() ;
00053
00054 p("texte") ;
00055 echo "La commande wc d'Unix, avec l'option -l permet de connaitre le nombre de lignes d'un ou plusieurs fichiers, comme " ;
00056 echo " le montre la commande suivante :" ;
00057 finp() ;
00058
00059 pre_fichier("wc_demo.txt","cadre") ;
00060
00061 p("texte") ;
00062 echo "On voudrait la compléter pour indiquer le nombre de mots moyen par ligne, avec le nombre minimal et maximal de mots." ;
00063 echo " Ainsi, on disposera d'un moyen pour tester si toutes les lignes ont le même nombre de mots. Implémenter un programme AWK " ;
00064 echo " qui calcule ces valeurs en plus du nombre de lignes. On devra l'exécuter par la commande " ;
00065 echo b(" gawk -f nblv1.awk fichier")." mais pour un seul fichier de données. Quel est le défaut de cet appel de programme ? Comment avoir un \"help\" de ce programme ? " ;
00066 echo " On rappelle que pour AWK la variable FNR correspond au numéro de ligne courant dans le fichier, " ;
00067 echo " NF au nombre de mots de la ligne courante et FILENAME au nom du fichier. " ;
00068 echo " Que se passe-t-il si au lieu d'un seul fichier on utilise une notation ambigue ? " ;
00069 echo " Voici un exemple de ce qu'on voudrait obtenir (les espaces et le formatage font partie de l'affichage, voir exercice 6) :" ;
00070 finp() ;
00071
00072 pre_fichier("nbl_awk.txt","cadre") ;
00073
00074 p("texte") ;
00075 echo "On pourra se contenter dans un premier temps de ne calculer que le nombre moyen de mots, affiché avec deux décimales." ;
00076 finp() ;
00077
00078 solution($numExo) ;
00079
00080 p("texte") ;
00081 echo "Puisque ce programme AWK ne doit s'appliquer qu'à un seul fichier, le programme est très simple à écrire :" ;
00082 echo " on initialise les variables quand on lit la ligne 1, on cumule les NF et on met à jour éventuellement les min et max de NC pour les autres lignes et enfin " ;
00083 echo " on affiche après avoir lu la dernière ligne du fichier. On peut utiliser NFR en fin de programme comme nombre de lignes lues pour " ;
00084 echo " calculer la moyenne des NC. Voici un exemple de programme minimal possible nommé ".href("nblv0.awk")." :" ;
00085 finp() ;
00086
00087 pre_fichier("nblv0.awk","cadrejaune") ;
00088 pre_fichier("nblv0_res.txt","cadre") ;
00089
00090 p("texte") ;
00091 echo "Sur ce principe, et en remettant END \"à sa place\" on peut compléter avec le nombre minimal et maximal de mots par ligne" ;
00092 echo " soit le fichier ".href("nblv1.awk")." :" ;
00093 finp() ;
00094
00095 pre_fichier("nblv1.awk","cadrejaune") ;
00096
00097 p("texte") ;
00098 echo "Le défaut de ce programme est de ne pas gérer plusieurs fichiers à la fois. Si on l'applique à un ensemble de fichiers, il fournira un résultat " ;
00099 echo " erroné et n'affichera que des informations -- correctes, mais incomplètes -- pour le dernier fichier. Pour l'appliquer en boucle sur chacun des fichiers passés en " ;
00100 echo " paramètre, voir l'exercice numéro 6. " ;
00101 finp() ;
00102
00103
00104 p("texte") ;
00105 echo "Il n'est pas possible d'avoir de \"help\" sauf à \"bricoler\". Par exemple en admettant que le fichier HELP_nbl.awk_AIDE sert à reconnaitre " ;
00106 echo " qu'on veut connaitre l'aide, on pourrait écrire quelque chose comme le " ;
00107 echo " le fichier ".href("nblv1aide.awk")." :" ;
00108 finp() ;
00109
00110 pre_fichier("nblv1aide.awk","cadrejaune") ;
00111
00112 p("texte") ;
00113 echo "Encore faudra-t-il savoir qu'il faut appeler le programme sur ce fichier via " ;
00114 echo b("gawk -f nblv1aide.awk HELP_nbl.awk_AIDE").". " ;
00115 finp() ;
00116
00117 p("texte") ;
00118 echo "En fait, très souvent on n'appelle pas un programme AWK directement. On utilise un script du système " ;
00119 echo " qui teste les paramètres et affiche l'aide si aucun paramètre n'est fourni et qui sinon exécute le programme avec le \"bon\" " ;
00120 echo " chemin d'accès (voir l'exercice 6). " ;
00121 finp() ;
00122
00123 finsolution() ;
00124
00125 finblockquote() ;
00126
00127 ## -------------------------------------------------------------------------------------------
00128
00129 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # AWK : compter les fichiers par extension
00130
00131 ## -------------------------------------------------------------------------------------------
00132
00133 blockquote() ;
00134
00135 p("texte") ;
00136 echo "On aimerait connaitre le nombre de fichiers par extension, avec la taille qu'ils occupent. Ecrire un programme Awk " ;
00137 echo " pour réaliser cela. " ;
00138 echo " Voici un exemple de ce qu'on voudrait obtenir pour notre répertoire courant (affichage trié) :" ;
00139 finp() ;
00140
00141 pre_fichier("statdir_res.txt","cadre") ;
00142
00143 solution($numExo) ;
00144
00145 p("texte") ;
00146 echo "Consulter le fichier ".href("statdir.awk")." pour une version proche de la solution, et qui s'utilise par exemple par ".b("ls -al | gawk -f statdir.awk")." :" ;
00147 finp() ;
00148
00149 pre_fichier("statdir.awk","cadrejaune") ;
00150
00151
00152 p("texte") ;
00153 echo "Il reste juste à trier l'affichage, ce que nous laissons à la perspicacité des lecteurs et lectrices." ;
00154
00155 finp() ;
00156
00157 finsolution() ;
00158
00159 finblockquote() ;
00160
00161 ## -------------------------------------------------------------------------------------------
00162
00163 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # AWK : créer les fichiers dictionnaires d'un texte
00164
00165 ## -------------------------------------------------------------------------------------------
00166
00167 blockquote() ;
00168
00169 p("texte") ;
00170 echo "On aimerait construirer les dictionnaires alphabétiques et fréquentiels du fichier ".href("texte.txt") ;
00171 echo " dont le contenu est :" ;
00172 finp() ;
00173
00174 pre_fichier("texte.txt","cadre") ;
00175
00176 p("texte") ;
00177 echo " Voici ce qu'on voudrait obtenir comme dictionnaire alphabétique, soit le fichier ".b("dico.tpm")." :" ;
00178 finp() ;
00179
00180 pre_fichier("dico_tpm.txt","cadre") ;
00181
00182 p("texte") ;
00183 echo " Et voici ce qu'on voudrait obtenir comme dictionnaire fréquentiel, soit le fichier ".b("dico.tpo").". " ;
00184 echo " Il faut donc trier ici par fréquence décroissante puis par ordre alphabétique croissant en cas " ;
00185 echo " d'".em("exaequo")." :" ;
00186 finp() ;
00187
00188 pre_fichier("dico_tpo.txt","cadre") ;
00189
00190 solution($numExo) ;
00191
00192 p("texte") ;
00193 echo "Consulter le fichier ".href("dico.awk")." pour une version proche de la solution :" ;
00194 finp() ;
00195
00196 pre_fichier("dico.awk","cadrejaune") ;
00197
00198 finsolution() ;
00199
00200 finblockquote() ;
00201
00202 ## -------------------------------------------------------------------------------------------
00203
00204 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # REXX : commandes en session interactive
00205
00206 ## -------------------------------------------------------------------------------------------
00207
00208 blockquote() ;
00209
00210 blockquote() ;
00211
00212 p("texte") ;
00213 echo "En mode interactif, avec ".href("rt.rex")." donner la ou les instructions qui répondent aux questions suivantes :" ;
00214 finp() ;
00215
00216 ul() ;
00217
00218 debutli() ; p() ;
00219 echo "quelle est la valeur de 16 puissance 4 ? et le reste entier de la division de 2012 par 128 ? " ;
00220 finp() ; finli() ;
00221
00222 debutli() ; p() ;
00223 echo " quel est le code hexadécimal de A ? et le code décimal de 'xFFF' ? et le code ascii de 'a' ? et le caractère de numéro décimal 98 ?" ;
00224 finp() ; finli() ;
00225
00226 debutli() ; p() ;
00227 echo " si la variable ".b("cmd")." contient ".b("\"prog --fmt tex --nbdec 4 --fichier demo.rex\"")." comment récupérer la valeur de l'option ".b("--fmt") ;
00228 echo " c'est-à-dire ".b("tex")." ? " ;
00229 finp() ; finli() ;
00230
00231 debutli() ; p() ;
00232 echo " si ".b("phr")." contient ".b("\"A2837 12 18 37 25\"")." comment transférer dans la variable numData toutes les valeurs après le premier mot (soit ici A2837) ? " ;
00233 finp() ; finli() ;
00234
00235 debutli() ; p() ;
00236 echo " combien vaut factorielle 8 ?" ;
00237 finp() ; finli() ;
00238
00239 debutli() ; p() ;
00240 echo " comment afficher ou mettre dans une variable la date et l'heure ?" ;
00241 finp() ; finli() ;
00242
00243 debutli() ; p() ;
00244 echo " comment calculer la moyenne des valeurs contenues dans la chaine de caractères \"12 5 20 8 15\" ?" ;
00245 finp() ; finli() ;
00246
00247 debutli() ; p() ;
00248 echo " comment souligner avec des tirets la chaine de caractères ".b("\"ceci est mon titre\"")." ?" ;
00249 finp() ; finli() ;
00250
00251 finul() ;
00252
00253 finblockquote() ;
00254
00255 solution($numExo) ;
00256
00257 p("texte") ;
00258 echo "Voici un exemple de solution en session interactive :" ;
00259 finp() ;
00260
00261 pre_fichier("rt_sol.txt","cadrebleu") ;
00262
00263 finsolution() ;
00264
00265 finblockquote() ;
00266
00267 ## -------------------------------------------------------------------------------------------
00268
00269 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # REXX : implémenter range comme en python
00270
00271 ## -------------------------------------------------------------------------------------------
00272
00273 blockquote() ;
00274
00275 blockquote() ;
00276
00277 p("texte") ;
00278 echo "Implémenter une fonction ".b("range()")." en REXX un peu comme Python, mais en commençant à l'indice 1. " ;
00279 echo " On viendra compléter le fichier ".href("range.rex")." suivant qui indique ce qu'on veut obtenir :" ;
00280 finp() ;
00281
00282 pre_fichier("range.rex","cadrebleu") ;
00283
00284 finblockquote() ;
00285
00286 solution($numExo) ;
00287
00288 p("texte") ;
00289 echo "Dans la mesure où REXX dispose d'une boucle ".b("do / = / to / by / end")." le problème est juste de bien " ;
00290 echo " gérer les paramètres, ici séparés par des virgules, d'où le fichier solution " ;
00291 echo href("range_sol.rex")." :" ;
00292 finp() ;
00293
00294 pre_fichier("range_sol.rex","cadrebleu") ;
00295 pre_fichier("range_sol.txt","cadre") ;
00296
00297 p("texte") ;
00298 echo "Pour ceux et celles qui préfèrent une séparation des paramètres par des espaces, " ;
00299 echo " consulter ".href("range_sol1.rex").". " ;
00300 finp() ;
00301
00302 finsolution() ;
00303
00304 finblockquote() ;
00305
00306 ## -------------------------------------------------------------------------------------------
00307
00308 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # REXX et AWK : exécuter le même programme AWK sur un ensemble de fichiers
00309
00310 ## -------------------------------------------------------------------------------------------
00311
00312 blockquote() ;
00313
00314 blockquote() ;
00315
00316 p("texte") ;
00317 echo "Reprendre l'exercice 1. On utilisera REXX pour afficher un \"help\" si on ne fournit aucun paramètre ; " ;
00318 echo " sinon, on exécutera la commande ".b("gawk -f nblv2.awk")." sur chacun des fichiers passés en paramètre " ;
00319 echo " (notation ambigue avec * et ? possible). " ;
00320 finp() ;
00321
00322 finblockquote() ;
00323
00324 solution($numExo) ;
00325
00326 p() ;
00327 echo "Là encore, il s'agit juste de bien gérer les paramètres. On remarquera dans la solution la composition \"à la volée\" de la " ;
00328 echo " commande à exécuter." ;
00329 finp() ;
00330
00331 pre_fichier("nbl.rex","cadrebleu") ;
00332 pre_fichier("nblv2.awk","cadrejaune") ;
00333 pre_fichier("nbl_rex.txt","cadre") ;
00334
00335 finsolution() ;
00336
00337 finblockquote() ;
00338
00339 ## -------------------------------------------------------------------------------------------
00340
00341 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # REXX : archivage incrémental de fichiers XML
00342
00343 ## -------------------------------------------------------------------------------------------
00344
00345 blockquote() ;
00346
00347 blockquote() ;
00348
00349 p("texte") ;
00350 echo "On voudrait qu'à l'exécution du script ".s_span("archcd.rex","gbleuf")." il y ait une production automatique de l'archive " ;
00351 echo " pour tous les fichiers de type xml avec numérotation de l'archive. " ;
00352 echo " Par exemple la première fois que le script est exécuté, on produira l'archive ".b("lesxml001.tar")." ; " ;
00353 echo " la seconde fois, ce sera ".b("lesxml002.tar")." etc. " ;
00354 echo " L'algorithme de base ressemble certainement à " ;
00355 finp() ;
00356
00357 pre_fichier("archivage_alg.txt","cadrebleu") ;
00358
00359 p("texte") ;
00360 echo "On pourra utiliser " ;
00361 echo href("REXXUT.rex","REXXUT") ;
00362 echo " et " ;
00363 echo href("FILEUT.rex","FILEUT") ;
00364 echo "." ;
00365 finp() ;
00366
00367 finblockquote() ;
00368
00369 solution($numExo) ;
00370
00371 p() ;
00372 echo "Consulter le fichier ".href("archcd.rex")." :" ;
00373 finp() ;
00374
00375 pre_fichier("archcd.rex","cadrejaune") ;
00376
00377 p() ;
00378 echo "Exemple d'utilisation :" ;
00379 finp() ;
00380
00381 pre_fichier("archcd_rex.txt","cadre") ;
00382
00383 finsolution() ;
00384
00385 finblockquote() ;
00386
00387
00388 ## -------------------------------------------------------------------------------------------
00389
00390 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # REXX : que font ces programmes ?
00391
00392 ## -------------------------------------------------------------------------------------------
00393
00394 blockquote() ;
00395
00396 blockquote() ;
00397
00398 p("texte") ;
00399 echo "Que fait le programme REXX nommé ".href("catv.rex")." ? " ;
00400 echo "Et les macros pour éditeur ".href("av.sedit").", ".href("ts.sedit")." et ".href("exec.sedit")." ?" ;
00401 finp() ;
00402
00403 finblockquote() ;
00404
00405 solution($numExo) ;
00406
00407 # mettre des versions avec numéros de lignes pour les explications
00408
00409 p("texte") ;
00410 echo "Après lecture du fichier-programme REXX nommé ".href("catv.rex")." dont nous avons numéroté les lignes, " ;
00411 finp() ;
00412
00413 pre_fichier("catv_rex.txt","cadrejaune") ;
00414
00415 p("texte") ;
00416 echo " on peut comprendre que ce programme REXX lit deux fichiers dont les noms sont passés en paramètre " ;
00417 echo " (lignes 23 et 24) " ;
00418 echo " et qu'il met met bout à bout soit une concaténation verticale " ;
00419 echo " (lignes 34 à 40 ) " ;
00420 echo " les lignes des deux fichiers. " ;
00421 echo " Par exemple, avec les deux fichiers " ;
00422 $f1 = "gauche.txt" ;
00423 $f2 = "droite.txt" ;
00424 $f3 = "gd2.txt" ;
00425 echo href("$f1") ;
00426 echo " et " ;
00427 echo href("$f2") ;
00428 echo " la commande ".b("catv $f1 $f2 3 35")." produit le fichier " ;
00429 echo href("$f3").". " ;
00430 echo " Si on ne passe pas de paramètre de taille de ligne après les noms de fichier et si le fichier de gauche n'a pas des lignes de " ;
00431 echo " même longueur, le résultat est \"cahotique\" comme pour le fichier ".href("gd1.txt").". " ;
00432 echo " On remarquera l'initialisation des ".b("stem")." (tableaux) ligne 19 qui permet de ne pas se préoccuper de lignes inexistantes... " ;
00433 finp() ;
00434
00435 pre_fichier("$f1","cadrejaune") ;
00436 pre_fichier("$f2","cadrejaune") ;
00437 pre_fichier("$f3","cadrebleu") ;
00438
00439
00440 p("texte") ;
00441 echo "L'étudiant Hossam Eddine BENHOUD a réussi à trouver une commande Unix à peu près équivalente. " ;
00442 echo "Il suffit d'écrire ".b("pr -m -t fichier1 fichier2").". Bravo Hossam Edine !" ;
00443 finp() ;
00444
00445 p("texte") ;
00446 echo "La macro-programme REXX pour éditeur nommée ".href("av.sedit") ;
00447 finp() ;
00448
00449 pre_fichier("av_sedit.txt","cadrejaune") ;
00450
00451 p("texte") ;
00452 echo "vient sauvegarder dans le répertoire ~/Tmp une copie du fichier en cours d'édition avec le même nom et de même " ;
00453 echo " extension mais avec insertion d'un numéro entier sur 4 positions autoincrémenté. Ainsi pour le fichier ".b("s1p2.php") ;
00454 echo " l'exécution de la macro, en ligne de commande-éditeur ou avec une touche comme F2 vient sauvegarder le fichier actuel comme " ;
00455 echo b("s1p2.0001.php")." ; la seconde exécution produit ".b("s1p2.0002.php")." etc." ;
00456 echo " La fonction ".b("state")." à la ligne 19 et à la ligne 26 renvoie 0 si le fichier n'existe pas, un entier positif sinon." ;
00457 finp() ;
00458
00459 p("texte") ;
00460 echo "La macro-programme REXX pour éditeur nommée ".href("ts.sedit") ;
00461 finp() ;
00462
00463 pre_fichier("ts_sedit.txt","cadrejaune") ;
00464
00465 p("texte") ;
00466 echo "ajoute en haut de fichier une ligne qui donne la date et l'heure. Si la ligne existe déjà, elle est mise à jour. " ;
00467 echo " La ligne est insérée comme un commentaire s'il s'agit d'un fichier-programme, avec le format de commenatire " ;
00468 echo " lié au langage. Par exemple, appliquée au fichier ".b("s1p2.php") ;
00469 echo " il y a insertion de quelque chose comme" ;
00470 finp() ;
00471
00472 pre_fichier("ts_demo1.txt","cadre") ;
00473
00474 p("texte") ;
00475 echo "Pour un fichier REXX comme par exemple ".b("s1p2.rex").", le commentaire sera :" ;
00476 finp() ;
00477
00478 pre_fichier("ts_demo2.txt","cadre") ;
00479
00480 p("texte") ;
00481 echo "La correction pour ".b("exec.sedit")." n'est volontairement pas fournie." ;
00482 finp() ;
00483
00484 finsolution() ;
00485
00486 finblockquote() ;
00487
00488 ## -------------------------------------------------------------------------------------------
00489
00490 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # REXX : créer les fichiers dictionnaires d'un texte
00491
00492 ## -------------------------------------------------------------------------------------------
00493
00494 blockquote() ;
00495
00496 blockquote() ;
00497
00498 p("texte") ;
00499 echo "Essayer de réaliser l'exercice 3 proposé pour AWK (création des dictionnaires) en REXX. " ;
00500 finp() ;
00501
00502 finblockquote() ;
00503
00504 solution($numExo) ;
00505
00506 p("texte") ;
00507 echo "Consulter ".href("dico.rex")." sachant qu'on utilise les bibliothèques de fonctions (gH) nommées " ;
00508 echo " ".href("FILEUT.rex")." et " ;
00509 echo " ".href("REXXUT.rex").". " ;
00510 finp() ;
00511
00512 pre_fichier("dico.rex","cadre") ;
00513
00514 pre_fichier("FILEUT.rex","cadrebleu") ;
00515 pre_fichier("REXXUT.rex","cadrejaune") ;
00516
00517
00518 finsolution() ;
00519
00520 finblockquote() ;
00521
00522
00523 ## -------------------------------------------------------------------------------------------
00524
00525 finPageExercices($numSerie) ; # contient finSection() et finPage() ; la fonction est dans webrd_inc.php
00526
00527 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)