École Supérieure de Technologie
et d’Informatique
A.U. 2010/2011
Cours : Enregistrements, allocation de la mémoire
Informatique Appliquée 1ère année
1. Déclaration d’un enregistrement
• Le tableau permet de désigner sous un seul nom un ensemble de valeurs de même type,
chacune d’entre elles étant repérée par un indice
• La structure permet de désigner sous un seul nom, un ensemble de valeurs pouvant être de
type différents. L’accès à chaque élément de la structure (nommé champ) se fait par son
nom au sein de la structure.
Nom_enregistrement = enregistrement
Champ 1 : type
Champ 2 : type
…
Champ n : type
Fin_enregistrement
Exemple
PRODUIT = enregistrement
Code : entier;
Quantité : entier ;
Prix : réel ;
Fin_enregistrement
(cid:1) PRODUIT est un nouveau type.
2. Déclaration des variables:
Nom_variable : Nom_enregistrement
Exemple :
pdt1 : PRODUIT ; // variable s’appelle pdt1 de type PRODUIT
(cid:1) Réservation d’un emplacement mémoire nommé pdt1 de type PRODUIT destiné à
contenir deux entiers et un réel.
3. Utilisation d’une structure
a) En travaillant individuellement sur chacun de ses champs
Nom_variable.champ
Exemple :
Algorithme exemple1
TYPE
PRODUIT = enregistrement
code : entier;
Mme Wiem Yaiche Elleuch
Page 1
quantité : entier ;
prix : réel ;
Fin_enregistrement
VAR
Pdt :PRODUIT
DEBUT
Ecrire (« saisir les informations sur un produit ») ;
Lire(pdt.code) ;
Lire(pdt.quantité) ;
Lire(pdt.prix) ;
Ecrire (« les informations sur ce produit sont ») ;
Ecrire (pdt.code) ;
Ecrire (pdt.quantité) ;
Ecrire (pdt.prix) ;
FIN
b) En travaillant de manière globale sur l’ensemble de la structure
(cid:2) Il est possible d’affecter à un enregistrement le contenu d’un autre enregistrement de
même type
Exemple :
pdt1, pdt2 : PRODUIT ;
pdt2.code<-3 ;
pdt2.quantité<-2 ;
pdt2.prix<-11.22 ;
pdt1(cid:3)pdt2
(cid:2) Équivalent à:
(cid:4) pdt1.code(cid:3)pdt2.code;
(cid:4) pdt1.quantité(cid:3) pdt2.quantité;
(cid:4) pdt1.prix(cid:3) pdt2.prix
// pdt2 contient les valeurs (3,2 et 11.22)
// pdt1 reçoit les mêmes valeurs que pdt2
(cid:2) Une affectation globale d’enregistrement est impossible avec des variables ayant une
structure analogue mais ayant des types différents.
Exemple
PRODUIT = enregistrement
Code : entier;
Quantité : entier ;
Prix : réel ;
Fin_enregistrement
ARTICLE = enregistrement
Code : entier;
Quantité : entier ;
Prix : réel ;
Fin_enregistrement
Déclaration de deux types : PRODUIT et ARTICLE ayant les mêmes champs.
Pdt1 : PRODUIT ;
Pdt2 : ARTICLE ;
Pdt1(cid:3)Pdt2 ; => impossible
Remarque
(cid:2) L’affectation globale n’est pas possible entre tableaux, elle l’est par contre entre
enregistrements.
(cid:2) Il est possible d’initaliser une variable enregistrement en donnant la liste des valeurs
séparées par une virgule.
Exemple : pdt(cid:3) {3,4, 15.2}
(cid:1) pdt.code contient 3 ; pdt.quantité contient 4 ; pdt.prix contient 15.2
Mme Wiem Yaiche Elleuch
Page 2
4. Imbrication d’enregistrements
Chaque champ d’un enregistrement peut être de type entier, réel, chaine, pointeur, tableau,
enregistrement, etc
Dans ce qui suit, seront détaillées :
(cid:1) Structures comportant des tableaux
(cid:1) Tableaux d’enregistrements
(cid:1) Structures comportant d’autres structures
(cid:1) Structures comportant des tableaux
EMPLOYE =enregistrement
Cin :entier
Nom : chaine
Heures : tableau de [1..31] d’entier
Fin_enregistrement
(cid:2) Le champ Heures d’EMPLOYE représente le nbre d’heures travaillées pendant chacun
des jours du mois. Exemple, si Heures[1] contient 5, càd que l’employé a travaillé 5h
le 1er jour du mois.
Soit la variable emp : EMPLOYE
(cid:5) emp.heures [4 ]: désigne le nombre d’heures travaillées par l’employé emp, le 4ème
jour du mois (4ème élément du tableau heures de la variable emp).
(cid:5) Exemple d’initialisation: emp(cid:3){123, « med »,{5,7,0,8,5,0,0}};
(cid:1) Tableaux d’enregistrements
Un tableau d’enregistrements est un tableau telque les éléments sont des enregistrements. Par
exemple, un tableau d’employés est un tableau telque chaque élément est de type EMPLOYE.
t : tableau de [1..50] de EMPLOYE
(cid:5)
(cid:5)
(cid:5)
t[i].cin : représente le cin du ième employé du tableau t.
t[i] : représente le ième employé du tableau t (tout l’enregistrement)
t[i]. heures[j] : représente le nombre d’heures travaillées le jème jour du mois par le ième
employé du tableau t.
(cid:1) Enregistrement comportant d’autres enregistrements
DATE= enregistrement
jour: entier
mois: entier
annee: entier
Fin_enregistrement
EMPLOYE =enregistrement
Cin :entier
Nom : chaine
Heures : tableau de [1..31] d’entier
Date_embauche : DATE
Fin_enregistrement
Soit la variable emp: EMPLOYE.
(cid:2) emp.date_embauche.jour : représente le jour d’embauche de l’employé emp.
Mme Wiem Yaiche Elleuch
Page 3
(cid:2) emp.date_embauche: représente la date d’embauche de l’employé emp (de type
DATE)
Exemple 1:
Ecrire un algorithme qui saisit et affiche les informations sur un employé.
ALGORITHME exemple1
EMPLOYE =enregistrement
Cin :entier
Nom : chaine
Heures : tableau de [1..31] d’entier
Date_embauche : DATE
Fin_enregistrement
VAR
emp : EMPLOYE
i : entier
Publicité
PROCEDURE Remplir_tab (VAR t : tableau de [1..31] d’entier)
VAR i :entier
DEBUT
Pour i de 1 à 31 faire
Lire(t[i]) ;
Fin_pour
FIN
PROCEDURE afficher_tab (VAR t : tableau de [1..31] d’entier)
VAR i :entier
DEBUT
Pour i de 1 à 31 faire
ecrire(t[i]) ;
Fin_pour
FIN
DEBUT
Ecrire(« saisir les informations sur un employé » ) ;
Lire (emp.cin)
Lire(emp.nom) ;
Pour i de 1 à 31 faire
Lire(emp.heures[i]) ;
Fin_pour
Lire (emp.date_embauche.jour) ;
Lire (emp.date_embauche.mois) ;
Lire (emp.date_embauche.annee) ;
Ecrire(« Les informations sur l’employé sont » ) ;
Ecrire (emp.cin)
Ecrire (emp.nom) ;
Pour i de 1 à 31 faire
Ecrire (emp.heures[i]) ;
Fin_pour
Ecrire (emp.date_embauche.jour) ;
Ecrire (emp.date_embauche.mois) ;
Ou bien
Remplir_tab(emp.heures) ; // appel
de la procédure Remplir_tab qui permet de
remplir un tableau par des entiers
Ou bien
afficher_tab(emp.heures) ; // appel
de la procédure afficher_tab qui permet
d’afficher un tableau d’ entiers
Mme Wiem Yaiche Elleuch
Page 4
Ecrire (emp.date_embauche.annee) ;
FIN
Exemple 2 : Ecrire un algorithme qui remplit et affiche un tableau de n employés
ALGORITHME exemple2
EMPLOYE =enregistrement
Cin :entier
Nom : chaine
Heures : tableau de [1..31] d’entier
Date_embauche : DATE
Fin_enregistrement
TAB_EMP : tableau de [1..50] de EMPLOYE.
VAR
i , j: entier ;
t : TAB_EMP ;
DEBUT
Ecrire(« Remplissage du tableau d’employés » ) ;
Pour i de 1 à n faire
Lire (t[i].cin)
Lire(t[i].nom) ;
Pour j de 1 à 31 faire
Lire(t[i].heures[j]) ;
Fin_pour
Lire (t[i].date_embauche.jour) ;
Lire (t[i].date_embauche.mois) ;
Lire (t[i].date_embauche.annee) ;
Fin_pour
Ecrire(« Affichage du tableau d’employés » ) ;
Pour i de 1 à n faire
Ecrire (t[i].cin)
Ecrire (t[i].nom) ;
Pour j de 1 à 31 faire
Ecrire (t[i].heures[j]) ;
Fin_pour
Ecrire (t[i].date_embauche.jour) ;
Ecrire (t[i].date_embauche.mois) ;
Ecrire (t[i].date_embauche.annee) ;
Fin_pour
FIN
Ou bien
Remplir_tab(t[i].heures) ; // appel de
la procédure Remplir_tab de exemple1
Ou bien
afficher_tab(t[i].heures) ; // appel de
la procédure afficher_tab de exemple1
5. Enregistrement et fonction, enregistrement et procedure
(cid:4) Les mêmes principes de passage par valeur et passage par adresse s’appliquent aux
variables enrregistrements
Exemple : Réécrire l’algorithme de l’exemple 1 (saisir et afficher les informations sur un
employé), en utilisant des procedures ou des fonctions.
Mme Wiem Yaiche Elleuch
Page 5
ALGORITHME exemple1_version2
EMPLOYE =enregistrement
Cin :entier
Nom : chaine
Heures : tableau de [1..31] d’entier
Date_embauche : DATE
Fin_enregistrement
VAR
emp : EMPLOYE
PROCEDURE Remplir_un_employe (VAR emp : EMPLOYE) // passage par adresse
DEBUT
Lire (emp.cin)
Lire(emp.nom) ;
Remplir_tab(emp.heures) ;
Lire (emp.date_embauche.jour) ;
Lire (emp.date_embauche.mois) ;
Lire (emp.date_embauche.annee) ;
// procédure développée ci dessus
FIN
FONCTION Remplir_un_employe_2() : EMPLOYE
VAR emp :EMPLOYE
DEBUT
Lire (emp.cin)
Lire(emp.nom) ;
Remplir_tab(emp.heures) ;
Lire (emp.date_embauche.jour) ;
Lire (emp.date_embauche.mois) ;
Lire (emp.date_embauche.annee) ;
Retourner emp ;
FIN
PROCEDURE Afficher_un_employe (emp : EMPLOYE) //passage par valeur
DEBUT
Ecrire (emp.cin) ;
Ecrire (emp.nom) ;
afficher_tab(emp.heures) ;
Ecrire (emp.date_embauche.jour) ;
Ecrire (emp.date_embauche.mois) ;
Ecrire (emp.date_embauche.annee) ;
// procédure développée ci dessus
FIN
DEBUT
Ecrire(« saisir les informations sur un employé » ) ;
// procedure
Remplir_un_employe (emp)
// ou bien
emp(cid:3) Remplir_un_employe_2
Afficher_un_employe(emp)
FIN
//fonction
Mme Wiem Yaiche Elleuch
Page 6
6. Pointeur et enregistrement
Un pointeur sur enregistrement est déclaré de la manière suivante :
Nom_pointeur : pointeur sur type
Exemple :
emp : EMPLOYE ;
p : pointeur sur EMPLOYE ;
p(cid:3) &emp ;
// variable emp de type EMPLOYE
// p est un pointeursur une variable de type EMPLOYE
p
F800
F800
emp
Publicité
cin
nom
heures
jour
mois
annee
Date_embauche
F800
F820
F850
F940
Il est possible d’accèder aux différents champs (cin, nom, etc) en utilisant la variable emp ou
bien le pointeur p.
Avec la variable emp, l’accès aux différents champs se fait en utilisant (.).
Exemple : emp.cin ; emp.date_embauche.jour ; etc
Avec le pointeur p, l’accès aux différents champs se fait généralement en utilisant ((cid:6)).
Exemple : p(cid:6)cin ; p(cid:6)date_embauche.jour ; etc
Ou bien (p).cin ; (p).date_embauche.jour
Remarque :
*p : représente le contenu de la variable pointée par p (c’est la variable emp).
=> (*p (cid:7) emp) ;
Mme Wiem Yaiche Elleuch
Page 7
Allocation de la mémoire
Problème
• Souvent, nous devons travailler avec des données dont nous ne pouvons pas prévoir le
nombre.
• Ce serait alors un gaspillage de réserver toujours l'espace maximal prévisible.
•
Il faut donc un moyen de gérer la mémoire lors de l'exécution du programme.
La fonction allouer
• La fonction allouer permet de localiser et de réserver de la mémoire au cours d'un
algorithme.
• La fonction allouer retourne l'adresse d'un bloc en mémoire libre ou la valeur NIL s'il n'y a
pas assez de mémoire.
• D’une manière générale
P : pointeur sur TYPE
P (cid:3) allouer ( n * TYPE)
(cid:1) Crée un tableau de n éléments.
(cid:1) Chaque élément est de type TYPE.
(cid:1) P contient l’adresse de début de l’espace alloué en mémoire
Exemple 1:
P : pointeur sur entier
P(cid:3) allouer (3* entier) ;
=> création d’un tableau de 3 entiers
=> cet espace alloué s’étend sur les adresses F800, F810 et F820
=> p reçoit l’adresse de début : F800
=> (p) ou ((p+0)) représentent le 1er élément du tableau : 3
=> (*(p+1)) : représente le 2ème élément du tableau : 6
=> (*(p+i)) : représente le (i+1)ème élément du tableau
p
F800
3
6
2
F800
F810
F820
Exemple 2 :
P : pointeur sur EMPLOYE
P(cid:3) allouer (3* EMPLOYE) ;
(cid:1) Création d’un tableau pour 3 employés
(cid:1) L’adresse de début de cet espace alloué (F800) est affectée à P.
Mme Wiem Yaiche Elleuch
Page 8
p
F800
Employé 1
Employé 2
Employé 3
Cin nom heures date_embauche
Cin nom heures date_embauche
Cin nom heures date_embauche
F800
F850
F900
(p) ou ((p+0)): représente l’employé 1 (cin, nom, heures et date_embauche), de type
EMPLOYE.
*(p+1) : représente l’employé 2.
*(p+i) : représente l’employé i+1.
*(p).cin ou bien p->cin: représente le cin du 1er employé du tableau
*(p).date_embauche.jour ou bien p->date_embauche.jour : représente le jour de la date
d’embauche du 1er employé du tableau
*(p+0).cin ou bien (p+0)->cin: représente le cin du 1er employé du tableau
*(p+0).date_embauche.jour ou bien p+0->date_embauche.jour : représente le jour de la
date d’embauche du 1er employé du tableau
*(p+1).cin ou bien (p+1)->cin: représente le cin du 2ème employé du tableau
*(p+1).date_embauche.jour ou bien p+1->date_embauche.jour : représente le jour de la
date d’embauche du 2ème employé du tableau
*(p+i).cin ou bien (p+i)->cin: représente le cin du (i+1)ème employé du tableau
*(p+i).date_embauche.jour ou bien (p+i)->date_embauche.jour : représente le jour de la
date d’embauche du (i+1)ème employé du tableau
La procédure libérer
• Si nous n'avons plus besoin d'un bloc de mémoire que nous avons réservé à l'aide de la
fonction allouer, alors nous pouvons le libérer à l'aide de la procédure libérer
libérer (P) ; libère le bloc de mémoire désigné par le pointeur (P);
•
• La procédure libérer ne change pas le contenu du pointeur; il est conseillé d'affecter la
valeur NIL au pointeur immédiatement après avoir libéré le bloc de mémoire qui y était
attaché.
• Avec procédure libérer, on ne peut pas libérer une partie de l’espace alloué.
P : pointeur sur TYPE
P (cid:3) allouer ( n * TYPE)
…….
libérer (P) ;
P(cid:3) NIL ;
Mme Wiem Yaiche Elleuch
Page 9
Tableau de pointeurs sur enregistrements
ETUDIANT= enregistrement
cin : entier
nom : chaine
moy : réel
Fin_enregistrement
tab : tableau de [1..3] de pointeur sur ETUDIANT
tab
F800 F100 F500
étudiant1
étudiant2
étudiant3
11 abc 15.8
12 def 17.9
13 ghi 12.3
Cin nom moy
Cin nom moy
Cin nom moy
F800
F100
F500
tab est un tableau de 3 pointeurs sur ETUDIANT.
Chaque élément du tableau tab contient l’adresse d’un étudiant.
F800 est l’adresse de l’étudiant1. F100 est l’adresse de l’étudiant2. etc
tab[1] : F800.
*(tab[1]) : l’étudiant1 ayant comme adresse (tab[1] :F800). C’est tout l’enregistrement
(11,abc,15.8).
tab[2] : F100.
*(tab[2]) : l’étudiant2 (12,def,17.9).
tab[1]->cin : cin de l’étudiant1
tab[2]->moy : moyenne de l’étudiant2
d’une manière générale :
tab[i] : l’adresse de l’étudiant i.
*(tab[i]) : l’étudiant ayant comme adresse (tab[i]) : tout l’enregistrement (cin, nom, moy).
tab[i]->champ : correspond au champ de l’étudiant i.
ALGORITHME tableau_pointeur
TYPE
ETUDIANT= enregistrement
cin : entier
nom : chaine
moy : réel
Fin_enregistrement
Tab_point : tableau de [1..50] de pointeur sur ETUDIANT
Mme Wiem Yaiche Elleuch
Page 10
VAR
i,n :entier
tab : Tab_point ;
DEBUT
Publicité
Lire(n) ;
pour i de 1 à n faire
tab[i]<- allouer (ETUDIANT) ;
lire(tab[i]->cin) ; // ou bien lire(*(tab[i]).cin) ;
lire(tab[i]->nom) ; // ou bien lire(*(tab[i]).nom) ;
lire(tab[i]->moy) ; // ou bien lire(*(tab[i]).moy) ;
fin_pour ;
ecrire (« affichage des étudiants ») ;
pour i de 1 à n faire
écrire(tab[i]->cin) ; // ou bien écrire(*(tab[i]).cin) ;
écrire (tab[i]->nom) ; // ou bien écrire(*(tab[i]).nom) ;
écrire (tab[i]->moy) ; // ou bien écrire(*(tab[i]).moy) ;
fin_pour ;
FIN
Tableau de pointeurs sur tableaux d’enregistrements
tab
F800 F100 F500
étud1 étud2
étud3 étud4 étud5
étud6 étud7 étud8 étud9
cin nom moy cin nom moy
cin nom moy cin nom moy cin nom moy
cin nom moy cin nom moy cin nom moy cin nom moy
F800
F810
F100
F110
F120
Tableau de 2 étudiants (p=2)
Tableau de 3 étudiants (p=3)
F500
F510
F520
F530
Tableau de 4 étudiants (p=4)
Dans ce schéma, il y a 9 étudiants (étud1…étud9)
tab est un tableau de pointeurs sur ETUDIANT.
Plusieurs appellations sont possibles :
•
•
•
tab[1] : contient l’adresse de début (F800) d’un tableau de 2 étudiants.
tab[1] pointe sur un tableau de 2 étudiants.
tab[1] est un pointeur sur un tableau de 2 étudiants
tab[1] ou (tab[1]+0) => F800
(tab[1]) ou (tab[1]+0) => étud1 (tout l’enregistrement étud1 : cin, nom, moy)
tab[1]->cin ou (tab[1]+0)->cin => cin de étud1
(tab[1]) .cin ou (tab[1]+0).cin => cin de étud1
**
Mme Wiem Yaiche Elleuch
Page 11
tab[1] +1 : F810
*( tab[1] +1 ) : étud2 (tout l’enregistrement étud2 : cin, nom, moy)
(tab[1] +1)-> cin : cin de étud2
*( tab[1] +1 ).cin : cin de étud2.
**
tab[2] ou tab[2]+0 => F100
(tab[2]) ou (tab[2]+0) => étud3 (tout l’enregistrement étud3 : cin, nom, moy)
tab[2]->cin ou (tab[2]+0) ->cin => cin de étud3
(tab[2]) .cin ou (tab[2]+0).cin =>cin de étud3
**
tab[2] +1 => F110
*( tab[2] +1 ) => étud4 (tout l’enregistrement étud4 : cin, nom, moy)
(tab[2] +1)-> cin => cin de étud4
*( tab[2] +1 ).cin => cin de étud4.
*
tab[3] +3 => F530
*( tab[3] +3 ) => étud9 (tout l’enregistrement étud9 : cin, nom, moy)
(tab[3] +3)-> cin => cin de étud9
*( tab[3] +3 ).cin => cin de étud9.
D’une manière générale :
tab[i] +j => représente l’adresse du ((j+1)ème étudiant du tableau dont l’adresse de début se
trouve dans le ième élément du tableau tab.
*(tab[i] +j) => représente le ((j+1)ème étudiant du tableau dont l’adresse de début se trouve
dans le ième élément du tableau tab.
(tab[i] +j)->champ => représente le champ du ((j+1)ème étudiant du tableau dont l’adresse de
début se trouve dans le ième élément du tableau tab.
*(tab[i] +j).champ => représente le champ du ((j+1)ème étudiant du tableau dont l’adresse
de début se trouve dans le ième élément du tableau tab.
ALGORITHME tableau_pointeur_tableau
TYPE
ETUDIANT= enregistrement
cin : entier
nom : chaine
moy : réel
Fin_enregistrement
Tab_point : tableau de [1..50] de pointeur sur ETUDIANT
VAR
i,j,n,p :entier
tab : Tab_point ;
DEBUT
Lire(n) ; // n représente la taille du tableau n
pour i de 1 à n faire
lire(p) // p représente la taille des tableaux d’étudiants (voir schémà).
Mme Wiem Yaiche Elleuch
Page 12
tab[i]<- allouer (p * ETUDIANT) ;
pour j de 0 à p-1 faire
lire (tab[i] +j)->cin)
lire (tab[i] +j)->nom)
lire (tab[i] +j)->moy)
fin_pour
fin_pour
ecrire (« affichage des étudiants ») ;
pour i de 1 à n faire
pour j de 0 à p-1 faire
ecrire (tab[i] +j)->cin)
ecrire (tab[i] +j)->nom)
ecrire (tab[i] +j)->moy)
fin_pour
fin_pour
FIN
Exercice d’application (de la série):
Un étudiant est caractérisé par : cin, nom, date de naissance et moyenne. Ecrire un algorithme
qui remplit et affiche un tableau de n étudiants, ensuite affiche les informations sur l’étudiant
ayant la meilleure moyenne et l’étudiant ayant la plus mauvaise moyenne. Afficher le nombre
d’étudiants ayant une moyenne supérieure ou égale à 10.
Utiliser un tableau statique, ensuite un tableau dynamique.
Utiliser les fonctions et/ou les procédures.
Version utilisant un tableau statique
ALGO ex1_tab_stat
TYPE
TJOUR :1..31
TMOIS : 1..12
TANNEE : 1900..2100
DATE= enregistrement
Jour : TJOUR
Mois : TMOIS
Annee : TANNEE
Fin_enregistrement
ETUDIANT= enregistrement
Cin : entier
Nom : chaine
Date_naiss : DATE
Moy : réel
Fin_enregistrement
TE : tableau de [1..50] d’ETUDIANT
VAR : meilleur : ETUDIANT
mauvais : ETUDIANT
nb_etud,n : entier
t : TE
PROCEDURE remplir_un_etudiant (VAR e :ETDUDIANT)
// passage par adresse
Mme Wiem Yaiche Elleuch
Page 13
DEBUT
Lire(e.cin)
Lire(e.nom)
Lire(e.date_naiss.jour)
Lire(e.date_naiss.jour)
Lire(e.date_naiss.jour)
Lire(e.moy)
FIN
FONCTION remplir_un_etudiant_2(): ETUDIANT
VAR : e :ETUDIANT
DEBUT
Lire(e.cin)
Publicité
Lire(e.nom)
Lire(e.date_naiss.jour)
Lire(e.date_naiss.jour)
Lire(e.date_naiss.jour)
Lire(e.moy)
Retourner e ;
FIN
PROCEDURE Remplir(VAR t :TE, n :entier)
DEBUT
Pour i de 1 à n faire
remplir_un_etudiant(t[i]) //ou bien t[i](cid:3)remplir_un_etudiant_2()
// remplir_un_etudiant est une procédure, remplir_un_etudiant_2 est une fonction
Fin_pour
FIN
PROCEDURE afficher_un (e :ETUDIANT)
DEBUT
// passage par valeur
ecrire(e.cin)
ecrire (e.nom)
ecrire (e.date_naiss.jour)
ecrire (e.date_naiss.jour)
ecrire (e.date_naiss.jour)
ecrire (e.moy)
FIN
PROCEDURE afficher (VAR t :TE, n : entier)
DEBUT
Pour i de 1 à n faire
Afficher_un (t[i])
(t :TE,n :entier, VAR meilleur :ETUDIANT, VAR mauvais :ETUDIANT, VAR
Fin_pour
FIN
PROCEDURE chercher
nb_etud :entier)
VAR i : entier
DEBUT
Nb_etud(cid:3)0 ;
Meilleur(cid:3)t[1] ;
Mauvais(cid:3)t[1] ;
Pour i de 2 à n faire
SI (t[i].moyenne>=meilleur.moyenne) alors meilleur(cid:3)t[i]
FIN_SI
SI (t[i].moyenne<=mauvais.moyenne) alors mauvais(cid:3)t[i]
FIN_SI
Si (t[i].moyenne>=10) alors nb_etud(cid:3)nb_etud+1
FIN_SI
Mme Wiem Yaiche Elleuch
Page 14
Fin_pour
Si (t[1].moyenne>=10) alors nb_etud(cid:3)nb_etud+1
FIN_SI
// le parcours du tableau a commencé à partir du 2ème élément, donc il faut faire un test sur le 1er
FIN
PROCEDURE resultat (meilleur : ETUDIANT, mauvais : ETUDIANT, nb_etud : entier)
DEBUT
Afficher_un(meilleur) ;
Afficher_un(mauvais) ;
Ecrire(nb_etud) ;
FIN
// appel de la procedure afficher_un développée ci dessus
DEBUT
Ecrire(« saisir nbre etudiants ») ;
Lire(n) ;
Remplir(t,n) ;
Afficher(t,n) ;
Chercher(t,n,meilleur,mauvais,nb_etud)
resultat(meilleur, mauvais, nb_etud)
FIN
Version utilisant un tableau dynamique
ALGO ex1_tab_dynamique
TYPE
TJOUR :1..31
TMOIS : 1..12
TANNEE : 1900..2100
DATE= enregistrement
Jour : TJOUR
Mois : TMOIS
Annee : TANNEE
Fin_enregistrement
ETUDIANT= enregistrement
Cin : entier
Nom : chaine
Date_naiss : DATE
Moy : réel
Fin_enregistrement
// on ne déclare pas un tableau
VAR : meilleur : ETUDIANT
mauvais : ETUDIANT
nb_etud,n : entier
p : pointeur sur ETUDIANT
PROCEDURE Remplir_dyn (p :pointeur sur ETUDIANT, n :entier)
DEBUT
Pour i de 0 à n-1 faire
// il faut commencer à partir de 0 parceque (p+0) (cid:7) p représente le premier étudiant du tableau
Remplir_un_etudiant ((p+i)) // ou bien (p+i)(cid:3)remplir_un_etudiant2()
// appel de la procédure Remplir_un_etudiant et de la fonction remplir_un_etudiant2 développées ci-dessus pour tableau
statique
Fin_pour
FIN
Ou bien
PROCEDURE Remplir_dyn (p :pointeur sur ETUDIANT, n :entier)
DEBUT
Mme Wiem Yaiche Elleuch
Page 15
Pour i de 0 à n-1 faire
Lire((p+i)->cin)
Lire((p+i)->nom)
Lire((p+i)->date_naiss.jour)
Lire(((p+i)->date_naiss.mois)
Lire(((p+i)->date_naiss.annee)
Lire((p+i)->moy)
FIN
PROCEDURE afficher (p :pointeur sur ETUDIANT, n : entier)
DEBUT
Pour i de 0 à n-1 faire
Afficher_un (*(p+i))
Fin_pour
FIN
PROCEDURE
chercher
mauvais :ETUDIANT, VAR nb_etud :entier)
(p :pointeur
sur ETUDIANT, n :entier, VAR meilleur :ETUDIANT, VAR
DEBUT
VAR i : entier
Nb_etud(cid:3)0 ;
Meilleur(cid:3)*p ;
Mauvais(cid:3)*p ;
// *p représente le 1er étudiant du tableau
Pour i de 1 à n faire
// on commence le parcours à partir du 2ème étudiant : *(p+1)
SI ((p+i)->moyenne>=meilleur.moyenne) alors meilleur(cid:3)*(p+i) ;
FIN_SI
//Ou bien SI ((p+i).moyenne>=meilleur.moyenne) alors meilleur(cid:3)(p+i) ;
FIN_SI
SI ((p+i)->moyenne<=mauvais.moyenne) alors mauvais(cid:3)*(p+i) ;
FIN_SI
Si ((p+i)->moyenne>=10) alors nb_etud(cid:3)nb_etud+1
FIN_SI
Fin_pour
Si (p->moyenne>=10) alors nb_etud(cid:3)nb_etud+1
FIN_SI // il faut faire un test sur le 1er étudiant puisque le parcours du tableau a commencé à partir du 2ème étudiant
FIN
DEBUT
Ecrire(« saisir nbre etudiants ») ;
Lire(n) ;
p(cid:3) allouer (n* ETUDIANT) ;
Remplir_dyn (p, n) ;
Afficher_dyn(p,n) ;
Chercher_dyn (t,n,meilleur,mauvais,nb_etud)
resultat(meilleur, mauvais, nb_etud)
FIN
// même procédure resultat pour tableau statique
Mme Wiem Yaiche Elleuch
Page 16