DPARTEMENT MATHMATIQUE ET INFORMATIQUE
COURS
STRUCTURE DE
DONNE
(ALGO 2)
SECTION: B
Les enregistrements
Introduction :
Contrairement la structure de tableau qui permet de regrouper plusieurs
donnes qui ont obligatoirement du mme type sous le mme nom, les
enregistrements permet de regrouper plusieurs donnes qui ne sont pas
ncessairement du mme type
Exemple :
Matricule
Nom
Jours
Etudiants
Prnom
Mois
Date de naissance
Anne
Dfinition :
Un enregistrement est une structure de donne qui a un nombre fixe et composants appel
champs, ces composants ne sont pas obligatoirement du mme type ainsi quil faut dfinir
pour chaque champ son identifiant, son type qui peut tre simple ou structur (Vecteur,
Matrice, chane)
Exemple :
Re :entier ;
Complexe En :entier ;
21/02/2016
Dclaration :
var <nom_energistrement> : Enregistrement
<Nom_champ1> :<type1> ;
<Nom_champ2> :<type2> ;
.
.
<Nom_champN> :<type> ;
FiEnrg ;
Exemple :
Type Date = Enregistrement
Jour : 1.31 ;
Mois : 1.12 ;
Anne : 19802500 ;
FiEnrg ;
Lire(Etud.Mat) ;
Lire(Etud.Date_N.Jour) ;
Lire(Etud.Date_ins.Jour) ;
Lire(Etud.Nom,Etud.Prnom) ;
Opration de manipulation des enregistrements :
1) Lecture/criture :
La lecture/criture dun enregistrement se fait champ par champ
2) Affectation :
LAffectation se fait champ par champ
Exemple :
Etud.Date_N.Anne <- 1531084599
3) Comparaison :
Si Etud.Date_N.Anne < 2006 alors
Exercice :
crire un algorithme qui permet de faire la somme de deux nombre complexe ?
Corrig :
Algorithme Somme_Complexe ;
Type Complexe : Enregistrement
Rel :rel ;
Im :rel ;
FiEnrg;
Var c1,c2,S : Complexe ;
Lire(c1.Rel,c1.Im) ;
Lire(c2.Rel,c2.Im) ;
S.Rel <- c1.Rel+c2.Rel ;
S.Im <- c1.Im+c2.Im ;
SI (S.im>0) alors crire (S.Rel,"+",S.Im,"i") ;
Sinon crire (S.Rel,"-",S.Im,"i") ;
FIN.
25-02-2016
Exercice :
crire un algorithme qui permet d'afficher le nombre de jour qui spare une date partir
d'une date de naissance donn
Exemple :
Type Code = Enregistrement
Anne : 2000 ... 2700;
Option: 1...15;
Nb: 1...90000;
FiEnrg;
Date = Enregistrement
Jour: 1...31;
Mois: 1...12;
Anne: 1990...2500;
FiEnrg;
Etudiant = Enregistrement
Nom,Prnom: chane[20];
Mat:Code;
DateN:Date;
Moy:rel;
FiEnrg;
Exercice:
crire un algo qui permet de saisir les infos d'un tudiant et dterminer si il est admis ou
non.
Corrig:
Algorithme EXO;
var etud: Etudiant;
code: Code;
DEBUT
lire(etud.Mat.Anne); lire(etud.Mat.Option); lire(etud.Mat.Nb);
lire(etud.Nom,etud.Prnom);
lire(etud.DateN.Jour); lire(etud.DateN.Mois); lire(etud.DateN.Anne);
lire(etud.Moy);
Si (etud.Moy 10) alors crire ("admis"); sinon crire ("non admis");
FIN.
Les variables structurs mixtes :
a) Enregistrement d'Enregistrement :
28-02-2016
Remarque:
Pour les enregistrements, la manipulation des variables autonyme ne pose pas de problme
exemple:
lire(etud.DateN.Anne);
lire(etud.Mat.Anne);
b) Enregistrement de tableau :
C'est le cas d'un enregistrement ou au moins l'un des champs est un tableau
exemple:
const examen=4;
module = 8;
type /* Code et date dj vue
etudiant=enregistrement
mat:Code;
Nom,Prnom:chane;
DateN:Date;
Nationalit:chane[30];
Sem1,Sem2:tableau[1...examen,1...module] de rel;
Moy:tableau[1...module] de rel;
MoyG:rel;
FiEnrg;
var etud: etudiant;
Accs:
On veut l'accs la note du 4me examen, du 3me module du semestre 1:
lire(etud.Sem1[4,3]);
On veut l'accs la moyenne du 2me module d'un tudiant ?
lire(etud.Moy[2]);
c) Tableau d'enregistrement :
const /* IDEM * /
type /* IDEM * /
var Section : tableau[1..150] d'Enregistrement;
Accs :
6-03-2016
3) Accs la note du 2me examen du 7me module du semestre 2 concernant le 5me tudiant
de la section:
(Section[5].Sem2[2,7])
Instruction Avec:
L'utilisateur des enregistrements peut rendre des fois l'criture de l'algorithme trs lourde.
L'instruction Avec permet de simplifier cette criture et d'accder au champ de
l'enregistrement comme s'il tait des variables simple
Syntaxe :
Avec <Variable enregistrement> faire
<Groupe d'instructions>;
fait;
Exemple :
Corrig:
Algorithme EXO;
var C: chane:
l,i:entier;
B:Boolen;
DEBUT
lire(C);
l <- longueur(C);
B <- Vrai; i<- 1;
Tantque (i<l) et (B=Vrai) faire
Si (C[i]<>C[l]) alors B <- faux;
Sinon
debut
i <- i + 1;
l <- l - 1;
fin;
Si (B= Vrai) alors crire("Palindrone");
sinon crire ("Non palindrone");
FIN.
13-03-2016
1) Introduction :
Tout les structures donns tudi prcdemment (tableau, enregistrement,
variables simple. ) elle servait dcrire les informations situ la mmoire
central (RAM). Ces informations sont volatiles c'est dire elle sont perdu la fin
de l'excution du programme ou ds que la machine est teinte, en revanche, la
structure d donne "fichier" conserve les donnes de faons permanente mme
si la machine est teinte de plus, la taille est apriori illimit (structure de donne
dynamique).
2) Dfinition :
Un fichier est un ensemble d'informations stockes sur un support Physique
(Disque dur, flash disque.) il permet une sauvegarde permanente des
informations de taille apriori illimit
On distingue deux techniques dorganisation du Fichier
a) Accs squentiel :
Pour rechercher un lment dans le fichier il faut parcourir squentiellement
tout les lments du dbut jusqu' l'lment voulu.
La cration d'un nouvel lment se fait toujours la fin du fichier.
b) Accs direct :
Il permet de se dplacer sur l'lment voulu directement sans avoir parcourir
les lments qui le prcde.
REMARQUE : Seulement l'accs squentiel sera trait dans ce cours.
Tte de lecture
Schmatiquement :
25
16
-2
3
42
55
128
1
2
lment
1er
courant
lment
Marque de fin
de fichier
Schmatiquement un fichier peut tre reprsent par un ruban form de cellule (place mmoire) et
possdent une tte lecture/criture qui permet de se positionner sur l'lment lire ou crire
L'lment de dessous de la tte lecture/criture est appel "lment courant"
17-04-2016
Var NomFichier:Fichier<Type>;
Le nom du fichier lors de la dclaration est appel nom logique du fichier.
Exemple :
Algorithme EXO;
var F:fichier char;
X:entiers;
Debut
Rcrire(F);
Assigner(F,fichier.txt");
L'instruction rcrire permet de crer le fichier cependant si on crit rcrire
pour un fichier dj cre, cette instruction permettra d'effacer tout les lments
contenus dans le fichier.
- Un fichier utilisera toujours une variable appele "mmoire temp" qui sera son
intermdiaire avec les diffrents priphriques et la mmoire centrale.
La variable temp et le fichier aurons toujours les mmes types.
FDF(NomLogique);
C'est une fonction boolenne qui donne Vrai si la tte lecture/criture est sur la
marque de fin de fichier, elle donne Faux dans le cas contraire.
la cration d'un fichier, FDF est Vrai
crire(NomLogique,Var Temp);
crire(F,X);
Cette instruction permet de mettre la valeur contenue dans la variable au
niveau de l'lment X du fichier (l'lment qui se trouve au dessous de la tte
lecture/criture)
La tte lecture/criture avance automatiquement l'lment suivant
Lire(NomLogique, VarTemp); cette instruction permet de mettre le contenu
de l'lment courant qui se trouve au dessous de la tte lecture/criture et elle
l'affecte la variable temp
La tte lecture/criture passe l'lment suivant.
Exercice :
Corrig :
a) Algorithme EXO;
Var P=0,Imp=0,X:entiers;
F:fichier entiers;
DEBUT
Rcrire(F);
Assigner(F,test);
Lire(X);
Tantque (X>0) debut
crire(F,X);
lire(X);
fin;
b) Relire(F);
Tantque(FDF(F,X)!=Vrai) faire debut
Lire(F,X);
Corrig:
Algorithme EXO;
var F,G:fichier d'entiers;
x:entiers;
DEBUT
Rcrire(F);
Assigner(F,"exo.dat");
lire(x);
fait;
rcrire(F);
relire(G);
crire(F,x);
fait,
effacer(G);
relire(F);
Tantque nonfdf(F) faire
lire(F,x);
crire(x);
fait;
fermer(F);
FIN.
Une variable de type pointeur est une structure de donne dont la valeur ne
peut-tre qu'une adresse.
La variable pointe (variable dynamique) est implicitement dclare mais elle
est libre et cre dynamiquement
var <nompointeur>: <type>
<nompointeur> est un idf (identifiant)
<type> peut tre simple (entier, rel, caractre..) , comme il peut tre compos
var p: #%&;
Nouveau(Nompointeur);
P
P
4
(1) var p: %()*%#;
Dbut
6
(2) Nouveau(P);
(3) P <- 4;
(4) q - p;
(5) Nouveau(P);
(6) P <- 6;
(7) + < . ++ ;
(8) Librer(p)
(9) p <- Nil;
FIN.
L'ancien endroit o pointe P est perdu (valeur 4 perdu) parce-que pour le
systme l'espace est dj pointe P est occup mais au mme l'adresse est
perdue
avant dlaisser une place une faut la librer
08-05-2016
Laisser(pointeur);
Si un pointeur contient la valeur "nil" sa veut dire il ne pointe vers aucun endroit
Droulement :
L'instruction
(1)
p
(2)
(3)
0
4
(4)
p
4
(5)
(6)
q
4
p
q
p
(7)
(8)
q
p
10
(9)
0
10
Une liste chane reprsente une suite dlments de mme types, chaque lment de la liste de
dcompose en deux parties :
a) une partie information : qui peut tre simple (entier, caractre etc.)) ou compos
(enregistrement, tableau ..)
b) une partie chanage : contenant l'adresse (pointeurs) de l'lment suivant
REMARQUE :
Le premier lment de la liste a une adresse qui est contenu dans un pointeur qui s'appelle tte de liste.
La tte de liste dtermine la liste en entier
<Informations>:<type informations>;
<Suivant>:<NomTypr> ;
FinEnrg.
cellule = Enregistrement
Infos:caractre;
Suiv: Ptr;
FinEng.
Var L,P:Ptr;
Schmatiquement :
L
L . *(672L <4*:=()
b
Celulle2
Celulle1
Exercice:
NIL
Celulle3
I) Cration de droite crer (on crer la dernire cellule par le suite jusqu' arriv la premire cellule):
1) Cration d'une liste vide
L <- Nil;
P. 24*: < ;;
P
C
L
4) Cration de la cellule qui contient "b"
Nouveau(P);
L
C
P
b
L <- P;
Exercice1:
1- Crer une liste de gauche droite
Corrig:
1- Cration d'une liste de gauche droite:
Debut
Nouveau(L);
Lire(0 . *(67);
P <- L;
Pour i <- 2 n faire Debut
Nouveau(P. 24*:);
P <- P. 24*:
Lire(P. *(6);
fin;
P. 24*: < @*&; 0 < @*&;
FIN
Exercice2:
Soit une liste chane d'entiers L, crire une action paramtre qui permet d'insrer une valeur VAL au
dbut de la liste
Corrig:
Procdure INSERT(E-S/L:PTR; E/VAL:entier);
var P:PTR;
Nouveau(P);
P <- Nil;
Fin;
Exercice3:
Insrer la valeur VAL la fin de la liste
Procdure INSERT_END(E-S:PTR;E/VAL:entier);
var P:PTR;
Nouveau (P);
.
.
Exercice (HomeWork):
crire une action paramtre qui permet de dire est-ce que la valeur VAL existe dans une
liste ou non
Corrig:
Algorithme EXO;
type .7*()%4# ;*2)%
type Liste=Enregistrement
Nombre:entiers;
Suivant:Pointeur;
FinEnregistrement
Var N,i:entiers;
Max,min:entiers;
Debut,courant:Pointeur;
Dbut
Nouveau(Debut);
courant <- debut;
Lire(N); i <- 1;
pour i <- 1 N faire
crire("Donner la valeur");
Lire(courant. (71>#%);
Nouveau(courant. 24*:=());
courant <- 374#=() . 24*:=();
fpour.
Exercice:
Crer une liste de gauche droite
Rpter lire(n) jusqu') (n>=0)
Si (n = 0) L <- Nil;
sinon
Nouveau(P);
Lire(0 . *(67);
L <- P;
Pour i <- 2 N faire
Nouveau(R);
Lire(R. *(67);
P. 24*: < B;
P <- R;
fait;
fonction Recherche(E/L:ptr;Val:entiers):boolen);
var B:boolen
debut
B <- faux;
P <- L;
Tantque (P<>Nil) et (B==faux) faire
Si (0 . *(67 == A=&) =&7#2 F < A#=*;
sinon P <- P. 24*:;
fsi;
fait;
recherche <- B;
fin;
Exercice:
Soit L une liste de nombre eniters non vide dont le nombre de cellule est paire
crire une action paramtrer qui partir de L construit selon un parcours de droite
gauche une liste R dont les lments reprsente la moyenne des lments de L pris deux
Corrig:
Dclaration: