Algorithmes et structures de données 9ème cours Patrick Reuter maître de conférences

Slides:



Advertisements
Présentations similaires
GEF 243B Programmation informatique appliquée
Advertisements

Programmation Orienté Objet en C++
Initiation à la programmation et algorithmique cours 4
Le langage C++ Les types structurés
Algorithmes et structures de données avancées 6ème cours Patrick Reuter
Algorithmes et structures de données avancées 5ème cours Patrick Reuter
Algorithmes et structures de données avancées Cours 6 Patrick Reuter
Algorithmes et structures de données 7ème cours
Algorithmes et structures de données avancés
Algorithmes et structures de données 3ème cours Patrick Reuter
Portée des variables VBA & Excel
Patrick Reuter maître de conférences
Algorithmes et structures de données 4ème cours
Algorithmes et structures de données 5ème cours
C++ 6ème cours Patrick Reuter maître de conférences
GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §
GEF 243B Programmation informatique appliquée
Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Tableaux et pointeurs §10.1.
3- Déclaration et accès aux objets
1 UMLV 1. Introduction 2. Hachage ouvert 3. Hachage fermé 4. Implémentation des fonctions Méthodes de hachage.
C.
PHP5 poo.
Les structures de données
FLSI602 Génie Informatique et Réseaux
Introduction à la programmation (420-PK2-SL) cours 15 Gestion des applications Technologie de linformation (LEA.BW)
Les sous-programmes Chapitre n° 5: Objectifs : Activité:
Sous-programmes Concepts généraux Passage de paramètres Fonctions
Cours 7 - Les pointeurs, l'allocation dynamique, les listes chaînées
CSI3525: Concepts des Langages de Programmation Notes # 12: Implementation des Sous-Programmes ( Lire Chapitre 9 )
TP : Fichiers et Tableaux Séance N°2 Avril Application de Gestion de stock Partie 1 : les fichiers 1 Création dun fichier de 20 articles.
TP Fichiers et Tableaux Avril Un fichier Permet le stockage de données sur des supports de mémoire externes (donc les données ne seront pas perdues.
LES SOUS-PROGRAMMES USTL Licence S.T.A. S3 A.P.I.2.
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
IFT-2000: Structures de Données Listes chaînées Dominic Genest, 2009.
Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès.
Langage Oriente Objet Cours 2.
Allocation de mémoire Allocation de mémoire.
Les pointeurs Enormément utilisé en C/C++ ! Pourquoi? A quoi ça sert?
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Structures de données IFT-2000
Révision des notions OO et Java Semaine 1 Jian-Yun Nie.
Sixième cours Les chaînes de caractères et le passage de paramètres par référence Passage de paramètres par référence String.h.
Environnements d'exécution
IFT 6800 Atelier en Technologies d’information

Tableaux Introduction aux tableaux à une dimension. Déclaration, stockage, initialisation et accès en lecture ou en écriture aux composantes d’un tableau.
Structures de données IFT-2000
Plan cours La notion de pointeur et d’adresse mémoire.
Stocker plusieurs valeurs de même type dans une variable
Question 1 Une série d'échantillons sont analysés dans un laboratoire. On constate que la teneur en carbone des différents échantillons varie d'un échantillon.
2.1 - Historique Chapitre 2 : Introduction au langage C++
Le langage C Rappel Pointeurs & Allocation de mémoire.
JavaScript Nécessaire Web.
Les Pointeurs et les Tableaux Statiques et Tableaux Dynamiques
O-notation 1. Introduction 2. O-notation 3. Opérations 3.1 Somme 3.2 Produit 4. Règles générales 5. Exemple 6.Analyse des algorithmes récursifs 6.1 Dilatation.
Packages et Types De la Spécification Formelle A l'implémentation Ada.
Labo II : Tableaux et pointeurs
La notion de type revisitée en POO
Algorithmes de tri et de recherche
CSI 3525, Implémentation des sous-programmes, page 1 Implémentation des sous-programmes L’environnement dans les langages structurés en bloc La structure.
ISBN Chapitre 10 L'implémentation des sous- programmes.
Cours LCS N°4 Présenté par Mr: LALLALI
Algorithmique et programmation en
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
1 Cours 6 Définitions de nouvelles procédures Transmissions de données/résultats Déclarations globales/locales Visibilités Interface/implementation.
8PRO107 Éléments de programmation Les adresses et les pointeurs.
Algorithmique Algorithmique  Pascal
3ième Classe (Mardi, 23 Septembre) CSI2572. O jourd'8: E Allocation de mémoire E Déallocation de mémoire E Tableaux (n dimensions) E Arithmetique des.
L'exécution d'un programme nécessite l'utilisation des ressources de l'ordinateur : temps de calcul pour exécuter les opérations, et l'occupation de la.
Informatique 2A Langage C 5ème séance. Déroulement de la séance 5 1 ère partie Étude des chaînes de caractères 2 ème partie Les structures 3.
Transcription de la présentation:

Algorithmes et structures de données 9ème cours Patrick Reuter maître de conférences

La dernière fois : –Règles de complexité –Pointeurs

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 )

