Programmation PHP. François Rioult



Documents pareils
Algorithmique et Programmation, IMA

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Algorithmique et programmation : les bases (VBA) Corrigé

STAGE IREM 0- Premiers pas en Python

Algorithme. Table des matières

Introduction à MATLAB R

Programmation Web. Madalina Croitoru IUT Montpellier

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

INTRODUCTION A JAVA. Fichier en langage machine Exécutable


1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

TP 1. Prise en main du langage Python

1 Lecture de fichiers

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Premiers Pas en Programmation Objet : les Classes et les Objets

1 Recherche en table par balayage

Cours 1 : Qu est-ce que la programmation?

Utilisation d objets : String et ArrayList

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Corrigé des TD 1 à 5

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Initiation à la programmation en Python

Cours 14 Les fichiers

URECA Initiation Matlab 2 Laurent Ott. Initiation Matlab 2

L informatique en BCPST

Bases de programmation. Cours 5. Structurer les données

Recherche dans un tableau

IV- Comment fonctionne un ordinateur?

Conventions d écriture et outils de mise au point

TP1. Outils Java Eléments de correction

Représentation d un entier en base b

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

Présentation du langage et premières fonctions

Définitions. Numéro à préciser. (Durée : )

Représentation des Nombres

Programmation système I Les entrées/sorties

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Créer le schéma relationnel d une base de données ACCESS

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Initiation à LabView : Les exemples d applications :

TP3 : Manipulation et implantation de systèmes de fichiers 1

TP1 - Prise en main de l environnement Unix.

Installation de Windows 2003 Serveur

Les structures de données. Rajae El Ouazzani

Module http MMS AllMySMS.com Manuel d intégration

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Cours d initiation à la programmation en C++ Johann Cuenin

Algorithmique et structures de données I

Chapitre 2 Devine mon nombre!

Cours Informatique Master STEP

Université du Québec à Chicoutimi. Département d informatique et de mathématique. Plan de cours. Titre : Élément de programmation.

MANUEL DE L UTILISATEUR

Initiation à la Programmation en Logique avec SISCtus Prolog

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Organigramme / Algorigramme Dossier élève 1 SI

Stockage du fichier dans une table mysql:

PROJET ALGORITHMIQUE ET PROGRAMMATION II

1. Structure d'un programme FORTRAN 95

La mémoire. Un ordinateur. L'octet. Le bit

TD3: tableaux avancées, première classe et chaînes

Formation. Module WEB 4.1. Support de cours

Les chaînes de caractères

Les fichiers. Chapitre 4

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

A.-M. Cubat PMB - Import de lecteurs - Généralités Page 1 Source :

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Dans l'article précédent, vous avez appris

Table des matières Avant-propos... V Scripting Windows, pour quoi faire?... 1 Dans quel contexte?

Cours Informatique 1. Monsieur SADOUNI Salheddine

PG208, Projet n 3 : Serveur HTTP évolué

Cours d algorithmique pour la classe de 2nde

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Stocker des données sur Amazon S3

TUTORIEL Qualit Eval. Introduction :

Découverte du logiciel ordinateur TI-n spire / TI-n spire CAS

EXCEL PERFECTIONNEMENT SERVICE INFORMATIQUE. Version /11/05

INITIATION A L INFORMATIQUE. MODULE : Initiation à l'environnement Windows XP. Table des matières :

TP 1 Prise en main de l environnement Unix

Création, analyse de questionnaires et d'entretiens pour Windows 2008, 7, 8 et MacOs 10

TP : Gestion d une image au format PGM

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

DM 1 : Montre Autoquartz ETA

Programmer en JAVA. par Tama

L envoi d un formulaire par courriel. Configuration requise Mail Texte Mail HTML Check-list

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Chapitre I Notions de base et outils de travail

CARPE. Documentation Informatique S E T R A. Version Août CARPE (Documentation Informatique) 1

MANUEL UTILISATEUR BALADEUR SANTÉ AUXILIAIRES MÉDICAUX ET SAGES-FEMMES C.D.C 1.40

Plan du cours. Historique du langage Nouveautés de Java 7

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

FOIRE AUX QUESTIONS PAIEMENT PAR INTERNET. Nom de fichier : Monetico_Paiement_Foire_aux_Questions_v1.7 Numéro de version : 1.7 Date :

Transcription:

Programmation PHP François Rioult 3 décembre 2007

Table des matières 1 Notion de programme, instructions 5 1.1 Premier exemple : lire un message et l afficher............. 5 1.1.1 Entrée / sortie.......................... 5 1.1.2 Suite de l exemple....................... 6 1.1.3 Séquencement......................... 7 1.1.4 Variable............................. 7 1.2 Structures de contrôle.......................... 9 1.2.1 Instruction conditionnelle................... 9 1.2.2 Itérations............................ 10 1.3 Bilan................................... 12 2 TD1 14 2.1 Découvrir................................ 14 2.2 Programmes et exercices (TD)..................... 14 2.2.1 Afficher le double d un nombre choisi par l utilisateur.... 14 2.2.2 Afficher le nombre de lettres et le nombre de "a" que contient un mot choisi par l utilisateur................. 15 2.2.3 Exercice............................. 15 2.2.4 Comparer deux nombres saisis par l utilisateur - différentes écritures............................. 15 2.2.5 Répondre des messages différents en fonction du nom de l utilisateur............................. 17 2.2.6 Exercice............................. 17 2.2.7 Répeter un traitement jusqu à ce que l utilisateur veuille s arrêter 17 2.2.8 Amélioration : compter le nombre de traitements faits.... 17 2.3 Jeu du nombre mystérieux....................... 19 2.4 Vote................................... 20 2.4.1 Version 1 : saisie des noms au clavier............. 20 2.4.2 Version 2 : les noms sont stockés dans un fichier....... 20 3 Fichier texte et algorithmes sur les fichiers 21 3.1 Notion de fichier texte......................... 21 3.1.1 Définition............................ 21 3.1.2 Principe d utilisation des fichiers textes............ 22 3.2 Algorithmes élémentaires sur les fichiers................ 24 3.2.1 Lecture d un fichier....................... 24 3.2.2 Création et écriture d un fichier................ 27 1

4 TP 2 - Calcul de moyenne de notes 28 4.1 Exercice 1 : moyenne de notes par personne.............. 28 5 Les tableaux 30 5.1 Les tableaux simples.......................... 30 5.2 Les chaînes de caractères........................ 32 5.3 Les tableaux associatifs......................... 33 5.4 Fonctions pour les tableaux....................... 35 6 TD 3 36 6.1 Exercice................................. 36 6.1.1 Manipulations......................... 36 6.2 Exercice................................. 36 7 TP 3 39 7.1 Exercice................................. 39 7.2 Exercice................................. 39 7.2.1 Version élémentaire....................... 39 7.2.2 Vérification des balises..................... 39 7.2.3 Vérification avancée...................... 39 8 Les fonctions 41 8.1 Exemples................................ 41 8.2 Portée des variables........................... 43 8.3 Génie logiciel.............................. 45 8.4 Récursivité............................... 46 8.5 Passage par référence.......................... 47 9 TD 4 50 9.1 Exercice................................. 50 9.2 Exercice................................. 50 10 TP 4 51 10.1 Exercice................................. 51 10.1.1 Exercice............................. 51 10.2 Exercice................................. 51 10.3 Exercice................................. 51 11 Formulaires 52 11.1 GET et POST.............................. 52 11.2 Bouclage sur un formulaire....................... 53 12 TD 5 57 12.1 Exercice................................. 57 12.2 Exercice................................. 57 12.3 Exercice................................. 57 13 TP 5 58 14 Les bases de données 59 14.1 Instruction PHP............................. 59 2

