Listing du fichier tp2.php
00001<?php
00002 # # (gH) -_- tp2.php ; TimeStamp (unix) : 24 Juin 2018 vers 20:53
00003 error_reporting(E_ALL | E_NOTICE | E_STRICT ) ;
00004 header('Content-Type "text/html; charset=iso-8859-1"') ;
00005 ini_set( 'default_charset', 'ISO-8859-1' );
00006 include("decra-inc.php") ;
00007
00008 $numSerie = 2 ;
00009 debutTP($numSerie,"Programmation en Python") ;
00010 ghAtAngers() ;
00011
00012 $R = ghRouge("R") ;
00013 $XML = ghRouge("XML") ;
00014 $Awk = ghRouge("AWK") ;
00015 $Php = ghVert("PHP") ;
00016 $Python = ghBleu("Python") ;
00017
00018 ## -------------------------------------------------------------------------------------------
00019
00020 sdl(3) ; echo cmt(' pour afficher toutes les solutions : tp2.php?solutions=1') ; sdl(3) ;
00021
00022 ## -------------------------------------------------------------------------------------------
00023
00024 pvide() ;
00025
00026 debutSection() ;
00027
00028 $tableauDesRubriques = array() ;
00029 $idr = 0 ;
00030 $idr++; $tableauDesRubriques[$idr] = "Vérification du tuteur $Python" ;
00031 $idr++; $tableauDesRubriques[$idr] = "Réindentation de code $Python" ;
00032 $idr++; $tableauDesRubriques[$idr] = "Compréhension de code $Python" ;
00033 $idr++; $tableauDesRubriques[$idr] = "Modes de développement et d'exécution en $Python" ;
00034 $idr++; $tableauDesRubriques[$idr] = "Archivage incrémental" ;
00035 $idr++; $tableauDesRubriques[$idr] = "Utilisation d'un Jupyter notebook pour $Python" ;
00036 $idr++; $tableauDesRubriques[$idr] = "Scripts $Python avec un argument en ligne de commande" ;
00037 $tdmCRLM = new tdm($tableauDesRubriques) ;
00038 $tdmCRLM->titre() ;
00039 $tdmCRLM->menu("oui","oui","nou") ;
00040
00041 direAfficherSolutionsTP($numSerie) ;
00042
00043 p("texte") ;
00044 echo ghRouge("Remarque :") ;
00045 echo " sauf pour les exercices 3 et 6, les exercices sont à réaliser dans un terminal, à l'aide de l'interpréteur " ;
00046 echo " indiqué, à savoir ".b("python3")." ou ".b("ipython3")."." ;
00047 finp() ;
00048
00049 p("texte") ;
00050 echo " Utiliser un répertoire pour tous vos développements de ce T.P., par exemple nommé " ;
00051 echo b("tp2/")." ou ".b("DCRA-tp2/")." est une pratique conseillée. Dans les salles du département informatique, le chemin absolu pour les notebooks, " ;
00052 echo " quant à lui, est ".b("/media/D/Mes_notebooks/").". " ;
00053 finp() ;
00054
00055 finSection() ;
00056
00057 $numExo = 0 ;
00058
00059 ## -------------------------------------------------------------------------------------------
00060
00061 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Vérification du tuteur Python
00062
00063 ## -------------------------------------------------------------------------------------------
00064
00065 blockquote() ; # tp
00066
00067 blockquote() ; # énoncé
00068
00069 p("texte") ;
00070 echo " Lire le ".href("../tuteurs/tutpython.php","tuteur Python") ;
00071 echo " et essayer de vérifier que chaque code $Python fourni est correct à l'aide la commande ".b("python3 script.py")." où " ;
00072 echo b("script.py")." est le nom du fichier qui contient le code." ;
00073 finp() ;
00074
00075 p("texte") ;
00076 echo " Lorsque le nom du fichier python est donné, " ;
00077 echo " il faut le télécharger à l'aide de la commande ".href("https://doc.ubuntu-fr.org/wget","wget")." car " ;
00078 echo " sinon, par copier/coller, on risque de perdre l'indentation qui est très stricte en $Python." ;
00079 echo " On supprimera le code ".b("# -*- coding:latin1 -*-")." " ;
00080 echo " si un fichier commence par une telle entête et on adaptera le code en conséquence." ;
00081 finp() ;
00082
00083 p("texte") ;
00084 echo " On commencera par vérifier la version de $Python utilisée." ;
00085 finp() ;
00086
00087 p("texte") ;
00088 echo b(em("Remarque :")) ;
00089 echo " on pourra utiliser ".b("geany")." comme éditeur de code $Python." ;
00090 finp() ;
00091
00092 h3(ghVert("Quelques questions à propos des exemples du tuteur :")) ;
00093
00094 ul() ;
00095
00096 debutli() ; p("texte") ;
00097 echo " Est-ce que les exemples ".b("bonjour.py").", ".b("if2.py")." , ".b("if3.py")." , " ;
00098 echo " ".b("python_demo5.py")." et ".b("python_demo6.py") ;
00099 echo " fonctionnent tels quels dans les salles informatiques de l'université ou sur votre ordinateur (si vous êtes en distanciel) ?" ;
00100 echo " Si non, que faut-il installer et comment, sachant qu'on n'a pas le droit " ;
00101 echo " d'être ".b("administrateur")." (".em("root").") sur ces ordinateurs ?" ;
00102 finp() ; finli() ;
00103
00104 debutli() ; p("texte") ;
00105 echo " Est-ce que les exemples ".b("tdmv1.py")." et ".b("tdmv2.py")." (qui utilisent ".b("easygui.py").") " ;
00106 echo " fonctionnent tels quels dans les salles informatiques de l'université ou sur votre ordinateur ?" ;
00107 echo " Si non, que faut-il installer et comment, sachant qu'on n'a pas le droit " ;
00108 echo " d'être ".b("administrateur")." (".em("root").") sur ces ordinateurs ?" ;
00109 finp() ; finli() ;
00110
00111 debutli() ; p("texte") ;
00112 echo " Est-il possible de tester l'exemple de la section 4 qui utilise le module ".b("pymysql")." ?" ;
00113 echo " et le script ".b("getndjpm.py")." ?" ;
00114 echo " et les autres scripts de cette section 4 ?" ;
00115 finp() ; finli() ;
00116
00117 debutli() ; p("texte") ;
00118 echo " Est-ce que les exemples qui utilisent $XML fonctionnent dans les salles du département informatique de l'université d'Angers ou sur votre ordinateur ?" ;
00119 finp() ; finli() ;
00120
00121 finul() ;
00122
00123 finblockquote() ; # énoncé
00124
00125 solutionTP($numExo,$numSerie) ;
00126
00127 p("texte") ;
00128 echo " Tous les exemples fonctionnaient (bien sûr) avec Python 3.2 à l'époque où le tuteur $Python a été écrit. " ;
00129 echo " Avec une version récente (Python 3.7, juin 2018) tous les exemples fonctionnent encore. " ;
00130 finp() ;
00131
00132 p("texte") ;
00133 echo " Au premier octobre 2018, dans les salles du département informatique de l'université d'Angers, il y a " ;
00134 echo " deux versions de $Python qui coexistent. On fera donc bien attention à utiliser la commande " ;
00135 echo b("python3")." pour exécuter les scripts. C'est peut-être aussi le cas pour vos ordinateurs." ;
00136 finp() ;
00137
00138 pre_fichier("versionsAlafac.txt","cadrejaune") ;
00139
00140 p("texte") ;
00141 echo "Si vous voulez ne pas vous tromper, le plus simple est de créer un alias python qui exécute python3, " ;
00142 echo " un alias ipython qui exécute ipython3 " ;
00143 echo " et un alias pip exécute pip3 comme suit :" ;
00144 finp() ;
00145
00146 pre_fichier("py-alias.txt","cadre") ;
00147
00148 p("texte") ;
00149 echo " Suivant les années, le module ".b("easygui.py")." est ou n'est pas installé dans les " ;
00150 echo " salles informatiques de l'université. En tant qu'utilisateur, il est possible d'installer un module avec " ;
00151 echo " la commande ".href("https://pip.pypa.io/en/stable/user_guide/","pip3").". " ;
00152 echo " La même remarque s'applique aux autres modules utilisés dans le tuteur, comme par exemple " ;
00153 echo href("https://pymysql.readthedocs.io/en/latest/","easygui").". " ;
00154 finp() ;
00155
00156 p("texte") ;
00157 echo " Si vous n'avez jamais utilisé ".b("pip")." ou ".b("pip3").", voici deux liens intéressants, " ;
00158 echo href("http://apprendre-python.com/page-pip-installer-librairies-automatiquement","ici") ;
00159 echo " et ".href("https://www.dabapps.com/blog/introduction-to-pip-and-virtualenv-python/","là").". " ;
00160 echo " Le deuxième lien, en anglais, explique aussi ce qu'est ".b("virtualenv")."." ;
00161 finp() ;
00162
00163 p("texte") ;
00164 echo " Les fichiers suivants ont le comportement attendu : " ;
00165 echo href("bonjour.py").", " ;
00166 echo href("if2.py").", " ;
00167 echo href("if3.py").", " ;
00168 echo href("tdmv1.py").", " ;
00169 echo href("python_demo5.py").", " ;
00170 echo href("python_demo6.py")." et " ;
00171 echo href("serveurweb.py").". " ;
00172 finp() ;
00173
00174 p("texte") ;
00175 echo " Pour ".href("tdmv2.py")." il faut exécuter en ligne de commandes ".b("pip3 install easygui")." pour que le script fonctionne." ;
00176 finp() ;
00177
00178 p("texte") ;
00179 echo " Dans les salles du département informatique, il n'est sans doute pas possible d'installer ".b("pymysql")." avec la commande ".b("pip3 pymysql")." " ;
00180 echo " donc le script associé ne fonctionne pas." ;
00181 finp() ;
00182
00183 p("texte") ;
00184 echo " Dans les salles du département informatique, le script ".href("getndjpm.py")." ne fonctionne pas." ;
00185 echo " Par contre, le script ".href("serveurweb.py")." fonctionne. On s'en rend compte en ouvrant un navigateur à " ;
00186 echo " l'adresse ".href("http://localhost:8090").". Dans le terminal qui a lancé le script, il faut faire ".b("Control-C")." pour arrêter ce serveur. " ;
00187 finp() ;
00188
00189 p("texte") ;
00190 echo " Un script fonctionnel équivalent à ".href("getndjpm.py") ;
00191 echo " est ".href("getndjpm2.py").", même s'il faut (peut-être) installer le module ".b("requests").". " ;
00192 finp() ;
00193
00194 p("texte") ;
00195 echo " Le script qui exécute la transformation ".b("XSL")." nommée ".href("vide.xsl") ;
00196 echo " sur le fichier $XML nommé ".href("test3.xml") ;
00197 echo " fonctionne aussi." ;
00198 finp() ;
00199
00200 finsolution() ; # contient un blockquote
00201
00202 finblockquote() ; # tp
00203
00204 ## -------------------------------------------------------------------------------------------
00205
00206 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Réindentation de code Python
00207
00208 ## -------------------------------------------------------------------------------------------
00209
00210 blockquote() ; # tp
00211
00212 blockquote() ; # énoncé
00213
00214 p("texte") ;
00215 echo " $Python est un des rares langages à imposer une indentation stricte pour les blocs. Ainsi le programme " ;
00216 echo href("malindent.py")." ci-dessous n'est pas exécutable. Réindenter son code pour qu'il s'exécute " ;
00217 echo " correctement. On devra obtenir comme résultat d'exécution du fichier correct le fichier ".href("bienindent_res.txt")."." ;
00218 finp() ;
00219
00220 p("texte") ;
00221 echo "Au passage, que réalise ce script $Python ?" ;
00222 finp() ;
00223
00224 pre_fichier("malindent.py","cadrebleu") ;
00225
00226 p("texte") ;
00227 echo "Réindenter aussi " ;
00228 echo href("mini_mvc2_py.txt")." et " ;
00229 echo href("mini_mvc3_py.txt")." " ;
00230 echo " avant de vérifier que ces programmes s'exécutent en Python 2. Les convertir ensuite en Python 3." ;
00231 echo " Que peut-on en déduire sur MVC ?" ;
00232 finp() ;
00233
00234 pre_fichier("mini_mvc2_py.txt","cadrejaune") ;
00235 pre_fichier("mini_mvc3_py.txt","cadrebleu") ;
00236
00237 finblockquote() ; # énoncé
00238
00239 solutionTP($numExo,$numSerie) ; # contient un blockquote
00240
00241 # consulter("bienindent.py") ;
00242
00243 p("texte") ;
00244 echo "Les textes correctement indentés sont nommés respectivement " ;
00245 echo href("bienindent.py").", " ;
00246 echo href("mini_mvc1.py").", " ;
00247 echo href("mini_mvc2.py")." et " ;
00248 echo href("mini_mvc3.py")."." ;
00249 echo " Comme indiqué, ils ne fonctionnent qu'avec Python 2." ;
00250 finp() ;
00251
00252 p("texte") ;
00253 echo "Pour Python 3, voir " ;
00254 echo href("mini_mvc1.py3").", " ;
00255 echo href("mini_mvc2.py3")." et " ;
00256 echo href("mini_mvc3.py3").". " ;
00257 echo "En cas de problème d'installation, utiliser apt-get pour installer python3-tk et importer ensuite tk au lieu de Tk (donc sans majuscule sur le t) " ;
00258 echo " dans le code-source. " ;
00259 echo " Il y a un programme nommé " ;
00260 echo href("http://docs.python.org/3.3/library/2to3.html","2to3") ;
00261 echo " qui fait partie de la distribution de Python dont le but est " ;
00262 echo " d'essayer de convertir automatiquement de Python 2 vers Python 3." ;
00263 finp() ;
00264
00265 p("texte") ;
00266 echo " Ces scripts implémentent en programmation objets des mini-exemples de MVC afin de bien en présenter les concepts." ;
00267 finp() ;
00268
00269 finsolution() ; # contient un blockquote
00270
00271 finblockquote() ; # tp
00272
00273 ## -------------------------------------------------------------------------------------------
00274
00275 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Compréhension de code Python
00276
00277 ## -------------------------------------------------------------------------------------------
00278
00279 blockquote() ; # tp
00280
00281 blockquote() ; # énoncé
00282
00283 p("texte") ;
00284 echo " L'une des forces du langage $Python est de permettre l'écriture de code en mode " ;
00285 echo href("https://fr.wikipedia.org/wiki/Lambda-calcul","lambda-calcul").". " ;
00286 finp() ;
00287
00288 p("texte") ;
00289 echo " Corriger le code " ;
00290 echo href("obfus-1.py")." ci-dessous qui n'est pas exécutable à cause d'erreur(s) simple(s) de syntaxe. " ;
00291 echo " Qu'affiche-t-il alors ?" ;
00292 echo " Au passage, est-ce du Python 2 ou du Python 3 ?" ;
00293 echo " Si c'est du Python 2, donner la version Python 3 correspondante." ;
00294 finp() ;
00295
00296 pre_fichier("obfus-1.py","cadrebleu") ;
00297
00298 p("texte") ;
00299 echo " Si le style " ;
00300 echo href("https://en.wikipedia.org/wiki/One-liner_program","one-liner")." vous perturbe, voici une version indentée, tout aussi " ;
00301 echo b("absconse").", à la limite de l'" ;
00302 echo href("https://en.wikipedia.org/wiki/Obfuscation_(software)","obfuscated")." :" ;
00303 finp() ;
00304
00305 pre_fichier("obfus-2.py","cadrejaune") ;
00306
00307 p("texte") ;
00308 echo " Que peut-on penser de cette façon de programmer ?" ;
00309 finp() ;
00310
00311 finblockquote() ; # énoncé
00312
00313 solutionTP($numExo,$numSerie) ; # contient un blockquote
00314
00315 p("texte") ;
00316 echo " Tout d'abord, il s'agit de code Python 2 car il y a écrit ".b("print x").". " ;
00317 echo " En Python3 ce serait ".b("print(x)")." donc avec des parenthèses." ; ;
00318 finp() ;
00319
00320 p("texte") ;
00321 echo " L'erreur se situe au niveau de l'appel de la fonction puissance. " ;
00322 echo " Il faut corriger ".ghRouge("pow(y;0,5)") ;
00323 echo " en ".ghVert("pow(y,0.5)").". " ;
00324 finp() ;
00325
00326 p("texte") ;
00327 echo "Voici ce qu'il affiche alors :" ;
00328 finp() ;
00329
00330 pre_fichier("obfus1.txt","cadrejaune") ;
00331
00332 p("texte") ;
00333 echo " Ce programme affiche (mais comment ?) la liste des nombres premiers entre 2 et 1000. " ;
00334 finp() ;
00335
00336 p("texte") ;
00337 echo " Voici sa version en Python 3:" ;
00338 finp() ;
00339
00340 pre_fichier("obfus3.py","cadrejaune") ;
00341
00342 p("texte") ;
00343 echo " Cet exemple montre à la fois la puissance du lambda-calcul et sa principale difficulté : " ;
00344 echo " la relecture de tels codes. Bien sûr on n'écrit pas ce code d'une seule traite, de gauche à droite. " ;
00345 echo " On l'écrit progressivement à partir de la première instruction ".b("map").", en rajoutant du code au fur et à mesure." ;
00346 finp() ;
00347
00348 finsolution() ; # contient un blockquote
00349
00350 finblockquote() ; # tp
00351
00352 ## -------------------------------------------------------------------------------------------
00353
00354 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Modes de développement
00355
00356 ## -------------------------------------------------------------------------------------------
00357
00358 blockquote() ; # tp
00359
00360 blockquote() ; # énoncé
00361
00362 p("texte") ;
00363 echo " Y a-t-il une différence entre l'exécution via ".b("python script.py") ;
00364 echo " et l'exécution via ".b("ipython script.py")." pour les exemples du tuteur ?" ;
00365 finp() ;
00366
00367 p("texte") ;
00368 echo " Plus globalement, quel est l'intérêt d'utiliser ".b("ipython")." plutôt que ".b("python") ;
00369 echo " au niveau du développement ?" ;
00370 finp() ;
00371
00372 p("texte") ;
00373 echo " Serait-ce mieux de développer avec un ".b("Jupyter Notebook")." ?" ;
00374 finp() ;
00375
00376 finblockquote() ; # énoncé
00377
00378 solutionTP($numExo,$numSerie) ; # contient un blockquote
00379
00380 p("texte") ;
00381 echo "Il n'y a pas de différence majeure lorsqu'on exécute du code correct dans un script avec " ;
00382 echo b("python")." et ".b("ipython").", comme indiqué " ;
00383 echo href("https://plot.ly/python/ipython-vs-python/","ici").". " ;
00384 echo " Pour les exemples du tuteur, l'exécution du script ".href("ligv.py")." sans paramètre fournit des affichages " ;
00385 echo " légèrement différents :" ;
00386 finp() ;
00387
00388 # donner une copie de la sortie ipython/python d'un script OK et de ligv.py
00389
00390 p("texte") ;
00391 nbsp(15) ;
00392 $img = "ligv.png" ;
00393 echo href($img,img($img,"",800)) ;
00394 finp() ;
00395
00396 p("texte") ;
00397 echo " C'est sans doute mieux de développer avec un ".b("Jupyter Notebook")." mais cela demande une installation particulière (voir la question 6)." ;
00398 finp() ;
00399
00400 finsolution() ; # contient un blockquote
00401
00402 finblockquote() ; # tp
00403
00404 ## -------------------------------------------------------------------------------------------
00405
00406 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Archivage incrémental
00407
00408 ## -------------------------------------------------------------------------------------------
00409
00410 blockquote() ; # tp
00411
00412 blockquote() ; # énoncé
00413
00414 p("texte") ;
00415 echo " On voudrait qu'à l'exécution du script ".s_span("archcd.py","gbleuf")." il y ait une production automatique d'une archive " ;
00416 echo " au format ".b("tar") ;
00417 echo " pour tous les fichiers de type xml avec numérotation de l'archive. " ;
00418 echo " Par exemple la première fois que le script est exécuté, on produira l'archive ".b("lesxml001.tar")." ; " ;
00419 echo " la seconde fois, ce sera ".b("lesxml002.tar")." etc. " ;
00420 echo " L'algorithme de base ressemble certainement à " ;
00421 finp() ;
00422
00423 pre_fichier("archivage_alg.txt","cadrebleu") ;
00424
00425 p("texte") ;
00426 echo "Voici la sortie des deux premières exécutions du script :" ;
00427 finp() ;
00428
00429 pre_fichier("archivage-sortie.txt","cadrejaune") ;
00430
00431 finblockquote() ; # énoncé
00432
00433 solutionTP($numExo,$numSerie) ; # contient un blockquote
00434
00435 consulter("archcd.py") ;
00436
00437 p("texte") ;
00438 echo " Pour voir le même algorithme dans d'autres langages, cliquez " ;
00439 echo href("../Scripts/transvers.php","ici")."." ;
00440 finp() ;
00441
00442 finsolution() ; # contient un blockquote
00443
00444 finblockquote() ; # tp
00445
00446 ## -------------------------------------------------------------------------------------------
00447
00448 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Utilisation d'un Jupyter notebook pour Python
00449
00450 ## -------------------------------------------------------------------------------------------
00451
00452 blockquote() ; # tp
00453
00454 blockquote() ; # énoncé
00455
00456 p("texte") ;
00457 echo " Télécharger et compléter le ".href("https://jupyter.org/","Jupyter ipython notebook")." nommé " ;
00458 echo href("../Notebooks/colExcel.ipynb","colExcel").". " ;
00459 finp() ;
00460
00461 p("texte") ;
00462 echo " Pour mémoire, dans les salles du département informatique, " ;
00463 echo " if faut, dans un terminal lancer la commande ".b("_jupyter_notebook")." c'est-à-dire ".ghBleu("jupyter_notebook")." précédé du souligné ".ghBleu("_") ;
00464 echo " pour pouvoir utiliser un serveur local de notebooks. Le disque ".b("D")." et le répertoire ".b("Mes_notebooks")." permettent alors " ;
00465 echo " d'enregistrer les fichiers. " ;
00466 echo " Il est conseillé de télécharger le notebook ".href("../Notebooks/colExcel.ipynb","colExcel")." dans le répertoire ".b("Mes_notebooks") ;
00467 echo " avant de lancer le serveur Jupyter. " ;
00468 finp() ;
00469
00470 p("texte") ;
00471 echo " Lorsqu'on exécute la commande ".b("_jupyter_notebook").", le serveur jupyter est lancé et il faut le laisser actif pour pouvoir continuer. " ;
00472 echo " Voici un exemple de session dans le terminal " ;
00473 finp() ;
00474
00475 pre_fichier("jupyter1.txt","cadrejaune") ;
00476
00477 p("texte") ;
00478 echo " Pour accéder au serveur, il faut utiliser via un navigateur Web le port indiqué et le jeton (".b("token").") indiqué. Ce n'est malheureusement pas simple car " ;
00479 echo " ce qui est affiché dans le terminal n'est pas prévu pour un copier/coller. " ;
00480 echo " Pour l'exemple précédent, l'URL de connection est :" ;
00481 finp() ;
00482
00483 pre_fichier("jupyter2.txt","cadrejaune") ;
00484
00485 p("texte") ;
00486 echo " Si vous n'avez tapé que la partie ".b("http://127.0.0.1:8888")." il est possible de saisir ensuite le token, sans oublier les caractères ".b("/?token=").". " ;
00487 finp() ;
00488
00489 p("texte") ;
00490 echo " Voici ce que vous devriez voir si tout se passe bien :" ;
00491 finp() ;
00492
00493 p("texte") ;
00494 nbsp(15) ;
00495 $img = "jupyter.png" ;
00496 echo href($img,img($img,"",800)) ;
00497 finp() ;
00498
00499 p("texte") ;
00500 echo " Pour terminer proprement la session avec jupyter, il faut arrêter le serveur avec ".b("deux fois Controle-C")." puis fermer le terminal." ;
00501 finp() ;
00502
00503 p("texte") ;
00504 echo "Pour mémoire, le chemin absolu pour les notebooks est ".b("/media/D/Mes_notebooks/").". " ;
00505 finp() ;
00506
00507 finblockquote() ; # énoncé
00508
00509 solutionTP($numExo,$numSerie) ; # contient un blockquote
00510
00511 p("texte") ;
00512 echo " La solution est " ;
00513 echo href("../Notebooks/colExcel-solution.ipynb","ici").". " ;
00514 echo " Un export automatique en PDF via LaTeX fournit le rendu suivant ".href("colExcel-solution.pdf") ;
00515 echo " qu'on viendra critiquer." ;
00516 finp() ;
00517
00518
00519 finsolution() ; # contient un blockquote
00520
00521 finblockquote() ; # tp
00522
00523 ## -------------------------------------------------------------------------------------------
00524
00525 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Script Python avec arguments en ligne de commande
00526
00527 ## -------------------------------------------------------------------------------------------
00528
00529 blockquote() ; # tp
00530
00531 blockquote() ; # énoncé
00532
00533 p("texte") ;
00534 echo " Ecrire un script $Python nommé ".b("colExcel.py")." qui fonctionne en ligne de commandes et qui correspond aux spécifications suivantes :" ;
00535 finp() ;
00536
00537 ol() ;
00538
00539 debutli() ; p() ;
00540 echo "sans paramètre, le script fournit un rappel de la syntaxe et des exemples." ;
00541 finp() ; finli() ;
00542
00543 debutli() ; p() ;
00544 echo "le script importe le fichier ".b("colExcelInc.py")." qui contient deux fonctions, à savoir " ;
00545 echo b("fromExcel()")." et ".b("toExcel()")." présentées dans l'exercice précédent." ;
00546 finp() ; finli() ;
00547
00548 debutli() ; p() ;
00549 echo " le fichier à importer ".b("colExcelInc.py")." contient un auto-test permettant de vérifier que les deux " ;
00550 echo " fonctions sont correctes." ;
00551 finp() ; finli() ;
00552
00553 debutli() ; p() ;
00554 echo "le script ".b("colExcel.py")." admet un seul paramètre nommé ".b("inpCol").". " ;
00555 echo "" ;
00556 finp() ; finli() ;
00557
00558 debutli() ; p() ;
00559 echo "le script ".b("colExcel.py")." détecte la nature du seul parametre nommé ".b("inpCol")." ; " ;
00560 echo " si c'est un nombre entier strictement positif, on éxécute " .b("toExcel()")." ;" ;
00561 echo " si c'est une chaine de caractères comportant un seul mot ne comportant que des majuscules (non accentuées), " ;
00562 echo " on éxécute ".b("fromExcel()")." ; dans les autres cas, on dit qu'il y a une erreur." ;
00563 finp() ; finli() ;
00564
00565 finol() ;
00566
00567 p("texte") ;
00568 echo "Voici le comportement attendu :" ;
00569 finp() ;
00570
00571 pre_fichier("colexcel.txt","cadre") ;
00572
00573
00574 p("texte") ;
00575 echo " Si vous n'avez pas réussi à résoudre l'exercice précédent ou à télécharger ses solutions, vous " ;
00576 echo " pouvez essayer de simplifier l'exercice en travaillant uniquement avec les nombres 1 à 26, c'est-à-dire avec ";
00577 echo " les colonnes A à Z." ;
00578 finp() ;
00579
00580 p("texte") ;
00581 echo " Ecrire ensuite un deuxième script $Python nommé ".b("decritExcel.py")." qui fonctionne en ligne de commandes et qui correspond aux spécifications suivantes :" ;
00582 finp() ;
00583
00584 ul() ;
00585
00586 debutli() ; p() ;
00587 echo "s'il n'y a pas de paramètre, on fournit un rappel de la syntaxe et un exemple puis on s'arrête." ;
00588 finp() ; finli() ;
00589
00590 debutli() ; p() ;
00591 echo "si le fichier Excel désigné par le paramètre n'est pas présent, on l'indique et on s'arrête." ;
00592 finp() ; finli() ;
00593
00594 debutli() ; p() ;
00595 echo "si le fichier est présent, on liste les colonnes présentes avec leur numéro et leur nom sous Excel (A pour 1, B pour 2...)." ;
00596 finp() ; finli() ;
00597
00598 finul() ;
00599
00600 p("texte") ;
00601 echo "Pour les expert(e)s, on pourra de plus fournir le type des colonnes, la valeur minimale, la valeur maximale et le nombre de valeurs manquantes," ;
00602 echo " comme ci-dessous, pour le fichier ".href("iris.xlsx")." :" ;
00603 finp() ;
00604
00605 pre_fichier("decritirisPython3.txt","cadre") ;
00606
00607 finblockquote() ; # énoncé
00608
00609 solutionTP($numExo,$numSerie) ; # contient un blockquote
00610
00611 # solution :
00612
00613 p("texte") ;
00614 echo "Pour le premier script, on viendra rapatrier " ;
00615 echo href("colExcel.py") ;
00616 echo " et ".href("colExcelInc.py").". " ;
00617 echo " On viendra en particulier vérifier que les ".em("auto-tests")." affichent bien " ;
00618 echo " ce qu'on demande. " ;
00619 finp() ;
00620
00621 p("texte") ;
00622 echo "Pour le second script, nous ne fournissons volontairement aucune solution. " ;
00623 echo " Toutefois, la liste des liens ci-dessous montre que c'est un problème simple " ;
00624 echo " avec plusieurs solutions, en Python \"direct\" ou avec " ;
00625 echo href("https://pandas.pydata.org/","pandas").". " ;
00626 finp() ;
00627
00628 pre_fichier("tp2-complements.txt","cadrebleu") ;
00629
00630 finsolution() ; # contient un blockquote
00631
00632 finblockquote() ; # tp
00633
00634 #############################################################################
00635
00636 finTP($numSerie) ;
00637 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)