Révisions 1 Tableaux non contraints Déclaration du type : type Tvecteur = tableau ( intervalle d’entiers) de entiers type Tvecteur is array (integer range <>) of integer; Le vecteur doit être contraint avant toute utilisation donc lors de la déclaration des variables du programme principal: vect : Tvecteur ( 1 .. 8); mais grande utilité des tableaux non contraints lors du passage de paramètres dans les procédures ou les fonctions 2 Tableaux non contraints Chercher une valeur dans un tableau se traduit par une procédure dont les instructions restent les mêmes que le tableau contienne 10, 20 ou 1000 valeurs. Ce qui sera modifié, sera le nombre d’itérations, suivant la position de cette valeur cherchée dans le tableau. Type Telement is private; type Tvecteur is array (integer range <>) of Telement; 3 Tableaux non contraints procedure RECHERCHE ( {D}vect : Tvecteur; {D} element_cherche : Telement; {R} position : entier ; {R} trouve : booléen) pré-requis : aucun action : S’il existe la valeur element_cherche, dans le tableau vect, alors met trouve à vrai et position prend la valeur du premier indice où element_cherche est rangé, sinon met trouve à faux et position reste indéterminé stratégie : parcours partiel de vect 4 Tableaux non contraints procedure RECHERCHE ( {D}vect : Tvecteur; {D} element_cherche : Telement ; {R} position : entier ; {R} trouve : booléen) I : entier début I premier indice de vect tant que I <= dernier indice de vect et alors non ( vect(I) = element_cherche) faire I I + 1 fin tant que I <= dernier indice de vect position I trouve fin RECHERCHE; 5 Tableaux non contraints procedure RECHERCHE ( {D}vect : Tvecteur; {D} element_cherche : caractere ; {R} position : entier ; {R} trouve : booléen) I : entier début I premier indice de vect tant que I <= dernier indice de vect et alors non (vect(I) = element_cherche ) faire I I + 1 fin tant que I <= dernier indice de vect position I trouve Parcours partiel fin RECHERCHE; 6 Procédure ou fonction générique procedure ECHANGE_ENTIER( {D/R} a, b : entier) pré-requis : aucun action : permute les deux valeurs entières contenues dans a et b variable : temp : entier procedure ECHANGE_REEL( {D/R} a, b : réel) pré-requis : aucun action : permute les deux valeurs réelles contenues dans a et b variable : temp : réel début temp a b fin début temp a b fin a b temp a b temp 7 Procédure ou fonction générique La généricité permet d’écrire une procédure modèle à partir de laquelle des procédures spécifiques pour chaque type pourront être créées et utilisées. Dans le cas des exemples précédents, seul le type diffère : le type va constituer un paramètre générique 8 Procédure ou fonction générique paramètres de généricité type TElement is private procedure ECHANGE_TOUT( {D/R} a, b : TElement) pré-requis : aucun action : permute les deux valeurs de même type TType contenues dans a et b variable : temp : TElement début temp a b fin a b temp 9 Procédure ou fonction générique Grâce à la procédure générique, il est maintenant possible de créer, en les spécialisant par un type précis, de nouvelles procédures. Cette opération s’appelle instanciation des procédures procedure ECHANGE_CARACTERES is new ECHANGE_TOUT(character); procedure ECHANGE_ENTIER is new ECHANGE_TOUT(integer); procedure ECHANGE_REELS is new ECHANGE_TOUT(float); Il peut y avoir plusieurs instances d’un même moule. 10 Procédure ou fonction générique Objet générique Moule non utilisable directement procedure function Instanciation avec paramètres effectifs Objet utilisable Objet utilisable with …..; appelé dans une autre procédure ou fonction avec la clause with pas de use 11 Encapsulation La plupart des méthodes préconisées pour la production de logiciels de qualité reposent sur la décomposition du logiciel en modules ou composants . On appelle composant une collection d’entités et de ressources logicielles « encapsulées » 12 Encapsulation Composant Exemple de la vie quotidienne montre identificateur Déclaration des fonctionnalités mises à la disposition d’un utilisateur Définition des fonctionnalités interface Donne l’heure Réalisation ou implémentation Construction interne de la montre 13 Encapsulation PDate identificateur type Tdate est privé procedure lire (D:Tdate); Déclarations procedure lire (D:Tdate) is begin Définitions …… end; 14 Paquetages génériques generic paramètres de généricité identificateur interface Déclaration des fonctionnalités mises à la disposition d’un utilisateur Définition des fonctionnalités réalisation ou implémentation 15 Paquetages génériques LIST_GEN Instance avec : Instance avec : type caractère type entier procedure put procedure ecrit Même programme 16 package Pliste_Generique package PDate package PMot package PProduit package PEnsemble_Produits 17 Fonctionnalités qui permettent de traiter les données TProduit - Nom : TMot - code : entier - Date_péremption : TDate - PrixHT : réel + procedure saisie ( p : out TProduit) ; + procedure affiche ( p : in TProduit) ; + function produitAlimentaire ( p : in TProduit) return boolean; + function lePrixTTC (p : in TProduit) return float; + function produitPerime ( p : in TProduit; dat : TDate) return boolean; 18 TDate - jour : entier - mois : entier - an : entier + procedure creDate ( D: out TDate; j : in integer; m : in integer; a : in integer) + function precede (D1, D2 : in TDate) return boolean 19 package PlistGen Instance pour la définition du type TMot package PMot 20 Types abstraits Un type de données abstrait est représenté par un composant logiciel dont l’interface est le suivant : identificateur du type de données abstrait ensemble de base opérations définies sur tout objet de ce type • Opération de construction ou destruction • Opérations de modification • Opérations de consultation itérateurs, dans le cas où l ’objet est une collection d ’éléments exceptions constantes éventuelles 21 Type abstrait Pile identificateur du type de données abstrait Tpile ensemble de base valeurs de type Telement 22 Type abstrait Pile Opérations de construction: • CRÉER TPile crée une pile vide Opérations de modification • EMPILE( TPile, TElement) • DEPILE (TPile) TPile ajoute un élément à la pile TPile retire un élément de la pile Opérations de consultation • VALEUR_SOMMET (TPile) • VIDE (TPile) booléen TElement donne accès au dernier élément rangé dans la pile, en le laissant dans la pile permet de savoir si une pile est vide ou non 23 Déclaration de l’unité pile Quelle que soit l’implémentation, l’interface de l’unité de programmation sera la même, à savoir déclaration des procédures et fonctions suivantes : Soit un type TPile privé procedure CRÉER ( {R} P : TPile ) -- pré-requis : aucun -- action : crée une pile vide P procedure EMPILE ( {D/R} P : TPile ; {D} e : TElement ) -- pré-requis : aucun -- action : ajoute l’élément e à la pile P (l’ajout se fait au sommet de la pile) procedure DEPILE ( {D/R} P : TPile ) -- pré-requis : aucun -- action : retire s’il existe, l’élément du sommet de la pile P 24 Déclaration de l’unité pile fonction VALEUR_SOMMET ( {D} P : TPile ) retourne un Telement -- pré-requis : la pile n’est pas vide -- résultat : renvoie la valeur qui est au sommet de la pile P fonction VIDE ( {D} P : TPile ) retourne un booleen -- pré-requis : aucun -- résultat : retourne vrai si la pile P est vide, faux sinon fonction HAUTEUR ({D} P : TPile ) retourne un entier -- pré-requis : aucun -- résultat : renvoie le nombre de valeurs rangées dans la pile P La réalisation verra la définition des corps de ces sous programmes 25 Récursivité Fonction Fib ( {D} n : entier) retourne 1 entier • Résultat : calcule la nième valeur de la suite • Pré requis : Les calculs qui suivent seront toujours faits avec n positif ou nul • Stratégie : calcul récursif 26 récursivité début si n <= 1 alors retourne 1 sinon retourne Fib (n -1) + Fib (n - 2) fin si fin 27 Récursivité et liste simplement chaînée On appelle décomposition canonique d ’une liste L non vide, sa décomposition en deux éléments : sa tête L(tête) son reste L(reste) 28 Récursivité et liste simplement chaînée Toute fonction ou procédure définie sur une liste L : • peut si L n’est pas vide, – traiter l’élément de tête – s’appeler récursivement sur L(reste) qui est de taille strictement inférieure à celle de L • nécessite un traitement particulier, si L est vide 29 Récursivité et liste simplement chaînée liste vide tete ou bien liste composée tete reste 30 Notion d’arbre • Un arbre est une structure à deux dimensions comportant un ensemble fini d’éléments, appelés nœuds. • Les nœuds sont associés entre eux suivant un ordre hiérarchique strict. • Il existe au plus, un seul chemin entre deux nœuds. • Un arbre binaire est un arbre dont chaque nœud possède au plus deux fils 31 Un arbre binaire est : soit vide, soit constitué d’un nœud racine possédant un sous arbre binaire gauche et un sous arbre binaire droit racine sous arbre gauche sous arbre droit 32 Parcours dans un arbre binaire : itérateurs Parcourir un arbre consiste à visiter les différents noeuds de l’arbre une fois et une seule dans un certain ordre. Les trois ordres de parcours habituels dans un arbre binaire sont : • le préordre ou parcours préfixé • le postordre ou parcours postfixé • le symétrique ou parcours infixé 33 Parcours dans un arbre binaire : préordre si l’arbre n’est pas vide alors traiter la racine de l’arbre effectuer le parcours préfixé de son sous arbre gauche effectuer le parcours préfixé de son sous arbre droit fin si 34 Arbre binaire de recherche Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud, la valeur de ce nœud est supérieure aux valeurs de ses descendants de gauche, et inférieure à celles de ses descendants de droite. On ne peut parler d’arbre binaire de recherche que si une relation d’ordre sur les valeurs contenues dans l’arbre, est définie et utilisable On suppose que toutes les valeurs rangées dans les arbres binaires de recherche, sont différentes 35 Arbre binaire de recherche Pour ajouter une valeur dans un arbre binaire de recherche, deux méthodes : – adjonction de la valeur dans une feuille de l’arbre – adjonction de la valeur à la racine de l’arbre 36 Arbre binaire de recherche : exemple 34 20 8 50 26 23 95 47 31 84 37 Arbre binaire de recherche 38 Arbre binaire de recherche procedure INSERE_VALEUR ( RAC : in out TArbreBinaire; X : in TElement) Pré requis : RAC repère un arbre binaire de recherche Action: insère la valeur X dans l’arbre binaire de recherche repéré par RAC, en conservant les propriétés de cet arbre binaire de recherche 39 Arbre binaire de recherche procedure INSERE_VALEUR ( RAC : in out TArbreBinaire; X : in TElement) is begin if RAC = null then RAC := new TCelluleAB' (X, null, null); else if plusPetit (X, RAC.val) then INSERE_VALEUR( RAC.suivG, X); else INSERE_VALEUR( RAC.suivD, X); end if ; end if; end INSERE_VALEUR; 40