Structures élémentaires
Introduction
Les chapitres précédents ont montré que l’algorithmique traite de la transformation de données. Dans ce chapitre, on s’intéresse à la façon de définir et d’organiser les données utilisées par nos algorithmes.
La section « Les chaînes de caractères » introduit les caractères et les chaînes de caractères. On peut ainsi commencer à étudier les transformations de données textuelles ou, plus généralement, de données non numériques. La section « Le tableau » définit les tableaux et les premières opérations élémentaires sur ces structures. Tous les langages de programmation impérative des ordinateurs proposent ces types qui sont prédéfinis et directement utilisables. Cependant, ils ne couvrent pas toutes les possibilités de traitement et tous les besoins des programmeurs. On doit donc introduire la possibilité de définir de nouveaux types de données, comme le type RÉSERVOIR du chapitre « Programmes directs ». C’est ce qui est fait en section « Définir un nouveau type de données » qui étudie comment l’utilisateur peut définir et utiliser ses propres types à partir des types...
Les chaînes de caractères
Cette section étudie le type CHAÎNE qui permet de déclarer des données qui ne sont pas numériques. Ainsi, les opérations usuelles sur les nombres ne sont plus des opérations du domaine des chaînes de caractères et nous devrons préciser les opérations applicables aux données de ce type.
Une chaîne est composée de caractères. Le CARACTÈRE est l’unité élémentaire d’information considérée dans cette section. La première partie introduit les caractères, les notations et les premières opérations applicables. La seconde section compose les caractères pour former les chaînes et commence l’étude des opérations du domaine. Enfin, la dernière section propose une série d’exercices d’application.
1. Les caractères
Un caractère est une donnée textuelle de base. ’A’, ’4’, ’!’ sont des caractères. Cependant, un caractère n’est pas nécessairement imprimable, c’est-à-dire humainement représentable. Ainsi, par exemple, un caractère particulier destiné à marquer la fin d’un enregistrement dans un fichier, bien que non représentable sur une feuille de papier, n’en est pas moins un caractère comme un autre.
Pour utiliser une variable destinée à recevoir un caractère, un algorithme de ce livre la déclare ainsi :
car : CARACTÈRE
et lui affecte une valeur comme à toute autre variable :
car '*'
La définition d’une constante de type CARACTÈRE utilisera un séparateur pour délimiter le caractère et l’isoler du reste des instructions. Dans l’exemple ci-dessus, une apostrophe informatique (« quote ») a été placée juste avant et juste après la valeur d’initialisation de car, de sorte qu’il n’y ait pas d’ambiguïté. Le but est de distinguer clairement la valeur à attribuer à la variable du contexte dans lequel elle apparaît. Il est possible, de cette façon, d’utiliser un séparateur quelconque, pourvu que ce séparateur...
Le tableau
Un tableau est une structure qui rassemble, sous un même nom, un multi-ensemble de données. Dans la suite, nous supposons que toutes les données enregistrées dans un tableau sont homogènes, c’est-à-dire toutes de même type. On parlera, par exemple, d’un tableau d’ENTIERS, d’un tableau de PERSONNES, d’un tableau de RÉSERVOIRS... pour exprimer que chacune des données enregistrées dans le tableau est un ENTIER, une PERSONNE ou un RÉSERVOIR. La première section traite des tableaux dont les éléments sont des données, structurées ou non. La section suivante étudie les tableaux dont les éléments sont des tableaux. La dernière section propose quelques exercices d’application.
1. Les tableaux simples
Un tableau est constitué d’un ensemble de « cases » numérotées en séquence. Chaque case peut être vide, c’est-à-dire non initialisée, ou contenir une donnée du type dans lequel le tableau a été défini. La figure ci-dessous représente un tableau d’ENTIERS de nom v de 30 cases numérotées de 1 à 30.
Les cases numérotées de 1 à 10 ont été initialisées (remplies) avec des entiers. La case numéro 6 contient la valeur -14, la case numéro 1 contient l’entier 5. Les cases dont les numéros vont de 11 à 30 n’ont pas encore reçu de valeur. Elles ne contiennent rien de significatif ou NUL.
Un tableau est défini par sa déclaration. Cette déclaration précise le nom du tableau, le numéro de la première et de la dernière case ainsi que le type de données qu’il contiendra. Ainsi, pour le tableau de la figure ci-dessus, la déclaration est, par exemple :
variable
v : TABLEAU[ENTIER][1,30]
Cependant, cette forme n’est pas obligatoire. Ainsi, par exemple, on trouve souvent, chez différents auteurs, la notation suivante :
variable
v : TABLEAU[1 .. 30] d'ENTIER
Cette notation imite les déclarations définies en langage PASCAL, par exemple. L’important est encore que la notation utilisée précise bien les différents...
Définir un nouveau type de données
Cette section étudie comment définir et utiliser de nouveaux types de données, à l’aide des types élémentaires de base. Cependant, alors que pour les types de base, comme les ENTIERS par exemple, les opérations applicables sont implicitement celles des Mathématiques usuelles, pour ces nouveaux types, il faudra clairement et précisément les définir. C’est ce que nous avons déjà commencé à faire dans le chapitre « Programmes directs » avec le type RÉSERVOIR, par exemple. Cette section propose d’étudier cette question d’une façon plus approfondie.
1. Définir un type de données
Un type de données définit le domaine des valeurs que peuvent prendre les données qui sont des instances de ce type, mais aussi les opérations applicables à ces instances. Ainsi, on peut déterminer la quantité de liquide pour remplir un RÉSERVOIR donné, mais remplir un ENTIER n’a pas de sens, de même que additionner deux réservoirs par exemple. Ainsi, remplir est une opération applicable à une instance de RÉSERVOIR mais pas à une instance d’ENTIER ; de même, on peut additionner deux entiers mais pas des réservoirs.
Un type est défini à partir des types de base, c’est-à-dire des types intuitivement évidents et qui font partie de notre quotidien : les nombres entiers, les nombres réels, les booléens... Les opérations applicables aux instances de ces types de base sont habituellement les opérations mathématiques du domaine : additionner, soustraire, multiplier... deux nombres, calculer aetb, aoub, pour deux booléens a et b, calculer l’intersection, la réunion de deux ensembles... On compose alors des données de ces types de base pour définir un nouveau type particulier. C’est ce qui a déjà été fait, par exemple, pour définir RÉSERVOIR au chapitre « Programmes directs ». Les opérations applicables ont été définies par des algorithmes complémentaires qui opèrent sur des données du type. Les données...
Notes bibliographiques
De nombreux livres et articles traitent des structures de données. C’est même la préoccupation centrale des ouvrages dont le sujet est l’algorithmique. On peut citer, par exemple, [BM83], [CB84], [CV75]... pour un point de vue strictement algorithmique, ou [CAR97] pour des exemples résolus et programmés dans différents langages, comme Java, Ada, C++... Peu d’ouvrages récents, abordables pour une première initiation, s’intéressent aux raisonnements de l’algorithmique. Le livre que vous lisez ne s’intéresse pas aux structures de données, mais bien aux raisonnements qui permettent de construire des algorithmes simples. Les structures élémentaires n’apparaissent ici que comme support, comme prétexte à l’analyse d’algorithmes.
Résumé
Ce chapitre a présenté quelques notions élémentaires sur la définition algorithmique de structures de données. Une structure de données permet de déclarer et d’utiliser des variables dont les valeurs sont des instances du type défini par la structure. Une telle instance est faite d’attributs, qui sont des instances des types de base ou d’autres structures, et d’opérations applicables. Nous avons également étudié plus particulièrement la chaîne de caractères qui permet de définir et d’opérer sur des données textuelles et le tableau qui permet de définir des variables regroupant sous un même nom un multi-ensemble de variables de même type.
Bibliographie
[BM83] Jean-Claude BOUSSARD, Robert MAHL : Programmation avancée - Algorithmique et structure de données ; EYROLLES, 1983.
[CB84] G. CLAVEL, J. BIONDI : Introduction à la programmation - Tome 2 : Structures de données ; MASSON, 1984.
[CV75] Jacques COURTIN, Jacques VOIRON : Introduction à l’algorithmique et aux structures de données - 2 tomes ; Institut Universitaire de Grenoble, Département d’informatique, 1975.
[CAR97] Christian CARREZ : Structures de données en Java, C++ et Ada95 ; InterEditions, 1997.
[LIS01] Barbara LISKOV Program Development in Java ; ADDISON WESLEY, 2001.
[MEY00] Bertrand MEYER : Conception et programmation orientées objet ; EYROLLES, PARIS, 2000.