Académique Documents
Professionnel Documents
Culture Documents
Programmation et
structures de données
Licence MI 3, semestre 2
Mohamed HAMDAH
Section 9
2015/2016
Sommaire
Chapitre I : les enregistrements
1. Introduction ....................................................................................................................... 1
2. Définittion ......................................................................................................................... 1
3. Déclaration d'un enregistrement ....................................................................................... 2
4. Les opérations sur les enregistrements ............................................................................. 3
4.1. Référence d'un champ .................................................................................................. 3
4.2. Initialisation d’un champ.............................................................................................. 4
4.3. Affichage d’un champ .................................................................................................. 4
5. Emboîtement (imbrication) d’enregistrements ................................................................. 5
6. L’instruction ’’avec’’ ........................................................................................................ 7
7. Exercices d’application ................................................................................................... 10
1. Introduction ..................................................................................................................... 15
2. Définition ........................................................................................................................ 15
3. Déclaration d’un pointeur ............................................................................................... 15
4. Les opérations de manipulation de pointeurs.................................................................. 16
4.1. Création d’une variable dynamique ........................................................................... 16
4.2. Initialisation d’une variable pointeur ......................................................................... 17
4.3. Initialisation d’une variable dynamique (pointée) ..................................................... 17
4.4. Suppression d’une variable dynamique ..................................................................... 18
5. Exemples ......................................................................................................................... 18
1. Introduction ..................................................................................................................... 21
2. Définition ........................................................................................................................ 21
3. Déclaration d’une liste .................................................................................................... 21
4. Création d’une liste chaînée ............................................................................................ 23
4.1. Création d’une liste LIFO .......................................................................................... 23
4.2. Création d’une liste FIFO........................................................................................... 25
5. Les traitementse effectués sur les listes chaînées ........................................................... 28
5.1. L’affichage du contenu d'une liste ............................................................................. 28
5.2. La recherche d’un élément ......................................................................................... 28
5.2.1. La recherche suivant la valeur de l'élément ............................................................... 28
5.2.2. Recherche suivant la position de l'élément ................................................................ 29
5.3. Insertion d’un élément................................................................................................ 30
5.3.1. Insertion au début ....................................................................................................... 30
5.3.2. Insertion à la fin ......................................................................................................... 31
5.3.3. Insertion au milieu...................................................................................................... 31
5.4. Suppression d’un élément .......................................................................................... 32
5.4.1. Suppression au début.................................................................................................. 32
5.4.2. Suppression à la fin .................................................................................................... 33
5.4.3. Suppression au milieu ................................................................................................ 33
6. Listes circulaires ............................................................................................................. 34
6.1. Définition ................................................................................................................... 34
6.2. Création d'une liste circulaire ..................................................................................... 34
6.3. L'affichage du contenu d'une liste circulaire .............................................................. 35
6.4. Recherche d'un élément dans une liste circulaire ....................................................... 35
6.4.1. Recherche en connaissant la valeur de l'élément ....................................................... 35
6.4.2. Recherche en connaissant la position de l'élément .................................................... 36
7. Listes bidirectionnelles ................................................................................................... 36
7.1. Définition ................................................................................................................... 36
7.2. Création d'une liste bidirectionnelle ........................................................................... 37
8. Exemples d'application ................................................................................................... 37
1. Introduction ..................................................................................................................... 40
2. Définition ........................................................................................................................ 40
3. Les caractéristiques d’un fichier à accès séquentiel ....................................................... 40
4. Déclaration d’un fichier .................................................................................................. 41
5. Les primitives de manipulation de fichiers ..................................................................... 42
5.1. L’assignation .............................................................................................................. 42
5.2. L’ouverture d’un fichier ............................................................................................. 43
5.2.1. L’ouverture en mode écriture (Création) ................................................................... 43
5.2.2. L’ouverture en mode lecture ...................................................................................... 43
5.3. La fermeture d’un fichier ........................................................................................... 44
5.4. Les opérations d’entrée/sortie sur un fichier .............................................................. 44
5.4.1. L’opération d’entrée ................................................................................................... 44
5.4.2. L’opération de sortie .................................................................................................. 45
5.5. Marque de fin de fichier ............................................................................................. 45
6. Exemples d’application................................................................................................... 46
Chapitre I : Les enregistrements
2. Définittion
Un enregistrement est une structure de données statique composée d’un ensemble fini
d’éléments appelés champs. Chaque champ est décrit par un nom et un type. Le type d'un
champ peut être soit, un type scalaire (entier, réel, booléen ou car) ou bien un type
structuré (tableau, chaîne, voire un enregistrement). Les champs d’un enregistrement ne
sont pas forcément de même type.
Exemple :
Proposer une structure de données pour sauvegarder les renseignements d'un enseignant;
sachant qu'un enseignant est décrit par quatre champs :
1. Numéro de sécurité sociale NSS de type entier,
2. Nom et prénom de type chaîne de caractères, et
3. Date de naissance de type tableau de trois entiers.
NSS Enseignant
Nom NSS
Nom
Prénom
Prénom
Date_naissance
JJ MM AAAA
Var
<idf_enregistrement> : Enregistrement
<idf_champ_1> : <type_champ_1> ;
<idf_champ_2> : <type_champ_2> ;
…
<idf_champ_N> : <type_champ_N> ;
Fin;
Exemple :
La déclaration d’une variable de type enregistrement décrivant un enseignant est donnée
comme suite :
Var
Enseignant : Enregistrement
NSS : entier;
Nom : chaîne;
Prénom : chaîne;
Date_naissance : tableau [1..3] de entier;
Fin;
Remarque
Un type enregistrement peut être déclaré dans la partie déclarations de types.
Syntaxe :
Type
<idf_type_enregistrement> = Enregistrement
<idf_champ_1> : <type_champ_1>;
<idf_champ_2> : <type_champ_2>;
…
<idf_champ_N> : <type_champ_N>;
Fin;
Var
<idf_enregistrement> : <idf_type_enregistrement>;
Exemple :
Type
Type_enseignant = Enregistrement
NSS : entier;
Nom, Prénom : chaine;
Date_naissance : tableau [1..3] de entier;
Fin;
Var
Enseignant : Type_enseignant;
Syntaxe :
<identificateur_enregistrement>.<identificateur_champ>
Exemple :
Enseignant.NSS est la référence du champ NSS déclaré dans l’enregistrement enseignant.
Remarque :
La variable enregistrement <identificateur_enregistrement> peut être elle même un champ
d'un autre enregistrement, et par conséquent la référence d'un champ peut être généralisé
comme suite :
Syntaxe :
<chemin_champ>.<identificateur_champ>
Syntaxe :
<idf_enregistrement>.<idf_champ_scalaire>←<expression>;
ou
Lire (<idf_enregistrement>.<idf_champ_scalaire>);
Exemple :
Pour initialiser la variable enseignant déclaré précédemment, nous utilisons les instructions
suivantes :
qui le composent.
Syntaxe :
Ecrire (<idf_enregistrement>.<idf_champ>)
Exemple :
Type
Date = Enregistrement
Jour : 01..31;
Mois : 01..12;
Année : 1974..2030;
Fin;
Type_enseignant = Enregistrement
NSS : entier;
Nom, Prénom : chaîne;
Date_naissance, Date_recrutement: Date;
Fin;
Var
Enseignant : type_enseignant;
Après la déclaration de la variable enseignant nous obtenons l’état de mémoire suivant:
Enseignant
?
?
?
? ? ?
? ? ?
Cette déclaration peut être représentée par un arbre comme nous montre le schéma
suivant :
Enseignant
Enseignant.NSS ← 27785916087;
Enseignant.nom ← "HAMDAH" ;
Enseignant.prénom ← "Mohamed" ;
Enseignant.date_naissance.jour ←15 ;
Enseignant.date_naissance.mois ←12 ;
Enseignant.date_naissance.année ←1974 ;
Enseignant.date_recrutement.jour ←01 ;
Enseignant.date_recrutement.mois ←12 ;
Enseignant.date_recrutement.année ←2003 ;
Enseignant
27785916087
HAMDAH
Mohamed
15 12 1974
01 12 2003
Remarque
Le champ jour déclaré dans l’enregistrement date_naissance et celui déclaré dans
l’enregistrement date_recrutement sont appelés homonymes.
6. L’instruction ’’avec’’
Pour simplifier l’écriture de l’algorithme et de ne pas réécrire à chaque fois la référence
enseignant.date_naissance ou enseignant.date_recrutement, nous utilisons l'instruction
"avec".
Syntaxe :
Avec <variable_enregistrement>
Faire
<liste d’actions> ;
Fait;
<variable_enregistrement> désigne le nom d’une variable enregistrement ou son chemin
d’accès.
<liste d’actions> contient la liste d’actions qui manipulent directement à un champ sans
mentionner son chemin d’accès.
Exemple :
L’initialisation de l’enregistrement enseignant peut se faire comme suit :
Avec Enseignant
Faire
NSS ← 27785916087 ;
nom ← "HAMDAH" ;
prénom ← "Mohamed" ;
date_naissance.jour ←15 ;
date_naissance.mois ←12 ;
date_naissance.année ←1974 ;
date_recrutement.jour ←01 ;
date_recrutement.mois ←12 ;
date_recrutement.année ←2003;
Fait;
Pour initialiser directement l’enregistrement date_naissance se trouvant dans
l’enregistrement enseignant nous utilisons les instructions suivantes :
Avec Enseignant.date_naissance
Faire
jour ←15 ;
mois ←12 ;
année ←1974 ;
Fait;
il existe une autre forme de l'intruction avec, il s'agit de la forme imbriquée comme suite :
Avec Enseignant
Faire
NSS ← 27785916087 ;
nom ← "HAMDAH" ;
prénom ← "Mohamed" ;
Avec date_naissance
Faire
jour ←15 ;
mois ←12 ;
année ←1974 ;
Fait;
Avec date_recrutement
Faire
jour ←01 ;
mois ←12 ;
année ←2003;
Fait;
Fait;
Remarque
Dans le cas où nous n’avons pas de variables homonymes, nous pouvons utiliser une autre
syntaxe de l’instruction avec.
Syntaxe
Avec <liste_variables_enregistrement>
Faire
<liste_actions>;
Fait;
<liste_variables_enregistrement> représente une liste de variables enregistrement «V, V1,V2
..,Vn» . L’enregistrement V représente la racine, alors que les Vi représentent les
variables enregistrement engendrées directement ou indirectement par V.
Exemple :
nom ← "HAMDAH" ;
prénom ← "Mohamed" ;
jour ←15 ;
mois ←12 ;
année ←1974 ;
Fait;
Avec enseignant, date_recrutement
Faire
jour ←01;
mois ←12;
année ←2003;
Fait;
Exemple :
Soit l’instruction avec suivante :
Cette écriture est fausse (ambiguë), car les champs : jour, mois et année sont déclarés dans
les deux enregistrements date_naissance et date_recrutement. En effet, pour afficher ceux
déclarés dans la date de naissance, nous devrons le spécifier soit en donnant le chemin
juste après le mot clés avec ou bien en utilisant une autre instruction avec.
Avec Enseignant
Faire
Avec
Faire
date_naissance
Écrire (jour, mois,année);
Fait;
Fait;
Ou bien
Avec Enseignant.date_naissance
Faire
Remarque :
La première forme est plus générale et offre plus de souplesse.
7. Exercices d’application
Exercice 1
Ecrire une fonction qui vérifie la cohérence des dates de naissance et de recrutement lues.
Exercice 2
Ecrire un algorithme qui affiche l’age d’un enseignant exprimé en nombre de jours.
Exercice 3
Ecrire un algorithme sous forme d’actions paramétrées permettant la lecture et la
sauvegarde des renseignements de 20 enseignants.
Exercice 4
Ecrire une procédure affichage qui affiche la liste du tous les enseignants suivant l’ordre
alphabétique.
Solution :
Date_recrutement = date_naissance + age_minimum_enseignant.
Const
Age_min =25;
Type
T_jours = 1..31;
T_mois = 1..12;
T_année = 1974..2010;
Date = Enregistrement
Jour : T_jours;
Mois : T_mois;
Année : T_année;
Fin;
Fonction vérification (date_recrutement, date_naissance : date) : booléen;
Début
Si (date_rerutement.année <= date_naissance.année+age_min)
alors vérification ←faux;
Solution :
Algorithme exemple;
Const
Age_min = 25;
Type
T_jour = 1..31;
T_mois = 1..12;
T_année = 1974..2010;
Date = Enregistrement
Jour : T_jours;
Mois : T_mois;
Année : T_année;
Fin;
Type_enseignant = Enregistrement
NSS : entier;
Nom, Prénom : chaine[30];
Date_naissance, Date_recrutement : Date;
Fin;
Var
Enseignant : type_enseignant ;
V_enseignant : tableau [1..20] de type_enseignant ;
Début
Pour i ← 1 à 20
Faire
Avec V_Enseignant[i]
Faire
Lire (NSS) ;
Lire(nom, prénom) ;
avec date_naissance
Faire
Lire (jour, mois, année) ;
Fait;
Avec date_recrutement
Faire
Lire (jour,mois,année);
Fait;
Fait;
Fin.
2. Définition
Une variable de type pointeur est une variable qui peut stocker une valeur de type adresse.
Le type pointeur est urilisé pour gérer une variable pointée appelée variable dynamique. Elle
n’est pas explicitement déclarée dans la partie déclaration, mais elle est crée et libérée,
dynamiquement, selon le besoin dans la partie actions d’un algorithme.
Var
<idf_pointeur> : ^ <type_variable_pointée>;
Exemple :
Ptr_entier : ^entier;
Suite à cette déclaration nous obtiendrons l’état suivant :
Ptr_entier
?
Remarque :
Si le type de la variable pointée est structuré, il est préférable de le déclarer d’abord dans la
partie type.
Exemple :
La déclaration d’un pointeur sur un enregistrement contenant les informations d’un
enseignant est donnée comme suite :
Type
Enseignant = Enregistrement
NSS : entier;
Nom, Prénom : chaîne;
Date_naissance : date;
Fin;
Var
ptr_enseignant : ^ Enseignant ;
Type
Enseignant = Enregistrement
NSS : entier;
Nom, Prénom : chaîne;
Date_naissance : date;
Fin;
Ptr_enseignant = ^ Enseignant ;
Var
P, q : ptr_enseignant ;
Syntaxe
Allouer (<Idf_pointeur>);
Exemple :
Allouer (ptr_entier);
Allouer (p);
Après l’exécution de ces deux instructions nous obtiendrons l’état de mémoire suivant:
USTHB, LIC_MI, programmation et structures de données, 2015/2016 Page : 16
Chapitre II : Les pointeurs
@0 P @1 @1
Prt_entier @0
Remarque :
Allouer (p,q);
Exemple :
P ←nil;
q ←p ;
Allouer (P);
Allouer (q);
Remarque :
Les seules opérations autorisées sur une variable de type pointeur sont : l’affectation, la
relation d’égalité ‘=’, et de différence ‘<>’.
Exemple :
P ←nil;
L’expression logique P<>nil retourne la valeur faux.
Exemple :
Allouer (P);
P^ ←125;
Allouer (Q);
Q^ ←p^ ;
Écrire (P^);
Remarque :
Une variable de type pointeur ne peut être lue ni affichée. En effet, les instructions suivantes
sont incorrectes.
Écrire (P);
lire (p)
Syntaxe
Libérer (<idf_pointeur>)
Exemple
Libérer (P);
Après la libération de l’espace mémoire de la variable dynamique P^ son contenu sera perdu
et son espace mémoire peut être alloué à d'autres variables dynamiques.
5. Exemples
Exemple 1 :
Algorithme pointeurs;
Type
Ptr_entier=^entier ;
Var
P, Q : Ptr_entier;
Début
Allouer (P);
P^ ←10;
Q ←P;
Q^ ←P^+2;
Q ←Nil;
Libérer (P)
Allouer (Q);
Fin.
P @0 @0 Q ?
?
P @0 @0 Q ?
10
P @0 @0
Q @0
12
P @0 @0 Q Nil
12
P ? Q Nil
P ? @0 Q @0
?
Exemple 2 :
Écrire un algorithme permettant la lecture et la sauvegarde des renseignements de N
enseignants (N<100).
NB : Les éléments du vecteur sont de type pointeur.
Algorithme enseignants;
Type
Ptr_enseignant = ^enseignant;
Enseignant = Enregistrement
NSS : entier;
Nom, Prénom : chaîne;
Date_naissance : date;
Fin;
Vect 10 0 7 2 -80 23
2. Définition
Une liste linéaire chaînée est une suite d’éléments de même type. Chaque élément de la liste
est composé de deux parties : la partie information, et la partie lien de chaînage. La première
partie contient l'information véhiculée par cette liste qui peut être soit de type simple ou
structurée, alors que la seconde (adr_svt) représente un lien de chaînage contenant l’adresse
de l’élément suivant. Les éléments d’une liste ont la même représentation en mémoire comme
nous montre le schéma suivant :
adr 10
info adr_svt
Syntaxe
Type
<idf_type_pointeur> = ^ <element_liste>;
<element_liste> = Enregistrement
<info> : <type_info>;
<suivant> : <idf_type_pointeur>;
Fin;
Var
<idf_tête> : <idf_type_pointeur> ;
Exemple
La déclaration d’une liste chaînée contenant des entiers est donnée comme suite :
Ptr =^Element;
Element=Enregistrement
Info : entier;
Svt : ptr;
Fin;
Var
Liste_entier : Ptr;
Exemple :
La déclaration d’une liste chaînée contenant les informations de N enseignants est donnée
comme suite :
Type
Ptr =^Enseignant;
Enseignant = Enregistrement
NSS : entier;
Nom, prénom : chaîne[30];
Date_naissance : Date;
Svt : ptr;
Fin;
Var
Liste_enseignant : ^ enseignant;
Remarque :
Si le type du champ information est structuré, il est préférable de le déclarer d’abord dans la
partie type.
Type
Enseignant = Enregistrement
NSS : entier;
Nom, prénom : chaîne[30];
Date_naissance : Date;
Fin;
Ptr_enseignant = ^E_enseignant;
E_enseignant = Enregistrement
Info : enseignant;
Svt : ptr_enseignant;
Fin;
Var
Liste_enseignant : ptr_enseignant;
Exemple
Soit le tableau d’entiers suivant :
Vent 10 0 0 25 0 23
La liste chaînée permettant contenant uniquement les valeurs non nulles de ce vecteur est
donnée comme suite :
Tête 10
Tête 10
Tête ← Nil;
Allouer (P);
P^. info ← 23;
P ^.svt ← Nil; ou P ^.svt ← tête;
Tête ←P;
Tête 10 P 10
23 Nil
Allouer (P);
P^. info ← 25;
P ^.svt ← tête;
Tête ←P;
Tête 10 P 10
25 Nil 23 Nil
Allouer (P);
P^. info ← 10;
P ^.svt ← tête;
Tête ←P;
Tête 10 P 10
Généralisation
Pour un vecteur T de N éléments
Tête ←nil;
Pour i ← 1 à N
Faire
Allouer (P);
P^.info ←T[i];
P^.svt ←tête;
Tête ←P;
Fait;
Tête Nil
Tête 10 P 10
10 Nil
Tête 10
10 Nil 25 Nil
Allouer (Q);
Q^. info ← 23;
P^.svt ← Q;
P← Q;
P^.svt←Nil
Tête 10
Généralisation
Pour un vecteur de N éléments.
Allouer (P);
P^. info ← T[1];
Tête ←P;
Pour i ← 2 à N
Faire
Allouer (P^.svt);
P←P^.svt;
P^.info ←T[i];
Fait;
P^.svt ←Nil;
ou
Allouer (P);
Tête ←P;
Pour i ← 1 à N-1
Faire
P^. info ← T[i];
Allouer (P^.svt);
P←P^.svt;
Fait;
P^.info ←T[N];
P^.svt ←Nil;
Exemple
Créer une liste linéaire chaînée à partir d’un vecteur de N entiers (N<101).
Algorithme Liste;
Type
Ptr =^élément;
élément = Enregistrement
Info : entier;
Svt : ptr;
Fin;
TAB = tableau [100] de entier;
Var
Téte, p : ptr;
F : TAB;
Fin;
Procédure liste_fifo (E/T : tab; E/ N : Entier ; S/tête : Ptr);
Début
Allouer (tête); P ←tête;
Pour i ← 1 à N-1
Faire
P^. info ← T[i];
Allouer (P^.svt);
P←P^.svt;
Fait;
P^.info ←T[N];
P^.svt ←Nil;
Fin;
Tête 10
Cas 1 :
La recherche de l’élément 25 retourne son adresse.
Cas 2 :
La recherche de l’élément 40 retourne la valeur Nil (car il n’existe pas dans la liste).
Fonction adresse (tête : ptr; val : entier) : ptr;
Var
P : ptr;
Début
P ←Nil;
Tant que (tête <> Nil) et (P =Nil)
Faire
Si tête^. Info= val alors P ←tête
Sinon Tête← tête^.svt
Fsi;
Fait;
Adresse←P;
Fin;
Tête 10
Pour la recherche de l'adresse d'un élément dans cette liste, nous distinguons deux cas de
figures.
Cas 1 :
La recherche d’un élément se trouvant à une position K (K=1,2 ou 3) et qui retourne son
adresse.
Cas 2 :
La recherche d’un élément se trouvant à une position invalide (K>3) et qui retourne la valeur
Nil. La fonction décrivant cette recherche est donnée comme suite :
Tête 10
-2 Nil
-2 Nil 10 Nil 25 23
P 10 7 Nil
13 Nil 23 Nil
P 10 Q 10 29
Début
Si (k=1) alors insertion_début (Tête, val); Possible ←vrai;
Sinon P ←adresse (tête, k-1) ;
Si (P<> Nil) alors allouer (Q);
Q^.info ← val;
Q^.svt ←P^.svt;
P^.svt ←Q;
Sinon possible ← faux
Fsi;
Fsi;
Fin;
Tête 10
Tête 10
P 10
10 Nil 25 23 Nil
Q 10 7 Nil
P 10 Q 10
6. Listes circulaires
6.1. Définition
Est une liste linéaire chaînées dont le dernier élément de liste pointe sur le premier comme
nous montre le schéma suivant :
Tête 10
10 Nil 25 Nil 23
Répéter
si (tête^. info=val) alors adresse← tête ; tête← P;
sinon Tête← tête^.svt;
Fsi;
Jusqu'à (tête =P);
Fsi;
Fin;
Fsi;
Fin;
7. Listes bidirectionnelles
7.1. Définition
Est une liste linéaire chaînée, telque chaque élement de la liste contient deux pointeurs : svt et
pred qui décrivent respectivement le pointeur sur le suivant et sur le précédent.
Tête 10
10 12 25
Nil
Nil
Type
ptr=^elt;
elt=Enregistrement
info :entier;
svt, pred :ptr;
Fin;
8. Exemples d'application
Exemple 1
Écrire une action paramétrée permettant de trier une liste d'entiers dans l'ordre croissant du
champ information. Notons que le tri demandé consiste à changer uniquement la valeur des
champs information sans toucher aux liens de chaînage.
I ←Tête;
Tant que (I<>Nil)
Faire
J ←I^.svt;
Tant que (J<> Nil)
Faire
Si (J^.info > I^.info) alors
Allouer (V);
V^←I^.info;
I^.info ← J^.info;
J^.info ←V^;
Libérer (V)
Fsi;
J←J^.svt;
Fait;
I←I^.svt;
Fait;
Fin;
Exemple 2
Écrire une action paramétrée permettant de calculer la somme des N premiers éléments d’une
liste d'entiers.
Somme ←S;
Fin;
1. Introduction
Étant données les renseignements de N enseignants (N<=100), tel que chaque enseignant est
décrit par un NSS (numéro de sécurité sociale), un prénom, un nom, et une date de naissance.
Pour stocker ces informations, nous avons utilisé un vecteur de 100 enregistrements.
Comment faire également pour sauvegarder toutes les informations même après la terminaison
du programme?
Toutes les structures de données vues jusqu’à présent ne répondent plus à ces besoins, car
leur contenu sera perdu juste après la terminaison du programme.
Comme solution, on utilise les fichiers à accès séquentiel.
2. Définition
Un fichier est un ensemble d’informations stockées sur un support physique (disque dur, flash
disque, …). Il s’agit d’une structure de donnée permettant de regrouper et de stocker de
manière permanente, un ensemble infini de variables de même type.
Suivant le mode d’accès à un fichier, nous distinguons deux types de fichier : fichier à accès
séquentiel et fichier à accès direct. Dans ce qui suit nous nous intéressons uniquement aux
fichiers à accès séquentiel.
10 2 X ….
Premier élément
Nom_logique Nom_physique
^Nom_logique
(Tampon)
Syntaxe
Var
<idf_fichier_logique> : Fichier de <type_élément>;
Exemple :
Fich_entier : Fichier de entier;
Remarque :
Si le type des éléments d’un fichier est structuré, il est préférable de le déclarer d’abord dans
la partie type.
Exemple :
La déclaration d’un fichier contenant les renseignements de plusieurs enseignants est donnée
comme suite :
Type
Enseignant = Enregistrement
NSS : entier;
Nom, prénom : chaine;
Date_naissance : date;
Fin;
Var
Fich_enseignant : Fichier de enseignant ;
Type
Enseignant = Enregistrement
NSS : entier;
Nom, prénom : chaîne;
Date_naissance : date;
Fin;
Pour chacune de ces étapes on utilise une primitive (procédure ou fonction) bien déterminée.
5.1. L’assignation
L'assignation est une opération qui permet de faire la correspondance entre le nom logique et
le nom physique d’un fichier, pour ce faire on utilise la procédure Assigner ( ).
Syntaxe
Exemple :
Assigner (fich_etudiant, "c: etudiant.dat")
Chemin ← "c: etudiant.dat";
Assigner (fich_etudiant, chemin) ;
Syntaxe
Fécrire (<idf_fichier_logique>);
<idf_fichier_logique> représente une variable décrivant le nom logique du fichier.
Exemple :
Étant donnée la déclaration de l’exemple précédent, pour ouvrir le fichier F en mode écriture
on écrit :
Fécrire (F) ;
<idf_fichier_logique> représente une variable décrivant le nom logique du fichier.
F^
X …. X
Remarque :
Si le fichier est déjà crée, alors toutes les informations que contient seront perdues.
Syntaxe
Flire (<idf_nom_logique>);
Exemple :
L’instruction suivante nous permet d’ouvrir le fichier logique F en mode lecture.
Flire (F)
F^
12 10 X …. 12
Exemple :
Fermer (F);
Exemple :
Soit la déclaration suivante :
Fent : fichier de entier;
Dans ce qui suit nous présenterons l’état de la mémoire après chaque instruction.
Fécrire (Fent);
y ←10; y Fent ^
mettre (Fent, y); X …. 10 X
10 X …. 2 X
10 2 X …. 2 X
USTHB, LIC_MI, programmation et structures de données, 2015/2016 Page : 44
Chapitre IV : Les fichiers séquentiels
y←2;
mettre (Fent, y) ;
Remarque
On ne peut plus modifier la valeur d’un élément.
Syntaxe
Exemple : y Fent ^
Flire (Fent) ; 10 2 4 X …. ? 10
prendre (Fent, y) ; 10 2 4 X …. 10 2
prendre (Fent, y); 10 2 4 X …. 2 4
prendre (Fent, y); 10 2 4 X …. 4 X
Remarque
Le programmeur n’intervient plus dans la gestion de la mémoire tampon du fichier Fent ^.
Syntaxe
Fdf (<nom_logique>) ;
Exemple :
Pour les deux exemples précédents, la fonction fdf () prendra les valeurs suivantes :
6. Exemples d’application
Exemple 1 :
Écrire une action paramétrée permettant la recherche de la valeur et la position du maximum
d’un fichier d’entier.
Solution
Type
Fent = Fichier de entier;
Remarque
L’ouverture et la vérification de fin de fichier peuvent se faire avant l’appel de la procédure.
Exemple 2 :
Écrire une action paramétrée permettant de copier le contenu d’un fichier (source) dans un
autre fichier (destination).
Type
Fent=Fichier de entier;
Exemple 03 :
Écrire une action paramétrée permettant de fusionner deux fichiers (F1 et F2) d’entiers triés
dans l’ordre croissant pour avoir un troisième (F3) trié dans le même ordre.
Remarque :
L’ouverture des trois fichiers est réalisée avant l’appel de la procédure fusion comme suit :
Si non fdf (F1) alors si non fdf (F2) alors fusion (F1, F2, F3)
Sinon copier (F1, F3)
Fsi
Sinon si non fdf(F2) alors copier (F2, F3)
Sinon écrire (‘les deux fichiers sont vides’)
Fsi;
Fsi;
Fermer(F1); Fermer(F2); Fermer(F3);