Théorie de la complexité Règles de constantes Règles des sommes Règles des produits Transitivité

Pointeurs

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

Organisation de la mémoire var a : byte; ( 1 octet (byte) ) #0 #1 #2 #3 #4 #5... # # #

Organisation de la mémoire var a : byte; #0 #1 #2 #3 a #4 #5... # # #

Organisation de la mémoire var a : byte; a := 97; #0 #1 #2 #3 a #4 #5... # # #

Organisation de la mémoire var a : byte; a := 97; #0 #1 #2 #3 a #4 #5... # # # Comment connaître ladresse de a ? Addr(a)

Organisation de la mémoire var a : byte; a := 97; p_a := Addr(a);{ Sauvegarder ladresse } #0 #1 #2 #3 a #4 #5... # # # Comment connaître ladresse de a ? Addr(a)

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... # # p_a # Comment connaître ladresse de a ? Addr(a) p_a #1.001 p_a #1.002 p_a # « 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 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... # # p_a # Comment connaître ladresse de a ? Addr(a) p_a #1.001 p_a #1.002 p_a #

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 }

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 !!

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

var p_a : ^byte; {4 octets, lire : pointeur vers a} begin p_a^ := 10;{ affectation par déréférencement} end. ERREUR !!

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... # # p_a #1.000 p_a #1.001 p_a #1.002 p_a #1.003

Solution var p_a : ^byte; {4 octets, lire : pointeur vers a}... #0 #1 #2 #3 #4 #5... # # p_a #1.000 p_a #1.001 p_a #1.002 p_a #

Solution var p_a : ^byte; {4 octets, lire : pointeur vers a}... New(p_a); #0 #1 #2 #3 #4 #5... # # p_a #1.000 p_a #1.001 p_a #1.002 p_a # p_a^

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... # # p_a #1.000 p_a #1.001 p_a #1.002 p_a # p_a^ #0 « p_a pointe vers p_a^ »

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... # # p_a #1.000 p_a #1.001 p_a #1.002 p_a #

Aujourdhui Tableaux dynamiques Portée

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

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 !!! …

Organisation de la mémoire var points : array[1..10] of byte; {10 octets} #0 points[1] # # # points[3] #2002 points[10] # points[2] #

Organisation de la mémoire points[1]:=130; points[2]:=25; … #0 points[1] # # # points[3] #2002 points[10] # points[2] #

Organisation de la mémoire var points : array[1..10] of byte; {10 octets} #0... # # Occupe de la place successive dans la mémoire points[1] # points[3] #2002 points[10] #2009 points[2] #

Organisation de la mémoire var points : array[1..10] of byte; {10 octets} #0... # # points[index] #(2000+index-1)... Occupe de la place successive dans la mémoire points[1] # points[3] #2002 points[10] #2009 points[2] #

Organisation de la mémoire var points : array[1..10] of byte; {10 octets}... # # #0 points[index] #(2000+index-1) points[1] # points[3] #2002 points[10] #2009 points[2] #

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

var points : array[1..10] of byte; {12 octets} var i : byte; i := 0; points = points[1] # # # points[3] #2002 points[10] # points[2] # #0 points[index] #(2000+index-1) i #

Un onzième joueur veut se connecter.. points[11] ????

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 !!! }

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 !!

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

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] # i #104 points #100 points #101 points #102 points #

Un onzième jouer ? Un douzième joueur ? points[10] ? points [11] ? Solution : SetLength(nom_du_tableau_dynamique, taille);

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] # i #104 points #100 points #101 points #102 points #

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] # i #104 points #100 points #101 points #102 points #

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] # i #104 points #100 points #101 points #102 points # points[0] #200 points[2] #202 points[11] #211 points[1] # Réserver la mémoire

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] # i #104 points #100 points #101 points #102 points # points[0] #200 points[2] #202 points[11] #211 points[1] # Copier la mémoire

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] # i #104 points #100 points #101 points #102 points # points[0] #200 points[2] #202 points[11] #211 points[1] # Libérer la mémoire

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)

SetLength(nom_du_tableau_dynamique, 0); 1.Libère la place pour la suite du programme Désallocation

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 # points[0] #200 points[2] #202 points[11] #211 points[1] # Libérer la mémoire

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; 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; 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; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end #0 i #100 n #200 i #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; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end #0 i #100 n #200 i #201

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 n #200 i #201 1

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.

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.

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ébut a := 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ébut a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin Appel par valeur #0 a #200 #201 #202 # # #203 #220 # #222 #

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 # # #203 parametre #220 # #222 # Appel par valeur

#0 a #200 #201 #202 # # #203 parametre #220 # #222 # 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

#0 a #200 #201 #202 # # #203 #220 # #222 # 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

#0 #200 #201 #202 # # #203 #220 # #222 # 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

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

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

#0 a #200 #201 #202 # # # 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

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 # # #203 parametre #240 parametre # parametre #242 parametre # Appel par référence

#0 a #200 #201 #202 # # #203 parametre #240 parametre # parametre #242 parametre # 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

#0 a #200 #201 #202 # # #203 #240 # #242 # 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

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