Structure de données ESTA, 01 Février 2017 Mohammed Khachan 1 Objectif • Connaître les structures de données élémentaires, tableaux, listes chaînées, piles, files, arbres • Concevoir des structures de données et les algorithmes qui les manipulent. • Il ne s'agit pas d'un cours de programmation de C. 2 Concept • Chaque COURS sera en partie : • de l'algorithmique (des structures de données) • de l'implantation dans un langage de programmation (C) • TD/TP sur machine • approfondir les structures de données et algorithmes du cours • alternance TD et TP d'application • Implémenter les exercices du TD 3 Plan • Algorithmique • Survol de l’architecture logicielle • Rappel • Récursivité (utilisation dans les arbres) • Structures (base des structures de données) • Tableaux statiques et dynamiques • Chaines de caractères • Allocation mémoire. • Listes chainées, piles, files. • Algorithmes de Tri et parcours. • Arbres. • Tables de hachage. 4 Partie I Algorithmique 5 Algorithme Al Khawarizmi, Bagdad IXè siècle. Encyclopedia Universalis : « Spécification d’un schéma de calcul sous forme d’une suite finie d’opérations élémentaires obéissant à un enchaînement déterminé. » DONNÉES RÉSULTATS, ACTIONS Composition d ’un nombre fini d’opérations dont chacune est : • définie de façon rigoureuse et non ambiguë • effective sur les données adéquates (exécution en temps fini) 6 Différence entre problème et instance du problème • Exemple d’un problème: Tri d’un ensemble d’éléments Entrée: Suite de n éléments a1,…an Sortie: La suite ordonnée • Instances du problème: Suite de nombres: 475, 787, 34, 245, 56, 350 Suite de noms: Pierre, Christine, Sylvie, Samuel, Fabien 7 Fonction: difference entre déclaration et definition • Une déclaration donne le nom et le type sans apporter d'autres détails. int sommeInt( int , int ); • Une définition précise les détails de l'implementation ou l'emplacement de la mémoire. int sommeInt( int a, int b ) { return ( a+b ); }; • La Signature d'une fonction correspond a la partie de sa déclaration qui précise les types de paramètres et le type de retour. Le nom de la fonction ne fait pas partie de sa signature. 8 Fonction: difference entre paramètre et argument • int sommeInt( int a, int b); a et b sont les paramètres de la fonction. void main() { int x=5, y=7; int res= 0; res= sommeInt( x, y ); // x et y sont les arguments de la fonction } 9 Subdivision d’un problème en sousproblèmes (programmation modulaire) Problème: Trouver le plus petit nombre premier strictement supérieur à un entier positif donné Déterminer si un entier m est un nombre premier. Il suffit de tester si m est divisible par un entier entre 2 et m/2 – Utiliser cette fonction pour trouver le plus petit nombre premier supérieur à un entier n. 10 Subdivision d’un problème en sous-problèmes 11 programmation modulaire La programmation modulaire consiste à décomposer une application en modules, groupes de fonctions pour pouvoir les développer indépendamment, et les réutiliser dans d'autres applications. Exemple: program.c program.h, program.c, main.c – program.h va contenir les déclarations des fcts. – program.c (.cpp) va contenir les définitions des fcts. – main.c (.cpp) va contenir le programme à exécuter. 12 programmation modulaire 13 Organisation du code • Organisation du code : • En fonctions, structures, etc. • En fichiers. • But: • Plus de lisibilité. • Facilité la maintenance du code. • Réutilisation. 14 Partie II Survol d’architecture logicielle 15 Programme ?? bin lib a.out Exécutable(s) .exe .o .so .lib .dll Librairies et fichiers objets Programme include .h Fichiers de description (header) src .c Fichiers d’implantation (source code) 16 Programmes et librairies En C : Exécutable ↔ main() Pour la réutilisation, on utilise des bibliothèques (ou librairies) de fonctions : une description de chaque fonction (dans des fichier “.h” d’en-tête, ou header), et du code compilé correspondant (des “.lib” et “.dll” sous PC, des “.so” et “.a” sous UNIX) 17 La Compilation : Résumé Fichiers d’en-tête C Code source C Préprocesseur .h .c Code pré-processé Compilateur Librairies .lib .so Fichier(s) Objet .o Editeur de liens exécutable a.out .exe 18 Qualité d’un programme Architecture claire Réutilisabilité Structures de données + Algorithmes; Documentation; Tests de robustesse; 19 Efficacité d’un algorithme • Critère de mesure : complexité, pas temps d’exécution. • On oublie ce qui est subjectif (programmeur, matériel, ... ). • On cherche une grandeur n pour "quantifier" les entrées. • On calcule les performances uniquement en fonction de n. • Complexité d'un ALGORITHME, pas d'un programme ! • On doit essayer de choisir comme grandeur (n) la dimension la plus significative. Par exemple : • Tableaux, listes : nombre d'éléments. • Arbres : la hauteur, le nombre de nœuds, de feuilles, ... • Polynômes : le degré, le nombre de coefficients différents de 0, ... • Le choix d'une structure de données a une grande influence sur l'efficacité d'un algorithme ! ! 20 Classe de complexité 21 Partie III Rappel Programmation C 22 Programmation C 23