Retour à l'index

Les types énumérés

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.

Dénition des types énumérés

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 :

Bien entendu cela ne peut concerner que des types correspondants à un ensemble ni d'éléments.

Mise en place des types énumérés en C

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 exemple d'utilisation d'un type énuméré

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 pourrait utiliser le type jour sans utiliser de déclaration de type en écrivant :
    						enum fdimanche, lundi, mardi, mercredi, jeudi, vendredi, samedig J, min, max;
    					
    mais il aurait fallu le répéter pour la déclaration du tableau.
  • Il n'existe pas de fonctions d'entrées-sorties pour les types énumérés, d'où la présence de la fonction ecris.

Règles du choix des identicateurs intervenant dans un type énuméré

On a toute latitude sur le choix des identicateurs mais avec les restrictions (de bon sens) suivantes :


Cours, éxercices ou graphismes libre de droit. Un mail est souhaitable | Webmestre : Aublet Bastien (bastien.aublet@hotmail.fr)