Types Abstraits de Données
Transcription
Types Abstraits de Données
Types Abstraits de Données Types Abstraits de Données • Processus de conception en plusieurs étapes : spécification des structures de données utilisées conception des algorithmes opérant sur ces données vérification de leurs propriétés implantation en machine, représentation physique des structures de données Introduction • Pour les trois premières étapes : on souhaite ne pas s’encombrer de détails ni de contraintes secondaires les données sont définies sous forme abstraite utilisation de Types Abstraits de Données (TAD) • Il s’agit de savoir : quelles sont les opérations sur les données quelles sont les propriétés intrinsèques de ces opérations • Mais pas : comment ces opérations sont réalisées • Ex. : nombres et opérations arithmétiques Types Abstraits de Données Types Abstraits de Données Un cahier des charges… Notion de signature • Définit • …entre : le concepteur (qui imagine la SD) le programmeur (qui implante la SD) l’utilisateur (qui manipule la SD pour concevoir ses propres algos) Types Abstraits de Données Exemple : TAD booléen type booléen opérations vrai : → booléen faux : → booléen ¬_ : booléen → booléen _∧_ : booléen x booléen → booléen _∨_ : booléen x booléen → booléen la syntaxe du type les opérations associées au type sans en définir les propriétés (sémantique) • Comporte la définition du nom du type du nom des opérations + type des arguments éventuels et du résultat Types Abstraits de Données Le symbole : type booléen opérations vrai : → booléen faux : → booléen ¬_ : booléen → booléen _∧_ : booléen x booléen → booléen _∨_ : booléen x booléen → booléen • la partie gauche indique le nom de l’opération et la place des arguments • la partie droite indique les types des arguments et du résultat 1 Types Abstraits de Données Le symbole _ type booléen opérations vrai : → booléen faux : → booléen ¬_ : booléen → booléen _∧_ : booléen x booléen → booléen _∨_ : booléen x booléen → booléen • signale la place d’un argument Types Abstraits de Données Le symbole → type booléen opérations vrai : → booléen faux : → booléen ¬_ : booléen → booléen _∧_ : booléen x booléen → booléen _∨_ : booléen x booléen → booléen • la partie gauche indique les types des arguments (séparés par des x) • la partie droite indique le type du résultat Types Abstraits de Données Types Abstraits de Données Sémantique Exemple : TAD booléen • la signature du type ne donne que des infos syntaxiques ne renseigne pas sur les propriétés du type • Le paragraphe sémantique précise les propriétés des opérations sous forme d’un ensemble d’axiomes propriétés « initiales » que les opérations doivent vérifier sans qu’il soit nécessaire de les démontrer possible de démontrer des propriétés supplémentaires par raisonnement type booléen opérations vrai : → booléen faux : → booléen ¬_ : booléen → booléen _∧_ : booléen x booléen → booléen _∨_ : booléen x booléen → booléen sémantique pour tout a, b : booléen 1. 2. 3. 4. 5. ¬ vrai = faux ¬ ¬ a = a vrai ∧ a = a faux ∧ a = faux a ∨ b = ¬ ( ¬ a ∧ ¬ b ) Types Abstraits de Données Types Abstraits de Données Nouvelles propriétés Hiérarchie des types (1) • ¬faux = vrai ¬faux = ¬(¬vrai) = vrai (1 puis 2) • faux ∨ b = b faux ∨ b = ¬(¬faux ∧ ¬b) = ¬(vrai ∧ ¬b) = ¬¬b = b {5, 6, 3, 2} • vrai ∨ b = vrai vrai ∨ b = ¬(¬vrai ∧ ¬b) = ¬(faux ∧ ¬b) = ¬faux = vrai {5, 1, 4, 6} • Le type booléen ne fait référence à aucun autre type que lui-même • Pour un tableau à une dimension de nombre réels, on a besoin : du type entier pour les bornes et les indices du type réel pour les éléments du tableau • on souhaitera faire référence à des types prédéfinis, sans avoir à les redéfinir complètement → on utilise ces types 2 Types Abstraits de Données Types Abstraits de Données Hiérarchie des types (2) Exemple : une table (1) • on a besoin des propriétés du type entier pour manipuler les éléments du tableau • on n’a pas besoin des propriétés du type réel puisqu’on peut le remplacer par n’importe quel type, ça ne change pas les propriétés du tableau c’est un paramètre du tableau • Définition : Une table est une structure de conservation d’une quantité fixe d’informations. Les informations sont identifiées par un numéro appartenant à un intervalle donné. Elle permet de retrouver une information préalablement mémorisée à partir de son numéro Types Abstraits de Données Types Abstraits de Données Exemple : une table (2) Exemple : une table (3) • Création d’une table • Ajout d’un élément à la table Pré : Pré : • i = indice du premier élément • j = indice du dernier élément Post : • table contenant des informations référencées par l’intervalle [bi..bs] • <[bi..bs]→ ?>, une table • i, un indice • e, un élément Post : • Table contenant l’élément e en i ème position tab i, j ⇒〈[bi ..bs ] → ?〉 〈[bi ..bs ] → ?〉, i, e changer −ième ⇒ 〈[bi ..bs ] → ?, i → e〉 Types Abstraits de Données Types Abstraits de Données Exemple : une table (4) TAD table (1) • Accéder au ième élément d’un tableau Pré : • <[bi..bs]→ ?, i→e>, une table • i, un indice Post : • Le i ème élément de la table ième 〈[bi ..bs ] → ?, i → e〉, i ⇒ e type table paramètre élément utilise entier, booléen opérations tab : entier x entier → table ième : table x entier → élément changer-ième : table x entier x élément → table borneinf : table → entier bornesup : table → entier défini : table x entier → booléen préconditions ième(t,k) : défini(t,k) changer-ième(t,k,e) : borneinf(t) ≤ k < bornesup(t) 3 Types Abstraits de Données Types Abstraits de Données TAD table (2) Opérations sémantique ième(t, j) = soit t = changer-ième(t’, i, e) si j = i alors e sinon ième(t’, j) fsi bornesup(t) = si t = tab(i, j) alors j sinon soit t = changer-ième(t’, k, e) bornesup(t’) fsi borneinf(t) = ... idem bornesup défini(t, k) = si t = tab(i, j) alors faux sinon soit t = changer-ième(t’, i, e) si k = i alors vrai sinon défini(t’, k) fsi fsi • Opérations internes Opèrent sur la table elle-même Opérations de construction • T apparaît comme résultat, pas comme argument • ex: tab Opérations de transformation • Modification de T passé en argument • ex: changer-ième • Opérations externes (observateurs) Ne modifient pas le contenu de la table T Opérations d’accès • ex: ième, bornesup, défini Types Abstraits de Données Exemple d’implantation typedef struct { element **tab; int bs; } table; table *tab(int s) { table *t = (table *)(malloc(sizeof(table)); t->bs = s; t->tab = (element **)(malloc(bs * sizeof(element*)); for (int i=0; i<bs; i++) t->tab[i] = null; return t; } table *changer_ième(table *t, int i, element *e) { if ((i>=0) && (i<t->bs)) t->tab[i] = e; return t; } element *ième(table *t, int i) { if ((i>=0) && (i<t->bs)) return t->tab[i]; } 4