Nous avons vu comment utiliser la boucle pour et comment indexer les tableaux en utilisant les entiers. On peut généraliser la nature des index en utilisant ce qu'on appelle les types ordinaux. Cette possibilité n'est en fait présente que dans peu de langages informatiques. Elle se trouve sous une forme assez sommaire, sous la seule forme des types énumérés, en langage C.
Un type énuméré est un type dont on énumère, c'est-à-dire dont on donne la liste effective, les éléments de ce type. On voit immédiatement des cas où cela peut être intéressant, par exemple pour traiter :
| Définition. | La dénition d'un type énuméré est très simple : on énumère les éléments de ce type, qui sont des identicateurs, séparés par des virgules et encadrés par des accolades ouvrante et fermante. Par exemple :
{lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche}
ou :
{as, roi, dame, valet, dix, neuf, huit, sept}
|
| Déclaration d'un type énuméré. | Pour déclarer un tel type, on commence par le mot clé enum, suivi d'un identicateur qui sera le nom du type, suivi de la dénition proprement dite, suivie d'un point-virgule. Par exemple :
enum JOUR {lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche};
|
| Déclaration d'une variable d'un type énuméré. | On commence également par le mot clé enum, suivi du nom du type, suivi du nom de la variable (ou des variables), suivi d'un point-virgule. Par exemple :
enum JOUR J; |
| Utilisation simple d'une variable d'un type énuméré. | Pour l'instant on ne peut qu'affecter une constante (du type donné) à une variable d'un type énuméré ou comparer une variable du type à une des valeurs du type. Par exemple :
J = dimanche;
if (J == lundi) printf("Monday");
|
| Conversion des types énumérés. | Le langage C considère les valeurs des types énumérés comme des constantes entières de type int, les convertissant dans l'ordre dans lequel elles ont été énumérées lors de la déclaration à partir de 0. Ceci permet alors de travailler comme avec des types ordinaux. |
| Remarque. | On peut forcer un élément d'un type à prendre une valeur donnée (grâce au signe = suivi d'une constante entière), les éléments suivants étant alors incrémentés à partir de cette valeur. Par exemple si on déclare :
enum JOUR {lundi, mardi, mercredi = 20, jeudi, vendredi, samedi, dimanche};
alors mardi aura la valeur 1, mercredi la valeur 20 et jeudi la valeur 21.
|
| Un problème de programmation. | Nous voulons relever la température chaque jour d'une certaine semaine et indiquer les températures minimum et maximum de la semaine en question, ainsi que les jours où celles-ci ont été atteintes. |
| Le problème de la manipulation des jours de la semaine. | On va, à un certain moment, utiliser une variable parcourant l'ensemble des jours de la semaine ou émulant ce parcours. Une façon de faire est de coder ces jours par des entiers de 1 à 7, par exemple, ce que l'on fait souvent. Un problème avec les codages est qu'ils ne sont pas uniques et qu'il peut y avoir ambiguïté ; par exemple les jours de la semaine vont-ils être énumérés de dimanche à samedi (l'aspect légal en France) ou de lundi à dimanche (l'aspect anglo-saxon maintenant largement répandu). |
| Exemple. | Le problème ci-dessus peut être résolu grâce au programme ci-dessous :
#include <stdio.h> ;
enum jour {dimanche, lundi, mardi, mercredi, jeudi,vendredi, samedi};
void ecris(enum jour J)
{
if (J == dimanche) printf("dimanche");
if (J == lundi) printf("lundi");
if (J == mardi) printf("mardi");
if (J == mercredi) printf("mercredi");
if (J == jeudi) printf("jeudi");
if (J == vendredi) printf("vendredi");
if (J == samedi) printf("samedi");
}
int main(void)
{
enum jour J, min, max;
float temp[7];
/* Saisie des temperatures*/
printf("Releve des temperatures de la semaine \n");
for (J = dimanche ; J <= samedi ; J++)
{
printf("Quelle est la temperature du ");
ecris(J);
printf(" : ");
scanf("%f", &temp[J]);
}
/* Determination des extremums */
min = dimanche;
max = dimanche;
for (J = lundi ; J <= samedi ; J++)
{
if (temp[J] < temp[min]) min = J;
if (temp[J] > temp[max]) max = J;
}
/* Affichage des resultats */
printf("\nLa temperature la plus fraiche ");
printf("de la semaine a ete constatee le ");
ecris(min);
printf(". \nElle etait de %3.1f degres C.", temp[min]);
printf("\nLa temperature la plus elevee ");
printf("de la semaine a ete constatee le ");
ecris(max);
printf(". \nElle etait de %3.1f degres C.\n", temp[max]);
}
|
| Commentaires. |
|
On a toute latitude sur le choix des identicateurs mais avec les restrictions (de bon sens) suivantes :
{do, re, mi, fa, sol, la, si}
puisque `do' est un mot réservé ; on peut, par exemple, remplacer `do' par `doo'.
{lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche}
et le type des jours ouvrables :
{lundi, mardi, mercredi, jeudi, vendredi}
puisqu'un identicateur tel que `lundi' aurait deux types, ce qui n'est pas permis.
{1, 3, 5, 7, 9}
ou le type des voyelles :
{'a', 'e', 'i', 'o', 'u', 'y'}
Cours, éxercices ou graphismes libre de droit. Un mail est souhaitable | Webmestre : Aublet Bastien (bastien.aublet@hotmail.fr)