Cours n° 9 Conception et Programmation à Objets

Slides:



Advertisements
Présentations similaires
Erratum C Surcharge For(int x=0; … 2.
Advertisements

Cours n° 7 Standard Template Library II.
Cours n° 6 Standard Template Library I.
Sensibilisation à l’Algorithmique
Au programme du jour …. Un peu plus de structures de données
Sensibilisation à l’Algorithmique et structure de données
Cours n° 8 Conception et Programmation à Objets
1 UMLV 1. Introduction 2. Hachage ouvert 3. Hachage fermé 4. Implémentation des fonctions Méthodes de hachage.
La programmation générique avec la STL EIUMLV - Informatique et Réseaux 99 Benoît ROMAND.
Approfondissement du langage
Algorithme et structure de données
JAV - TD 6 Structures de données JAVA
Introduction à la POO: Les classes vs les objets
Utilisation des tableaux
ALGORITHMES RECURSIFS
Structures collectives en Java
IPA – Catherine Faron Zucke et Anne Marie Deryr. suite ordonnée d'éléments de taille variable ArrayList liste; liste = new ArrayList (); Ne peuvent contenir.
Les algorithmes: complexité et notation asymptotique
Leçon 6 : Structures de données dynamiques IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier.
Bibliothèque standard du C++
Ecole Supérieure Privée de ingénierie et de technologie année universitaire :2013/2014 Cross-Plateform Cours JavaScript.
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.
Chapitre 21 Collections Partie I Introduction Une collection : est un objet qui regroupe multiple éléments dans une unité. Une collection est.
Standard Template Library (STL)
1 Objectifs de ce cours (I21) Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Résumé du cours précédent.
Python La programmation objet
Structures de données IFT-2000
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
Traiter des Données avec la STL
Les fichiers indexés (Les B-arbres)
Structures de données IFT Abder Alikacem La classe vector Édition Septembre 2009 Département dinformatique et de génie logiciel.
Ensembles Définition d’un ensemble. Opérations sur les ensembles. Accès, suppression et ajout d’éléments d’un ensemble. Fonctions permettant de manipuler.
Structures de données IFT-2000
Structures de données IFT Abder Alikacem La classe string Département dinformatique et de génie logiciel Édition Septembre 2009 Département dinformatique.
Structures de données IFT-2000 Abder Alikacem La librairie STL du C++ Département dinformatique et de génie logiciel Édition Septembre 2009.
Structures de données IFT-2000 Abder Alikacem Standard Template library Édition Septembre 2009 Département dinformatique et de génie logiciel.
Programme de baccalauréat en informatique Programmation Orientée Objets IFT Thierry EUDE Module 7 : Classes et fonctions paramétrables Département.
Conteneurs STL.
Rappels Java.
GPA789 Analyse et conception orientées objet 1 Professeur: Tony Wong, Ph.D., ing. Chapitre 6 Correspondance UML et C++
Parallel Programming in C with MPI and OpenMP
Chapitre 9 Les sous-programmes.
COURS DE PROGRAMMATION ORIENTEE OBJET :
Standard Template Library
Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 1 Cours n° 4 Polymorphisme II.
Structures de données IFT-2000
Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 1 Cours n° 3 Polymorphisme I.
Structures des données
Le langage C Structures de données
2.1 - Historique Chapitre 2 : Introduction au langage C++
LES PILES ET FILES.
La notion de type revisitée en POO
GESTION ET TRAITEMENT DES ERREURS
Templates, Containers et STL Structures de données de base tableau, liste chaînée file, pile, arbres, hashtable collection, ensemble 2 caractéristiques.
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
ETNA – 1ème année Guillaume Belmas –
C# de plus près.  Ce sont globalement les mêmes que Java : ◦ Int(int16, int32), float, double, bool,…  Les classe « communes » sont également les mêmes.
Conception de Programmes - IUT de Paris - 1ère année – Cours 8 – Les entrées/sorties Comment fonctionnent les opérateurs > pour les types élémentaires.
Conception de Programmes - IUT de Paris - 1ère année Conception de Programmes Objectifs et organisation du cours Introduction à la P.O.O. et au.
Liste Une liste est une séquence d’éléments. Concept important: Chaque élément possède une position dans la liste. Notation: De quelles opérations a-t-on.
Conception de Programmes - IUT de Paris - 1ère année Conception de Programmes Objectifs et organisation du cours Introduction à la P.O.O.
Chapitre VII Techniques plus avancées à travers le concept de classe.
Templates & STL Ou comment ne pas réinventer la roue à chaque fois.
1 Listes des méthodes de la classe string, et exemples.
Structures de données IFT-2000 Abder Alikacem Laboratoire #1 Département d’informatique et de génie logiciel Édition Septembre 2009.
Structures de données IFT-2000 Abder Alikacem Standard Template library Semaine 5 Édition Septembre 2009 Département d’informatique et de génie logiciel.
Chapitre 21 Collections partie III Set Une collection qui contient des éléments uniques. Deux implémentation :  HashSet : stock les éléments.
Files de priorité (Priority Queue)
CSI2510 Structures des Données et Algorithmes
Transcription de la présentation:

Cours n° 9 Conception et Programmation à Objets Equipe pédagogique Marie-José Caraty, Denis Poitrenaud et Mikal Ziane Cours n° 9 Conception et Programmation à Objets Réutilisation de composants de la bibliothèque standard du C++ (STL) 2/2

Sommaire Introduction Conteneurs 1.1. Séquences élémentaires Conteneurs vector, deque, list 1.2. Adaptateurs de séquence Conteneurs stack, queue, priority_queue 1.3. Conteneurs associatifs Conteneur map, set, multimap, multiset Itérateurs Algorithmes Manipulations - Ordonnancement Recherche - Ensemblistes Conclusion

1.3. CONTENEURS ASSOCIATIFS Introduction Conteneurs indexés par une clé de type quelconque et triés suivant cette clé (généralisation des séquences) Concept de paire (clé, valeur) pour représenter un élément set Clé et valeur sont confondues, éléments tous distincts map Clé et valeur sont distinctes, clé unique par élément multiset Plusieurs occurrences possibles du même élément multimap Une même clé peut correspondre à plusieurs éléments

Méthodes communes des conteneurs associatifs (1/2) bool empty(); true si le conteneur est vide size_type size() const; Nombre d'éléments du conteneur size_type max_size() const; Contenance maximale du conteneur size_type count(const key_T& k) const; Nombre d’éléments de clé k iterator lower_bound(const key_T& k) const; Itérateur sur le 1er élément dont la clé est supérieure ou égale à k iterator upper_bound(const key_T& k) const; Itérateur sur le 1er élément dont la clé est inférieure ou égale à k

Méthodes communes des conteneurs associatifs (2/2) iterator find(const key_T& k); Recherche d’un élément de clé k key_compare key_comp() const; Objet de type fonction binaire de comparaison de deux clés value_compare value_comp() const; Objet de type fonction binaire de comparaison de deux valeurs void erase(iterator i); Suppression de l’élément référencé par l'itérateur i void erase(iterator debut, iterator fin); Suppression des valeurs de [debut fin[ void erase(const key_T& k); Suppression des valeurs de clé k

Membres publics et fonction générique (externe) make_pair 1.3. CONTENEURS ASSOCIATIFS Patron (template) de la classe pair pair <T1, T2> T1 : type du premier élément stocké dans la paire T2 : type du deuxième élément stocké dans la paire Membres publics et fonction générique (externe) make_pair first membre correspondant au premier élément stocké second membre correspondant au deuxième élément stocké pair <T1, T2> make_pair (const T1& o1, const T2& o2); constitue un objet unique de type pair à partir de o1 et o2 Exemple : type pair sur le concept (clé, valeur) décrivant un objet voiture Pair<string, string> v; v = make_pair("Peugeot", "207 CC Coupé Cabriolet"); Cout << "Marque :" << v.first << " Modèle :" v.second << endl; clé (marque) valeur (modèle) voiture

map<key_T, value_T , Compare=less<key_T> > m; 1.3. CONTENEURS ASSOCIATIFS - Conteneur MAP Instanciation, propriétés et méthodes spécifiques map<key_T, value_T , Compare=less<key_T> > m; Déclaration d’un ensemble m de couples (clés de type key_T, valeurs associées de type value_T) pair make_pair(const key_T& k, const value_T& v) Regroupement de la clé et de la valeur dans un seul élément Insertion réussie si absence d’élément de même clé Méthods spécifiques pair<iterator, bool> insert(const T& e); Tentative d’insertion d’un élément e pair<iterator, bool> insert(iterator i, const T& e); Tentative d’insertion d’un élément e à l'emplacement spécifié par l'itérateur i (améloration du temps de recherche de l’emplacement) void insert(iterator debut, iterator, fin) Tentative d’insertion des éléments de [debut fin[ d’une autre séquence

#include <iostream> #include <map> #include <string> 1.3. CONTENEURS ASSOCIATIFS - Conteneur MAP Exemple #include <iostream> #include <map> #include <string> using namespace std; int main() { map<string, float, less<string> > prixFruit; prixFruit.insert(make_pair("poire", 1.5)); prixFruit.insert(make_pair("pêche", 2.7)); prixFruit.insert(make_pair("orange", 1.2)); map<string, float, less<string> >::iterator it; if ((it = prixFruit.find("poire")) == prixFruit.end()) cout << "fruit non référencé"; else cout << it->second; } Résultat d’exécution : 1.5

set<key_T, Compare=less<key_T> > s; 1.3. CONTENEURS ASSOCIATIFS - Conteneur SET Instanciation et propriétés set<key_T, Compare=less<key_T> > s; Déclaration d’un ensemble s de clés de type key_T Mêmes méthodes que pour le conteneur map Clés et valeurs confondues

multimap<key_T, value_T , Compare=less<key_T> > mm; 1.3. CONTENEURS ASSOCIATIFS - Conteneur MULTIMAP Instanciation, propriétés et méthodes spécifiques multimap<key_T, value_T , Compare=less<key_T> > mm; Déclaration d’un ensemble mm de couples (clés de type key_T, valeurs associées de type value_T) Pas d’échec d’insertion Méthodes spécifiques iterator lower_bound(const T& e); Recherche du premier élément de clé k iterator upper_bound(const T& e); Recherche du dernier élément de clé k

#include <iostream> #include <map> #include <string> 1.3. CONTENEURS ASSOCIATIFS - Conteneur MULTIMAP Exemple #include <iostream> #include <map> #include <string> using namespace std; int main() { multimap<int, string, less<int> > conjug; conjug.insert(make_pair(1, "parler")); conjug.insert(make_pair(2, "choisir")); conjug.insert(make_pair(3, "prendre")); conjug.insert(make_pair(2, "finir")); conjug.insert(make_pair(1, "manger")); multimap<int, string, less<int> >::iterator it1, it2, it; it1 = conjug.lower_bound(2); it2 = conjug.upper_bound(2); cout << "Verbes du deuxième groupe : "; for (it = it1; it != it2; it++) cout << it->second << ", "; } Résultat d’exécution : Verbes du deuxième groupe : choisir, finir

multiset<key_T, Compare=less<key_T> > ms; 1.3. CONTENEURS ASSOCIATIFS - Conteneur MULTISET Instanciation et propriétés multiset<key_T, Compare=less<key_T> > ms; Déclaration d’un ensemble ms de clés de type key_ T Mêmes opérations que pour le conteneur multimap Clés et valeurs confondues

Variable qui repère la position d'un élément dans un conteneur 2. ITERATEURS Rôles des itérateurs Variable qui repère la position d'un élément dans un conteneur Utilisés pour accéder/balayer les éléments d'un conteneur Accès (lecture/écriture) des éléments du conteneur Balayage séquentiel de tous les éléments du conteneur Méthodes membres des conteneurs (sauf adaptateurs) begin(), end() // Balayage du début du conteneur à sa fin rbegin(), rend() // Balayage de la fin du conteneur à son début

Généralisation et amélioration de la sûreté des pointeurs 2. ITERATEURS Opérateurs associés Généralisation et amélioration de la sûreté des pointeurs Soit l’itérateur It Déréférencement Accès au conteneur dont l'itérateur pointe l'élément *It Déplacement En avant, en arrière ou aléatoire Exemples : ++It; It++; // balayage séquentiel avant --It; It--; // balayage séquentiel arrière It+=5; It-=3; // accès direct

BidirectionalIterator RandomAccessIterator 2. ITERATEURS Hiérarchie des itérateurs *, i++, ++i Constructeur copie Opérateur d'assignation ==, != InputIterator OutputIterator Itérateur d'entrée Lecture Déplacement avant *, i++, ++i Constructeur copie Opérateur d'assignation Itérateur de sortie Ecriture Déplacement avant Itérateur unidirectionnel Lecture et écriture Déplacement avant ForwardIterator Itérateur bidirectionnel Lecture et écriture Déplacement avant/arrière i--, --i BidirectionalIterator <, <=, >, >= +, +=, -, -= [] Itérateur accès aléatoire Lecture et écriture Accès aléatoire RandomAccessIterator

A chaque conteneur son type d'itérateur 2. ITERATEURS Déclaration des itérateurs A chaque conteneur son type d'itérateur Itérateur à accès aléatoire (vector et deque) Itérateur bidirectionnel (list, map, set) Types membres des classes conteneurs const_iterator (version constante) iterator (version non constante) Déclaration d’itérateur Instanciation du conteneur, opérateur de visibilité, type d’itérateur Exemples de déclaration : Déclaration d'un itérateur Itv sur un vecteur d'entiers vector<int>::iterator Itv; Déclaration d'un itérateur Itl sur une liste d'entiers list<int>::iterator Itl;

Affichage d'un conteneur vecteur d'entiers par balayage d'itérateur 2. ITERATEURS Balayage/accès par itérateur Affichage d'un conteneur vecteur d'entiers par balayage d'itérateur typedef vector<int> vectInt; vectInt V; // Première version for (vectInt::iterator It=V.begin(); It<V.end(); It++) cout<<*It<<" "; // ou V[It] cout<<endl; // Deuxième version vectInt::iterator It=V.begin(); while (It!=V.end()){ cout<<*It<<" "; ++It; }

Manipulations Classification Algorithmes Ordonnancement Ensemblistes Comparaisons Recherche Copie Echange Inclusion Motif Remplissage Différence Elément Remplacement Tri Intersection Réorganisation Gestion de tas Union et fusion Transformation Recherche binaire Partitionnement

Manipulation (Extraits) 3. ALGORITHMES Manipulation (Extraits) OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result); Copie de la séquence [first last[ à l’emplacement result OutputIterator copy_backward(InputIterator first, InputIterator last, OutputIterator result); Copie de la séquence ]last first] à l’emplacement result ForwardIterator2 swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2); Echange des éléments des deux séquences [first1 last1[ et [first2 last2[ void generate(ForwardIterator first, ForwardIterator last, Generator gen); Initialisation de [first last[ par une fonction génératrice void rotate (ForwardIterator first, ForwardIterator middle, ForwardIterator last); Echange des éléments des deux séquences [first middle[ et [middle last[

Tri de la séquence [first last[ avec l’opérateur de comparaison Comp 3. ALGORITHMES Tris (Extraits) void sort (RandomAccessIterator first, RandomAccessIterator last [,Compare comp]); Tri de la séquence [first last[ avec l’opérateur de comparaison Comp void stable_sort (RandomAccessIterator first, RandomAccessIterator last [,Compare comp]); Tri stable de la séquence [first last[ avec l’opérateur de comparaison Comp, Ordre initial en cas d’égalité

Recherches (Extraits) 3. ALGORITHMES Recherches (Extraits) InputIterator find(InputIterator first, InputIterator last, const T& v); Recherche de la valeur v dans la séquence [first last[ InputIterator find_if(InputIterator first, InputIterator last, Predicate pred); Recherche d’une valeur de la séquence [first last[ satisfaisant pred ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2); Recherche d’une valeur de la séquence [first2 last2[ présente dans la séquence [first1 last1[ ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2 [, BinaryPredicate binary_pred]); Recherche de la séquence [first2 last2[ dans la séquence [first1 last1[

Prérequis : l'opérateur == est défini pour T 3. ALGORITHMES Opération de recherches find Prérequis : l'opérateur == est défini pour T template <class InputIterator, class T> InputIterator find(InputIterator debut, InputIterator fin, const T& valeur); Recherche dans la séquence définie par l'intervalle [debut fin[ d'un item égal à valeur Retourne le premier itérateur i dans l'intervalle tel que *i == valeur Retourne end() si la valeur n'est pas trouvée

Prérequis : un prédicat pred est défini 3. ALGORITHMES Opération de recherche find_if Prérequis : un prédicat pred est défini template <class InputIterator, class Predicate> InputIterator find_if(InputIterator debut, InputIterator fin, Predicate pred); Recherche dans la séquence définie par l'intervalle [debut fin[ d'un item égal à valeur Retourne le premier itérateur i dans l'intervalle tel que pred(*i) ==true Retourne end() si le prédicat n'est pas satisfait

Résultat d'exécution : 4 (premier élément du conteneur >3) 3. ALGORITHMES Exemple d’objet fonction template <class T> class PremierPlusGrand { // Objet fonction : classe avec private: // surcharge de l'opérateur () T x_; public: PremierPlusGrand () : x_ (0) {} PremierPlusGrand (const T& x) : x_ (x) {} int operator () (const T& v) {return v > x_;} }; vector <int> v; ... // Vecteur initialisé à 1 2 3 4 5 vector<int>::iterator i = find_if(v.begin(), v.end(), PremierPlusGrand <int> (3)); (i!=v.end()) ? cout<<*i : cout<<"element introuvable"; Résultat d'exécution : 4 (premier élément du conteneur >3)

Ensemblistes (Extraits) 3. ALGORITHMES Ensemblistes (Extraits) set_union (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result [,Compare comp]); Union des deux ensembles [first1 last1[ et [first2 last2[ Résultat dans un troisième ensemble set_intersection (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); Intersection des deux ensembles [first1 last1[ et [first2 last2[ Résultat dans un troisième ensemble set_difference (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); Différences entrel les deux ensembles [first1 last1[ et [first2 last2[ Résultat dans un troisième ensemble

Efficacité : objectif même des concepteurs (code efficace) 3. ALGORITHMES Avantages à utiliser STL Efficacité : objectif même des concepteurs (code efficace) Complexité maximale spécifiée pour les méthodes/algorithmes Algorithmes choisis pour l'implémentation des fonctionnalités sont les plus efficaces qui soient (les meilleurs connus à ce jour) Gain en production de logiciel dû à la réutilisation Nombre impressionnant d'algorithmes disponibles Couverture de tous les besoins courants des programmeurs Fiabilité : gain de fiabilité par réutilisation de composants Plus un composant est réutilisé, plus il est sûr Réutilisation et maintenabilité : facilitée par la standardisation Portabilité : a priori grâce à la norme ISO Applicabilité des algorithmes aux structures de données utilisateur

Exemple – Carnet téléphonique (Carnet.hpp) ANNEXE Exemple – Carnet téléphonique (Carnet.hpp) #include <string> #include <map> #include <iterator> using namespace std; class Carnet { private: map<string, string> MCarnet; //map(clé=nom, valeur=téléphone) map<string, string>::iterator it; //iterateur it pour accès //et balayage de la map public: Carnet() {} void ajoute(string nom, string tel); //ajoute un enregistrement string getTel(string nom); //accesseur du numéro de téléphone string listeNom(string tel); //liste du/des nom(s) string listeCarnet(); //liste du carnet complet };

Exemple – Carnet téléphonique (Carnet.cpp) ANNEXE Exemple – Carnet téléphonique (Carnet.cpp) #include "Carnet.h" using namespace std; void Carnet::ajoute(string nom, string tel) { MCarnet[nom] = tel; //ajoute/remplace l'enregistrement //correspondant à nom } string Carnet::getTel(string nom) { it = MCarnet.find(nom); //fin de conteneur si aucune clé //ne correspond à nom if (it == MCarnet.end()) return ""; return (*it).second; //retourne le numéro de téléphone

Exemple – Carnet téléphonique (Carnet.cpp) ANNEXE Exemple – Carnet téléphonique (Carnet.cpp) string Carnet::listeNom(string tel) { string resultat = ""; for (it = MCarnet.begin(); it != MCarnet.end(); it++) if ((*it).second == tel) resultat += (*it).first + '\n'; return resultat; } string Carnet::listeCarnet() { string resultat; resultat += (*it).first + " : " + (*it).second + "\n";

Exemple – Carnet téléphonique (main.cpp) ANNEXE Exemple – Carnet téléphonique (main.cpp) #include "Carnet.h" #include <iostream> using namespace std; void main() { Carnet C; string dupond = "Dupond Georges"; string telDupond = "0123456789"; C.ajoute("Martin Pierre", "0122334455"); C.ajoute(dupond, telDupond); C.ajoute("Dupond Jean", telDupond); C.ajoute("Durand Jacques", "0266778899"); C.ajoute("Durand Jacques", "0266778800"); cout << C.listeCarnet() << endl; cout << "Le numero de " << dupond << " est :"; string numTel = C.getTel(dupond); if (numTel.length() == 0) cout << "inconnu" << endl; else cout << numTel << endl << endl; cout << "Entree(s) du no " << telDupond << " :\n" << endl; string liste = C.listeNom(telDupond); if (liste.length() == 0) cout << "aucune entree"; else cout << liste << endl; }