Title: Algorithmes et structures de donnes avances 6me cours
1Algorithmes et structures de données
avancées6ème cours
- Patrick Reuter
- http//www.labri.fr/preuter
2Ingrédients dalgorithmes
- Affectation (ex. mois 6, jours1 31)
- Condition/Comparaison (ex. mois lt 12)
- Appel de fonction (ex. writeln(mois))
- Structure de contrôle
- Branchements conditionnels (multiples) (si ..
Alors .. Sinon) - Boucles (tant que..faire, pour.. faire)
- Bloc dinstructions (begin .. end)
3Aujourd'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
4Déclaration de variables
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 ..
- 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
5Déclaration de variables
- var compteur integer
- var diviseur single
- var c byte
- var precision double
- var nom string
- var masculin boolean
- var jours array1..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
6Déclaration de variables
- Types prédéfinis
- Integer, boolean, single,
- Types que lon peut définir soi-même
- type t_tableau array1..12 of byte
- var jours t_tableau
- au lieu de
- var jours array1..12 of byte
7Organisation de la mémoire
- type t_tableau array1..12 of byte
- var jours t_tableau 12
octets
536.870.911
536.870.910
...
jours12 2011
31
...
Occupe de la place successive dans la mémoire
jours3 2002
31
jours2 2001
28
jours1 2000
31
...
0
? joursindex (2000index-1)
8 9Motivation
type t_champ (vide, blanc, noir) type
t_ligne array1..8 of t_champ type t_damier
array1..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 damierij vide FIN
POUR FIN POUR
10Enregistrements
11Déclaration de variables
- Type enregistrement (structure hétérogène)
-
- type t_enregistrement RECORD
- nom_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
dun 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
12Type enregistrement (structure hétérogène)
- Exemple
- Déclaration du type
- type t_date RECORD
- an integer
- mois byte
- jour byte
- END
- Déclaration dune variable
- var aujourdhui t_date
- Affectation
- aujourdhui.jour 17
- aujourdhui.mois 10
- aujourdhui.an 2006
13Enregistrements
- Motivation (à ne pas faire !)
- type t_couleur (rouge, vert, jaune)
- var joueurnom array1..n of string
- var joueurscore array1..n of integer
- var joueurcouleur array1..n of t_couleur
- joueurnom1 " Martin
- joueurscore1 0
- joueurcouleur1 rouge
- joueurnom2 " Romain
- joueurscore2 0
- joueurcouleur2 vert
14Enregistrements
- Motivation (à faire !)
- type t_couleur (rouge, vert, jaune)
- type t_joueur RECORD
- nom string
- score integer
- couleur t_couleur
- END
- var joueur array1..n of t_joueur
- joueur1.nom " Martin
- joueur1.score 0
- joueur1.couleur rouge
- joueur2.nom " Romain
- joueur2.score 0
15- type t_date RECORD
- an integer
- mois byte
- jour byte
- END
- var aujourdhui t_date
536.870.911
...
536.870.910
...
17
aujourdhui.jour 4005
aujourdhui.mois 4004
10
aujourdhui.an 4003
0
aujourdhui.an 4002
0
Occupe de la place successive dans la mémoire
aujourdhui.an 4001
7
aujourdhui.an 4000
214
...
0
16Type tableaux denregistrements
- Déclaration du type enregistrement
- type t_chanson RECORD
- titre string100
- artiste string100
- album string100
- longueur integer
- date t_date
- END
- Déclaration du type tableau
- type t_tableau_chansons array1..n of
t_chanson - Déclaration dune variable de ce type
-
- var collection t_tableau_chansons
- Affectation
17Type tableaux denregistrements
- Exercice
- type t_chanson RECORD
- titre string100
- artiste string100
- album string100
- longueur integer
- date t_date
- END
- type t_tableau_chansons array1..n of
t_chanson - var collection t_tableau_chansons
- Trouver lartiste dune chanson donnée kaya
- i 1
- tant que iltn
-
18Type tableaux denregistrements
- Exercice
- type t_chanson RECORD
- titre string100
- artiste string100
- album string100
- longueur integer
- date t_date
- END
- type t_tableau_chansons array1..n of
t_chanson - var collection t_tableau_chansons
- Trouver lartiste dune chanson donnée kaya
- i 1
- tant que iltn
- si collectioni.title kaya alors
- afficher collectioni.artiste
19Type tableaux denregistrements
- Exercice
- type t_chanson RECORD
- titre string100
- artiste string100
- album string100
- longueur integer
- date t_date
- END
- type t_tableau_chansons array1..n of
t_chanson - var collection t_tableau_chansons
- Trouver lartiste dune chanson donnée kaya
- trouve FAUX
- i 1
- tant que (iltn ET trouve FAUX)
- si collectioni.title kaya alors
- afficher collectioni.artiste
20NOUVEAU Addressage mémoire
21(No Transcript)
22(No Transcript)
23Adresse dune 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
24Organisation de la mémoire
- var a byte ( 1 octet (byte) )
536.870.911
536.870.910
...
1.000
...
5
a 4
3
2
1
0
25Organisation de la mémoire
536.870.911
536.870.910
...
1.000
...
5
a 4
97
3
2
1
0
26Organisation de la mémoire
536.870.911
536.870.910
...
1.000
...
5
a 4
97
3
2
1
0
Comment connaître ladresse de a ? ? Addr(a)
27Organisation de la mémoire
- var a byte
- a 97
- p_a Addr(a) Sauvegarder ladresse
536.870.911
536.870.910
...
1.000
...
5
a 4
97
3
2
1
0
Comment connaître ladresse de a ? ? Addr(a)
28- var a byte
- var p_a byte 4 octets, lire pointeur vers
a - a 97
- p_a Addr(a) Sauvegarder ladresse
536.870.911
536.870.910
p_a pointe vers a
0
p_a 1.003
0
p_a 1.002
0
p_a 1.001
p_a 1.000
5
...
a 5
97
4
3
2
1
0
Comment connaître ladresse de a ? ? Addr(a)
29- var a byte
- var p_a pointer to byte 4 octets, lire
pointeur vers a - a 97
- p_a Addr(a) Sauvegarder ladresse
- p_a est 4, p_a est 97)
- p_a 10 Déréférencement
- p_a est 4, p_a est 10)
536.870.911
536.870.910
0
p_a 1.003
0
p_a 1.002
0
p_a 1.001
p_a 1.000
4
...
5
p_a a 4
10
3
2
1
Comment connaître ladresse de a ? ? Addr(a)
0
30- var a byte
- var p_a byte 4 octets, lire pointeur vers
a - a 97
- p_a Addr(a) Sauvegarder ladresse
- p_a 10 affectation par déréférencement
- a 10 affectation
31- var a byte
- var p_a byte 4 octets, lire pointeur vers
a - a 97
- p_a Addr(a) Sauvegarder ladresse
- p_a 10 affectation par déréférencement
- a 10 affectation
Cest équivalent !!
32Définitions
- Déclaration dun pointeur vers un byte
- var p_a byte
- Déréférencement dun pointeur
- p_a
- Connaître ladresse dune variable a
- Addr(a) ou bien
- _at_a
33Fonctions
34- type t_tableau array1..n of integer
- var tab t_tableau
- function dedans(quoi integer, n integer)
integer - var position integer
- var i integer
- début
- position 0
- i 1
- tant que (iltn) faire
- si (quoi tabi) alors
- position i
- fin si
-
- i i 1
35- type t_tableau array1..n of integer
- var tab t_tableau
- function dedans(quoi integer, n integer)
integer - var position integer
- var i integer
- début
- position 0
- i 1
- tant que (iltn) faire
- si (quoi tabi) alors
- position i
- fin si
-
- i i 1
En-tête de la fonction
36- type t_tableau array1..n of integer
- var tab t_tableau
- function dedans(quoi integer, n integer)
integer - var position integer
- var i integer
- début
- position 0
- i 1
- tant que (iltn) faire
- si (quoi tabi) alors
- position i
- fin si
-
- i i 1
Corps de la fonction
37- type t_tableau array1..n of integer
- var tab t_tableau
- function dedans(quoi integer, n integer)
integer - var position integer
- var i integer
- début
- position 0
- i 1
- tant que (iltn) faire
- si (quoi tabi) alors
- position i
- fin si
-
- i i 1
Paramètres de la fonction (arguments)
38- type t_tableau array1..n of integer
- var tab t_tableau
- function dedans(quoi integer, n integer)
integer - var position integer
- var i integer
- début
- position 0
- i 1
- tant que (iltn) faire
- si (quoi tabi) alors
- position i
- fin si
-
- i i 1
Type de retour de la fonction
Valeur de retour de la fonction
39La portée
40- 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
- i3
- WriteLn(somme(5))
- WriteLn('i ', i)
41- 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
- i3
- WriteLn(somme(5))
- WriteLn('i ', i)
...
...
i 100
...
0
42- 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
- i3
- WriteLn(somme(5))
- WriteLn('i ', i)
...
...
i 201
n 200
5
3
i 100
...
0
43- 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
- i3
- WriteLn(somme(5))
- WriteLn('i ', i)
...
...
i 201
n 200
5
3
i 100
...
0
44- 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
- i3
- WriteLn(somme(5))
- WriteLn('i ', i)
...
...
1
i 201
n 200
5
3
i 100
...
0
45- 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
- i3
- WriteLn(somme(5))
- WriteLn('i ', i)
46- 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
- i3
- WriteLn(somme(5))
- WriteLn('i ', i)
47Appel des fonctions
- Appel par valeur
- Appel par référence
48Appel par valeur
- var a byte
- procedure ajouter (parametre byte)
- début
- WriteLn(parametre, parametre)
- parametre parametre 2
- WriteLn(parametre, parametre)
- fin
- début
- a 4
- WriteLn(a, a)
- ajouter(a)
- WriteLn(a, a)
49Appel par valeur
536.870.911
536.870.910
...
- var a byte
- procedure ajouter (parametre byte)
- début
- WriteLn(parametre, parametre)
- parametre parametre 2
- WriteLn(parametre, parametre)
- fin
- début
- a 4
- WriteLn(a, a)
- ajouter(a)
- WriteLn(a, a)
...
223
222
221
220
...
203
202
201
a 200
4
...
0
50Appel par valeur
536.870.911
536.870.910
...
- var a byte
- procedure ajouter (parametre byte)
- début
- WriteLn(parametre, parametre)
- parametre parametre 2
- WriteLn(parametre, parametre)
- fin
- début
- a 4
- WriteLn(a, a)
- ajouter(a)
- WriteLn(a, a)
...
223
222
221
4
parametre 220
...
203
202
201
a 200
4
...
0
51Appel par valeur
536.870.911
536.870.910
...
- var a byte
- procedure ajouter (parametre byte)
- début
- WriteLn(parametre, parametre)
- parametre parametre 2
- WriteLn(parametre, parametre)
- fin
- début
- a 4
- WriteLn(a, a)
- ajouter(a)
- WriteLn(a, a)
...
223
222
221
6
parametre 220
...
203
202
201
a 200
4
...
0
52Appel par valeur
536.870.911
536.870.910
...
- var a byte
- procedure ajouter (parametre byte)
- début
- WriteLn(parametre, parametre)
- parametre parametre 2
- WriteLn(parametre, parametre)
- fin
- début
- a 4
- WriteLn(a, a)
- ajouter(a)
- WriteLn(a, a)
...
223
222
221
220
...
203
202
201
a 200
4
...
0
53Appel par valeur
536.870.911
536.870.910
...
- var a byte
- procedure ajouter (parametre byte)
- début
- WriteLn(parametre, parametre)
- parametre parametre 2
- WriteLn(parametre, parametre)
- fin
- début
- a 4
- WriteLn(a, a)
- ajouter(a)
- WriteLn(a, a)
...
223
222
221
220
...
203
202
201
200
4
...
0
54Appel par référence
- 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ébut
- a 4
- WriteLn('a', a)
- ajouter(Addr(a))
55Appel par référence
- 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ébut
- a 4
- WriteLn('a', a)
- ajouter(Addr(a))
Parametre est un pointeur
Appel par référence
56Appel par référence
536.870.911
536.870.910
...
- 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ébut
- a 4
- WriteLn('a', a)
- ajouter(Addr(a))
...
...
203
202
201
a 200
4
...
0
57Appel par référence
536.870.911
536.870.910
...
- 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ébut
- a 4
- WriteLn('a', a)
- ajouter(Addr(a))
parametre 243
0
0
parametre 242
0
parametre 241
200
parametre 240
...
...
203
202
201
a 200
4
...
0
58Appel par référence
536.870.911
536.870.910
...
- 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ébut
- a 4
- WriteLn('a', a)
- ajouter(Addr(a))
parametre 243
0
0
parametre 242
0
parametre 241
200
parametre 240
...
...
203
202
201
a 200
6
...
0
59Appel par référence
536.870.911
536.870.910
...
- 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ébut
- a 4
- WriteLn('a', a)
- ajouter(Addr(a))
243
242
241
240
...
...
203
202
201
a 200
6
...
0
60Appel 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ébut
- a 4
- WriteLn(a, a)
- ajouter(a)
- WriteLn(a, a)
Une autre façon dappeler une fonction par
référence qui est moins explicite