Algorithmique & structures de données 1
5 Les Enregistrements
79
Algorithmique & structures de données 1
5.1 Introduction
Les types vus jusqu’à présents sont dits standards car ils sont offerts dans la
librairie du langage de programmation. Qu’en est-il si on veut créer son propre
type ? Ce nouveau type est structuré, et composé alors de types standards ou de
types déjà définis par l’utilisateur. On les appelle aussi types personnalisés.
Ce type abstrait décrit en général en entité (telle que vue par les systèmes
d’information). Un étudiant par exemple est caractérisé par son nom, prénom, âge,
Num_inscription, …Par opposition aux tableaux, les composants des
enregistrements ne sont pas nécessairement de même type. Ces éléments qui
composent un enregistrement sont appelés champs. On retrouve cette notion aussi
en bases de données, un enregistrement est une ligne de la table, et les champs
sont les attributs. Les enregistrements sont appelés structures, en analogie avec le
langage C. Plus tard, ils seront à la base de la construction des fichiers.
Quant à la structuration des données, XML est un bon exemple pour voir la
hiérarchisation dans la description des données. On doit comprendre aussi qu’un
fichier de données est aussi un moyen de communication entre deux programmes,
où le premier programme génère des données qui seront exploitées par le second.
5.2 Enumérations
Ce type a déjà été abordé au chapitre deux avec les types standards. Il permet
d’éviter les erreurs de saisie, notamment d’une chaine de caractères. Une
énumération est un ensemble statique de valeurs prédéfinies et ordonnées.
Nous écrivons :
Enum chiffre ={ zero =0, un, deux, trois, quatre, cinq, six sept, huit, neuf}
Dans ce cas les autres, constantes d’énumération prendront automatiquement les
valeurs, 1, 2, …etc.
En langage algorithmique, on considère l’introduction d’un nouveau type
Type enum {Dimanche, Lundi, Mardi, Mercredi, Jeudi, Vendredi} semaine;
Puis son utilisation en déclarant une variable de ce type (ici jour).
semaine jour;
Nous pouvons utiliser classiquement cette variable dans une instruction switch
pour voir ce que l’on fait chaque jour de la semaine
Switch (jour)
{ case dimanche : ….. ;
Case lundi : …
}
80
Algorithmique & structures de données 1
Nous verrons son utilisation dans la section suivante, celle des structures.
5.3 Déclaration d’un enregistrement
En langage algorithmique En C
Type point=structure Typedef struct
{ {
X :réel; float X;
Y :réel; float Y;
} } point;
Contrairement aux tableaux où tous les éléments sont de même type, les
enregistrements regroupent des données pouvant être de types différents.
Un enregistrement est un ensemble de paires (nom_champ, type_champ) qui
regroupe les données relatives à une même entité ou structure.
Déclarer un enregistrement nécessite de :
Définir son nom.
Définir les champs et leur type.
Langage algorithmique En C
Type nom_type= Structure { struct<Nom_Structure>
nom_champ1: type_champ1 ; {<type_champ1><Nom_Champ1>;
…
<type_champ N><Nom_Champ N>;
nom_champ N:type_champ N ;
} };
Exemple 1
Type Etudiant = structure { Nom : chaîne ;
prénom : chaîne ;
âge : Entier ; Champs
Email : chaine} ;
Nom prénom âge Email
81
Etudiant
Algorithmique & structures de données 1
Exemple 2
En langage algorithmique En C
Type semaine = Enum {Dimanche, Typedef enum {Dimanche, Lundi,
Lundi, Mardi, Mercredi, Jeudi, Mardi, Mercredi, Jeudi, Vendredi}
Vendredi} ; semaine ;
Type date = Structure { Typedef struct{
j_semaine : semaine ; semaine j_semaine ;
j_mois : entier; int j_mois;
mois : entier; int mois;
année : entier; }; int année; } date;
Algorithme main ()
Début {
D1, D2 : date; Date D1, D2 ;
Fin }
Remarque : tous les langages de programmation offrent des fonctions prédéfinies
pour avoir l’horloge du système. Plusieurs formats existent : time(),
datetime.now(), …pour accéder aux informations sur la date et l’heure.
Exemple 4
Type fournisseur = Structure {Nom : chaîne ;
prénom : chaîne ;
adresse : chaine ;
Email :chaine ;
Tel : chaine ;}
5.3.2 Accès à un champ d’enregistrement
On accède à un champ d’enregistrement par un sélecteur de champ.
L’écriture syntaxique du sélecteur reflète la hiérarchie de la structure.
Le sélecteur d’un champ élémentaire de type simple champ d’un enregistrement
nommé Enregistrement est noté : Enregistrement.champ (Le point indique le
chemin d’accès) par Exemple : « point.X « sélecteur du champ X dans la structure
point de l’exemple précédent.
82
Algorithmique & structures de données 1
Des champs appartenant à des structures différentes, peuvent être homonymes
c'est-à-dire, avoir le même identificateur. Par exemple etudiant.prenom de
l’exemple 1 et fournisseur.prenom de l’exemple 4 aucune confusion n’est
possible entre les sélecteurs de champs. Dans certains langages, le sélecteur est
une flèche (en C par exemple). Nous retrouvons aussi le sélecteur dans les
langages objet, c’est un moyen d’accéder aux propriétés ou méthodes de l’objet,
c’est aussi un facilitateur lors de l’écriture du programme, le compilateur nous
affiche la liste des champs (ou propriétés) disponibles une fois le sélecteur saisi.
5.3.3 Structures imbriquées
Un enregistrement est un type défini par le programmeur, il est alors vu comme
un type personnalisé, qui peut être à son tour utilisé dans la définition d’autres
types plus complexes.
Un enregistrement peut être imbriqué dans une autre structure, les champs d’un
enregistrement peuvent être de type enregistrement.
Type date = structure
{
j :entier ;
m :entier ;
a : entier ;
}
Type enseignant= structure
{
Nom : chaîne ;
Prénom : chaîne ;
date_naiss : date ;
module :chaine ;
}
5.3.4 Cas d’un tableau comme champ de structure
Dans une structure on peut avoir des champs de type tableau
Exemple 1
Type Etudiant = structure{
Nom : chaîne ;
Prénom : chaîne ;
date_naiss : date ;
Notes [10] :réel }
83
Algorithmique & structures de données 1
E : Etudiant ;
Nom Prénom date_naiss Notes
9 10 8 12.5 15 7 4 9.5 11 13
1 2 3 4 5 6 7 8 9 10
E.Notes [2] =10. La valeur 10 est contenue dans la 2 èmecase du tableau
« Notes »qui représente le 4ème champ de la structure Etudiant.
Ainsi si on veut accéder au mois de naissance d’un étudiant, on utilise le sélecteur
( ‘.’) de manière hiérarchique : E.date_naiss.m.
5.3.5 Cas de tableaux d'enregistrements (ou tables)
C’est le cas le plus fréquent. En effet, un enregistrement étant un nouveau type,
on peut en regrouper plusieurs de ce type. Il arrive que l’on veuille traiter non pas
un seul enregistrement mais plusieurs, donc on aura un tableau contenant des
enregistrements. Chaque élément du tableau est alors de type structure.
Remarquer que le tableau d’enregistrements est stocké en mémoire par opposition
aux enregistrements manipulés par un fichier.
Exemple
Type enseignant= structure{
Nom : chaîne ;
Prénom : chaîne ;
date_naiss : date ;
module :chaine ;}
Corps enseignant [7] : enseignant ;
Chaque élément du tableau « Corps enseignant « est un enregistrement,. On
accède à un enregistrement par son indice dans le tableau.
Corps enseignant[2] représente le 2èmeenseignant du Corps enseignant
Nom Prénom date_naiss module
i=1
Enregistrements
84
Champs
Algorithmique & structures de données 1
5.4 Autres possibilité de définition de type :
Le langage C fournit des types supplémentaires qui permettent de s'abstraire des
types qui dépendent des caractéristiques techniques de l'ordinateur cible, de la
taille réservée aux données, …etc. Ils sont appelés types abstraits de données.
Grâce à cette notion de bibliothèque où il est possible de définir de nouveaux types
qui seront inclus dans le programme.
Le langage C++ aujourd’hui, compatible avec le C permet d’introduire le
paradigme objet sans perdre de la puissance du C.
Il est à noter que les types présentés ici ne sont pas les seuls disponibles dans les
langages. Chaque langage présente ses propres types mais la plupart manipulent
les types standards. Certains langages offrent des types qui facilitent les
manipulations de données. Ainsi le type intervalle qui précise les bornes
inférieures et supérieures ; Nous en donnons quelques-uns en python :
Le type ensemble set A = set ([‘vert’, ‘blanc’, ‘rouge’]).
Des fonctions prédéfinies permettent de savoir si un élément appartient à une liste
(‘in’), de même que des opérations ensemblistes peuvent être utilisées (union,
intersection, différence, ..)
Le type liste qui est vu comme séquence dans laquelle on rassemble plusieurs
éléments de données dans une même unité. Comme en prolog, on reconnaitra la
liste par les [ ]. Ces crochets sont réservés aux tableaux dans les langages C et
java. En Prolog, il n’y a pas de déclaration explicite de liste, le fait d’écrire les [ ]
signifie automatiquement qu’il s’agit d’une liste.
Liste A = [ 1, 2, 3, 4, 5].
On pourra tester si un élément est dans une liste par la fonction ‘in’
De manière plus hiérarchisée, les tuples peuvent représenter des données
complexes ( à l’image de Xml)
Un_tuple = ( a,b, c, ( d, e), f ( g, ( h, i, j, k)))
Les dictionnaires sont aussi une structure de données intéressante formés d’une
liste de paires clé/valeur (comme un mot et sa définition). On peut par la suite
rechercher une valeur particulière par le nom et un index.
Mon_dico = {‘vert’ :1, ‘blanc’ :2, ‘rouge’ :3}
Donc mon_dico[‘blanc’] donnera la valeur 2.
Nous verrons dans les chapitres suivants les types structurés tableaux et
enregistrements qui permettent de regrouper plusieurs données de même ou
différents types respectivement.
85
Algorithmique & structures de données 1
5.5 Enoncés des exercices d’application
Exercice 6.1
Une carte grise contient les informations sur un véhicule :
Nom et prénom du propriétaire, adresse, N° matricule, marque, type, puissance,
année, couleur.
Le matricule (en Algérie) est un code contenant quatre informations un numéro
de série, le type, l’année, et la wilaya.
1) Donner la déclaration de la structure carte grise.
2) Créer un tableau de 100 véhicules pour remplir les champs déclarés.
3) Ecrire un algorithme qui compte le nombre de véhicules de la wilaya 31 et
affiche ce résultat.
Exercice 6.2
Ecrire un programme en C qui calcule la distance entre 2 points (utiliser la
fonction prédéfinie SQRT de calcul de la racine carrée d’un nombre réel).
Exercice 6.3
Un étudiant est caractérisé par les informations suivantes :
Nom et prénom
Date de naissance
Filière
Matricule
Moyenne
Soit T un tableau d’au plus 100 étudiants. Ecrire un algorithme permettant
d’afficher tous les étudiants admis. Un étudiant est admis si sa moyenne est
supérieure ou égale 10. Calculer et afficher la moyenne de tous les étudiants.
Exercice 6.4
1- Déclarer des types qui permettent de stocker :
Un joueur de basket caractérisé par son nom, sa date de naissance,
sa nationalité et sa taille.
Une équipe de 20 joueurs.
Une association comprenant le nom de l’association, l’équipe des
joueurs et les points marqués par l’équipe.
2- Ecrire un algorithme qui permet de saisir les données des 20 joueurs.
3- Ecrire un algorithme qui compte le nombre de joueurs non algériens.
86
Algorithmique & structures de données 1
Exercice 6.5
Un client dans une banque est identifié par son nom, prénom, adresse, numéro
de compte, e-mail, téléphone et le solde de son compte.
Ecrire un algorithme qui permet de faire la somme des soldes des clients de la
banque et de calculer le solde moyen par client.
Exercice 6.6 non corrigé
On désire représenter une liste de vols (comme un tableau d’affichage d’un
aéroport). Chaque vol contient les informations sur la compagnie, le Num_vol,
destination, heure_départ, observation. On désire créer une autre liste des vols à
destination d’Alger.
Donner la structure de données adéquate et l’algorithme correspondant.
Considérer une solution avec un tableau d’enregistrements
Exercice 6.7 non corrigé
On s’intéresse à la gestion des véhicules d’un parc auto. Chaque véhicule est
caractérisé par
Une marque,
une couleur,
un modèle,
le nombre de places
une puissance
un matricule,
Le matricule est composé de
un numéro,
l’année
le numéro de la wilaya
1- Déclarer la structure « véhicule » contenant les informations ci-dessus
2- Déclarer un tableau T contenant N(≤ 500) véhicules
3- Ecrire une fonction qui compte le nombre de véhicule de marque « Renaut
« et matriculé dans la wilaya 48.
4- Ecrire une procédure qui affiche la marque de voiture qui a la plus grande
puissance parmi tous les véhicules stockés dans le tableau T.
87
Algorithmique & structures de données 1
Corrigés
6.1
TYPE matricule = Structure
{num: entier ; type : entier ; annee : entier, wilaya : entier};
TYPE carte grise = Structure
{nom : chaine; prenom : chaine; mat : matricule; adresse : chaine; marque:
chaine; type : chaine; puissance : chaine; année :entier ;couleur : chaine; };
T [100] : carte grise ;
Algorithme calcul_wilaya
Debut
Variables i, n :entier ;
Pour i de 1 à 100 Faire
Lire(T[i].nom , T[i].prenom , T[i].mat, T[i].adresse,T[i].marque,
T[i].type, T[i].puissance,T[i].annee,T[i].couleur);
Fin pour
n=0 ;
Pour i de 1 à 100Faire
Si T[i].mat.wilaya =31
alors n=n+ 1 ;
Fin si ;
Fin pour;
Ecrire(‘ le nombre de véhicules de matricule 31 est :’,n) ;
Fin
6.2
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
Typedef struct
{
float X;
float Y;
} TPoint;
main()
{
TPoint P1,P2;
Float D;
88
Algorithmique & structures de données 1
printf("Donner l abscisse du premier point\n");
scanf("%f",&P1.X);
printf("Donner l ordonnee du premier point\n");
scanf("%f",&P1.Y);
printf("Donner l abscisse du second point\n");
scanf("%f",&P2.X);
printf("Donner l ordonnee du second point\n");
scanf("%f",&P2.Y);
D = sqrt((P1.X-P2.X)*(P1.X-P2.X)+(P1.Y-P2.Y)*(P1.Y-
P2.Y));
printf("La distance est %.2f\n",D);
}
6.3
TYPE Date = Structure
{j : entier ; m : entier ; an : entier;};
Type Etudiant = structure
{ Nom, Prenom, filiere : chaine ;
Matricule : entier ;
Moyenne : réel ;
ddn : Date ;}
Algorithme Etudiant ;
T [100] : Etudiant ;
Variables i,N :entier ;
Variables M, S: réel;
Début
Ecrire (‘Donner le nombre d’’etudiants’) ;
Repeter
Lire(N) ;
Jusqu’à N>0 et N≤100 ;
Pour i de1 à N Faire
Lire(T[i].nom) ;
Lire(T[i].prenom) ;
Lire(T[i].filiere) ;
Lire(T[i].Matricule) ;
Lire (T[i].Moyenne;
Lire( T[i].ddn.j , T[i].ddn.m, T[i].ddn.an) ;
Fin pour ;
89
Algorithmique & structures de données 1
S←0 ;
Pour i de 1 à N Faire
Si T[i].Moyenne)≥10
Alors Ecrire(T[i].nom) ;
Fin si;
Fin pour ;
Pour i de 1 à N faire
S=S+T[i].moyenne ;
Fin pour ;
M←S/N ;
Ecrire (‘la moyenne des étudiants est :’,M) ;
Fin.
6.4
Type date= structure
{ j: entier ;
m: entier ;
a : entier ;
}
90
Algorithmique & structures de données 1
Type joueur = structure
{
nom, chaine ;
dn: date ;
nat :chaine ;
taille :reél ;
}
E [20] : joueur ;
Type association = structure
{
nom, chaine ;
points :entier ;
equipe : E [20] ;
}
Algorithme saisie
Variable i : entier ;
debut
pour i de 1 à 20 faire
Lire (E[i].nom, E[i].nat, E[i].taille, E[i].dn.j, E[i].dn.m, E[i].dn.a);
fpour
fin
Algorithme compte
Variables c, i :entier ;
debut
pour i de 1 à n faire
si (E[i].nat≠’algerienne’) alors
c←c+1 ;
finsi ;
finpour ;
Ecrire (‘le nombre est :’c)
Fin.
6.5
Type client=structure
{ nom : chaine ;
Prénom : chaine ;
Adresse : chaine ;
NC : chaine ;
91
Algorithmique & structures de données 1
e: chaine ;
tel : chaine ;
S : réel }
B[200] :client ;
Algorithme banque
Variable n : entier ;
Variable ST,M :réel ;
Ecrire (‘donnez le nombre de clients :’) ;
Lire (n) ;
Pour i de 1 à n faire
Lire (B[i].nom, B[i]. Prénom, B[i]. Adresse, B[i].NC, B[i].e, B[i].tel, B[i].S) ;
Finpour ;
ST←0.0 ;
Pour i de 1 à n faire
ST ← ST+ E[i].S ;
Finpour;
Ecrire (‘le solde total est :’,ST)
M←ST/n ;
Ecrire (‘la moyenne du solde par client est :’,M)
Finpour ;
Fin.
92
Algorithmique & structures de données 1
Conclusion Générale
Tout est bien qui finit bien !
Donner une introduction à l’algorithmique via l’informatique est un exercice
pédagogique qui n’est pas aisé. Nous avons donné un bref historique de
l’évolution fulgurante de l’informatique avant d’introduire les bases de
l’algorithmique.
Nous avons insisté sur la méthodologie à suivre pour construire un algorithme
partant de la spécification du problème.
Par opposition aux opérations d’installation d’un produit ou de montage d’un
meuble où on connait à priori à quoi on veut arriver, l’algorithme est présenté
comme un ensemble d’étapes à suivre pour résoudre un problème pratique, et où
la conception des instructions à suivre incombe au programmeur. La maitrise des
structures algorithmiques de base est acquise à ce niveau (les itérations, les
alternatives, …) ainsi que les structures de données utilisées.
Ce dernier doit raisonner par objectif. Cette approche est dite téléologique ou
modèle de l’ours blanc qui a pour objectif de survire dans un environnement
hostile. On connait les données, ou les inputs ; on connait le problème mais on ne
sait pas comment faire.
Et là le génie du programmeur intervient, comme celui d’el Khawarizmi en
indiquant les étapes à suivre pour résoudre une équation. Nous avons vu que ces
instructions prenaient différentes formes, allant de l’itération simple aux boucles
imbriquées, en passant par les alternatives et les boucles ‘Pour’. La structure du
programme est importante pour pouvoir suivre les étapes de son exécution.
Souvent, au début de la programmation, on ne comprend pas pourquoi un
programme ne marche alors qu’on a écrit tout correctement. Les erreurs
sémantiques sont plus difficiles à détecter que les erreurs syntaxiques.
Quant à l’aspect structure de données, l’essence de construire des données
complexes comme les enregistrements à partir des données simples ou types
standards a été expliqué par des exemples et des exercices d’application. Le choix
d’un tableau, matrice ou enregistrement pour la résolution d’un problème fait
partie de la conception globale de la solution.
Nous avons vu ensuite à travers quelques exemples, l’aspect optimisation de
l’algorithme, afin que celui-ci donne une meilleure solution plus rapide ou
nécessitant moins de données ou moins d’espace. Cet aspect sera développé en
Algorithmique avancée, notamment avec les algorithmes de tri.
Enfin, Comme l’histoire de l’œuf et la poule, on ne peut pas dissocier l’algorithme
des données sur lesquelles il travaille. Par quoi commencer ?
93
Algorithmique & structures de données 1
Bibliographie
1- Nicolas Flasque, Helen Kassel , Franck Le poivre , Boris Velikson -
EXERCICES ET PROBLÈMES D’ALGORITHMIQUE-
édition Dunod, Paris, 2010 .
2- Jean Paul Muller & Luca Massaron, « Les algorithmes » , First Interactive
Wiley Publishing Inc, edition 2021
3- Claude Delannoy. Programmer en langage C. 5ième édition Brochet
Eyrolles 2016.
4- Rémy Malgouyres , Rita Zrour , Fabien Feschet- INITIATION À
L’ALGORITHMIQUE ET À LA PROGRAMMATION EN C Cours avec 129
exercices corrigés -2eme édition. Paris Dunod 2014
5- Thomas H.Cormen Charles E.Leiserson& Ronald L.Rivest.
Introduction to Algorithms third edition. MIT Press, Cambridge, Masasuchetts,
London 2009
6- F. FABER & J.F Programmation en C,. ANNE 1998/1999
7- Brian W.Kernigham, Denis M.Richie The C programming langage .
Printice hall Software Series 1999.
8- Thomas H. Cormen, Algorithmes Notions de base Collection : Sciences
Sup, Dunod, 2013.
9- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest Algorithmique
- 3ème édition - Cours avec 957 exercices et 158 problèmes Broché, Dunod,
2010.
10- Rémy Malgouyres, Rita Zrour et Fabien Feschet. Initiation à
l’algorithmique et à la programmation en C : cours avec 129 exercices corrigés.
2ième Edition. Dunod, Paris, 2011. ISBN : 978-2-10-055703-5.
11- Damien Berthet et Vincent Labatut. Algorithmique & programmation en
langage C - vol.1 : Supports de cours. Licence. Algorithmique et
Programmation, Istanbul, Turquie. 2014, pp.232.
12- Damien Berthet et Vincent Labatut. Algorithmique & programmation en
langage C - vol.2 : Sujets de travaux pratiques. Licence. Algorithmique et
Programmation, Istanbul, Turquie. 2014, pp.258. <cel-01176120>
13- Damien Berthet et Vincent Labatut. Algorithmique & programmation en
langage C - vol.3 : Corrigés de travaux pratiques. Licence. Algorithmique et
Programmation, Istanbul, Turquie. 2014, pp.217. <cel-01176121>
14- Claude Delannoy. Apprendre à programmer en Turbo C. Chihab-
EYROLLES, 1994.
94