Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parMarcelon Cheron Modifié depuis plus de 11 années
1
Algorithmes et structures de données 9ème cours Patrick Reuter maître de conférences http://www.labri.fr/~preuter
2
La dernière fois : –Règles de complexité –Pointeurs
3
Théorie de la complexité Classes de Grand-O O(1)complexité constante O(log n) complexité logarithmique O(n)complexité linéaire O(n log n)complexité quasi-linéaire O(n a) complexité polynomiale –O(n 2) complexité quadratique –O(n 3) complexité cubique O(a n) complexité exponentielle O(log n) O(n) O(n log n) O(n 2 ) O(n 3 ) O(2 n )
4
Théorie de la complexité Règles de constantes Règles des sommes Règles des produits Transitivité
5
Pointeurs
6
Dé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 } @a;
7
Organisation de la mémoire var a : byte; ( 1 octet (byte) ) #0 #1 #2 #3 #4 #5... #536.870.910 #536.870.911 #1.000...
8
Organisation de la mémoire var a : byte; #0 #1 #2 #3 a #4 #5... #536.870.910 #536.870.911 #1.000...
9
Organisation de la mémoire var a : byte; a := 97; #0 #1 #2 #3 a #4 #5... #536.870.910 #536.870.911 #1.000... 97
10
Organisation de la mémoire var a : byte; a := 97; #0 #1 #2 #3 a #4 #5... #536.870.910 #536.870.911 #1.000... 97 Comment connaître ladresse de a ? Addr(a)
11
Organisation de la mémoire var a : byte; a := 97; p_a := Addr(a);{ Sauvegarder ladresse } #0 #1 #2 #3 a #4 #5... #536.870.910 #536.870.911 #1.000... 97 Comment connaître ladresse de a ? Addr(a)
12
var a : byte; var p_a : ^byte; {4 octets, lire : pointeur vers a} a := 97; p_a := Addr(a);{ Sauvegarder ladresse } #0 #1 #2 #3 a #4 #5... #536.870.910 #536.870.911 p_a #1.000 0 97 Comment connaître ladresse de a ? Addr(a) p_a #1.001 p_a #1.002 p_a #1.003 4 0 0 « p_a pointe vers a »
13
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) #0 #1 #2 #3 p_a^a #4 #5... #536.870.910 #536.870.911 p_a #1.000 0 10 Comment connaître ladresse de a ? Addr(a) p_a #1.001 p_a #1.002 p_a #1.003 4 0 0
14
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 }
15
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 !!
16
Dé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 } @a;
17
var p_a : ^byte; {4 octets, lire : pointeur vers a} begin p_a^ := 10;{ affectation par déréférencement} end. ERREUR !!
18
var p_a : ^byte; {4 octets, lire : pointeur vers a} p_a^ := 10;{ affectation par déréférencement } ERREUR !! #0 #1 #2 #3 #4 #5... #536.870.910 #536.870.911 p_a #1.000 p_a #1.001 p_a #1.002 p_a #1.003
19
Solution var p_a : ^byte; {4 octets, lire : pointeur vers a}... #0 #1 #2 #3 #4 #5... #536.870.910 #536.870.911 p_a #1.000 p_a #1.001 p_a #1.002 p_a #1.003... 0 0 0 0
20
Solution var p_a : ^byte; {4 octets, lire : pointeur vers a}... New(p_a); #0 #1 #2 #3 #4 #5... #536.870.910 #536.870.911 p_a #1.000 p_a #1.001 p_a #1.002 p_a #1.003... 0 0 0 0 p_a^
21
Solution var p_a : ^byte; {4 octets, lire : pointeur vers a}... New(p_a); p_a^ := 10;{ affectation par déréférencement } #1 #2 #3 #4 #5... #536.870.910 #536.870.911 p_a #1.000 p_a #1.001 p_a #1.002 p_a #1.003... 0 0 0 0 10p_a^ #0 « p_a pointe vers p_a^ »
22
Solution var p_a : ^byte; {4 octets, lire : pointeur vers a}... New(p_a); p_a^ := 10;{ affectation par déréférencement }... Dispose(p_a);{ Libérer la mémoire } #0 #1 #2 #3 #4 #5... #536.870.910 #536.870.911 p_a #1.000 p_a #1.001 p_a #1.002 p_a #1.003... 0 0 0 0
23
Aujourdhui Tableaux dynamiques Portée
24
Type : tableau statique (angl. static ARRAY) Déclaration dune variable de type tableau Défintion : var nom_du_tableau : Array[MinDim..MaxDim] of type ; Exemple : var points: array[1..10] of byte; … -structure de données la plus connu -structure homogène, chaque élément est du même type de base -La taille du tableau est fixe
25
Type : tableau statique (angl. static ARRAY) Déclaration dune variable de type tableau statique var points : array[1..10] of byte; Affectation : nom_du_tableau[index] := valeur ; Exemples : points[1] := 130; points[2] := 25; … points[10] := 90; points[11] ----- Erreur !!! points[12] ----- Erreur !!! …
26
Organisation de la mémoire var points : array[1..10] of byte; {10 octets} #0 points[1] #2000... #536.870.910 #536.870.911... points[3] #2002 points[10] #2009... points[2] #2001...
27
Organisation de la mémoire points[1]:=130; points[2]:=25; … #0 points[1] #2000... #536.870.910 #536.870.911... points[3] #2002 points[10] #2009... points[2] #2001 130 25 31 90
28
Organisation de la mémoire var points : array[1..10] of byte; {10 octets} #0... #536.870.910 #536.870.911... Occupe de la place successive dans la mémoire points[1] #2000... points[3] #2002 points[10] #2009 points[2] #2001 130 25 31 90
29
Organisation de la mémoire var points : array[1..10] of byte; {10 octets} #0... #536.870.910 #536.870.911 points[index] #(2000+index-1)... Occupe de la place successive dans la mémoire points[1] #2000... points[3] #2002 points[10] #2009 points[2] #2001 130 25 31 90
30
Organisation de la mémoire var points : array[1..10] of byte; {10 octets}... #536.870.910 #536.870.911... #0 points[index] #(2000+index-1) points[1] #2000... points[3] #2002 points[10] #2009 points[2] #2001 130 25 31 90
31
Type : tableau statique (angl. static ARRAY) -structure de données la plus connu -structure homogène, chaque élément est du même type de base -occupe de la place successive dans la mémoire -« random access » = accès aux différentes éléments se fait au coût égal
32
var points : array[1..10] of byte; {12 octets} var i : byte; i := 0; points = points[1] #2000... #536.870.910 #536.870.911 points[3] #2002 points[10] #2009... points[2] #2001 31 #0 points[index] #(2000+index-1) i #2010 0... 130 25 31 90
33
Un onzième joueur veut se connecter.. points[11] ????
34
Tableaux Que faire si on veut agrandir la taille du tableau ? Solution : Tableaux dynamiques var points : array of byte; {Tableau dynamique} SetLength(points, 10); { Allocation de [0..9]... } SetLength(points, 50); { Allocation de [0..49]... }... SetLength(points, 0); { Désallocation !!! }
35
Tableaux Que faire si on veut agrandir la taille du tableau ? Solution : Tableaux dynamiques var points : array of byte; {Tableau dynamique} SetLength(points, 10); { Allocation de [0..9]... } SetLength(points, 50); { Allocation de [0..49]... }... SetLength(points, 0); { Désallocation !!! } Commence toujours à 0 !!
36
var points : array of byte; {pointeur 4 octets} var i : byte; i := 10; points[0] := 2; { ERREUR !!!! }... #0 10 i #104 points #100 points #101 points #102 points #103 Pointeur : 4 octets
37
var points : array of byte; {pointeur 4 octets} var i : byte; SetLength(points, 10);... #0 jours[index] #(120+index) points[0] #120 points[2] #122 points[9] #129 points[1] #121 10 i #104 points #100 points #101 points #102 points #103 120 0 0 0
38
Un onzième jouer ? Un douzième joueur ? points[10] ? points [11] ? Solution : SetLength(nom_du_tableau_dynamique, taille);
39
var points : array of byte; {pointeur 4 octets} var i : byte; SetLength(points, 10); jours[index] #(120+index)... #0 points[0] #120 points[2] #122 points[9] #129 points[1] #121 10 i #104 points #100 points #101 points #102 points #103 120 0 0 0
40
var points : array of byte; {pointeur 4 octets} var i : byte; SetLength(points, 10); points[0] := 130; points[1] := 25; …... #0 jours[index] #(120+index) points[0] #120 points[2] #122 points[9] #129 points[1] #121 10 i #104 points #100 points #101 points #102 points #103 120 0 0 0 130 25
41
var points : array of byte; {pointeur 4 octets} var i : byte; SetLength(points, 10);... SetLength(points, 12);... #0 points[0] #120 points[2] #122 points[9] #129 points[1] #121 10 i #104 points #100 points #101 points #102 points #103 200 0 0 0 points[0] #200 points[2] #202 points[11] #211 points[1] #201... Réserver la mémoire 130 25
42
var points : array of byte; {pointeur 4 octets} var i : byte; SetLength(points, 10);... SetLength(points, 12);... #0 points[0] #120 points[2] #122 points[9] #129 points[1] #121 10 i #104 points #100 points #101 points #102 points #103 200 0 0 0 points[0] #200 points[2] #202 points[11] #211 points[1] #201... Copier la mémoire 130 25
43
var points : array of byte; {pointeur 4 octets} var i : byte; SetLength(points, 10);... SetLength(points, 12);... #0 points[0] #120 points[2] #122 points[9] #129 points[1] #121 10 i #104 points #100 points #101 points #102 points #103 200 0 0 0 points[0] #200 points[2] #202 points[11] #211 points[1] #201... Libérer la mémoire 130 25
44
SetLength(nom_du_tableau_dynamique, taille); Complexité : O(n) avec n = taille SetLength(points, 12); 1.Chercher un endroit dans la mémoire pour 12 octets consécutives 2.Copier toute la mémoire dans le nouvel endroit … O(n) ! 3.Libérer la place occupé avant Type : tableau dynamiques (angl. dynamic ARRAY)
45
SetLength(nom_du_tableau_dynamique, 0); 1.Libère la place pour la suite du programme Désallocation
46
var points : array of byte; {pointeur 4 octets} var i : byte; SetLength(points, 10);... SetLength(points, 12); SetLength(points, 0);... #0 10 i #104 points #100 points #101 points #102 points #103 200 0 0 0 points[0] #200 points[2] #202 points[11] #211 points[1] #201... Libérer la mémoire 130 25
47
La portée :
48
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; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.
49
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; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.... #0 i #100
50
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; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.... 3 #0 i #100 n #200 i #201 5
51
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; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.... 3 #0 i #100 n #200 i #201
52
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; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.... 3 #0 i #100 n #200 i #201 1
53
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; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.
54
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; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.
56
Appel des fonctions Appel par valeur Appel par référence
57
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); fin Appel par valeur
58
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); fin Appel par valeur #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 #220 #221... #222 #223... 4
59
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); fin #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 parametre #220 #221... #222 #223... 4 4 Appel par valeur
60
#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ébut a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin
61
#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ébut a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin
62
#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ébut a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin 4
63
Appel 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)); WriteLn('a', a); fin
64
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)); WriteLn('a', a); fin Appel par référence Parametre est un pointeur Appel par référence
65
#0 a #200 #201 #202 #536.870.910 #536.870.911 #203... 4 Appel 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)); WriteLn('a', a); fin
66
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)); WriteLn('a', a); fin #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 parametre #240 parametre #241... parametre #242 parametre #243... 4 200 0 0 0 Appel par référence
67
#0 a #200 #201 #202 #536.870.910 #536.870.911 #203 parametre #240 parametre #241... parametre #242 parametre #243... 6 200 0 0 0 Appel 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)); WriteLn('a', a); fin
68
#0 a #200 #201 #202 #536.870.910 #536.870.911 #203 #240 #241... #242 #243... 6 Appel 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)); WriteLn('a', a); fin
69
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ébut a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin Une autre façon dappeler une fonction par référence qui est moins explicite
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.