Listing du fichier progie3.php
00001 <?php
00002 # # (gH) -_- progie3.php ; TimeStamp (unix) : 16 Février 2015 vers 21:25
00003
00004 error_reporting(E_ALL | E_NOTICE | E_STRICT) ;
00005
00006 include_once("std7.php") ;
00007 include_once("progi.php") ;
00008 include_once("statuno7.php") ;
00009
00010 $R = s_span("R","gbleuf") ;
00011 $numSerie = 3 ;
00012 debutPageExercices($numSerie) ;
00013
00014 # le dernier élément de v
00015 # les trois derniers
00016
00017 ## -------------------------------------------------------------------------------------------
00018
00019 p("texte") ;
00020 echo "" ;
00021 finp() ;
00022 debutSection() ;
00023
00024 $tableauDesRubriques = array() ;
00025 $idr = 0 ;
00026
00027 $idr++; $tableauDesRubriques[$idr] = "Comparaison de valeurs (1)" ;
00028 $idr++; $tableauDesRubriques[$idr] = "Comparaison de valeurs (2)" ;
00029 $idr++; $tableauDesRubriques[$idr] = "Filtrage vectoriel" ;
00030 $idr++; $tableauDesRubriques[$idr] = "Vérification de valeurs dans un fichier Excel" ;
00031 $idr++; $tableauDesRubriques[$idr] = "Remplacements dans un vecteur" ;
00032 $idr++; $tableauDesRubriques[$idr] = "Utiliser AND ou imbriquer ?" ;
00033 $idr++; $tableauDesRubriques[$idr] = "Fonctions à résultats logiques de $R" ;
00034
00035 $tdmCRLM = new tdm($tableauDesRubriques) ;
00036 $tdmCRLM->titre() ;
00037 $tdmCRLM->menu("oui","oui","nou") ;
00038
00039 afficherSolutions($numSerie) ;
00040
00041 finSection() ;
00042
00043 debutSection() ;
00044 $numExo = 0 ;
00045
00046 ## -------------------------------------------------------------------------------------------
00047
00048 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Comparaison de valeurs (1)
00049
00050 ## -------------------------------------------------------------------------------------------
00051
00052 blockquote() ;
00053
00054 blockquote() ;
00055
00056 p("texte") ;
00057 echo "On dispose de deux variables nommées ".b("valA")." et ".b("valB").". " ;
00058 echo " Sans utiliser les fonctions de $R, écrire des instructions qui mettent dans la variable " ;
00059 echo b("petit")." la plus petite variable (la variable de plus petit contenu) et dans " ;
00060 echo b("grand")." la plus grande variable. " ;
00061 echo " Donner ensuite la \"bonne\" solution avec les fonctions de $R. " ;
00062 finp() ;
00063
00064 finblockquote() ;
00065
00066 solution($numExo,$numSerie) ;
00067
00068 p("texte") ;
00069 echo "Un seul test logique suffit ici :" ;
00070 finp() ;
00071
00072 pre_fichier("s3e1.txt","cadre") ;
00073
00074 finsolution() ;
00075
00076 finblockquote() ;
00077
00078 ## -------------------------------------------------------------------------------------------
00079
00080 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Comparaison de valeurs (2)
00081
00082 ## -------------------------------------------------------------------------------------------
00083
00084 blockquote() ;
00085
00086 blockquote() ;
00087
00088 p("texte") ;
00089 echo "On dispose de trois variables nommées ".b("valA").", ".b("valB")." et ".b("valC").". " ;
00090 echo " Sans utiliser les fonctions de $R, écrire des instructions qui mettent dans la variable " ;
00091 echo b("tpetit")." la plus petite variable, dans " ;
00092 echo b("milieu")." la variable intermédiaire et dans " ;
00093 echo b("tgrand")." la plus grande variable. " ;
00094 echo " Donner ensuite la \"bonne\" solution avec les fonctions de $R. " ;
00095 finp() ;
00096
00097 p("texte") ;
00098 echo "Et si on avait plus de trois valeurs à trier ?" ;
00099 finp() ;
00100
00101 p("texte") ;
00102 echo b("Remarque :") ;
00103 echo " on supposera les valeurs distinctes. " ;
00104 finp() ;
00105
00106 finblockquote() ;
00107
00108 solution($numExo,$numSerie) ;
00109
00110 p("texte") ;
00111 echo "Ici, les choses se compliquent car il y a 6 cas à envisager..." ;
00112 finp() ;
00113
00114 pre_fichier("s3e2.txt","cadre") ;
00115
00116
00117 p("texte") ;
00118 echo "La dernière solution, qui met tous les éléments dans un vecteur et utilise " ;
00119 echo lafonction("sort")." pour trier les éléments est la plus générale et couvre aussi le cas " ;
00120 echo " de variables égales. Ouf, pas besoin de faire 3, 4, 5... structures SI emboitées !" ;
00121 finp() ;
00122
00123 p("texte") ;
00124 echo "On notera que pour vérifier ces algorithmes on ne peut pas se contenter de vérifier que cela " ;
00125 echo " \"marche\" sur un exemple. Il faut bien tester les 6 cas avant d'être sûr de la " ;
00126 echo " validité de l'algorithme (ou du programme). Ainsi l'instruction \"tentante\" " ;
00127 finp() ;
00128
00129 pre_fichier("s3e2plus.txt","cadre") ;
00130
00131 p("texte") ;
00132 echo " met bien \"ce qu'il faut\" dans ".b("milieu")." dans 4 cas sur 6. Si on ne vérifie pas tout, ce qui est " ;
00133 echo rouge("fastidieux")." car il faut être ".vert("exhaustif").", on risque de s'en rendre compte après " ;
00134 echo " avoir exécuté le programme plusieurs fois et avoir utilisé de faux résultats." ;
00135 finp() ;
00136
00137 p("texte") ;
00138 echo "Pour les plus courageux et les plus courageuses, on pourra essayer de refaire cet exercice " ;
00139 echo " si on ajoute un ou plusieurs ".b("NA")." dans le vecteur..." ;
00140 finp() ;
00141
00142 finsolution() ;
00143
00144 finblockquote() ;
00145
00146 ## -------------------------------------------------------------------------------------------
00147
00148 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Filtrage vectoriel
00149
00150 ## -------------------------------------------------------------------------------------------
00151
00152 blockquote() ;
00153
00154 blockquote() ;
00155
00156 p("texte") ;
00157 echo "Soit ".b("v")." le vecteur défini par " ;
00158 finp() ;
00159
00160 pre("cadre demiLargeur") ;
00161 echo " v <- c( 1, 8, 2, -5, 15, 6, 9, -1, 4) " ;
00162 finpre() ;
00163
00164 p("texte") ;
00165 echo "Donner les expressions $R qui fournissent :" ;
00166 finp() ;
00167
00168 ul() ;
00169
00170 debutli() ; p() ;
00171 echo "le dernier élément de ".b("v")." ;" ;
00172 finp() ; finli() ;
00173
00174 debutli() ; p() ;
00175 echo "les trois derniers éléments de ".b("v")." ;" ;
00176 finp() ; finli() ;
00177
00178 debutli() ; p() ;
00179 echo "les éléments de ".b("v")." de rang pair." ;
00180 finp() ; finli() ;
00181
00182 finul() ;
00183
00184 finblockquote() ;
00185
00186 solution($numExo,$numSerie) ;
00187
00188 p("texte") ;
00189 echo "Puisque ".b("length(v)")." est à la fois la longueur et l'indice du dernier élément de v, " ;
00190 echo b("v[ length(v) ]")." est le dernier élément de v." ;
00191 finp() ;
00192
00193 p("texte") ;
00194 echo "Pour les trois derniers éléments de ".b("v").", deux solutions au moins sont faciles à trouver :" ;
00195 finp() ;
00196
00197 pre_fichier("s3e3.txt","cadre") ;
00198
00199 p("texte") ;
00200 echo "Dans la mesure où $R dispose de l'opérateur ".noir("%%")." qui renvoie le ".em("modulo").", c'est-à-dire le reste de la \n" ;
00201 echo "division entière, les éléments de ".b("v")." de rang pair sont ".em("a priori")." donnés par l'expression \n" ;
00202 finp() ;
00203
00204 pre_fichier("rangpair1.txt","cadre") ;
00205
00206 p("texte") ;
00207 echo "car \"pair\" équivaut à \"dont le reste de la division par 2 est zéro\". \n" ;
00208 echo "Toutefois cette expression est peu lisible et certainement peu compréhensible, sauf à bien connaitre la priorité entre opérateurs. \n" ;
00209 echo "Ajouter des parenthèses ne simplifie en rien l'expression : \n" ;
00210 finp() ;
00211
00212 pre_fichier("rangpair2.txt","cadre") ;
00213
00214 p("texte") ;
00215 echo "Il est au final beaucoup plus lisible d'écrire cela en plusieurs affectations :" ;
00216 finp() ;
00217
00218 pre_fichier("rangpair3.txt","cadre") ;
00219
00220
00221 p("texte") ;
00222 echo "Attention à la notation ".b("1:length(v)")." car elle réserve des suprises si le vecteur est de longueur nulle. " ;
00223 echo " On lui préfère en général la fonction ".b("seq_along()")." :" ;
00224 finp() ;
00225
00226 pre_fichier("seqalong.txt","cadre") ;
00227
00228 finsolution() ;
00229
00230 finblockquote() ;
00231
00232 ## -------------------------------------------------------------------------------------------
00233
00234 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Vérification de valeurs dans un fichier Excel
00235
00236 ## -------------------------------------------------------------------------------------------
00237
00238 blockquote() ;
00239
00240 blockquote() ;
00241
00242 p("texte") ;
00243 echo "On veut lire le fichier Excel nommé ".href("elfNA.xls") ;
00244 echo " et savoir combien de cases sont non vides pour la colonne AGE. " ;
00245 echo " Comment réaliser cela avec $R ?" ;
00246 finp() ;
00247
00248 finblockquote() ;
00249
00250 solution($numExo,$numSerie) ;
00251
00252 p("texte") ;
00253 echo "Une case vide correspond à la valeur NA. Il suffit donc d'écrire :" ;
00254 finp() ;
00255
00256 pre_fichier("s3e4.txt","cadre") ;
00257
00258 p("texte") ;
00259 echo "On remarquera que la deuxième solution n'utilise pas de test logique en apparence. " ;
00260 finp() ;
00261
00262 finsolution() ;
00263
00264 finblockquote() ;
00265
00266 ## -------------------------------------------------------------------------------------------
00267
00268 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Remplacements dans un vecteur
00269
00270 ## -------------------------------------------------------------------------------------------
00271
00272 blockquote() ;
00273
00274 blockquote() ;
00275
00276 p("texte") ;
00277 echo "On voudrait convertir les cases non vides de la colonne AGE et remplacer par \"jeune\" " ;
00278 echo " tout AGE<20 et par \"vieux\" sinon. Quel code $R faut-il écrire ?" ;
00279 finp() ;
00280
00281 p("texte") ;
00282 echo "Reprendre ensuite avec \"jeune\" " ;
00283 echo " pour AGE<20, \"adulte\" pour AGE entre 20 et 60 (bornes incluses) et \"vieux\" pour AGE>60." ;
00284 finp() ;
00285
00286 p("texte") ;
00287 echo "On pourra simuler 50 nombres entiers entre 1 et 99 pour AGE à l'aide de l'expression :" ;
00288 finp() ;
00289
00290 pre_fichier("simulage.r","cadre") ;
00291
00292 finblockquote() ;
00293
00294 solution($numExo,$numSerie) ;
00295
00296 p("texte") ;
00297 echo "$R est riche en fonctions. Si une solution avec ".hrrr("ifelse")." convient pour deux valeurs, " ;
00298 echo " il faut avoir recours à ".hrrr("cut")." pour plus de deux modalités, sachant que le remplacement " ;
00299 echo " par filtre vectoriel est sans doute plus simple à lire :" ;
00300 finp() ;
00301
00302 pre_fichier("s3e6.txt","cadre") ;
00303
00304 p("texte") ;
00305 echo rouge("Remarques ").": " ;
00306 echo "lorsque la fonction ".hrrr("ifelse")." rencontre ".b("NA").", elle renvoie ".b("NA").". " ;
00307 echo " Si on ne fournit pas de ".b("labels")." à la fonction ".hrrr("cut").", elle utilise les bornes de classes " ;
00308 echo " comme labels où les parenthèses signifient ".b("borne non comprise") ;
00309 echo " alors que les crochets signifient ".b("borne comprise")." comme dans :" ;
00310 finp() ;
00311
00312 pre_fichier("s3e7.txt","cadre") ;
00313
00314 finsolution() ;
00315
00316 finblockquote() ;
00317
00318 ## -------------------------------------------------------------------------------------------
00319
00320 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Utiliser AND ou imbriquer ?
00321
00322 ## -------------------------------------------------------------------------------------------
00323
00324 blockquote() ;
00325
00326 blockquote() ;
00327
00328 p("texte") ;
00329 echo "En logique mathématique, on apprend que ".noir("a ET b")." est équivalent à \n" ;
00330 echo noir("b ET a")." . Est-ce que pour $R les codes ".noir("a & b")." et \n" ;
00331 echo noir("b & a")." sont équivalents ? Comment le prouver ou au contraire \n" ;
00332 echo "l'infirmer, sachant que ".noir("a")." et ".noir("b")." sont des expressions $R ? \n" ;
00333 echo "Quelle est la différence entre ".noir("&")." et ".noir("&&")." en $R ? \n" ;
00334 echo " \n" ;
00335 finp() ;
00336
00337 finblockquote() ;
00338
00339 solution($numExo,$numSerie) ;
00340
00341 p("texte") ;
00342 echo " La logique mathématique et le traitement des expressions logiques en informatique sont très proches mais différents. " ;
00343 echo " Mathématiquement, pour évaluer ".noir("a ET b").", on évalue ".noir("a")." puis on évalue ".noir("b")." " ;
00344 echo " et enfin on effectue le ".noir("ET")." logique sur les deux résultats précédents d'évaluation." ;
00345 finp() ;
00346
00347 p("texte") ;
00348 echo "C'est exactement ce que fait $R quand il rencontre ".noir("a & b")."." ;
00349 echo " Par contre, l'évaluation du code ".noir("a && b")." se fait sur le mode ".em("coupe-circuit")." :" ;
00350 echo " si ".noir("a")." renvoie ".noir("FAUX").", ce n'est pas la peine d'évaluer ".noir("b")." parce que ".noir("FAUX")." et n'importe quoi " ;
00351 echo " renvoie toujours ".noir("FAUX").". Donc les expressions ".noir("a && b")." et ".noir("b && a")." ne sont pas strictement équivalentes " ;
00352 echo " alors que ".noir("a & b")." et ".noir("b & a")." sont \"assez\" équivalentes pour des expressions simples." ;
00353 finp() ;
00354
00355 p("texte") ;
00356 echo "Il faut donc plutot interpréter le code" ;
00357 finp() ;
00358
00359 pre_fichier("if1.txt","cadre") ;
00360
00361 p("texte") ;
00362 echo "comme le code suivant, avec une imbrication, où on voit bien qu'il n'y a pas symétrie d'utilisation " ;
00363 echo " entre ".noir("a")." et ".noir("b")." :" ;
00364 finp() ;
00365
00366 pre_fichier("if2.txt","cadre") ;
00367
00368 p("texte") ;
00369 echo "C'est pourquoi vous ne devez ".rouge("jamais")." utiliser ".noir("&&")." avec des vecteurs, comme le montre le code suivant, " ;
00370 echo " sous peine d'obtenir non pas un vecteur de résultats logiques calculés terme à terme mais juste une seule valeur " ;
00371 echo "logique :" ;
00372 finp() ;
00373
00374 pre_fichier("etet.txt","cadre") ;
00375
00376 p("texte") ;
00377 echo "Si maintenant ".noir("a")." et ".noir("b")." sont des appels de fonctions qui modifient des variables globales " ;
00378 echo " (il s'agit bien " ;
00379 echo "sûr ici d'une ".b("hérésie")." qui mérite le bûcher, mais cela risque peut-être un jour de vous arriver, donc " ;
00380 echo " autant le savoir pour mieux l'éviter), alors il y a encore " ;
00381 echo " moins équivalence entre ".noir("a & b")." et ".noir("b & a")." comme le montre le code suivant " ;
00382 echo " où ".noir("a")." correspond à l'appel de ".noir("f()") ;
00383 echo " et ".noir("b")." à celui de ".noir("g()")." :" ;
00384 finp() ;
00385
00386 pre_fichier("if3.r","cadre") ;
00387
00388 p("texte") ;
00389 echo "Voici le résultat de son exécution -- si vous ne le saviez pas, l'expression ".noir("<<-")." utilise l'environnement parent, donc ici " ;
00390 echo "".noir("x")." est une variable globale :" ;
00391 finp() ;
00392
00393 pre_fichier("if3.txt","cadre") ;
00394
00395 p("texte") ;
00396 echo " On voit clairement qu'avec ".noir("&")." les deux fonctions sont appelées alors qu'avec " ;
00397 echo "".noir("&&")." seule la première fonction est utilisée. De plus à chaque fois " ;
00398 echo " on n'obtient pas le même résultat suivant qu'on commence par ".noir("a")." ou par ".noir("b")."." ;
00399 finp() ;
00400
00401 finsolution() ;
00402
00403 finblockquote() ;
00404
00405 ## -------------------------------------------------------------------------------------------
00406
00407 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Fonctions à résultats logiques de $R
00408
00409 ## -------------------------------------------------------------------------------------------
00410
00411 blockquote() ;
00412
00413 blockquote() ;
00414
00415 p("texte") ;
00416 echo " Comment fait-on en $R pour tester si un mot est présent dans une liste de mots ou dans un vecteur " ;
00417 echo " de mots avec ".lafonction("grep")." ? Et avec l'opérateur ".noir("%in%")." ?" ;
00418 finp() ;
00419
00420 p("texte") ;
00421 echo " On veut savoir si au moins un des éléments du vecteur ".noir("V")." numérique ";
00422 echo " est positif. Trouver une solution basée sur ".noir("V>0")." et ".noir("sum").". Pourquoi " ;
00423 echo " ".lafonction("any")." est-elle plus adaptée ?" ;
00424 finp() ;
00425
00426 p("texte") ;
00427 echo " On veut être sûr que tous les éléments du vecteur ".noir("V")." numérique " ;
00428 echo " sont positifs. Trouver une solution basée sur ".noir("V>0").", ".noir("sum")." et ".noir("length(V)").". ";
00429 echo " Pourquoi ".lafonction("all")." est-elle plus adaptée ?" ;
00430 finp() ;
00431
00432 p("texte") ;
00433 echo " A quoi sert ".lafonction("all.equal")." ?" ;
00434 finp() ;
00435
00436 finblockquote() ;
00437
00438 solution($numExo,$numSerie) ;
00439
00440 p("texte") ;
00441 echo " La fonction ".hrrr("grep")." permet de connaitre la ou les positions d'un mot dans une liste ou dans un vecteur de mots " ;
00442 echo " comme on peut le voir avec le résultat d'exécution ci-dessous :" ;
00443 finp() ;
00444
00445 pre_fichier("grep1.txt","cadre") ;
00446
00447 p("texte") ;
00448 echo " Le premier résultat renvoyé est ".noir("1 4")." parce que \"le\" est trouvé comme premier et quatrième mot dans la liste ".noir("ldm").". " ;
00449 echo " Le deuxième résultat renvoyé montre que ".hrrr("grep")." sait aussi rechercher des sous-chaines : " ;
00450 echo " le vecteur résultat ".noir("2 5") ;
00451 echo " signifie que \"ch\" est trouvé dans les deuxième et cinquième mots du vecteur ".noir("ldm[[1]]").". " ;
00452 echo hrrr("grep")." sait utiliser les " ;
00453 echo href("../../../tuteurs/tutregexp.php","expressions régulières") ;
00454 echo " : le troisième résultat indique que les mots 2 et 3 " ;
00455 echo " finissent par \"t\", ce qui se décrit par l'expression régulière ".noir("t\$")."." ;
00456 finp() ;
00457
00458 p("texte") ;
00459 echo " Lorsque ".lafonction("grep")." ne trouve pas ce qu'on cherche, elle renvoie " ;
00460 echo b("integer(0)")." c'est-à-dire un vecteur de longueur 0. Il suffit donc " ;
00461 echo " d'écrire ".noir("if (length(grep(...)>0)")." pour savoir si la recherche a été fructueuse." ;
00462 finp() ;
00463
00464 p("texte") ;
00465 echo " Si on veut juste vérifier que le mot est exactement présent dans un vecteur, on peut utiliser " ;
00466 echo " l'opérateur ".hrrr("match","base","%in%")." :" ;
00467 finp() ;
00468
00469 pre_fichier("grep2.txt","cadre") ;
00470
00471 p("texte") ;
00472 echo " Dans les exercices de la séance 8, on montrera que ".noir("%in%")." est vraiment beaucoup plus rapide que ".hrrr("grep").". " ;
00473 finp() ;
00474
00475 p("texte") ;
00476 echo " Pour savoir si au moins un des éléments du vecteur ".noir("V")." numérique est positif, on peut se contenter, pour des " ;
00477 echo " vecteurs de petite longueur, de l'expression ".noir("if (sum(V>0)>0)").". " ;
00478 echo " En effet, ".noir("V>0")." renvoie un ensemble de valeurs logiques " ;
00479 echo " ".noir("TRUE")." et ".noir("FALSE")." remplacés automatiquement par ".noir("1")." et ".noir("0")." à cause de l'appel de ".noir("sum()").". " ;
00480 echo " S'il y a au moins un élément positif, il y a au moins un ".noir("TRUE")." donc au moins un 1, et la somme est forcément positive." ;
00481 finp() ;
00482
00483 p("texte") ;
00484 echo " Cette solution " ;
00485 echo " n'est pas optimisée parce qu'on teste ".b("tous")." les éléments de V. Avec un vecteur d'un million d'éléments tous négatifs sauf le " ;
00486 echo " premier, on effectue un million de tests. " ;
00487 echo " C'est pourquoi ".lafonction("any")." est plus adaptée et sans doute plus rapide : " ;
00488 echo " elle renvoie VRAI dès qu'elle trouve un " ;
00489 echo " élément correspondant (mais sans dire où ; c'est l'expression ".noir("which(V>0)")." qui en donne les positions)." ;
00490 echo " Dans les exercices de la séance 8, on calculera à quel point ".noir("any(v>0)")." est plus rapide que ".noir("sum(v>0)>0")."." ;
00491 finp() ;
00492
00493 p("texte") ;
00494 echo " De la même façon, tous les éléments de ".noir("V")." sont positifs si ".noir("sum(v>0)")." est égal à la longueur de ".noir("V").". " ;
00495 echo " On peut donc le tester via ".noir("if (sum(V>0)==length(V))")." pour des vecteurs de petite longueur ou prendre l'habitude d'utiliser dès le départ " ;
00496 echo " ".noir("if (all(V>0))")."." ;
00497 finp() ;
00498
00499 p("texte") ;
00500 echo " Comme son nom l'indique, ".lafonction("all.equal")." permet de tester si deux objets sont égaux. Si vous vous souvenez bien, " ;
00501 echo " au chapitre précédent, nous avions, dans le calcul des contributions relatives pour la comparaison d'effectifs observés et d'effectifs " ;
00502 echo " théoriques, " ;
00503 echo " deux variables numériquement égales, mais l'une était nommée pas l'autre. " ;
00504 echo " La fonction ".hrrr("all.equal")." est capable de l'indiquer :" ;
00505 finp() ;
00506
00507 pre_fichier("allequal1.txt","cadre") ;
00508
00509 p("texte") ;
00510 echo " De même qu'elle peut détecter des différences de longueur, de structure... :" ;
00511 finp() ;
00512
00513 pre_fichier("allequal2.txt","cadre") ;
00514
00515 p("texte") ;
00516 echo " Si vous pensez avoir construit deux variables complétement équivalentes, surtout s'il s'agit de structures, ".hrrr("all.equal")." " ;
00517 echo " peut vous le dire ou expliquer ce qu'elle trouve de différent... une fois qu'".hrrr("identical")." est passé par là, bien sûr." ,
00518 finp() ;
00519
00520
00521 p("texte") ;
00522 echo " Voici donc quelques autres détections obtenues grâce à ".hrrr("all.equal")." :" ;
00523 finp() ;
00524
00525 pre_fichier("allequal3.txt","cadre") ;
00526
00527 finsolution() ;
00528
00529 finblockquote() ;
00530
00531 finPageExercices($numSerie) ; # contient finSection() et finPage() ; la fonction est dans progi.php
00532
00533 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)