Listing du fichier l2a_tp1.php avec syntaxhighlighter
<?php # (gH) -_- l2a_tp1.php ; TimeStamp (unix) : 25 Février 2013 vers 11:19 error_reporting(E_ALL | E_NOTICE | E_STRICT) ; include("std.php") ; include("l2a_inc.php") ; $numTp = 1 ; debutPageTp($numTp) ; ## ------------------------------------------------------------------------------------------- sdl(3) ; echo cmt(' pour afficher toutes les solutions : l2a_tp'.$numTp.'.php?solutions=1') ; sdl(3) ; ## ------------------------------------------------------------------------------------------- debutSection() ; $tableauDesRubriques = array() ; $idr = 0 ; $idr++; $tableauDesRubriques[$idr] = "PHP cli : date, heure et numéro de version" ; $idr++; $tableauDesRubriques[$idr] = "PHP cli : conversion pouces/cm" ; $idr++; $tableauDesRubriques[$idr] = "PHP -a et test rapide de fonction" ; $idr++; $tableauDesRubriques[$idr] = "Gestion Web de l'affichage avec \\n,<br> et <p>" ; $idr++; $tableauDesRubriques[$idr] = "Combien de tests ?" ; $idr++; $tableauDesRubriques[$idr] = "Affichage XHTML de milles terrestres " ; $idr++; $tableauDesRubriques[$idr] = "Affectations multiples " ; $idr++; $tableauDesRubriques[$idr] = "Une fonction pour <h1> " ; $idr++; $tableauDesRubriques[$idr] = "Occurences du maximum d'un tableau " ; $idr++; $tableauDesRubriques[$idr] = "La structure de données ".b("\"pile\"")." version 1" ; $idr++; $tableauDesRubriques[$idr] = "Polynome quand tu nous tiens" ; $tdmCRLM = new tdm($tableauDesRubriques) ; $tdmCRLM->titre() ; $tdmCRLM->menu("oui","oui","nou") ; pvide() ; p() ; echo "Il est possible d'afficher toutes les solutions via ".href("l2a_tp$numTp.php?solutions=1","?solutions=1","bouton_fin jaune_pastel nou").". " ; finp() ; finSection() ; debutSection() ; p("texte") ; echo s_span("Rappel :","grouge") ; echo " vos programmes PHP doivent être transférés sur le serveur ".b("forge")." dans votre répertoire " ; echo s_span("forge_html","gbleuf")." avant d'être utilisés. Vous pouvez les éditer sous Windows ou sous Linux, mais au final "; echo " ils doivent être exécutés sur forge. " ; echo " Il faut utiliser ".s_span("ssh -X -Y login@janus.info.univ-angers.fr","grouge") ; echo " pour vous connecter ou " ; echo " ".s_span("ssh -X -Y login@forge","grouge")." si vous êtes dans une des salles locales de TP." ; finp() ; finSection() ; debutSection() ; $numExo = 0 ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # PHP cli : date, heure et numéro de version ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "Ecrire un programme PHP qui fonctionne en mode CLI (ligne de commande) qui affiche la date et l'heure et le " ; echo " numéro de la version du PHP utilisé sur le serveur." ; finp() ; p("texte") ; echo "A quoi sert l'instruction nommée ".b("phpinfo()")." ?" ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo " Pour la date et l'heure, on utilise la même fonction de PHP nommée ".href("http://php.net/manual/fr/function.date.php","date")." " ; echo " mais avec des paramètres différents." ; echo " Il est conseillé de lire au moins une fois le manuel de PHP à l'adresse ".href("http://php.net/manual/fr/function.date.php")." pour voir " ; echo " toutes les options possibles. Voici ce qu'on peut écrire pour réaliser l'exercice :" ; finp() ; pre_fichier("dh.php","cadre") ; p("texte") ; echo " La fonction nommée ".href("http://php.net/manual/fr/function.phpversion.php","phpversion()")." renvoie, en plus du numéro de version le nom du système " ; echo " d'exploitation. Par contre l'instuction ".href("http://php.net/manual/fr/function.phpinfo.php","phpinfo()")." renvoie toute la configuration de PHP." ; echo " Ainsi, le simple programme " ; finp() ; pre_fichier("phpinfo.php","cadre") ; p("texte") ; echo "renvoie tout ce que vous pouvez lire à l'URL ".href("phpinfo.php")."." ; echo " Cela permet en particulier de savoir comment est configuré le serveur, quel codage il utilise pour les accents, quels modules sont disponibles..." ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # PHP cli : conversion pouces/cm ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "Ecrire un programme PHP qui fonctionne en mode CLI qui a besoin de deux paramètres : une valeur numérique et le mot \"pouces\" ou " ; echo " le mot \"cm\". On effectuera alors la conversion idoine, sachant qu'un pouce vaut 2,54 cm." ; echo " Voici un exemple de ce qu'on voudrait comme fonctionnement :" ; finp() ; pre_fichier("convcminch.txt","cadre bleu_pastel") ; p("texte") ; echo "Volontairement, on n'utilisera aucune fonction et on ne fera aucun test sur la valeur numérique afin de voir commment PHP se comporte " ; echo " en cas de donnée mal typée." ; finp() ; p("texte") ; echo "Y a-t-il une façon standard d'écrire des paramètres sous Linux ?" ; finp() ; p("texte") ; echo "Ecrire un programme similaire qui fonctionne avec les paramètres ".b("val")." et ".b("unit")." passés en méthode ".b("GET")." dans l'URL. " ; echo " Voir la page ".href("convcminch2.php")." comme exemple." ; echo " On pourra utiliser les fichiers ".b("debutpage.php")." et ".b("finpage.php")." de " ; echo " l'archive ".href("debutfin.zip")." pour générer le début et la fin de la page." ; finp() ; p("texte") ; echo "Ecrire enfin une page XHTML Strict valide basée sur le \"squelette\" de page ".href("sqs.htm")." avec un formulaire dont l'attribut ".b("action")." est " ; echo " ".href("convcminch2.php")."." ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Pour tester le nombre d'arguments, on peut utiliser ".href("http://php.net/manual/fr/reserved.variables.argc.php","argc") ; echo " et pour leur valeur on utilise ".href("http://www.php.net/manual/fr/reserved.variables.argv.php","argv")." qui font partie des " ; echo " variables dites ".href("http://www.php.net/manual/fr/reserved.variables.php","réservées").". " ; echo " Un exemple de solution est ".href("montresource.php?nomfic=convcminch.php","convcminch.php")." :" ; finp() ; pre_fichier("convcminch.php","cadre") ; p("texte") ; echo "Si on se trompe sur l'unité, par exemple en écrivant pomme ou pouce au lieu de pouces (donc sans \"S\"), la variable \$fact n'est pas définie, " ; echo " pas plus que \$autreu, d'où deux erreurs. De même, si on ne fournit pas un nombre mais une chaine, il devrait y avoir une erreur mais PHP renvoie 0, tout simplement :" ; finp() ; pre_fichier("convcminch2.txt","cadre bleu_pastel") ; p("texte") ; echo "Sous Linux, on écrit des paramètres nommés à l'ancienne mode avec un tiret et un espace, à la nouvelle mode avec deux tirets et un signe égale. " ; echo " Voici ce que cela donnerait si on décide de nommer ".b("unit")." et ".b("val")." les paramètres :" ; finp() ; pre_fichier("convcminch3.txt","cadre") ; p("texte") ; echo "Le code-source PHP de la page nommée ".href("convcminch2.php","","grouge nou")." qui gère ces paramètres avec la méthode GET " ; echo " est ".href("montresource.php?nomfic=convcminch2.php","ici","gvert nou")." et " ; echo " un exemple de formulaire basé sur ".b("sqs.htm")." est ".href("convcminch_form.htm","là","gbleuf nou").". " ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # PHP -a et test rapide de fonction" ; ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "Quelqu'un vous dit que la fonction ".b("ucfirst()")." fait une «quasi uppérisation» d'une chaine de caractères. "; echo " Avez-vous besoin d'écrire un programme php pour tester ce que fait cette fonction ?" ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Non, bien sûr car on peut utiliser le mode interactif avec ".b("php -a").". Démonstration :" ; finp() ; pre_fichier("ucfirst.txt","cadre bleu_pastel") ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Gestion Web de l'affichage avec \\n,<br> et <p>" ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "Téléchargez l'archive ".href("debutfin.zip")." et reproduisez le programme suivant que vous nommerez ".b("essaipage.php").". " ; echo " Où seront les sauts à la ligne dans la page Web ? Et dans le code-source généré de la page Web ? Que se passe-t-il s'il y a une erreur, " ; echo " par exemple si on écrit ".b("echi")." au lieu de ".b("echo")." ? Au passage, rappelez où on peut trouver une liste des entités XHTML." ; finp() ; p("texte") ; echo "On en profitera pour installer " ; echo href("http://users.skynet.be/mgueury/mozilla/download_090.html","HTML VALIDATOR","bouton_fin jaune_pastel nou") ; echo " de M. Gueury." ; finp() ; pre_fichier("essaipage.txt","cadre tarose") ; p("texte") ; echo "Il est possible de rapatrier l'archive et de la décompresser en ligne de commandes (dans le bon répertoire !) via :" ; finp() ; pre_fichier("wgetarch.txt","cadre") ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Les sauts de ligne dans le code source HTML apparaissent uniquement quand on demande à PHP de produire ".b("\\n").". " ; echo " Par contre au niveau de la page Web, vous devez vous rappeler que tous les espaces, tabulations et sauts de ligne sont " ; echo " remplacés par un seul espace. Donc seules des balises explicites comme <br>, <p>, <li>... ou des marges induites " ; echo " par le CSS permettent de passer à la ligne. Ce qui signifie que le texte ".b("\"à tous et à toutes.\"")." est sur une seule ligne, " ; echo " les mots étant séparés par un seul espace." ; echo " Vérification : ".href("essaipage2.php","ici").". " ; finp() ; p("texte") ; echo "En cas d'erreur, par exemple avec ".b("echi")." au lieu d'".b("echo").", le serveur réagit en fonction de sa configuration. Ainsi sur forge, une " ; echo " erreur fait que la page est vide... dommage ! " ; echo " Avec un serveur configuré autrement, on peut avoir le détail (pas toujours très compréhensible) de l'erreur comme ci-dessous :" ; finp() ; p() ; $img = "echi.png" ; nbsp(15) ; echo href($img,img($img,$img,900)) ; finp() ; p("texte") ; echo "Pour retrouver une liste d'entités XHTML, ".em("Google est notre ami").", soit le lien français " ; echo href("https://www.google.fr/search?q=liste+entit%C3%A9s+XHTML","entités","gvertf nou") ; echo " ou le lien anglais " ; echo href("https://www.google.fr/search?q=XHTML%20entities%20list","entities","gvertf nou").". " ; echo " Parmi les listes proposées, nous conseillons celle de la " ; echo href("http://www.w3schools.com/tags/ref_entities.asp","W3 School","grouge nou").", celle de " ; echo href("http://www.elizabethcastro.com/html/extras/entities.html","elizabethcastro","grouge nou") ; echo " et enfin celle du ".href("http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references","wiki anglais","grouge nou").". " ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Combien de tests ? ## ------------------------------------------------------------------------------------------- blockquote() ; p("texte") ; echo "Combien de cas faut-il envisager et tester avant d'être convaincu que le programme en ligne de commande " ; echo href("montresource.php?nomfic=convcminch.php","convcminch.php","gbleuf nou")." est correct et qu'on a «tout prévu» ?" ; finp() ; p("texte") ; echo "Au passage, quelle est la différence entre développer et programmer ?" ; finp() ; solution($numExo,$numTp) ; p("texte") ; echo "Il faut certainement prévoir et tester au moins 7 cas :" ; finp() ; ol() ; li("un cas sans aucun paramètre ;") ; li("un cas avec tous les paramètres corrects en nom et en valeur ;") ; li("un cas avec le paramètre ".b("val")." absent ;") ; li("un cas avec le paramètre ".b("unit")." absent ;") ; li("un cas avec la valeur du paramètre ".b("val")." mal typée ;") ; li("un cas avec la valeur du paramètre ".b("unit")." mal typée ;") ; li("un cas avec des valeurs des paramètres avec beaucoup de décimales.") ; finol() ; p("texte") ; echo "Programmer, c'est juste écrire un programme. " ; echo "Développer, c'est réfléchir au problème, l'analyser, choisir des solutions, " ; echo " les programmer, les documenter, les tester... " ; finp() ; p("texte") ; echo "Ainsi, pour l'exemple de conversion, un «vrai» développeur " ; echo " ajoutera la détection de l'initiale (p pour pouce, c pour cm), viendra certainement " ; echo " ajouter un ".b("s")." à ".b("pouce")." pour obtenir ".b("pouces")." au lieu de reprocher " ; echo " à l'utilisateur une mauvaise orthographe, il (elle) proposera peut-être " ; echo " d'utiliser aussi l'initiale ".b("i")." pour inch(es), voire même d " ; echo " (pour Daumen en allemand) si la page est beaucoup lue en Allemagne... " ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Affichage XHTML de milles terrestres ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "Reproduire la page ".href("mille.php","","gbleuf nou").". On utilisera ".b("debutpage.php")." et ".b("finpage.php")." comme précédemment mais " ; echo " aussi ".href("std.css")." afin d'avoir une page XHTML valide et «jolie»." ; echo " On produira le tableau avec une seule boucle ".rouge("pour")." dont l'indice variera de 1 à 15. " ; echo " Les valeurs seront arrondies et affichées à droite avec deux décimales." ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Voir le code-source de ".href("montresource.php?nomfic=mille.php","mille.php","gbleuf nou").". " ; finp() ; p("texte") ; echo "En version «php conceptuel», c'est-à-dire sans balise apparente," ; echo " consulter le code-source de ".href("montresource.php?nomfic=mille2.php","mille2.php","gbleuf nou")." dont le rendu est ".href("mille2.php")."." ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Affectations multiples ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "Il parait qu'il est possible de réaliser en PHP des affectations multiples avec ".b("list").". Est-ce vrai ?" ; echo " A quoi cela peut-il servir ?" ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Si on lit la ".href("http://php.net/manual/fr/function.list.php","documentation")." de ".b("list").", on voit qu'il est " ; echo " effectivement possible de réaliser plusieurs affectations avec list à gauche et un tableau (array) à droite." ; echo " Cela permet par exemple de permuter deux variables en une seule ligne, comme dans l'exemple suivant :" ; finp() ; pre_fichier("affmult.txt","cadre tarose") ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Une fonction pour <h1> ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "On voudrait implémenter une fonction pour produire des titres de niveau 1 avec <h1>. Ecrire une fonction ".b("achin()") ; echo " qui correspond au comportement suivant :" ; finp() ; pre_fichier("achin.txt","cadre bleu_pastel") ; p("texte") ; echo "Quelle serait la syntaxe pour avoir juste une indication de classe ? Et d'id ?" ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Voici un exemple possible de fonction :" ; finp() ; pre_fichier("achin.php","cadre") ; p("texte") ; echo "Pour utiliser juste une classe, ".b("achin(\$txt,\$cla)")." suffit et pour avoir juste un id, il faut écrire " ; echo " ".b("achin(\$txt,\"\",\$id)").". " ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Occurences du maximum d'un tableau ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo " On voudrait trouver la plus grande valeur d'un tableau et le nombre de fois où elle apparait. " ; echo " Pour cela, on commencera par écrire une fonction ".b("valMax(\$leTableau)")." qui calcule la plus grande valeur du tableau " ; echo " et on utilisera une deuxième boucle pour compter le nombre d'occurences du maximum." ; finp() ; p("texte") ; echo "Recommencer l'exercice en utilisant cette fois une seule boucle pour déterminer à la fois le maximum et son "; echo " nombre d'occurences. " ; echo " On utilisera les valeurs 1 8 2 8 3 6 8 2 comme jeu d'essai dans un premier temps." ; echo " Dans un second temps, " ; echo ' on utilisera les valeurs "a", "b", "oui", "c", "oui", "d" comme ' ; echo " jeu d'essai." ; echo " On donnera aussi la position de la " ; echo " première et de la dernière occurence du maximum. On pourra se contenter d'une version en ligne de commandes." ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "On trouvera la solution dans ".href("montresource.php?nomfic=valmax.php","valmax.php")."." ; echo " Le non-typage explicite de PHP permet d'utiliser les instructions qu'il s'agisse d'un tableau de nombres ou de chaines de caractères. " ; echo " Voici la solution avec les lignes non numérotées :" ; finp() ; pre_fichier("valmax.php","cadre") ; p("texte") ; echo "Il serait possible de tout déterminer sans utiliser de boucle explicite car PHP dispose de nombreuses fonctions sur tableau. " ; echo " Voici par exemple comment trouver le maximum et son nombre d'occurences. Il faut bien sûr noter qu'utiliser ces fonctions ne " ; echo " garantit pas l'efficacité (et donc la rapidité de la solution)." ; finp() ; pre_fichier("valmaxfn.php","cadrejaune") ; p("texte") ; echo "Calculer le maximum et son nombre d'occurrences en une seule boucle ne présente pas vraiment d'intérêt " ; echo " pour un \"petit tableau\" (disons quelques centaines ou quelques milliers d'éléments). Par contre, si on dépasse le " ; echo " million d'éléments, c'est non négligeable. Par exemple, si une image comme " ; echo href("http://images.aperio.com/H_E%2040x.svs/view.apml","celle-ci")." -- 7 Go ! --" ; echo " doit être traitée pour trouver le maximum d'intensité des pixels (ce qui correspond à l'intensité maximale de " ; echo " la maladie), le parcours de l'image mise dans un tableau dure environ 6 minutes. Avec deux boucles, il faut donc en tout " ; echo " 12 minutes ; avec une seule boucle, la durée d'exécution est plutôt proche de 8 minutes (il y a un \"surcout\" " ; echo " de temps à cause des tests dans la boucle)." ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # La structure de données pile (v1) ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "On voudrait implémenter en ligne de commandes la notion de pile où on ne peut ajouter qu'en haut de pile. " ; echo " Pour cela on utilisera un tableau PHP. Voici un exemple de ce qu'on voudrait pouvoir écrire :" ; finp() ; pre_fichier("pilev1.txt","cadre") ; p("texte") ; echo "Implémenter les fonctions citées en utilisant seulement " ; echo " ".b("return()").", ".b("array()").", ".b("count()").", l'indexation et ".b("unset()").". " ; finp() ; p("texte") ; echo "Comment dit-on une pile en anglais ? Et empiler ? Et dépiler ? Y a-t-il des fonctions PHP prévues pour cela ?" ; finp() ; finblockquote() ; solution($numExo,$numTp) ; p("texte") ; echo "Consulter ".href("montresource.php?nomfic=pilev1.php","pilev1.php")." pour un listing numéroté, " ; echo " mais vous pouvez vous contenter de ce qui suit :" ; finp() ; pre_fichier("pilev1.php","cadrebleu") ; p("texte") ; echo "Dans le contexte informatique, une pile se dit ".b("stack")." en anglais, " ; echo "empiler ".b("to stack").", " ; echo "dépiler ou désempiler ".b("to unstack").". " ; echo "PHP dispose des fonctions "; echo href("http://www.php.net/manual/en/function.array-push.php","array_push","gbleuf nou")." et " ; echo href("http://www.php.net/manual/en/function.array-pop.php","array_pop","gbleuf nou")." ce qui fait " ; echo " qu'on n'a pas besoin d'inventer de fonction pour résoudre le problème, comme le montre le programme " ; echo " ci-dessous :" ; finp() ; pre_fichier("pilev1bis.php","cadrejaune") ; p("texte") ; echo "On notera au passage le comportement de ".b("array_pop")." lorsque la pile est vide." ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Polynome qaund tu nous tiens ## ------------------------------------------------------------------------------------------- blockquote() ; blockquote() ; p("texte") ; echo "Contrairement à ce qu'on croit dans les «petites classes», un polynome n'est pas une fonction de x, " ; echo " mais un \"objet mathématique\" défini par une liste de coefficients. Par exemple la liste " ; finp() ; p("texte") ; nbsp(15) ; input_text("coeffs"," 1 0 -2 6 ",20,"bleu_pastel") ; finp() ; p("texte") ; echo "correspond à x".sup("3")." -2 x + 6 avec les puissances décroissantes, et à " ; echo " 1 - 2 x".sup("2")." + 6 x".sup("3")." avec les puissances croissantes." ; finp() ; p("texte") ; echo "Ecrire un programme PHP qui lit une telle liste et qui affiche le polynome comme ci-dessus." ; finp() ; p("texte") ; echo "Pour les plus courageuses et les plus courageux, implémenter la saisie d'un deuxième polynome, " ; echo " puis calculer et afficher leur somme, leur produit, leur polynome équivalent à leur fonction primitive et celui de leur fonction dérivée. " ; finp() ; finblockquote() ; solution($numExo,$numTp) ; vnc() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- finPageTp($numTp) ; # contient finSection() et finPage() ; la fonction est dans l2a_inc.php ?>La coloration syntaxique est réalisée par : SyntaxHighlighter.
Si vous préférez, vous pouvez utiliser celle de geshi ou même celle construite autour de la fonction highlight_file.
Retour à la page principale de (gH)