Modélisation des données [dx] Algorithmique et Programmation Karine Zampieri, Stéphane Rivière, Béatrice Amerein-Soltner Unisciel algoprog Version 19 septembre 2016 Table des matières 1 Se poser les bonnes questions 2 2 Les structures de données 4 3 Quelques conseils 5 4 Outils de documentation 4.1 Commenter un algorithme . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Outils de documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 6 5 Conclusion 7 C++ - Introduction Mots-Clés Modélisation Requis Axiomatique impérative Difficulté • ◦ ◦ (15 min) Ce module apporte une synthèse des notions vues tout au long de cette partie [Axiomatique impérative] et propose quelques pistes de réflexion quant au choix d’une bonne modélisation des données qui se pose lors de la résolution de problèmes de programmation avancés. 1 Unisciel algoprog – dx00cours-texte, September 19, 2016 1 2 Se poser les bonnes questions Retour à la case départ Nous avons vu qu’un problème bien spécifié s’inscrit dans le schéma suivant (cf. @[L’algorithmique]) : étant donné [les données] on demande [l’objectif] Une fois le problème correctement posé, on peut partir à la recherche d’une méthode de résolution, c.-à-d. d’un algorithme en ce qui concerne les problèmes à résoudre par les moyens informatiques. Démarches algorithmiques de base Nous avons vu divers modèles et techniques algorithmiques adaptées à des structures particulières (les nombres, les chaı̂nes, les tableaux, les variables structurées, les fichiers...). La plupart des exercices portaient directement sur ces structures (par ex. calculer la somme des nombres d’un tableau, fusionner deux fichiers en un seul, extraire une sousliste à partir d’une liste donnée). Ces exercices d’entraı̂nement et de formation constituent des démarches algorithmiques de base qui trouvent toutes une place dans des problèmes plus complexes. Problèmes de la vie courante Mais la plupart des problèmes issus des situations de la vie courante auxquels se confronte le programmeur s’expriment généralement de manière plus floue : par ex. • Dresser la comptabilité des dépenses mensuelle d’une entreprise. • Faire un tableau récapitulatif du résultat des élections par cantons électoraux. • Faire une version informatique d’un jeu télévisé... Les exemples sont infinis. La représentation des données C’est dans le cadre de ce genre de problème plus complexe que se pose le problème de la représentation de données. Une fois le problème bien spécifié (par les données et l’objectif) apparaissent naturellement les questions suivantes : • Quelles données du problème sont réellement utiles à sa résolution ? (Il est fréquent que l’énoncé d’un problème contienne des données superflues ou inutiles.) • Y a-t-il des données plus importantes que d’autres ? • Les données doivent-elles être consultées plusieurs fois ? • Quelles données faut-il conserver en mémoire ? • Sous quelle forme ? • Faut-il utiliser un tableau ? Une liste ? • Faut-il créer une structure ? • Les données doivent-elles être classées selon un critère précis ? • Ou la présentation brute des données suffit-elle pour solutionner le problème posé ? Unisciel algoprog – dx00cours-texte, September 19, 2016 3 Flair et savoir-faire Les réponses ne sont pas directes et les différents outils qui sont à notre disposition peuvent être ou ne pas être utilisés. Il n’y a pas de règles précises pour répondre à ces questions : c’est le flair et le savoir-faire développés patiemment par le programmeur au fil de ses expériences et de son apprentissage qui le guideront vers la solution la plus efficace. Parfois plusieurs solutions peuvent fonctionner sans pouvoir départager la meilleure d’entre-elles. Finalité Ce type de questionnement est l’un des aspects le plus délicat et le plus difficile de l’activité de programmation, car d’une réponse appropriée dépendra toute l’efficacité du code développé. Un mauvais choix de représentation des données peut mener à un code lourd et maladroit. Nous donnons dans ce qui suit quelques indices et pistes de réflexion, qui seront consolidées par l’expérience acquise lors des travaux pratiques ainsi que par les techniques de modélisation vues dans votre cours d’algorithmique. Unisciel algoprog – dx00cours-texte, September 19, 2016 2 4 Les structures de données Première année Rappelons brièvement les différentes structures étudiées : • Les données « simples » (entiers, réels, chaı̂nes, caractères, booléens). • Les variables structurées qui regroupent en une seule entité une collection de variables simples. • Le tableau qui contient un nombre déterminé de variables de même type, accessibles via un indice ou plusieurs pour les tableaux multidimensionnels. • La liste qui peut contenir un nombre indéfini d’éléments de même type. • Le fichier séquentiel qui est un support physique permettant le stockage « à long terme » de données. Deuxième année Le cours de deuxième année abordera : • Les objets qui combinent en un tout une série d’attributs et des méthodes agissant sur ces attributs. • D’autres structures particulières : les listes chaı̂nées, les piles, les files. • La récursivité. Troisième année Le cours de troisième année abordera : • L’héritage et le polymorphisme des objets. • Les structures arborescentes et les structures relationnelles. • Les dictionnaires et les algorithmes. Caractéristiques Chaque structure de données possède ses spécificités propres quant à la façon d’accéder aux valeurs, de les parcourir, de les modifier, d’ajouter ou de supprimer des éléments à la collection. Unisciel algoprog – dx00cours-texte, September 19, 2016 3 5 Quelques conseils Voici quelques conseils en vrac qui pourraient vous être utiles. Grands principes de base Nous vous conseillons de relire le paragraphe @[Les algorithmes paramétrés – Qu’est-ce qu’un algorithme de qualité]. Vous comprendrez certainement, sous un nouvel éclairage, les termes de validité, d’extensibilité, de réutilisabilité, de lisibilité et d’efficience. Parcours des données En général, on évite de parcourir plusieurs fois le contenu d’un ensemble de données (surtout s’il s’agit d’un fichier) sauf s’il n’y a pas d’autre solution. Duplication des données On évite de créer un duplicata sous quelque forme que ce soit d’une grande structure de données. Par exemple, s’il faut trier les données d’un fichier, il est évident qu’il faut stocker l’entièreté des données en mémoire pour pouvoir effectuer les comparaisons. Par contre, c’est inutile si le problème est d’extraire le maximum de ces données ou de les compter. Les booléens L’expérience montre que les étudiants négligent souvent leur utilisation. Les variables booléennes permettent de décrire de façon élégante l’état de différentes situations, d’exprimer de façon concise des conditions... Choix des boucles Relisez attentivement le paragraphe @[Répétitives – Structures répétitives] sur le choix des boucles. Dans un processus itératif, il est impératif de le quitter dès qu’une réponse est connue, plutôt que de parcourir inutilement jusqu’au bout un ensemble de données. Le bon suivi de ce principe intervient de façon primordiale dans l’efficacité d’un algorithme ! Unisciel algoprog – dx00cours-texte, September 19, 2016 4 4.1 6 Outils de documentation Commenter un algorithme Les commentaires On n’insistera jamais assez sur la nécessité de documenter un programme en y insérant des commentaires judicieux, clairs et suffisants. Ils sont destinés à faciliter la compréhension de votre programme par le lecteur (parfois une autre personne, mais aussi l’auteur dans son propre texte lorsqu’il s’y replonge après une interruption). Exemple Un excès de commentaires peut être aussi nuisible qu’un trop-peu. Par exemple, un choix judicieux de noms de variables peut s’avérer bien plus efficace que des commentaires superflus. Ainsi, l’instruction suivante dépourvue de commentaires : nouveauCapital = ancienCapital * (1 + taux / 100) est préférable aux lignes suivantes : // calcul du nouveau capital c1 = c0 * (1 + t / 100) // c1 est le nouveau capital, c0 l’ancien capital, t le taux Mise en place Prenez l’habitude de les mettre en place au fur et à mesure de l’avancement du travail. 4.2 Outils de documentation Doxygen Génération de la documentation C++, C, Java, Python, etc. multi-plateforme : http://www.stack.nl/~dimitri/doxygen/ Manuel de Doxygen cf. [doxygen-manuel] Graphviz Graph Visualization Software – Complément à doxygen afin de générer les graphes de dépendances – Voir documentation doxygen : http://www.graphviz.org/ Unisciel algoprog – dx00cours-texte, September 19, 2016 5 7 Conclusion Modélisation des données La modélisation consiste à identifier des entités logiques et les dépendantes logiques entre ces entités, ce qui constitue le modèle. Le modèle des données n’organise pas seulement les données sous la forme de structures de données mais précise aussi ce que les données veulent vraiment représenter. L’intérêt des structures de données est la simplification des traitements les concernant. Remarque La difficulté des exercices tient en partie dans le bon choix d’une représentation des données et de la démarche algorithmique la plus adéquate à mettre en oeuvre pour agir sur ces données en vue d’obtenir le résultat escompté. L’efficacité d’un algorithme est lié étroitement au choix de la représentation.