15 Enchaînement de scripts 62 15.1 Librairie................................. 65 15.2 Mise en forme HTML.......................... 69 15.3 Insertion des fragments HTML..................... 71 15.4 Champ caché.............................. 73 16 TD 7 74 16.1 Exercice................................. 74 16.2 Exercice................................. 74 16.3 Exercice................................. 74 17 TP 7 75 17.1 Préliminaires.............................. 75 17.2 Formulaire client............................ 75 17.3 Formulaire produits........................... 75 17.4 Facturation............................... 75 18 Programmation objet 76 18.1 Introduction............................... 76 18.2 Conception orientée objet........................ 77 18.3 Passage d objet............................. 81 18.4 Exemple................................. 82 18.5 Documentation............................. 83 19 TD 8 84 19.1 Exercice................................. 84 20 TP 8 85 20.1 Préliminaires.............................. 85 20.2 Classe client............................... 85 20.3 Classe produits............................. 85 20.4 Documentation............................. 86 21 Héritage 87 21.1 Session PHP............................... 87 21.2 Classe des formulaires......................... 87 22 TD 9 103 22.1 Exercice................................. 103 22.2 Exercice................................. 103 23 TP 9 104 23.1 Préliminaires.............................. 104 23.2 Classe produits............................. 104 23.3 Documentation............................. 104 24 Application objet 105 24.1 Curl................................... 106 24.2 Conception............................... 108 24.3 Réalisation............................... 113 3

25 TD - 10 116 25.1 Classe Cddb............................... 116 25.2 Classe Client.............................. 116 26 TP 10 117 26.1 Préliminaires.............................. 117 26.2 Classe disques.............................. 117 26.3 Classe clients.............................. 117 27 Images dynamiques - file upload 118 27.1 Méthodes statiques........................... 118 27.2 File upload - scripts CGI........................ 118 27.3 Images dynamiques........................... 119 27.4 Taquin.................................. 120 27.4.1 Classe Vignette....................... 120 27.4.2 Classe Image......................... 122 27.4.3 Classe Case.......................... 123 27.4.4 Classe Grille......................... 123 28 TD 11 127 29 TP 11 128 29.1 Préliminaires.............................. 128 29.2 Classe Grille............................... 128 30 Introduction à la complexité 129 30.1 Géodésie................................ 129 30.2 Complexité............................... 129 30.2.1 Comparaison de fonctions classiques............. 129 30.2.2 Exemple simple......................... 131 30.2.3 Exemple amélioré....................... 131 30.2.4 Problème de recherche..................... 131 30.3 Recherche de plus court chemin.................... 131 30.3.1 Graphe............................. 131 30.3.2 Solution simple......................... 132 30.3.3 Algorithme de DIJKSTRA................... 132 30.4 Conseils................................. 132 30.5 Généricité................................ 133 30.6 Sources................................. 133 31 TD 12 135 32 TP 12 136 A Séquence 8 137 A.1 TD 8................................... 137 A.2 TP 8................................... 140 4

Chapitre 1 Notion de programme, instructions 1.1 Premier exemple : lire un message et l afficher Programme : description précise d actions à exécuter sur un ordinateur pour réaliser une tâche. Les programmes ne se rencontrent pas seulement en informatique. Exemples : partition musicale, recette de cuisine, méthode pour calculer la longueur moyenne et le poids moyen d un ensemble de personnes. Traitement automatique : signifie que le traitement, une fois défini, ne dépend que des données fournies en entrée et non de choses extérieures. L ordinateur n est pas l unique type de machine à effectuer des traitements automatiques (ou programmés) : un orgue de barbarie, un métier à tisser automatique, une machine à laver sont aussi des machines programmées. Exemple de programme PHP : afficher un message à l écran Voici ce premier programme : <?php echo "Bonjour à tous\n" ;?> Remarquer les balises <?php et?> pour indiquer au système qu il s agit d un script PHP. Ces balises doivent obligatoirement être présentes. Le texte entre " " est une chaine de caractères. \n est le saut de ligne dans un contexte de chaîne. Pour exécuter le programme (stocké dans le fichier de nom test1.php), taper la ligne de commande : bruno@pc159:~$ php test1.php 1.1.1 Entrée / sortie On souhaite maintenant modifier le programme pour que celui-ci demande à l utilisateur son nom et l affiche. De quoi avons-nous besoin? entrée / sortie : saisie du nom (entrée) et affichage (sortie), 5

variable : pour stocker et retrouver le nom. Les notions d entrée / sortie (encore appelées lecture / écriture) sont à considérer du point de vue de l ordinateur (cf. figure 1.1). écrire humain lire FIG. 1.1 lecture / écriture entrée : l utilisateur fournit des informations à l ordinateur (i.e. lecture d information de la part de l ordinateur) : l instruction lire() collecte une ligne de saisie (fin de la saisie terminée par <RETOUR>). sortie : l ordinateur donne des informations à l utilisateur (i.e. écriture (affichage) d information de la part de l ordinateur) : la fonction echo envoie ses arguments sur le périphérique de sortie standard. Remarque : La fonction lire utilisée dans les programmes qui suivent pour lire une chaine de caractères tapée au clavier par l utilisateur, n est pas une fonction prédéfinie dans PHP. La suite d instructions permettant de réaliser ce travail n est pas détaillée ici cer elle est un peu complexe pour démarrer. Le code de cette fonction est rangé dans le fichier fonctions1.inc que vous devez recopier dans votre répertoire de travail. Pour pouvoir l utiliser dans un programme rajouter en tête du programme l instruction : require("fonctions1.inc") 1.1.2 Suite de l exemple Voici le programme qui permet de réaliser cette version améliorée de l exemple. <?php require("fonctions1.inc"); echo "Bonjour à tous\n" ; echo "Quel est ton nom : " ; $NomPersonne = lire() ; print "Bonjour ", $NomPersonne ;?> Voici maintenant un exemple de résultat d exécution de ce programme. Bonjour à tous Quel est ton nom : fanny Bonjour fanny En fait dans un premier temps il y a eu seulement affichage de : 6

