Beruflich Dokumente
Kultur Dokumente
Lakhdar SAS
Licence Maths Info 2me anne
Facult des sciences Jean Perrin - Universit dArtois
Prsentation
Cours :
Responsable : Lakhdar SAS
Contact :
CRIL, Bureau 307
sais@cril.univ-artois.fr
http://www.cril.univ-artois.fr/~sais
Cours :
2 sances /sem : Lundi et jeudi
Amphi S23
Prsentation
TD :
Intervenants :
Lakhdar Sas
Stphane Cardon
TP :
Intervenants :
Lakhdar Sas
Stphane Cardon
Olivier Fourdrinoy
Prsentation
Les examens :
Contrles :
CC : la semaine du 14 novembre
Examen : la semaine du 9 janvier (1re session)
Seconde session : semaine du 20 fvrier
TP : 1 projet + 1 contrle de TP
valuation :
3 ( Ex Ds ) 1
Note Sup ( , Ex) Tp
Si (Note>=10) 4 2 4
alors crire( Admis )
Exemple :
Donnes
type suite = tableau [1..N] dentiers
etudiant = structure
nom, prnom : chane de caractres
Structures
Algorithme de
ge : entier positif donnes
sexe : caractre
... Rsultats
fin structure
Analyse
les nombres ne sont pas des valeurs isoles.
font partie dun texte.
Exemples :
la valeur de x est 1526.32
12 * 5.01 + x = y
Le programme doit :
lire tous les caractres jusquau premier caractre chiffre ;
lire la partie entire du nombre,
et sil trouve le point, la partie dcimale.
Introduction
Exemple :
le mot 15.67 sera traduit en la valeur entire 1567, cette valeur sera
ensuite divis par 102 (2 tant le nombre de chiffres aprs la virgule)
Algorithme
1. rechercher un chiffre
2. lire la partie entire du nombre
3. si il y a un point dcimal
alors
3.1. lire les chiffres suivants ce point
3.2. remettre l'chelle ce nombre
fin si
4. crire le rsultat
Introduction
1. rechercher un chiffre
rpter lire un caractre jusqu trouver un caractre chiffre.
rpter
Rsultats Note
Introduction
0. Calcul de la note finale
Dclaration :
const NOM_CONST = valeur;
var nomVar : type; type de la variable
Exemples : (integer, real, char)
const PI = 3.14;
var rayon, surface: real;
nom de la variable
(identificateur)
Rappel
Oprations :
and (et), or(ou), not(non), xor (ou exclusif)
Les valeurs d'un type numr ordonnes selon leur ordre de dclaration :
Pour le type jourSemaine nous avons
lundi < mardi < mercredi < jeudi < vendredi < samedi < dimanche
Les oprations possibles : = <> < <= > >=, succ, pred, ord
Rappel
Type intervalle
Un intervalle permet de restreindre le groupe des valeurs d'un type appel
type de base et choisi parmi integer, boolean, char ou un type numr.
Exemples:
0..9 est l'intervalle des valeurs entires 0 9, le type de base est integer
lundi..vendredi est l'intervalle des valeurs numres lundi vendredi, le
type de base est jourSemaine
'A'..'Z' est l'intervalle des lettres majuscules, le type de base est char
type chiffre = 0..9;
joursDeTravail = lundi..vendredi;
majuscule = 'A'..'Z';
Exemple :
read (v1, v2, ..., vn); quivaut read (v1); read (v2);... read (vn);
readln (v1, v2, ..., vn); quivaut read (v1);read (v2);...read (vn);
readln;
Rgle pratique :
Pour viter toute surprise, chaque fois qu'une donne tape par
l'utilisateur se termine par une marque de fin de ligne, cette marque doit
tre saute (limine) par l'utilisation de readln.
Rappel
Entres/sorties :
Ecriture : crire en pseudo
write(expression) (resp. writeln(expression) ) permet dafficher des
donnes au clavier, le curseur reste sur la mme ligne (resp. passe la
ligne suivante)
expression peut tre un texte, le contenu dune variable, rsultat
dun calcul.
write(v1, v2, ..., vn); quivaut write (v1); write (v2);... write (vn);
writeln (v1, v2, ..., vn); quivaut write (v1);write (v2);write (vn);
writeln;
Exemple :
var rayon : real; (* rayon d'un cercle *)
...
write ( 'Veuillez donner le rayon du cercle: ' );
readln ( rayon );
Rappel
Affectation :
En pseudo : variable expression
En pascal : variable := expression;
Exemple :
moyTp:= (projetTp+controleTp)/2;
Remarque :
le type de la variable et de la valeur de lexpression
doivent tre identique (dpend du langage).
Rappel
Tests :
En pseudo : si condition
alors instruction_1
sinon instruction_2;
fin si
En pascal : if condition
then instruction_1
else instruction_2;
condition est une expression boolenne
Exemple :
if (nb mod 2 = 1)
then begin
write( 'Le nombre ',nb);
writeln(' est impair');
end
else writeln( 'Le nombre ',nb ,' est pair');
Rappel
Tests :
Questions: peut-on remplacer linstruction conditionnel par
laffectation?
Boucles :
En pseudo : tantque (condition) faire instructions; fin tanque
En pascal : while (condition) do instructions;
condition est une expression boolenne
Exemple :
var a,b, reste: integer;
begin
a:=36;
b:=24;
while (b<>0) do Conditions initiales
begin
reste:=a mod b;
a:= b;
b:=reste; Condition darrt
end;
writeln(Le pgcd(,a,,,b)=,a);
Corps de la boucle
Procdures et fonctions
Quelques citations :
Pour comprendre un programme dun seul tenant, un tre humain
Exemple 1 :
F : R -> R
x --> ax + b
Incorporation dans une expression :
if F(x0) > 10 then ...
Retour lexemple de tches : procdures
changer le contenu des variables entires A et B.
Diviser lentier A par lentier B pour obtenir le quotient Q et le reste R
Trier la suite de N lments contenu dans le tableau T
lever A la puissance B
fonctions
Procdures et fonctions
Dclaration :
En pseudo :
procdure nomProc(don_1:type,,don_n:type, r rs_1,,rs_m:type)
dbut
fin
write(y?);readln(y);
division(x,y,quotient,reste);
a b
writeln(le quotient de la division de ,x,par,y,est , quotient, le reste est, reste );
q r
end. 16 6
Procdures et fonctions :
utilisation
Utilisation dune fonction
program appels_foncts;
var x,y:integer;
function puissance(a,b:integer) : integer;
{ donnes: a,b:entier
rsultat: a puissance b
spcifications : lever A la puissance B.}
var p,i :integer;
begin
p:=1;
for i:=1 to b do
p:=p*a;
puissance := p;
end;
On peut crire :
begin z:=2 * puissance(x,y)-10;
writeln(calcul de x puissance y);
write(x?);readln(x);
write(y?);readln(y);
writeln(puissance (,x,,,y,)= , puissance(x,y) );
end.
Procdures et fonctions :
exemple
Programme Pascal
Program convertir_repeat (input, output) ;
const POINT = '.' ;
BASE = 10 ;
var resultat : real ;
partEntiere,partDecimale,nbChiffre : integer ;
car : char ;
function estUnChiffre( car:char):boolean;
begin
estUnChiffre:=('0'<=car) and (car<='9') ;
end;
function car2Chiffre( car:char):integer;
begin
car2Chiffre:=ord(car)-ord('0') ;
end;
procedure repererUnNombre(var car:char)
begin
repeat
read(car)
until (estUnChiffre(car)) ;
end;
Procdures et fonctions :
exemple
procedure extraireNombre(var car : char; var nb, nbChiffre:integer);
begin
nb := 0;nbChiffre:=0;
repeat
nbChiffre:=nbChiffre+1;
nb := BASE*nb + car2chiffre(car);
read(car)
until (not (estUnChiffre(car));
end;
fonction miseAEchelle(partDecimale,nbChiffre:integer): real;
var nb:real;
begin
nb:=partDecimale;
while (nbChiffre >0) do
begin
nb := nb/BASE ;
nbChiffre := nbChiffre -1
end
miseAEchelle:=nb;
end;
Procdures et fonctions :
exemple
begin
repererUnNombre(car);
extraireNombre(car, partEntiere,nbChiffre);
if (car = POINT) then
begin
read(car) ;
extraireNombre(car, partDecimale,nbChiffre);
resultat:=partEntiere+miseAEchelle(partDecimale,nbChiffre):
end ;
writeln(resultat)
end.
Visibilits variables locales et globales
begin
end;
procedure afficher(s:suiteEntier)
...
procedure afficherLigne(s:suiteEntier, lg:integer);
...
end;
begin
...
Rgles de visibilit - Objets locaux ou
globaux program tri_suite; Niveau 0
S Q
paramtre : paramtres :
rsultat k rsultat j, donne i
variables : k
procdure : R
R
paramtres :
rsultat l , i
variables : j
Exemple
Program P; Pile dexcution
var i, j, k, l, m :integer;
S k
procedure S(var k:integer);
begin j 10
i:= i - 3; k:= j * 4; l:= k + j; R i
writeln(i, ,j, ,k, ,l, ,m);
end; l
k 0 0 20
procedure Q(var j: integer;i:integer);
var k:integer; Q i 4 5
procedure R(var l, i : integer); j
var j: integer;
begin m 5
k:= 0; j:=l + m; i:= j * l;
S(i); l 4 50 8 10 2
k:= i + j ; P k 3
writeln(i, ,j, ,k, ,l, ,m);
end; j 2
begin i 1 0 -3
j:= l - i; k:= 2 * j; i:= k + m;
R(i, l); On affiche :
l:= i + j; -3, 2, 10, 10, 5
writeln(i, ,j, ,k, ,l, ,m);
end; 10, 10, 20, 5, 5
begin
i:=1; j:=2; k:=3; l:=4; m:=5; 5, -3, 20, 2, 5
Q(i, l);
writeln(i, ,j, ,k, ,l, ,m); -3, 2, 3, 2, 5
end.
Rcursivit
Preuve : i 0 2
Cas de base :
n = 0 : S (0) i 0 0(0 1) 0
0
(Vrai)
i 0 2
1
1(1 1)
n = 1 :
S (1) i 0 1 1 (Vrai)
i 0 2
Rcurrence :
Hypothse : S(n) est vrai,
montrer que S(n+1) est vrai
Rcursivit
hypothse de rcurrence
n 1 n
S (n 1) i ( i ) (n 1) S (n) (n 1)
i 0 i 0
n( n 1)
(n 1)
2
n (n 1)( n 2)
(n 1)( 1) (Vrai )
2 2
Rcursivit
quations de rcurrences
Base : S(0) = 0
Rcurrence : S(n+1) = S(n)+(n+1)
La rcursivit est un
mcanisme de calcul puissant!!
Rsoudre un problmedetaillen
peut se ramener la rsolution
dun(plusieurs)sousproblmes
detailleplusrduite ...
Rcursivit
Action rcursive
une action A est exprime de faon rcursive si la
dcomposition de A fait appel A.
Action calculer S(n) :
Appliquer les deux rgles suivantes:
1) S(0) = 0
2) S(n) = S(n-1) + n , n>0
S(3) ?
= S(2) +3 = (S(1)+2 ) +3
= ((S(0)+1)+2)+3 = ((0+1)+2)+3 = 6
Rcursivit
Objet rcursif
La dfinition dun objet est rcursive lorsquelle se
formule en utilisant lobjet mme quelle entend dfinir
Exemple (suite)
Daprs la dfinition prcdente :
a est une chane :
un caractre a suivi dune chane vide
ab est une chane :
un caractre a suivi de la chane b
La rcursivit est un
mcanisme puissant de dfinition dobjets!
Rcursivit Vs Itration
Itration Rcursivit
procdureItration() procdureItration()
Tantque(condition)faire Si(condition)alors
<Instructions> <Instructions>
Itration()
fintantque
finsi
fonctionS(n):entier fonctionS(n):entier
S:=0 Si(n=0)
Tantque(n>0)faire alorsS:=0
S:=S+n sinonS:=S(n-1)+n
n:=n-1 finsi
fintantque
Rcursivit : applications
Exemple 2 (suite)
Voyons lexcution : u(9)?
u(9)
u(8) u(7)
u(7) u(6) u(6) u(5)
n
But : dplacer tous les disques de G D
RglesG(auche)
: M(ilieu) D(roite)
1 seul disque peut tre dplac la fois
1 disque ne peut jamais tre dpos sur un plus petit
1 disque ne peut tre dpos que sur G, M ou D
Rcursivit : applications
1 3
2
G(auche) M(ilieu) D(roite)
(k=2)
(k=3) , bonne chance
Rcurrence :
Hypothse: on connat la solution le problme pour k disques
Trouver la solution pour k+1 disques
Rcursivit: applications
k 1(hypo)
k+1 3(hypo)
Solution
procduredplacer(n,G,M,D)
dplacerundisquedeGversDenutilisantlaxeM
(Base)n=1,dplacerundisquedeGversD
(rcurrence)
dplacer(n-1,G,D,M)
dplacerundisquedeGversD
dplacer(n-1,M,G,D)
Rcursivit: applications
Program hanoi(inout,output);
var n :integer; { nombre de disques}
procdure deplacer(n : integer, G :char, M:char, D:char)
begin
if (n=1) then begin
write("dplacer un disque de ") ;
writeln(G, " vers ", D);
end else begin
dplacer(n-1, G, D, M);
write("dplacer un disque de ") ;
writeln(G, " vers ", D);
dplacer(n-1, M, G, D);
end;
begin
write("Nb disques? " ) ; readln(n);
deplacer(n, g, m, d);
end.
Rcursivit : pile
dexcution(exemple)
Program PP();
var nb = 37, sc : integer; c
procedure P(n: entier, var s : entier) P n 0
var c : integer; s
begin c 3
if(n = 0) then s :=0 P n 3
else begin s
c := n mod 10; c 7
P(n div 10, s); P n 37
s
s:=s +c;
nb 37
end; PP sc 0 3 10
end;
Pile dexcution
begin
P(nb, sc);
writeln ("somme des chiffres de", nb, "est ", sc)
Rcursivit
Conclusion
La rcursivit est un principe puissant nous
permettant de :
dfinir des structures de donnes complexes
de simplifier les algorithmes oprants sur ces
structures de donnes
Classements (Tris)
Liste
L = ( 7, 3, 1, 4, 8, 3 )
classement, tri
L = ( 1, 3, 3, 4, 7, 8 )
Liste classe (en ordre croissant)
Tri interne
lments en table(tableau), liste chane(en mmoire centrale)
Tri externe
lments en fichiers (en mmoire secondaire)
Oprations lmentaires
comparaison de deux lments
change
slection de places
Tris internes
Elmentaires
Slection
Insertion
Bulles
Dichotomiques
Tri rapide
Fusion
Cls
CLES
Guy 1m75 60 k
Anne 1m70 55 k
Lou 1m75 57 k
Luc 1m72 61 k
Problme
Calculer p, permutation de {1, 2, , n}
telle que Cl(ep(1)) Cl(ep(2)) Cl(ep(n))
Stabilit
p est stable, chaque fois que Cl (ep(i)) = Cl (ep(k)) :
i < k quivalent p(i) < p(k)
[ le tri nchange pas les lments de mme cl ]
Exemple
1 Guy 1m75 60 k
2 Anne 1m70 55 k
3 Lou 1m75 57 k
4 Luc 1m72 61 k
Problme quivalent :
trier (1, 2, , n) suivant certaines cls
Tri par slection
t t
1 7 1 1
2 7 2 7
3 change 3
4 4
4 2 4 2
5 6 5 6
6 4 6 4
MIN 7 1 7 7 reste classer
8 8 8 8
9 3 9 3
10 1 10 1
11 5 11 5
12 4 12 4
Point dinsertion
- recherche squentielle
- recherche dichotomique
Tri par insertion
Un balayage
2 2 2 2 1
3 3 3 1 2
5 5 1 3 3
1 1 5 5 5
4 4 4 4 4
2 1 1 1 1
3 2 2 2 2
5 3 3 3 3
1 5 4 4 4
4 4 5 5 5
PARTAGE / FUSION
Si liste assez longue
3 7 9 2 7 1 5 3
PARTAGE
3 7 9 2 7 1 5 3
TRI TRI
2 3 7 9 1 3 5 7
FUSION
1 2 3 3 5 7 7 9
2 4 1 7 3 2 3 6
2 2 1 7 3 4 3 6
<3 3
2 2 1 3 3 4 7 6
Suite du tri
TRI TRI
1 2 2 3 3 4 6 7
Tri rapide
P
variables : i, j, k, l, m
procdures : Q
Q
paramtres :
rsultat j, donne i
variables : k
procdure : S, R
R
S
paramtres :
paramtre :
rsultat l , i
rsultat k variables : j
Correction du Ds: exercice 1
Program P; Pile dexcution
var i, j, k, l, m :integer; S k
procedure Q(var j: integer;i:integer); j
var k:integer; 10
procedure S(var k:integer); R i
begin
i:= i - 3; k:= j * 4; l:= k + j; l
writeln(i, ,j, ,k, ,l, ,m); k 0 0 0 10
end; Q i
procedure R(var l, i : integer); 45 2
var j: integer; j
begin
k:= 0; j:=l + m; i:= j * l; m 5
S(i); l 4 50 0 0 2
k:= i + j ;
writeln(i, ,j, ,k, ,l, ,m); P k 3
end;
j 2
begin i 1 0
j:= l - i; k:= 2 * j; i:= k + m;
R(i, l); On affiche :
l:= i + j; 2, 0, 0, 0, 5
writeln(i, ,j, ,k, ,l, ,m);
end; 0, 10, 10, 2, 5
begin 2, 0, 10, 2, 5
i:=1; j:=2; k:=3; l:=4; m:=5;
Q(i, l); 0, 2, 3, 2, 5
writeln(i, ,j, ,k, ,l, ,m);
Correction du Ds: exercice 2
Exercice 2
const MAX = 10;
type suiteEntiers = record
nbElements:entier;
tab: array[1..MAX] of integer;
end;
crire les procdure / fonction suivantes:
qui, tant donne un entier X et une suite dentiers ordonne par
ordre croissant S1 calcule la suite S2 obtenue partir de S1 en
insrant llment X la bonne place.
procdure insrer(X:entier , S1: suiteEntiers , r S2: suiteEntiers)
Correction du Ds: exercice 2
procedure inserer (x:integer;S1:tabEntiers;var S2:tabEntiers);
var i,j:integer;
begin
i:=1;
while (i<=S1.nbElement and x>S1.tab[i]) do
begin
S2.tab[i]:=S1.tab[i];
i:=i+1;
end;
S2.tab[i]:=x;
for j:= i to S1.nbEelement do
S2.tab[j+1]:=S1.tab[j];
S2.nbElement:=S1.nbElement+1;
end;
Correction du Ds: exercice 2
qui, tant donne une suite S1 quelconque, calcule la suite ordonne
S2 des lments de S1.
Q2. Que faut-il modifier pour viter les oprations : a*1 et 1*a
Correction du Ds: exercice 3 (Q1 et
Q2)
program tablesMult(iput,output);
uses crt;
const NB_MULT = 50;
var a,b, repEnfant:integer; fin,ok:boolean;
nbEssaisOk:integer;
begin
randomize;nbEssaisOk:=0;
repeat
a:= random(9)+1;
b:= random(9)+1;
ok:=false;
a:=random(8)+2;
repeat
clrscr; Q1 b:=random(8)+2; Q2
write(a, ' x ', b, ' = ? ');
readln(repEnfant);
ok:=(repEnfant=a*b);
if(ok) then writeln('Bravo!!')
else writeln('C''est Faux, ressayer!!');
readkey;
until ok;
nbEssaisOk:=nbEssaisOk+1;
until nbEssaisOk=NB_MULT;
end.
Correction du Ds: exercice 3
(Q3)
Q3 : On dsire ensuite disposer dun moyen de dtecter
rponse ).
la notion de fichier.
Les fichiers
Qu'est-ce qu'un fichier?
Un fichier est une collection de fiches;
etc.
d'enregistrement.
Points techniques :
La fin du fichier est repre par un marqueur de fin de fichiers : emploi de la
fonction boolenne eof (end_of_file)
eof(fichier) = vrai si fin de fichier atteinte
eof(fichier) = faux sinon
Longueur du fichier = nombre d'lments du fichier
non dfinie lors de la dclaration du fichier
S'il n'y a pas d'lments : fichier vide
Elments attachs aux fichiers
On appelle nom interne dun fichier, le nom sous lequel un
fichier est identifi. (fichier logique)
On appelle nom externe dun fichier(fichier physique), le nom
sous lequel un fichier est identifi en mmoire secondaire.
Le nom externe est une chane de caractre compose de 3
partie :
l indentification du support
le nom du fichier proprement dit
un suffixe qui prcise le genre (donne, texte, etc.)
C:\TP\donne.dat
On appelle une fentre dun fichier, une zone de la
mmoire principale pouvant contenir un enregistrement du
fichier
Dclaration
Un fichier (binaire) se dclare :
En pseudo :
type fichierDeTypeElement = fichier de type-lment ;
En Pascal :
type fichierDeTypeElement = file of type-lment ;
Tous les types sont autoriss pour les lments, sauf le type
fichier !!!
Les types de fichiers
Exemples :
const LG_MAX_NOM = 30;
LG_MAX_TITRE = 40;
type
auteurLivre = string [ LG_MAX_NOM ];
titreLivre = string [ LG_MAX_TITRE ];
livreCote = record
nomAuteur : auteurLivre;
titre : titreLivre;
cote : integer;
end;
fichierBibliothque = file of livreCote;
var FichierBib : fichierBibliothque;
Primitives de manipulations de fichiers
squentiels
Etablir un lien entre le nom interne et le nom
externe du fichier
Assign(nom interne, nom externe); (en
Pascal)
Procedure ECRIT;
Var
c : char;
Begin
Assign(F, 'fichierText' );
Rewrite(F );
Writeln( ' Tapez un texte et terminez par $' );
read( c );
read( c );
end;
Close(F);
End;
Exemple 1 : devinez ce que fait ce programme ?
Procedure LIT;
Var c : char;
Begin
Reset(F, 'fichierText' );
read(F,c);
while (not eof(F) ) do begin
write(c);
read (F,c);
end;
Close(F);
End;
Begin
Repeat
Writeln( ' 1) Ecriture' );
Writeln( ' 2) Lecture' );
Writeln( ' 0) Fin' );
Write( ' Votre choix => ' );
Readln(rep);
Case rep of
'1' : ECRIT;
'2' : LIT;
End;
Until rep='0';
End.
Les fichiers Accs Direct
Quelques instructions
soit var f : file of <typElements>
FILEPOS(f)
indique la position du pointeur courant(tte de lecture)
donne un entier
FILESIZE(f)
retourne le nombre denregistrements (composants) du fichier
SEEK(f,i)
positionne le pointeur au composant ni (0 i < filesize(f) )
IORESULT
variable contenant 0 si l'action sur un fichier s'est bien droule, un entier
suprieur 0 sinon
Exemple
Exemple
Program LIRE_PRODUITS_DIRECT;
Type PRODUIT = record
NOM : string[20] ;
PRIX : real ;
end;
var ARTICLE : produit ; FICH : file of PRODUIT ; N : integer ;
begin
assign(FICH, 'inventaire') ;
{$I-} reset (FICH) ; {$I+}
if (IOResult <> 0)
then writeln(Fichier non trouve!!)
else begin
writeln(la taille du fichier est : , filesize(FICH)
write(Entrez un numro denregistrement? );readln (N) ;
SEEK (FICH, N) ;
read (FICH, ARTICLE) ;
writeln (Nom du produit: , ARTICLE. NOM, Prix:, ARTICLE.PRIX) ;
close(FICH);
end;
end.
Gestion dun carnet dadresses
BUT : proposer une solution de gestion dun ensemble
dinformations concernant des personnes (nom, prnom, adresse,
code postal, ville, tlphone, e-mail)*. On dsire pouvoir:
crer,
consulter,
supprimer et modifier.
* Pour information: il faut savoir que la constitution et lexploitation dun fichier
informatique contenant des informations sur des individus doit tre soumis laccord
de la CNIL (Commission Nationale Informatique et Libert). Dans le cas contraire, de
graves sanctions pnales sont encourues.
Gestion dun carnet dadresses
Proposer les structure de donnes permettant de :
stocker les informations concernant une personne,
de stocker durablement toutes les informations relatives
toutes les personnes.
TYPEEnregistrement}
{Fichier dindex}
cle = record
nom, prenom : string;
end;
index = record
cl: cle;
position: integer;
end;
fichierIndex =file of index;
{Fichier dadresse} Dclaration des types}
adresse=record
cl: cle;
adresse, cp, ville,
tel, mail: string;
end;
{Fichier d'enregistrements}
carnetAdresse =file of adresse;
Programme principal
program fichiers(iput,output);
var f:carnetAdresse;
ind: fichierIndex; {trie par ordre croissant des noms et prnoms}
...
begin
assign(f,carnet.fic'); assign(ind,carnet.index);
repeat
choix := menu;
case choix of
1: creation(f,ind);
2: ajout(f, ind);
3: liste(f, ind);
4: acces(f, ind);
5: modif(f, ind);
6: suppression(f, ind);
7: recherche_nom(f, ind);
8: recherche_ville(f, ind);
end;
until choix=0;
end.
Cration
procedure creation(var f: carnetAdresse; var ind:fichierIndex);
var choix: integer;
begin
repeat
write('Detruire le carnet existant et son index(1) ou annuler (2) ? ');
readln(choix);
until (choix=1) or (choix=2);
if choix=1 then
begin
rewrite(f); rewrite(ind);
close(f); close(ind);
writeln('Ok.');
end;
end;
Ajout
procedure ajout(var f: carnetAdresse; var ind:fichierIndex);
var nouveau: adresse; in:index;
choix: integer;
begin
reset(f); reset(ind);
seek(f,filesize(f)); seek(ind, filesize(ind));
repeat
saisieAdresse(input, nouveau);
write(f,nouveau);
in.position:=filepos(ind); { in.position:= filepos(f)-1;}
in.cl:=nouveau.cl;
write (ind, in);
write('Saisir un nouveau correspondant (1) / Fin (0) ? ');
readln(choix);
until choix=0;
close(f); close(ind); trier(ind);
end;
liste
procedure liste(var f: carnetAdresse; var ind:fichierIndex);
var r : adresse;in:index;
res: text;
choix: integer;
begin
repeat
write('Sortie a l''ecran (1));
write(ou dans un fichier texte (2) ? ');
readln(choix);
until (choix=1) or (choix=2);
if (choix=1) then assigncrt(res)
else begin
assign(res, carnet.txt');
writeln('Resultat dans le fichier carnet.txt.');
end;
Liste (suite)
reset(f); reset(ind);
while not eof(ind) do
begin
read(ind,in); seek(f,in.position); read(f,r);
writeln(res,'Numero : ',in.position);
afficherAdresse(res, r );
end;
close(f);close(res);close(ind);
end;
end
else writeln(non trouv);
close(f);
end;
Modif
procedure modif(var f:carnetAdresse;var ind:fichierIndex);
var pos: integer;
r: adresse;c :cle;
begin
saisieCle(c);
pos:= rechercherPos(c,ind);
writeln(Entrez la nouvelle adresse :);
saisieAdress(input,r);
reset(f);
seek(f,pos);
write(f,r);
close(f);
trierIndex(ind);
end;
Suppression
procedure suppression(var f: carnetAdresse; var ind:fichierIndex);
var posIndex, i: integer;
r: adresse;in:index; c : cle;
tempAdr: fichierAdresse; tempInd:fichierIndex;
begin
saisieCle( c); posIndex:=rechercherPosIndex(c,ind);
reset(ind); seek(ind,posIndex); read(ind,in);
{suppression dans le fichier dadresse}
assign(tempAdr, 'tempAdr.fic');
rewrite(tempAdr);
reset(f);
for i:=0 to in.position-1 do
begin
seek(f,i); read(f,r);write(temp,r);
end;
Suppression (suite)
assign(tempInd, 'tempInd.fic');
rewrite(tempInd);
reset(ind);
for i:=0 to posIndex-1 do
begin
seek(ind,i); read(ind,in);write(tempInd,in);
end;
for i:=posInd+1 to filesize(ind)-1 do
begin
seek(ind,i);read(ind,in);write(tempInd,in);
end;
close(ind);close(tempInd);
erase(ind);
rename(tempInd, carnet.index');
assign(ind, carnet.index');
writeln('Ok.');
end;
Recherche nom
procedure recherche_nom(var f: carnetAdresse;var ind:fichierInde
var r: adresse;c:cle; in:index;
trouve: boolean;
begin
saisieCle( c); posIndex:=rechercherPosIndex(c,ind);
if (posIndex<>-1)
then begin
reset(ind); seek(ind, posIndex);read(ind,in);close(ind);
reset(f); seek(f,in.position); read(f,r); close(f);
afficherAdresse(output,r);
end
else writeln(non trouve);
end;
Recherche Ville