Conception de Site Webs Interactifs Cours 9 Patrick Reuter [email protected].
Algorithmes et structures de données avancées 6ème cours Patrick Reuter preuter.
-
Upload
denis-philippe -
Category
Documents
-
view
108 -
download
0
Transcript of Algorithmes et structures de données avancées 6ème cours Patrick Reuter preuter.
Algorithmes et structures de données avancées
6ème cours
Patrick Reuter
http://www.labri.fr/~preuter
Ingrédients d’algorithmes
• Affectation (ex. mois := 6, jours[1] := 31)• Condition/Comparaison (ex. mois <= 12)• Appel de fonction (ex. writeln(mois))
• Structure de contrôle– Branchements conditionnels (multiples) (si .. Alors .. Sinon)
– Boucles (tant que..faire, pour.. faire)
• Bloc d’instructions (begin .. end)
Aujourd'hui
TYPES:– tableau 1D– tableau 2D– types énumérés– enregistrements– pointeurs
PORTEE :– variables globales– variables locales
APPEL DE FONCTIONS– appel par valeur– appel par référence
Déclaration de variables
Comme dans un livre de recettes
Ingrédients(pour 8-10 personnes) :
- 1 kg de couscous roulé - 1 kg de mouton - 1 poignée de pois chiches - 2 oignons secs - 3-4 tomates fraîches ou 1 cuillère.à soupe de concentré de tomate - 3-4 pommes de terre - 3-4 navets - 3-4 carottes - 3-4 courgettes - 1 tranche de courge - 4 cuillères à soupe d'huile - 1/2 cuillère à café de cannelle - 1 pincée de poivre noir - 1/2 cuillère à soupe de piment rouge doux ou de paprika - 1/2 cuillère à soupe de ras-el-hanout - 1 piment rouge sec - 100 g de beurre ou 3 cuillères à soupe d'huile - sel
Préparation :
La veille, mettez les pois chiches dans un bol d'eau.
Le jour même, roulez le couscous .Si vous utilisez du couscous roulé et séché, rincez-le à l'eau froide, égouttez-le et laissez-le gonfler pendant 30 mn.
Coupez la viande en morceaux.Pelez les oignons et coupez-en 1 en morceaux.
Lavez et passez les tomates à la moulinette.Mettez la viande dans une marmite et ajoutez les morceaux d'oignon, les tomates ou le concentré de tomate dilué dans 1 verre d'eau, l'huile, le poivre, le piment, la cannelle et du sel.
Faites revenir …..
Déclaration de variables
var compteur : integer;
var diviseur : single;
var c : byte;
var precision : double;
var nom : string;
var masculin : boolean;
var jours : array[1..12] of byte;
diviseur := 1.1; { Affectation }compteur : = 1;Nom := ‘Gerhard’;
Nombre entier
Nombre à virgule flottante
Nombre à virgule flottante avec double précision
Chaîne de caractères
Tableau
TYPE
Déclaration de variables
• Types prédéfinis– Integer, boolean, single, …
• Types que l’on peut définir soi-même
type t_tableau = array[1..12] of byte;
var jours : t_tableau;
au lieu de
var jours : array[1..12] of byte;
Organisation de la mémoiretype t_tableau = array[1..12] of byte;var jours : t_tableau; {12 octets}
#0
jours[1] #2000
...
#536.870.910#536.870.911
...
jours[index] #(2000+index-1)
jours[3] #2002
jours[12] #2011
...
Occupe de la place successivedans la mémoire
jours[2] #2001312831
31
• Tableau 2D
Motivation
type t_champ =(vide, blanc, noir); type t_ligne = array[1..8] of t_champ;type t_damier = array[1..8] of t_ligne;var damier : t_damier;var i,j : integer;
Pour initialiser un damier vide :
POUR i = 1 à 8 faire POUR j = 1 à 8 faire damier[i][j] := vide; FIN POURFIN POUR
Enregistrements
Déclaration de variables
• Type enregistrement (structure hétérogène)
type t_enregistrement = RECORDnom_de_variable_1 : type1;nom_de_variable_2 : type2;
...nom_de_variable_n : typen;
END;var dossier : t_enregistrement;
- structure hétérogène, les éléments peuvent être d’un type différent- occupe de la place successive dans la mémoire- « random access » = l’ accès aux différents éléments se fait à coût
égal
Type enregistrement (structure hétérogène)
Exemple• Déclaration du type
type t_date = RECORD an : integer;
mois : byte; jour : byte;
END;
• Déclaration d’une variable
var aujourdhui : t_date;
• Affectationaujourdhui.jour = 17;aujourdhui.mois = 10;aujourdhui.an = 2006;
Enregistrements• Motivation (à ne pas faire !)
type t_couleur = (rouge, vert, jaune);
var joueurnom : array[1..n] of string;var joueurscore : array[1..n] of integer;var joueurcouleur : array[1..n] of t_couleur;
joueurnom[1] := " Martin“;joueurscore[1] := 0;joueurcouleur[1] := rouge;
joueurnom[2] := " Romain“;joueurscore[2] := 0;joueurcouleur[2] := vert;
…
Enregistrements• Motivation (à faire !)
type t_couleur = (rouge, vert, jaune);
type t_joueur = RECORD nom : string;score : integer;couleur : t_couleur;
END;
var joueur : array[1..n] of t_joueur;
joueur[1].nom := " Martin“;joueur[1].score := 0;joueur[1].couleur := rouge;
joueur[2].nom := " Romain“;joueur[2].score := 0;joueur[2].couleur := vert;
…
type t_date = RECORD an : integer;
mois : byte; jour : byte;
END;var aujourdhui : t_date;
aujourdhui.an #4000
...
#536.870.910#536.870.911
...
aujourdhui.an; #4002
...
aujourdhui.an; #400121470
17
#0
Occupe de la place successivedans la mémoire
aujourdhui.an; #4003aujourdhui.mois; #4004aujourdhui.jour; #4005
0
10
Type tableaux d’enregistrements
• Déclaration du type enregistrement :
type t_chanson = RECORD titre : string[100];
artiste : string[100];album : string[100];longueur : integer;date : t_date;
END;
• Déclaration du type tableau
type t_tableau_chansons = array[1..n] of t_chanson;
• Déclaration d’une variable de ce type
var collection : t_tableau_chansons;
• Affectation
collection[1].title = ‘Riders on the storm’;collection[1].artiste = ‘The Doors’;...collection[n].title = ‘Talkin Blues’;...
Type tableaux d’enregistrements
• Exercice
type t_chanson = RECORD titre : string[100];
artiste : string[100];album : string[100];longueur : integer;date : t_date;
END;type t_tableau_chansons = array[1..n] of t_chanson;var collection : t_tableau_chansons;
• Trouver l’artiste d’une chanson donnée ‘kaya’
i := 1;tant que i<=n
i := i + 1;fin tant que
Type tableaux d’enregistrements
• Exercice
type t_chanson = RECORD titre : string[100];
artiste : string[100];album : string[100];longueur : integer;date : t_date;
END;type t_tableau_chansons = array[1..n] of t_chanson;var collection : t_tableau_chansons;
• Trouver l’artiste d’une chanson donnée ‘kaya’
i := 1;tant que i<=n
si collection[i].title = ‘kaya’ alorsafficher collection[i].artiste;
i := i + 1;fin tant que
Type tableaux d’enregistrements
• Exercice
type t_chanson = RECORD titre : string[100];
artiste : string[100];album : string[100];longueur : integer;date : t_date;
END;type t_tableau_chansons = array[1..n] of t_chanson;var collection : t_tableau_chansons;
• Trouver l’artiste d’une chanson donnée ‘kaya’trouve := FAUX;i := 1;tant que (i<=n ET trouve = FAUX)
si collection[i].title = ‘kaya’ alorsafficher collection[i].artiste;trouve := VRAI;
i := i + 1;fin tant que
NOUVEAU : Addressage mémoire
Adresse d’une variable
• Stocké dans 4 Octets (32 bit), comme ça on peut adresser
232 octets = 4 294 967 296 octes
= 4 GO
Limite bientôt atteint
Organisation de la mémoire
var a : byte; ( 1 octet (byte) )
#0#1#2#3
a #4#5
...
#536.870.910#536.870.911
#1.000
...
Organisation de la mémoirevar a : byte;a := 97;
#0#1#2#3
a #4#5
...
#536.870.910#536.870.911
#1.000
...
97
Organisation de la mémoirevar a : byte;a := 97;
#0#1#2#3
a #4#5
...
#536.870.910#536.870.911
#1.000
...
97
Comment connaître l’adresse de a ? Addr(a)
Organisation de la mémoirevar a : byte;a := 97;p_a := Addr(a); { Sauvegarder l’adresse }
#0#1#2#3
a #4#5
...
#536.870.910#536.870.911
#1.000
...
97
Comment connaître l’adresse de a ? Addr(a)
var a : byte;var p_a : ^byte; {4 octets, lire : pointeur vers a}a := 97;p_a := Addr(a); { Sauvegarder l’adresse }
#0#1#2#3
#4
a #5
...
#536.870.910#536.870.911
p_a #1.0000
97
Comment connaître l’adresse de a ? Addr(a)
p_a #1.001p_a #1.002p_a #1.003
5
00
« p_a pointe vers a »
var a : byte;
var p_a : pointer to byte; {4 octets, lire : pointeur vers a}
a := 97;
p_a := Addr(a); { Sauvegarder l’adresse }
{ p_a est 4, p_a^ est 97)
p_a^ := 10; { Déréférencement }
{ p_a est 4, p_a^ est 10)
#0#1#2#3
p_a^ a #4#5
...
#536.870.910#536.870.911
p_a #1.0000
10
Comment connaître l’adresse de a ? Addr(a)
p_a #1.001p_a #1.002p_a #1.003
4
00
var a : byte;
var p_a : ^byte; {4 octets, lire : pointeur vers a}
a := 97;
p_a := Addr(a); { Sauvegarder l’adresse }
p_a^ := 10; { affectation par déréférencement }
a := 10; { affectation }
var a : byte;
var p_a : ^byte; {4 octets, lire : pointeur vers a}
a := 97;
p_a := Addr(a); { Sauvegarder l’adresse }
p_a^ := 10; { affectation par déréférencement }
a := 10; { affectation }
C’est équivalent !!
Définitions
• Déclaration d’un pointeur vers un byte
var p_a : ^byte;
• Déréférencement d’un pointeur :
p_a^
• Connaître l’adresse d’une variable a
Addr(a); {ou bien }@a;
Fonctions
type t_tableau = array[1..n] of integer;var tab : t_tableau;
function dedans(quoi : integer, n : integer) : integer;
var position : integer;var i : integer;
débutposition := 0;i := 1;
tant que (i<=n) faire
si (quoi = tab[i]) alors position := i;
fin si
i := i + 1;
fin tant que
result := position;
fin
type t_tableau = array[1..n] of integer;var tab : t_tableau;
function dedans(quoi : integer, n : integer) : integer;
var position : integer;var i : integer;
débutposition := 0;i := 1;
tant que (i<=n) faire
si (quoi = tab[i]) alors position := i;
fin si
i := i + 1;
fin tant que
result := position;
fin
En-tête de la fonction
type t_tableau = array[1..n] of integer;var tab : t_tableau;
function dedans(quoi : integer, n : integer) : integer;
var position : integer;var i : integer;
débutposition := 0;i := 1;
tant que (i<=n) faire
si (quoi = tab[i]) alors position := i;
fin si
i := i + 1;
fin tant que
result := position;
fin
Corps de la fonction
type t_tableau = array[1..n] of integer;var tab : t_tableau;
function dedans(quoi : integer, n : integer) : integer;
var position : integer;var i : integer;
débutposition := 0;i := 1;
tant que (i<=n) faire
si (quoi = tab[i]) alors position :=i;
fin si
i := i + 1;
fin tant que
result := position;
fin
Paramètres de la fonction(arguments)
type t_tableau = array[1..n] of integer;var tab : t_tableau;
function dedans(quoi : integer, n : integer) : integer;
var position : integer;var i : integer;
débutposition := 0;i := 1;
tant que (i<=n) faire
si (quoi = tab[i]) alors position := i;
fin si
i := i + 1;
fin tant que
result := position;
fin
Type de retourde la fonction
Valeur de retourde la fonction
La portée :
program portee;
var i : byte;
function somme(n : byte) : byte;var i : byte;begin result := 0; for i := 1 to n do begin result := result + i; end;end;
begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i);
readln;
end.
program portee;
var i : byte;
function somme(n : byte) : byte;var i : byte;begin result := 0; for i := 1 to n do begin result := result + i; end;end;
begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i);
readln;
end.
...
...
...
#0
i #100
program portee;
var i : byte;
function somme(n : byte) : byte;var i : byte;begin result := 0; for i := 1 to n do begin result := result + i; end;end;
begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i);
readln;
end.
...
...
3
...
#0
i #100
n #200i #201
5
program portee;
var i : byte;
function somme(n : byte) : byte;var i : byte;begin result := 0; for i := 1 to n do begin result := result + i; end;end;
begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i);
readln;
end.
...
...
3
...
#0
i #100
n #200i #201
5
program portee;
var i : byte;
function somme(n : byte) : byte;var i : byte;begin result := 0; for i := 1 to n do begin result := result + i; end;end;
begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i);
readln;
end.
...
...
3
...
#0
i #100
n #200i #201 1
5
program portee;
var i : byte; { Variable globale }
function somme(n : byte) : byte;var i : byte; { Variable locale }begin result := 0; for i := 1 to n do begin result := result + i; end;end;
begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i);
readln;
end.
program portee;
var i : byte; { Variable globale }
function somme(n : byte) : byte;var i : byte; { Variable locale }begin result := 0; for i := 1 to n do begin result := result + i; end;end;
begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i);
readln;
end.
Appel des fonctions
• Appel par valeur
• Appel par référence
var a : byte;
procedure ajouter (parametre : byte)début
WriteLn(‘parametre’, parametre);
parametre := parametre + 2;
WriteLn(‘parametre’, parametre);fin
débuta := 4;
WriteLn(‘a’, a);
ajouter(a);
WriteLn(‘a’, a);fin
Appel par valeur
var a : byte;
procedure ajouter (parametre : byte)début
WriteLn(‘parametre’, parametre);
parametre := parametre + 2;
WriteLn(‘parametre’, parametre);fin
débuta := 4;
WriteLn(‘a’, a);
ajouter(a);
WriteLn(‘a’, a);fin
Appel par valeur
#0
a #200 #201
#202
#536.870.910#536.870.911
#203
#220#221
...
...
#222
#223...
...
4
var a : byte;
procedure ajouter (parametre : byte)début
WriteLn(‘parametre’, parametre);
parametre := parametre + 2;
WriteLn(‘parametre’, parametre);fin
débuta := 4;
WriteLn(‘a’, a);
ajouter(a);
WriteLn(‘a’, a);fin #0
a #200 #201
#202
#536.870.910#536.870.911
#203
parametre #220#221
...
...
#222
#223...
...
4
4
Appel par valeur
#0
a #200 #201
#202
#536.870.910#536.870.911
#203
parametre #220#221
...
...
#222
#223...
...
6
4
Appel par valeur var a : byte;
procedure ajouter (parametre : byte)début
WriteLn(‘parametre’, parametre);
parametre := parametre + 2;
WriteLn(‘parametre’, parametre);fin
débuta := 4;
WriteLn(‘a’, a);
ajouter(a);
WriteLn(‘a’, a);fin
#0
a #200 #201
#202
#536.870.910#536.870.911
#203
#220#221
...
...
#222
#223...
...
4
Appel par valeur var a : byte;
procedure ajouter (parametre : byte)début
WriteLn(‘parametre’, parametre);
parametre := parametre + 2;
WriteLn(‘parametre’, parametre);fin
débuta := 4;
WriteLn(‘a’, a);
ajouter(a);
WriteLn(‘a’, a);fin
#0
#200 #201
#202
#536.870.910#536.870.911
#203
#220#221
...
...
#222
#223...
...Appel par valeur
var a : byte;
procedure ajouter (parametre : byte)début
WriteLn(‘parametre’, parametre);
parametre := parametre + 2;
WriteLn(‘parametre’, parametre);fin
débuta := 4;
WriteLn(‘a’, a);
ajouter(a);
WriteLn(‘a’, a);fin
4
Appel par référencevar a : byte;
type t_p_a = ^byte;
procedure ajouter (parametre : t_p_a)begin
WriteLn('parametre^', parametre^);
parametre^ := parametre^ + 2;
WriteLn('parametre^', parametre^);end;
débuta := 4;
WriteLn('a', a);
ajouter(Addr(a));
WriteLn('a', a);fin
var a : byte;
type t_p_a = ^byte;
procedure ajouter (parametre : t_p_a)begin
WriteLn('parametre^', parametre^);
parametre^ := parametre^ + 2;
WriteLn('parametre^', parametre^);end;
débuta := 4;
WriteLn('a', a);
ajouter(Addr(a));
WriteLn('a', a);fin
Appel par référence
Parametre est un pointeur
Appel par référence
#0
a #200 #201
#202
#536.870.910#536.870.911
#203
...
...
...
...
4
Appel par référencevar a : byte;
type t_p_a = ^byte;
procedure ajouter (parametre : t_p_a);begin
WriteLn('parametre^', parametre^);
parametre^ := parametre^ + 2;
WriteLn('parametre^', parametre^);end;
débuta := 4;
WriteLn('a', a);
ajouter(Addr(a));
WriteLn('a', a);fin
var a : byte;
type t_p_a = ^byte;
procedure ajouter (parametre : t_p_a);begin
WriteLn('parametre^', parametre^);
parametre^ := parametre^ + 2;
WriteLn('parametre^', parametre^);end;
débuta := 4;
WriteLn('a', a);
ajouter(Addr(a));
WriteLn('a', a);fin #0
a #200 #201
#202
#536.870.910#536.870.911
#203
parametre #240parametre #241
...
...
parametre #242
parametre #243
...
...
4
200000
Appel par référence
#0
a #200 #201
#202
#536.870.910#536.870.911
#203
parametre #240parametre #241
...
...
parametre #242
parametre #243
...
...
6
200000
Appel par référencevar a : byte;
type t_p_a = ^byte;
procedure ajouter (parametre : t_p_a);begin
WriteLn('parametre^', parametre^);
parametre^ := parametre^ + 2;
WriteLn('parametre^', parametre^);end;
débuta := 4;
WriteLn('a', a);
ajouter(Addr(a));
WriteLn('a', a);fin
#0
a #200 #201
#202
#536.870.910#536.870.911
#203
#240#241
...
...
#242
#243
...
...
6
Appel par référencevar a : byte;
type t_p_a = ^byte;
procedure ajouter (parametre : t_p_a);begin
WriteLn('parametre^', parametre^);
parametre^ := parametre^ + 2;
WriteLn('parametre^', parametre^);end;
débuta := 4;
WriteLn('a', a);
ajouter(Addr(a));
WriteLn('a', a);fin
Appel par référence (2)var a : byte;
procedure ajouter (var parametre : byte)début
WriteLn(‘parametre’, parametre);
parametre := parametre + 2;
WriteLn(‘parametre’, parametre);fin
débuta := 4;
WriteLn(‘a’, a);
ajouter(a);
WriteLn(‘a’, a);fin
Une autre façon d’appeler une fonctionpar référence qui est moins explicite