Anda di halaman 1dari 24

MINISTRE

DE LENSEIGNEMENT SUPRIEUR ET DE LA RECHERCHE SCIENTIFIQUE


UNIVERSIT DALGER 1


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 ;

Var Etud : Enregistrement


Mat : entier ;
Nom,Prnom : chane[20];
Section: caractre;
Date_N : Date;
Date_ins : Date;
Accs au champ dEnregistrement :
Pour accder un champ dune variable denregistrement il faut unis la variable au champ
par un point (.)
Question ?
Var X :entier ;
Y :rel ;
Lire(X,Y) ;
Est-ce que cest juste dcrire sa ?
Rp : faux car on ne peut pas lire deux variables qui nont pas le mme type

Syntaxe :
<Nom_enregistrement>.<Nom_champ> ;
exemple :

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 :

C'est le cas ou au moins un des champs est lui mme un enregistrement


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;

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 :

Les lments d'un tel tableau sont de type "enregistrement"


Exemple :

const /* IDEM * /
type /* IDEM * /
var Section : tableau[1..150] d'Enregistrement;
Accs :

1) Accs au Nom du 25me tudiant de la section


(Section[25].Nom)

6-03-2016

2) Accs au numro du matricule du 6me tudiant de la section:


(Section[25].Mat.Num)

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 :

Avec etud faire


Lire(Nom);
Lire(Prnom);
Avec Mat faire
Lire(option);
Lire(Num);
Lire(Anne);
Fait;
Avec DateN Faire
Lire(Jours); Lire(Mois); Lire(Anne);
Fait;
Fait;
Exercice: chane de caractre

Soit une chane de n caractres.


crire un algorithme qui dit si la chaine est palindrome ou non

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.

Les fichiers squentiels

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.

Instructions sur les fichiers :


on utilise deux instructions :

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

Relire(NomLogique); Cette instruction permet de mettre la tte


lecture/criture sur le 1er lment

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 :

a) crire un algorithme qui permet de remplir un fichier contenant des entiers


strictement positifs, la saisie s'arrte lorsqu'on saisie un nombre ngatif.
b) On veut afficher le nombre des lments paire et les lments impaires dans
ce fichier.


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);

Si (Xmod2==0) p++; sinon imp++;


Finfichier;
FIN.
24-04-2016

Il est obligatoire de fermer un fichier quand on termine et on l'a plus


besoin

effacer(G):
Exercice : Soit un fichier d'entiers strictement positif, la saisie s'arrte
quand on saisie un nombre ngatif
crire un algorithme qui permet de supprimer une valeur VAL dans le
fichier.





Corrig:
Algorithme EXO;
var F,G:fichier d'entiers;
x:entiers;
DEBUT

Rcrire(F);
Assigner(F,"exo.dat");
lire(x);

Tantque(x>0) faire crire(F,x);


lire(x);
fait.

Rpter lire(Val) jusqu' (Val > 0)


Relire(F);
Assigner(G,"temp.dat");
rcrire(G):

Tantque (nonfdf(F)) faire


lire(F,x);
si(Val<>=x) alors crire(G,x);
fsi;

fait;
rcrire(F);
relire(G);

Tantque nofdf(G) faire


lire(G,x);

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

type <Nomtype>= &1%()2;


<lments>=Enregistrement

<Informations>:<type informations>;
<Suivant>:<NomTypr> ;
FinEnrg.

Var <Nom_liste>: <Nom_type>;

Type Ptr= 3%&&4&%

cellule = Enregistrement
Infos:caractre;
Suiv: Ptr;
FinEng.

Var L,P:Ptr;

Schmatiquement :
L
L . *(672L <4*:=()

b
Celulle2

Celulle1

Exercice:

crire un algorithme qui permet de crer la liste suivant:

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;

2) Cration de la cellule contenant "c"


Nouveau(P);

P. *(672 < "9";


P
C

P. 24*: < ;;

P
C

3) La tte de liste n'est pas vide


L <- p;
L

C

L
4) Cration de la cellule qui contient "b"
Nouveau(P);
L
C

P. *(672 < >;


L
C
P
b
5) Changez vers la dernire cellule
P. 24*: < ;;

P
b

6) Changement de l'adresse de la tte de liste

L <- P;

7) Cration de la cellule contenant "A"


Nouveau(P);

Exercice1:
1- Crer une liste de gauche droite

2- Gnraliser la cration pour n cellule

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. *(672 < A=&;


P. 24*: < ;;
L <- 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.

Cration d'une liste de droite gauche :


Algorithme EXO;
Type Ptr= 3%&&4&%
celulle:Enregistrement;
info:entiers;
suiv:ptr;
finenrg.
L,P: .)#;
n,i:entiers;
Rpter
lire(n); jusqu' (n>=0) L <- Nil;
pour i <- 1 n faire
Nouveau(P);
0 . 24*: < ;;
lire(P. *(67);
L <- P;
fait;
0 < @*&;
FIN.

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;

0 . 24*: < @*&;


fsi;
FIN.
P <- L;
Si (L==Nil) alors Nouveau(P);
Lire(P. *(67);
0 . 24*: < @*&;
L <- P;
sinon
Nouveau(R);
Lire(R. *(67);
R. 24*: < @*&;
Tantque(P. 24*: > @*&) 6=*#%
P <- P. 24*:;
fait;
P. 24*: < B;
P <- Nil;
R <- Nil;
FIN.

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:

Type Ptr1= 3%&&4&%


celulle:Enregistrement;
info:rel;
suiv:ptr;
finenrg.
Procdure Create_L(E/L:ptr;S/R:ptr1);
var p,q:Ptr1;
t:Ptr1;
Debut
R <- Nil; P <- L;
Tantque (P<>Nil) faire
q <- p. 24*:;
Nouveau(t);
t. *(67 < 0 . *(67 + + . *(67 /2;
; . 24*: < B;
R <- t;
P <- q. 24*:;
fait;
fait;

Anda mungkin juga menyukai