Bonjour à tous Quel est ton nom : Le programme s arrête, et reprend son exécution lorsque l utilisateur a fini de taper une chaine de caractères terminée par un retour-chariot. Le reste du texte est alors affiché. 1.1.3 Séquencement Séquencement. Les instructions d un programme sont exécutées séquentiellement. Cela signifie : les instructions sont traitées les unes après les autres, chaque instruction est traitée une fois, aucune n est répétée ni omise, les instructions sont traitées de la première à la dernière, le programme est alors fini, l état final (par exemple, les variables et leurs valeurs) d une instruction devient l état initial de l instruction qui la suit. Marque de séquencement séparant deux instructions : " ;". 1.1.4 Variable $Nompersonne est ce que l on appelle une variable. En informatique, une variable est un objet permettant de stocker et de retrouver une information en mémoire (cf. figure 1.2). <nom> <valeur> $Utilisateur Pierre FIG. 1.2 schématisation d une variable Une variable est caractérisée par : nom : choisi par le programmeur, désigne la variable sans ambiguïté (ici : $NomPersonne). valeur : contenu de la variable (ici : fanny après que l utilisateur ait fini de taper ce texte au clavier. Remarque : une variable peut être "accessible" de certains points d un programme et pas d autres. C est ce que l on appelle la portée d une variable. Cette question sera vue avec la modularité. Pas de véritable notion de type en PHP (contrairement à d autres langages). Un nom de variable commence par $ Choisir des noms significatifs pour les variables. PHP distingue majuscules / minuscules. Convention possible : faire ressortir les différentes parties d un nom par une majuscule. Initialisation de variables par défaut par PHP. Cette initialisation dépend du contexte (la notion de contexte sera ultérieurement détaillée). Si la variable considérée est : 7

nombre : valeur 0, chaîne : chaîne vide, valeur booléenne attendue : valeur "faux" (codée FALSE) Attention : une chaîne ayant la valeur 0 est considérée dans un contexte booléen comme ayant la valeur faux. Exemple (cet exemple sera détaillé à la section 1.2.1). <?php if ($A) { echo "vrai \n" ; else { echo "faux \n" ;?> faux affiche si $A n est pas initialisé. faux est aussi affiché si $A a la valeur 0 mais vrai est affiché si $A a (par exemple) la valeur 1 Autre exemple : echo "Somme = ", 30 + $A + 10 ; echo "\n" ; echo "Chaine = ", "30". $A. "10" affiche : Somme = 40 Chaine = 3010 Affectation. Assignation d une valeur à une variable : symbole = (à ne pas confondre avec la notion d égalité!). $N1 = $N2 ; $N1 est le receveur, $N2 le donneur Le donneur peut être n importe quelle expression, le receveur doit être un emplacement valide de stockage (variable, élément de tableau). $N1 = $N1 + $N2 ; $N1 est ici d abord donneur puis receveur. Dans le texte ci-dessus lire() est ce que l on appelle une fonction. Quand l instruction $NomPersonne = lire(), est rencontrée, il y a successivement exécution de la fonction lire() : le programme s arrète et ne reprend qu après que l utilisateur ait tapé un retour chariot. la chaine de caractère qu a tapé l utilisateur est considérée comme le résultat de la fonction lire(). On dit que lire() retourne cette chaine de caractères. cette valeur retournée est affectée à la variable $NomPersonne Quand le programme passe à l instruction suivante echo "Bonjour", $NomPersonne, c est alors la valeur de cette variable qui est utilisée pour exécuter l instruction et produire l affichage. 8

1.2 Structures de contrôle 1.2.1 Instruction conditionnelle Imaginons qu on veuille personnaliser la réponse : si l utilisateur est Pierre, on affiche bonjour mon cher Pierre, sinon bonjour <Nom de l utilisateur>. Pour cela, il faut utiliser une instruction conditionnelle. if (expression) { instruction1 ; instruction2 ; else { instruction3 ; instruction4 ; Dans le contexte d une instruction conditionnelle, <expression>, (aussi appelée test ), est évaluée à une valeur booléenne (TRUE ou FALSE). Ne pas oublier les () autour de <expression>. Les délimiteurs de blocs sont impératifs dès que il y au moins deux instructions à exécuter dans une alternative. Le else et les instructions qui le suivent peuvent être absents. <?php require("fonctions1.inc"); echo "Bonjour à tous\n" ; echo "Quel est ton nom : " ; $NomPersonne = lire() ; if ($NomPersonne == "Pierre") { echo "Bonjour mon cher Pierre"\n" ; else { echo "Bonjour ", $NomPersonne,"\n" ;?> Remarques : Ici les { auraient pu être omises puisque dans chaque alternative il n y a qu une seule instruction à exécuter. Observer l indentation du texte du programme. Elle n est pas significative pour PHP. Le texte pourait être écrit entièrement sur une seule ligne. Mais une bonne disposition facilite la lecture et la compréhension de la structuration du programme pour le programmeur. Une partie entre accolades s appelle un bloc. Le ; qui suit un bloc peut-être omis. S il y a plus de deux alternatives on peut utiliser une "cascade" de elseif : <?php require("fonctions1.inc") ; echo "Bonjour à tous\n" ; 9

echo "Quel est ton nom : " ; $NomPersonne = lire() ;?> if ($NomPersonne == "Pierre") { echo "Bonjour mon cher Pierre \n" ; elseif ($NomPersonne == "Marie") { echo "Bonjour ma chère Marie\n" ; elseif ($NomPersonne == "Clara") { echo "Bonjour ma très chère Clara\n" ; else { echo "Bonjour ", $NomPersonne,"\n" ; Remarquez que les différentes alternatives sont disjointes : si on passe dans une, les suivantes sont ignorées même si une ou plusieurs conditions sont vérifiées. Comme dit précédemment, l évaluation de l expression qui suit le if doit produire vrai ou faux. Par extension on considèrera qu une chaine de caractères qui n est pas vide ou un nombre non nul à la valeur TRUE. La chaine vide et 0 sont considérés comme ayant la valeur booléenne FALSE. Exemple : <?php if ($A) { print "vrai \n" ; else { print "faux \n" ;?> Dans le programme ci-dessus $A n a jamais reçu d affectation. Il est considéré comme étant la chaine vide ou le nombre 0 et dans le test l évaluation booléenne sera donc faux. Ce programme affichera donc le mot faux. 1.2.2 Itérations On souhaite répéter l affichage du message tant que la chaîne fin n est pas tapée. Pour cela, on utilise une itération : while (expression) { instruction1 ; instruction 2 ; L itération est répétée tant que expression a la valeur vrai. Dans le contexte d une itération, <expression>, (i.e. test ), est évaluée à une valeur booléenne. Ne pas oublier les () autour <expression>. Le bloc entre accolades qui suit le while s appelle le corps de la boucle. (expression) exprime la "condition d arrêt". 10

<?php require("fonctions1.inc"); echo "Bonjour à tous\n" ; echo "Quel est ton nom : " ; $NomPersonne = lire() ; while ($NomPersonne!= "fin") { if ($NomPersonne == "Pierre") { echo "Bonjour mon cher Pierre\n"; elseif ($NomPersonne == "Marie") { echo "Bonjour ma chère Marie\n"; else { echo "Bonjour ", $NomPersonne,"\n" ; ; echo "Quel est le nom suivant : " ; $NomPersonne = lire() ; ; Remarques : ($NomPersonne!= "fin") est un test qui prend la valeur vrai si la valeur de $NomPersonne est différente de fin Observer le == pour tester l égalité entre la valeur reçue par $NomPersonne et les chaines Pierre ou Marie suivant le cas. Observer que l instruction $NomPersonne = lire() ; apparaît deux fois. Une première fois avant le while pour saisir le nom de la première personne. Une deuxième fois en fin de boucle, afin d avoir une nouvelle valeur de $NomPersonne avant de refaire le test. Il existe plusieurs structures de contrôle permettant de réaliser des boucles, et souvent plusieurs manières différentes d écrire des traitement identiques ou voisins. Nous y reviendrons ultérieurement. Reprenons le programme précédent. On veut en outre compter le nombre de personnes à qui le programme dit bonjour. Quel va être le principe? L expliciter en langage courant. Quelles variables et traitement sont à introduire? Voici une solution : <?php /*commentaire Saluer des personnes. Ce programme permet de montrer les briques élémentaires d un programme. */ require("fonctions1.inc"); echo "Bonjour à tous\n" ; $NbPersonne = 0 ; // initialisation facultative echo "Quel est ton nom : " ; 11

$NomPersonne = lire() ; while ($NomPersonne!= "fin") { $NbPersonne = $NbPersonne + 1 ; if ($NomPersonne == "Pierre") { echo "Bonjour mon cher Pierre\n"; elseif ($NomPersonne == "Marie") { echo "Bonjour ma chère Marie\n"; else { echo "Bonjour ", $NomPersonne,"\n"; ; echo "Quel est le nom suivant : " ; $NomPersonne = lire() ; ;?> echo "J ai dit bonjour à ", $NbPersonne, " personne (s).\n" ; /*... */ encadrent un texte que l on appelle commentaire, qui peut tenir sur plusieurs lignes. // précède également un commentaire mais qui occuppe uniquement la fin de la ligne. Les commentaires sont ignorés par PHP. Ils sont très utiles au programmeur et autres lecteurs du programme pour comprendre celui-ci. Remarquer ici l instruction $NbPersonne = $NbPersonne + 1 ; L exécution de cette instruction se déroule selon un mécanisme analogue à celui décrit un peu plus haut pour l affectation $NomPersonne = lire() ; $NbPersonne + 1 est exécuté ou plus exactement calculé. le résultat de ce calcul est rangé dans la variable à gauche du signe = cette instruction a donc pour effet d augmenter de 1, la valeur connue par le système pour la variable $NbPersonne 1.3 Bilan Effectuons le bilan de chapitre : Un programme se compose d instructions, celles-ci sont ordonnées et exécutées séquentiellement. Deux types d instructions : instruction élémentaire : instruction directement comprise par PHP : affectation, lecture, fonctions (echo, log,...). instruction non élémentaire et écrite par le programmeur : (lire()... Une telle instruction est écrite pour réaliser une tâche et finit toujours par se décomposer en termes d instructions élémentaires (cf. fonctions et cours sur la modularité). On distingue : mots réservés : mots et symboles appartenant à PHP : echo, print, if, $, ;,... 12

mots ou instructions librement choisis par le programmeur en respectant les conventions du langage : $NbPersonne = 0 ;... Commentaire : texte facilitant la lecture du programme par un humain mais non exploité par la machine. Remarquez la notation différente entre commentaire uniligne et multiligne. Présentation : PHP est un langage de format libre : en général, les espaces entre éléments sont optionnels. Remarquez l indentation, elle est importante pour la lisibilité du programme par le programmeur. Principe de déroulement d un programme (cf. figure 1.3). état initial données programme FIG. 1.3 déroulement d un programme état final résultats Les instructions manipulent des objets portant l information : les variables. Les variables sont consultées ou modifiées. Analogie avec les langues naturelles : nom : variable, comme endroit pour conserver quelque chose, un endroit qui a un nom. verbe : commande. Une instruction commençant par un verbe est en général impérative et est évaluée pour ses effets secondaires. Ces verbes sont souvent appelés procédures (la commande echo est un tel verbe, la sortie est l effet secondaire désirée). D autres verbes traduisent leurs paramètres d entrée en valeurs de retour (fonctions). 13

Chapitre 2 TD1 2.1 Découvrir gérez vos répertoires et vos fichiers : créez un répertoire pour le module d analyse / programmation en PHP, des sous-répertoires par séquence ou thème. suffixez vos scripts PHP par.php travaillez par analogie : sachez récupérer un programme et le transformer pour vos propres besoins. récupérez les programmes vus en cours, copiez-les dans votre répertoire de travail, exécutez-les, modifiez-les à votre guise pour observer les différences, jusqu à ce que vous ayez bien compris le rôle de chaque instruction. 2.2 Programmes et exercices (TD) 2.2.1 Afficher le double d un nombre choisi par l utilisateur Programme doublelog.php <?php //ce programme affiche le double et le logarithme d un nombre choisi // par l utilisateur?> require("fonctions1.inc"); // Pour pouvoir utiliser la fonction lire echo "Voici notre premier exemple \n"; echo "Donnez moi un nombre : \n"; $nombre = lire(); echo "le double de ce nombre est ",$nombre+$nombre,"\n"; //on aurait aussi pu écrire : // $double = $nombre + $nombre; // echo "le double de ce nombre est $double"; 14

2.2.2 Afficher le nombre de lettres et le nombre de "a" que contient un mot choisi par l utilisateur Programme nblettres.php <?php /* Affiche le nombre de lettres et le nombre de a d un mot choisi par l utilisateur */ require("fonctions1.inc"); echo "Voici notre deuxieme exemple \n"; echo "Donnez moi un mot : \n"; $mot = lire(); $longueur = strlen($mot); $nba = substr_count($mot,"a");?> echo "ce mot est composé de $longueur lettres \n"; echo "il contient $nba fois la lettre a \n"; 2.2.3 Exercice En vous inspirant des deux exemples qui précèdent écrire les deux programmes ci-dessous : 1. On demande deux nombres à l utilisateur, afficher leur somme et leur produit. 2. On demande un mot à l utilisateur, afficher le nombre de voyelles de chaque type et le nombre total de voyelles. 2.2.4 Comparer deux nombres saisis par l utilisateur - différentes écritures Programme comparenombres1.php <?php // Comparaison de deux nombres require("fonctions1.inc"); // Saisie des nombres ============================= echo "Donnez-moi un nombre \n "; $Nombre1 = lire(); echo "Donnez-moi un autre nombre \n"; $Nombre2 = lire(); // Comparaison ==================================== if ($Nombre1 < $Nombre2) { echo "le premier nombre est plus petit que le deuxième \n" ; 15

?> else {echo "le premier nombre est supérieur ou égal au deuxième \n" ;; Version un peu améliorée : Programme comparenombres2.php <?php Comparaison de deux nombres avec test d égalité require("fonctions1.inc"); // Saisie des nombres ============================= echo "Donnez-moi un nombre \n "; $Nombre1 = lire(); echo "Donnez-moi un autre nombre \n"; $Nombre2 = lire();?> // Comparaison ==================================== if ($Nombre1 < $Nombre2) { echo "le premier nombre est plus petit que le deuxième \n" ; elseif ($Nombre2 < $Nombre1) {echo "le deuxième nombre est inférieur au premier \n" ; else { echo "Les deux nombres sont egaux \n"; Ou encore Programme comparenombres3.php <?php Comparaison de deux nombres avec test d égalité require("fonctions1.inc"); // Saisie des nombres ============================= echo "Donnez-moi un nombre \n "; $Nombre1 = lire(); echo "Donnez-moi un autre nombre \n"; $Nombre2 = lire();?> // Comparaison ==================================== if ($Nombre1 == $Nombre2) { echo "Les deux nombres sont égaux \n" ; elseif ($Nombre2 < $Nombre1) {echo "le deuxième nombre est inférieur au premier \n" ; else { echo "Le premier nombre est inférieur au second \n"; 16

2.2.5 Répondre des messages différents en fonction du nom de l utilisateur Programme nom.php <?php require("fonctions1.inc");?> echo "quel est votre nom \n"; $NomPersonne = lire(); if ($NomPersonne == "fanny") { print "Bonjour ma chère fanny"; else {print "Bonjour $NomPersonne"; 2.2.6 Exercice Ecrire un programme qui compare le nombre de voyelles de deux mots donnés par l utilisateur. 2.2.7 Répeter un traitement jusqu à ce que l utilisateur veuille s arrêter On reprend le programme qui répond des messages différents à l utilisateurs Programme nomiter1.php <?php require("fonctions1.inc"); echo "quel est votre nom \n"; $NomPersonne = lire();?> while ($NomPersonne!= "fin") { if ($NomPersonne == "fanny") print "Bonjour ma chère fanny\n"; else print "Bonjour $NomPersonne\n"; echo "quel est votre nom \n"; $NomPersonne = lire(); 2.2.8 Amélioration : compter le nombre de traitements faits Le même en comptant le nombre de personnes saluées. Programme nomiter2.php 17

<?php require("fonctions1.inc"); echo "quel est votre nom \n"; $NomPersonne = lire(); $NbPersonne = 0;?> while ($NomPersonne!= "fin") {$NbPersonne = $NbPersonne +1 ; if ($NomPersonne == "fanny") print "Bonjour ma chère fanny\n"; else print "Bonjour $NomPersonne echo "quel est votre nom \n"; $NomPersonne = lire(); echo \n"; "j ai salué $Nbpersonnes \n"; 18

2.3 Jeu du nombre mystérieux Dans le jeu du nombre mystérieux, l ordinateur tire au hasard un nombre que l utilisateur doit deviner. Pour cela, l utilisateur propose un nombre : s il est trop petit, l ordinateur répond trop petit, s il est trop grand, l ordinateur répond trop grand, sinon, c est que le nombre proposé par l utilisateur est celui choisi par l ordinateur : l utilisateur a alors gagné. Le but de cet exercice est d écrire en procédant par étapes un programme de jeu du nombre mystérieux. Dans cet exercice, les étapes sont proposés et chaque étape complète la précédente. 1. Dans un premier temps, on triche : le nombre mystérieux n est pas tiré au hasard : il est fixé (par le programmeur) dans une variable. Cela permettra de faire plus facilement les tests! Ecrivez le programme qui initialise cette variable et demande un nombre à l utilisateur. 2. Indiquez au joueur si le nombre qu il a proposé est plus petit, plus grand ou s il a gagné. 3. Répétez les tours de jeu jusqu à ce que le joueur ait deviné. 4. Indiquez en combien de tours le jour a deviné. On pourra adresser un message de félicitations si le joueur a deviné (par exemple) en moins de 8 tours. 5. Maintenant c est l ordinateur qui choisit le nombre. En phase de test, vous pouvez en début de partie faire afficher le nombre choisi. Evidemment en version finale cet affichage disparaitra. Indication : Le fichier fonctions1.inc contient une fonction choix() qui retourne un nombre compris entre 0 et 100. 6. Bien sûr, d autres améliorations sont possibles : Enchaîner les parties : à la fin d une partie, le programme demande à l utilisateur s il souhaite enchaîner une nouvelle partie. Indroduisez une condition d arrêt supplémentaire : si au bout d un certain nombre d essais (fixé par l utilisateur ou le programme) l utilisateur n a pas trouvé le nombre mystérieux, le programme s arrête automatiquement. Ajoutez un message de d accueil pour souhaiter la bienvenue à l utilisateur, un message d adieu. Le programme peut demander au début le nom de l utilisateur et le message d adieu peut ainsi être personnalisé à l utilisateur. Modifiez le programme pour qu il compte le nombre d essais de l utilisateur et qu il affiche, à chaque proposition de l utilisateur, le nombre d essais effectués. 19

2.4 Vote 2.4.1 Version 1 : saisie des noms au clavier Dans une petite commune, les électeurs, lors d une élection partielle, ont le choix entre deux candidats, mais peuvent aussi voter pour une personne de leur choix. On souhaite connaître le nombre et le pourcentage de votes pour les deux candidats officiels. Scénario : les électeurs saisissent au clavier (l anonymat et la validité du vote sont garantis!), chacun leur tour le nom de la personne pour laquelle ils désirent voter. A la clôture du bureau, le responsable tape fin pour terminer la saisie et afficher le résultat (partiel) de l élection. 1. Ecrivez d abord un programme qui accepte des noms désignant les élus potentiels (par exemple, pierre, marie,...) saisis au clavier et affiche, après chaque saisie : Vous avez voté pour XXX. La chaîne fin indique la fin de saisie. fin ne doit pas être affiché comme un vote. 2. Modifiez le programme pour que celui-ci connaisse les noms des deux candidats déclarés saisis au clavier et indique : le nombre de voix obtenu par chacun de ces candidats lequel de ces deux candidats a obtenu le plus de le plus de voix. 3. Indiquez le pourcentage de voix de chacun des candidats par rapport au nombre total de votants. Avant de vous lancer dans les modifications du programme, réfléchissez aux questions suivantes : comment s obtient (se calcule) un pourcentage? quelle variable faut-il introduire? Que se passe-t-il si personne ne vient voter? 2.4.2 Version 2 : les noms sont stockés dans un fichier On suppose maintenant que les noms ne sont plus saisis au clavier mais qu ils ont été rangés dans un fichier au fur et à mesure du vote et qu un traitement de ce fichier est ensuite fait pour calculer les résultats. Ecrire un fichier texte contenant les votes (1 nom par ligne). Modifiez le programme précédent, pour qu il lise ce fichier et affiche les résultats du vote. Modifier le programme pour que le nom du fichier texte contenant les votes soit saisi au clavier et qu un message d erreur s affiche si le fichier n est pas trouvé. 20

Chapitre 3 Fichier texte et algorithmes sur les fichiers 3.1 Notion de fichier texte 3.1.1 Définition Définition d un fichier. Un fichier est un ensemble d informations identifié par un nom et enregistré sur un support magnétique. Un fichier texte est une suite de caractères ASCII. Ces caractères sont organisés en lignes. Chaque ligne est terminée par le caractère <RETOUR> (facultatif pour la dernière ligne). Les différentes lignes ne sont pas nécessairement de même longueur. Historiquement, une ligne (ou fiche) d un fichier correspondait à un élément (par exemple, les fiches signalétiques des livres d une bibliothèque, des caractéristiques d individus d une même population,...). La figure 3.1 représente un fichier texte. fin de ligne fin de fichier FIG. 3.1 schématisation d un fichier Intérêts des fichiers : stockage sur un support permanent (disque dur, disquette) autorisant l archivage et non pas en mémoire vive, 21

stockage d informations nécessaires à plusieurs programmes (cela évite de devoir maintenir une information commune à plusieurs programmes, cette idée débouchant sur les systèmes de gestion de bases de données). La contiguïté est l ordre implicite des éléments du fichier : la correspondance entre une position et un élément est implicite (on est sur le 3ème élément uniquement parce que celui-ci a deux prédécesseurs). Les fichiers textes standards ne permettent pas d accéder directement à une ligne : pour accéder à la ième ligne, il faut parcourir les (i-1)ème premières. 3.1.2 Principe d utilisation des fichiers textes Un fichier texte peut être édité et manipulé avec un éditeur de texte. Dans certains cas, c est le moyen le plus aisé pour le modifier (par exemple, remplacer une ligne). Dans d autres cas, un programme effectuera plus aisément la tâche (par exemple remplacer une chaîne de caractères par une autre pour les lignes impaires du programme). Il peut être aussi nécessaire d accéder à un fichier par le biais d un programme pour, par exemple, accéder à des données ou enregistrer des résultats. La manipulation d un fichier texte par un programme nécessite les 3 étapes suivantes : 1. Ouverture du fichier. Cette étape comprend 2 opérations : (a) effectuer le lien entre le nom du fichier dans le programme) et le nom physique du fichier (nom du fichier en mémoire secondaire) : canal d entrée / sortie. (b) indiquer le mode d utilisation du fichier : lecture, écriture ou ajout de données (en fait, d autres modes sont possibles). 2. Traitement des éléments du fichier. Exemple : lecture des lignes, écriture d information. Pour un fichier séquentiel, l accès se fait élément par élément sans possibilité de retour en arrière (si on souhaite revenir en arrière, il est nécessaire de fermer le fichier, puis de le ré-ouvrir et d avancer jusqu à atteindre l élément désiré). Le caractère de fin de fichier permet d arrêter l itération. En général, les algorithmes ont la forme indiquée à la figure 3.2. ouverture en lecture : ouverture en écriture lire fichier : <FICHIER> traiter ligne traiter ligne écrire fichier : print FICHIER...; FIG. 3.2 principe des algorithmes usuels sur les fichiers 3. Fermeture du fichier. En PHP, l ouverture du fichier est effectuée par la fonction fopen qui possède deux arguments. Par exemple : $FichPers = fopen("fpers1.txt","r") ; 22

fopen renvoie un pointeur (ou descripteur ou handle) de fichier (sauf en cas d échec ou false est retourné). Le fichier fpers1.txt (qui est dans le répertoire courant) est ouvert en lecture. Le mode d utilisation du handle de fichier est désigné par le deuxième argument de fopen : r (comme dans l exemple ci-dessus) : le fichier est ouvert en lecture seule. Le programme est prêt à lire le premier élément, mais celui-ci n est pas encore lu. w : ouverture en écriture seule. Si le fichier n existe pas, il est créé (et son contenu est vide), s il existe déjà, cette opération le vide de son contenu (cela permet de réinitialiser un fichier). a : ouverture en ajout. Si le fichier n existe pas, il est créé. Dans tous les cas, on est positionné à la fin du fichier, prêt à écrire un nouvel élément après le dernier élément. Exemples d échec : tentative d ouverture en lecture d un fichier qui n existe pas ou pour lequel on ne dispose pas des autorisations, tentative d ouverture en écriture sur un fichier protégé en écriture, à un répertoire inaccessible. Aussi, il est judicieux de vérifier les valeurs de retour des fonctions fopen et fclose (cf. exemple ci-dessous). Un appel à fclose peut échouer en cas de disque plein, si le serveur contenant le fichier devient inaccessible, etc. la fermeture du fichier s effectue avec fclose avec comme argument un pointeur de fichier. Par exemple : fclose($fichpers) ; test de fin de fichier : feof avec comme argument un pointeur de fichier. lecture dans un fichier. Il existe plusieurs fonctions (pf désigne un pointeur de fichier) : fgetc(pf) : lecture d un caractère fgets(pf,nbmax) : lecture d une chaîne (terminée par \n ou la fin de fichier) ayant au plus nbmax - 1 caractères. fgetss(pf,nbmax) : comme fgets mais exclut les balises HTML et PHP lors de l affichage (mais celles-ci sont comptées pour nbmax). fread(pf,nbmax) fscanf(pf,chaine) file(nomphysiquedufichier) : chaque ligne du fichier est placée dans un élément d un tableau. écriture dans un fichier : fwrite(pf,chaîne) : écrit chaîne dans le fichier pointé par pf. Un troisième argument optionnel indique le nombre de caractères de la chaîne à écrire. fputs est un alias de fwrite file_exists(nomphysiquedufichier) teste si le fichier existe (renvoie true si il existe, false sinon). filesize(nomphysiquedufichier) donne la taille du fichier en argument. 23

3.2 Algorithmes élémentaires sur les fichiers 3.2.1 Lecture d un fichier Affichage des lignes d un fichier On suppose que le fichier existe. Exemple : fichier de personnes, chaque ligne du fichier contient le nom d une personne, son âge et sa taille, ces caractéristiques étant séparées deux à deux par un espace. Le but du programme est d afficher chaque ligne, telle qu elle se présente dans le fichier. Attention : si le nom de la variable indiquant le nombre de caractères lus dans le fgets (ici, $NbCarMaxLigne) a la valeur 0 (par exemple, parce qu elle a mal été orthographiée et a donc par défaut la valeur 0), alors aucun caractère n est lu à chaque itération et on boucle. <?php $NbCarMaxLigne = 1000 ; $FichPers = fopen("fpers1.txt","r") ; $Num = 0 ; while (! feof($fichpers)) { $Ligne = fgets($fichpers, $NbCarMaxLigne) ; $Num = $Num + 1 ; echo "Ligne numéro $Num : $Ligne" ; fclose($fichpers) ;?> Remarque : Il est possible d utiliser une constante : define (NbCarMaxLigne, 1000) ;... $Ligne = fgets($fichpers, NbCarMaxLigne) ; Pour le fichier fpers1.txt suivant : Pierre 1.70 17 Noémie 1.61 25 Julie 1.66 18 Barthélemy 1.79 21 le programme affiche : Ligne numéro 1 : Pierre 1.70 17 Ligne numéro 2 : Noémie 1.61 25 Ligne numéro 3 : Julie 1.66 18 Ligne numéro 4 : Barthélemy 1.79 21 24

Chaque ligne du fichier (y compris le caractère \n) est lue une à une lors de l itération et est successivement stockée dans $Ligne. En contrôlant les valeurs de retour d open et close : <?php $NbCarMaxLigne = 1000 ; $FichPers = fopen("fpers1.txt","r") ; if (! $FichPers) { echo "Impossible d ouvrir fpers1.txt\n" ; exit ; $Num = 0 ; while (! feof($fichpers)) { $Ligne = fgets($fichpers, $NbCarMaxLigne) ; $Num = $Num + 1 ; echo "Ligne numéro $Num : $Ligne" ; $Res = fclose($fichpers) ; if (! $Res) { echo "Impossible de fermer fpers1.txt\n" ;?> Affichage des caractéristiques des lignes d un fichier Idem que précédemment, mais on souhaite un affichage séparé des caractéristiques de chaque ligne. Pour cela, il est nécessaire de connaître la structure d une ligne : quelles sont les caractéristiques d une ligne, comment ces caractéristiques sont-elles séparées La structure d une ligne de cet exemple est précisée au paragraphe 3.2.1. Les différentes caractéristiques d une ligne s obtiennent grâce à la fonction split. Le constructeur list est utilisé pour affecter en rafale une liste de variables, chacune d entre elles correspondant à un élément du tableau renvoyé par split <?php $NbCarMaxLigne = 1000 ; $FichPers = fopen("fpers1.txt","r") ; if (! $FichPers) { echo "Impossible d ouvrir fpers1.txt\n" ; exit ; $Num = 0 ; while (! feof($fichpers)) { $Ligne = fgets($fichpers, $NbCarMaxLigne) ; list($nom, $Taille, $Age) = split(" ", $Ligne) ; $Num = $Num + 1 ; echo "Ligne numéro $Num - Nom : $Nom Taille : $Taille Age : $Age" ; 25

$Res = fclose($fichpers) ; if (! $Res) { echo "Impossible de fermer fpers1.txt\n" ;?> affiche : Ligne numéro 1 - Nom : Pierre Taille : 1.70 Age : 17 Ligne numéro 2 - Nom : Noémie Taille : 1.61 Age : 25 Ligne numéro 3 - Nom : Julie Taille : 1.66 Age : 18 Ligne numéro 4 - Nom : Barthélemy Taille : 1.79 Age : 21 Remarquez que le passage à la ligne ne s effectue pas par le biais du echo du programme, mais à cause de la caractéristique $Age qui contient un \n. Moyenne des caractéristiques lues dans un fichier Calcul et affichage de l âge moyen et de la taille moyenne des personnes du fichier. <?php $NbCarMaxLigne = 1000 ; $FichPers = fopen("fpers1.txt","r") ; if (! $FichPers) { echo "Impossible d ouvrir fpers1.txt\n" ; exit ; $NbPers = 0 ; $SomTaille = 0 ; $SomAge = 0 ; while (! feof($fichpers)) { $Ligne = fgets($fichpers, $NbCarMaxLigne) ; $Ligne = rtrim($ligne) ; list($nom, $Taille, $Age) = split(" ", $Ligne) ; $NbPers = $NbPers + 1 ; $SomTaille = $SomTaille +$Taille ; $SomAge = $SomAge + $Age ; $Res = fclose($fichpers) ; if (! $Res) { echo "Impossible de fermer fpers1.txt\n" ; $AgeMoy = $SomAge / $NbPers ; $AgeMoyAnnees = intval($agemoy) ; $NbMois = round(($agemoy - $AgeMoyAnnees) * 12) ; echo "Taille moyenne : ", number_format($somtaille/$nbpers, 2), " age moyen $AgeMoyAnnees et $NbMois mois\n" ;?> 26

affiche, toujours pour notre fichier usuel : Taille moyenne : 1.69 Age moyen : 20 ans et 3 mois Remarquez qu à chaque itération $Age contient la valeur numérique de l âge, suivi du caractère \n. La somme des âges est cependant correctement calculée car la chaîne age\n est convertie dans le contexte arithmétique de $SomAge += $Age ; en valeur numérique de age. 3.2.2 Création et écriture d un fichier Lecture d un fichier de personnes et création d un fichier contenant les noms et les tailles des personnes supérieures à une certaine taille. <?php require("fonctions1.inc") ; $NbCarMaxLigne = 1000 ; $FichPers = fopen("fpers1.txt","r") ; if (! $FichPers) { echo "Impossible d ouvrir fpers1.txt\n" ; exit ; $FichPersOut = fopen("fpers2.txt","w") ; if (! $FichPersOut) { echo "Impossible d ouvrir fpers2.txt\n" ; exit ; echo "Taille? : " ; $SeuilTaille = lire() ; while (! feof($fichpers)) { $Ligne = fgets($fichpers, $NbCarMaxLigne) ; list($nom, $Taille, $Age) = split(" ", $Ligne) ; if ($Taille >= $SeuilTaille) { fwrite($fichpersout, "$Nom $Taille\n") ; $Res = fclose($fichpers) ; if (! $Res) { echo "Impossible de fermer fpers1.txt\n" ; $Res = fclose($fichpersout) ; if (! $Res) { echo "Impossible de fermer fpers2.txt\n" ;?> 27

Chapitre 4 TP 2 - Calcul de moyenne de notes 4.1 Exercice 1 : moyenne de notes par personne On considère des fichiers structurés comme le fichier fnotes1.txt (_ est le caractère souligné) : sport_math_français_histoire_anglais paul:12_7_8_3_4 marie:7_2_5_19_11 albert:0_0_0_0_0 jean:15_9_10_7_20 julie:7_18_20_0_20 clara:13_7_15_10_9 La première ligne du fichier contient une liste de matières, chaque matière est séparée par le caractère _. Chaque ligne contient le nom d une personne, puis le caractère : puis une série de notes, les notes étant séparées par l_. 1. Écrivez une procédure qui reçoit en paramètre d entrée une chaîne de caractères contenant des nombres séparés par _ et qui retourne la moyenne de ces nombres. Écrivez le script php minimal qui teste cette fonction (indication : le test peut être effectué en utilisant une chaîne comme par exemple 9_11_8_14 ). 2. Écrivez un script php affichant le nom de chaque personne contenue dans un fichier structuré comme fnotes1.txt La première ligne du fichier est donc à ignorer (i.e. à sauter). 3. Écrivez un script php affichant pour chaque personne sa moyenne. Pour fnotes1.txt, le résultat est : paul : 6.80 marie : 8.80 albert : 0.00 jean : 12.20 julie : 13.00 clara : 10.80 28

4. Écrivez une procédure qui affiche les éléments (clé et valeur) d un tableau dont les clés sont des chaînes de caractères. Écrivez le script php minimal qui teste cette fonction. En utilisant la fonction asort(tableau), les éléments de Tableau sont triés suivant l ordre de leurs valeurs. 5. Modifiez le script php écrit à la question 3 pour que celui-ci range la moyenne de chaque personne dans un tableau dont les clés sont les noms des personnes. 6. Modifiez le script php écrit à la question précédente pour que la première ligne du fichier (i.e. les matières) soit traitée (c est-à-dire, la liste des matières est affichée avant les noms et les moyennes). Plusieurs techniques sont possibles pour traiter la première ligne. Sur fnotes1.txt, ce script produit : Les matières sont : sport math français histoire anglais Cle : albert - valeur : 0.00 Cle : paul - valeur : 6.80 Cle : marie - valeur : 8.80 Cle : clara - valeur : 10.80 Cle : jean - valeur : 12.20 Cle : julie - valeur : 13.00 Remarques : On rappelle que pour écrire l ensemble d un programme deux démarches sont possibles : (a) démarche ascendante : soit commencer par écrire et tester les fonctions les plus élémentaires. Ensuite, remonter jusqu au programme principal. (b) démarche descendante : soit commencer par écrire le programme principal avec une version simplifiée des fonctions nécessaires et tester l ensemble. Ensuite, descendre jusqu à l écriture complète des fonctions élémentaires. En fait, ces deux démarches sont concomitantes et complémentaires et, dans la pratique, on passe souvent de l une à l autre. Dans les questions précédentes, vous pouvez distinguer celles relevant d une démarche ascendante et celle d une démarche descendante. 29

Chapitre 5 Les tableaux 5.1 Les tableaux simples Les tableaux permettent un premier niveau de structuration des données en PHP. Il s agit de collectionner des éléments qui ont un rapport entre eux, en utilisant un nom de variable générique. Par exemple, dans le fichier ci-dessous, on décide de stocker les noms des mois de l année dans un tableau $annee. Ainsi $annee[0] sera janvier, $annee[1] sera février, etc. 5 <?php // ----------------------------------- mois.php ----------------------------- // manipulation d un tableau de mois // création d un tableau 10 $annee = array( "janvier", "fevrier", "mars", "avril"); // affichage formaté print_r($annee); /*Array 15 ( [0] => janvier [1] => fevrier [2] => mars [3] => avril 20 )*/ // affichage avec un compteur for($i = 0; $i < sizeof($annee); $i ++) echo "le mois ". ($i + 1). " de l annee est $annee[$i].\n"; 25 /*le mois 1 de l annee est janvier. le mois 2 de l annee est fevrier. le mois 3 de l annee est mars. le mois 4 de l annee est avril. */ 30 30

// affichage avec foreach foreach($annee as $mois) // pas d indice echo "$mois\n"; /*janvier 35 fevrier mars avril */ 40 // ajout d un mois supplémentaire à la fin array_push($annee, "mai"); $annee[] = "juin"; $annee[sizeof($annee)] = "juillet"; print_r($annee); 45 /*Array ( [0] => janvier [1] => fevrier [2] => mars 50 [3] => avril [4] => mai [5] => juin [6] => juillet )*/ 55 // retrait de la fin echo "dernière valeur : ". array_pop($annee). "\n"; /*dernière valeur : juillet*/ 60 print_r($annee); /*Array ( [0] => janvier [1] => fevrier 65 [2] => mars [3] => avril [4] => mai [5] => juin )*/ 70 // ajout d un mois supplémentaire au début array_unshift($annee, "decembre"); print_r($annee); /*Array 75 ( [0] => decembre [1] => janvier [2] => fevrier [3] => mars 80 [4] => avril 31

)*/ [5] => mai [6] => juin 85 // retrait du début echo "première valeur : ". array_shift($annee). "\n"; // première valeur : decembre print_r($annee); 90 /*Array ( [0] => janvier [1] => fevrier [2] => mars 95 [3] => avril [4] => mai [5] => juin )*/ 100?> 5.2 Les chaînes de caractères Les chaînes de caractère peuvent être considérées comme des tableaux de caractères. Dans l exemple suivant, $chaine[$i] est le caractère de rang $i dans la chaîne. 5 <?php $chaine = "Bonjour à tous!"; for($i = 0; $i < strlen($chaine); $i ++) 10 echo "caractère $i : $chaine[$i]\n"; /* caractère 0 : B caractère 1 : o 15 caractère 2 : n caractère 3 : j caractère 4 : o caractère 5 : u caractère 6 : r 20 caractère 7 : caractère 8 : à caractère 9 : caractère 10 : t caractère 11 : o 25 caractère 12 : u 32

caractère 13 : s caractère 14 : caractère 15 :! */ 30?> On peut créer un tableau en découpant une chaîne de caractère suivant un délimiteur grâce à l instruction split : 5 <?php $mots = split(" ","Bonjour à tous!"); print_r($mots); 10 /* Array ( [0] => Bonjour [1] => à 15 [2] => tous [3] =>! ) */?> 5.3 Les tableaux associatifs Jusqu ici, nous avons vu des tableaux où les valeurs correspondent à des indices entiers, appelés également des clés. Les tableaux associatifs permettent d associer une clé de type chaîne de caractère à une valeur. Les usages sont multiples : associer sa traduction en Anglais à un mot français, liste de caractéristiques d un ensemble de personnes, indiquer pour chaque immatriculation le nom du propriétaire,... Dans l exemple ci-dessous, on associe à un nom d artiste son score de vente. 5 <?php // définition du tableau de classement, qui associe un artiste à son score de $classement = array("georges" => 1000, "jacques" => 500, 10 "lucienne" => 750, "edith" => 800); 15 // affichage du tableau print_r($classement); /*-------------------------------------------- Résultat : Array ( 33

20 [georges] => 1000 [jacques] => 500 [lucienne] => 750 [edith] => 800 ) 25 */?> 5 <?php // ----------------------------------- exo2.php ----------------------------- // parcours de tableau 10 require("definition.inc"); // affichage du tableau foreach($classement as $artiste => $score) echo "l artiste $artiste a un score de $score\n"; 15 echo "\n"; // affichage avec un while reset($classement); while(list($artiste, $score) = each($classement)) 20 echo "l artiste $artiste a un score de $score\n"; echo "\n"; // affichage avec un itérateur 25 if(sizeof($classement)){ end($classement); $fin = key($classement); reset($classement); while(true){ echo "l artiste ". key($classement); 30 echo " a un score de ". current($classement). "\n"; if(key($classement) == $fin) break; next($classement); 35 exit(0); /*-------------------------------------------- Résultat : 40 l artiste georges a un score de 1000 l artiste jacques a un score de 500 l artiste lucienne a un score de 750 l artiste edith a un score de 800 */ 34

45?> 5.4 Fonctions pour les tableaux Nom array_pop($variable) ; array_push($variable, $val) ; array_unshift($variable, $val) ; arsort($tableau) asort($variable) valeur = current($variable) $tableau = each($variable) end($variable) ; true false = in_array($valeur, $tableau) clé false = array_search($valeur, $tableau) clé = key($variable) nombre = krsort($variable) nombre = ksort($tableau) list($variable,..., $variablen) valeur false = next($variable) valeur false = prev($variable) valeur = reset($variable) nombre = sizeof($variable) Signification supprime le dernier élément d un tableau tout en le retournant. ajoute une valeur à la fin un tableau. ajoute une valeur au début d un tableau. trie un tableau dans un ordre inverse en conservant le couple clé/valeur. trie les valeurs d un tableau en conservant le couple clé/valeur. retourne l élément courant désigné par le pointeur d un tableau. retourne chacune des paires clé/valeur dans un tableau à quatre éléments (0 => clé, 1 => valeur, key => clé, value => valeur ) et avance le pointeur de tableau. place le pointeur sur le dernier élément du tableau. recherche la valeur spécifiée dans un tableau. retourne la clé associée en cas de réussite de la recherche de la valeur spécifiée. retourne la clé en cours dans le tableau. trie les clés d un tableau dans l ordre inverse en conservant les paires clé/valeur. trie les clés d un tableau en conservant les paires clé/valeur. affecte une série de variables en une seule opération. avance le pointeur au prochain élément et retourne la valeur correspondante. déplace le pointeur sur l élément précédent et retourne la valeur. déplace le pointeur sur le premier élément d un tableau et retourne sa valeur. retourne le nombre d éléments d un tableau. 35