Cours C++ Master Actuariat Séance 9: La classe Liste chaînée

Slides:



Advertisements
Présentations similaires
Cours de C – Séance dexercices 12 Octobre Exercice 5 Idem quexercice 1 : lire une ligne au clavier Sans limitation de la longueur de la ligne (utilisez.
Advertisements

Les fonctions A quoi ça sert ?
Cours n° 7 Standard Template Library II.
C++ 6ème cours Patrick Reuter maître de conférences
Cours n° 8 Conception et Programmation à Objets
(Classes prédéfinies – API Java)
C.
Introduction à la programmation (420-PK2-SL) cours 15 Gestion des applications Technologie de linformation (LEA.BW)
Regrouper des éléments de même type et pouvoir y accéder à laide dun identificateur et dun indice. Objectif des tableaux.
ALGORITHMES RECURSIFS
Structures de données linéaires
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
Structures de données et algorithmes – C5 Maria-Iuliana Dascalu, PhD
Leçon 6 : Structures de données dynamiques IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier.
IFT-2000: Structures de Données Listes chaînées Dominic Genest, 2009.
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
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.
Structures de données IFT-2000
Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
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 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
Une nouvelle structure de données : les tableaux
Introduction au paradigme orienté-objet (suite)
Présentation Structures de Données et TDA
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.
Points importants de la semaine Les allocations programmées de mémoire. Les enregistrements.
1 PROTOTYPE PGC++ Vecteur_3D DÉFINITION. 2 class Vecteur_3D { private : float vx, vy, vz, vw; // Représentation en coordonnées homogènes. public : Vecteur_3D();
1 La récursion. Nous avons vu qu'un programme est constitué d'un ensemble de fonctions. Il est possible pour une fonction donnée d'appeler une autre fonction.
COURS DE PROGRAMMATION ORIENTEE OBJET :
1 Fonction : surcharge de sélection La surcharge de sélection consiste à implanter plusieurs méthodes de même nom dans une même classe à condition que.
C++ : fonctions et opérateurs
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
Développement dapplication avec base de données Semaine 10 : WCF avec Entité Framework Automne 2013.
Structures de données IFT-2000
Structures de données IFT-10541
Structures de données IFT-2000 Abder Alikacem Retour sur les listes ordonnées Département dinformatique et de génie logiciel Édition Septembre 2009.
Plan cours La notion de pointeur et d’adresse mémoire.
Structures de données IFT-2000
Structures de données IFT-2000
Le langage C Structures de données
Ch. PAUL - Piles et Files à l'aide de listes chainées
La notion de type revisitée en POO
7ième Classe (Mardi, 24 novembre) CSI2572. Devoir 3 ?
Cours 7 Classes locales Clonage Divers: tableaux.
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.
Arbres binaires et tables de hachage
Cours C++ Fonctions Surcharge d’opérateurs Passage d’arguments
Tutorat en bio-informatique
ETNA – 1ème année Guillaume Belmas –
Strings et Tableaux en Java
Les opérateurs L’amitié Les opérateurs Introduction
Les surcharges d'opérateurs
Cours LCS N°4 Présenté par Mr: LALLALI
Tutorat en bio-informatique Le 15 novembre Exercices 1 et 2 (MAT1400) - solutions Chapitre 12.2, Analyse - concepts et contextes vol. 2 19) Calculez.
Chapitre VII Techniques plus avancées à travers le concept de classe.
Conception de Programmes - IUT de Paris - 1ère année Quelques éléments du langage C++ Les références La surcharge de fonctions Les fonctions «
Ecrire 10 fois "Bonjour" sur 10 lignes différentes
8PRO107 Éléments de programmation Les adresses et les pointeurs.
8PRO107 Éléments de programmation Les tableaux. Étude de cas 1 Description du problème : Lire une liste d’entiers et l’afficher d’abord dans le même ordre.
PRO-1027 Programmation Scientifique en C
Algorithmique Tableaux de données
1 Listes des méthodes de la classe string, et exemples.
Exception Handling "Unfortunately, it's almost accepted practice to ignore error conditions, as if we're in a state of denial about errors." Bruce Eckel.
Conception de Programmes - IUT de Paris - 1ère année Les classes Introduction Déclaration d’une classe Utilisation d’une classe Définition des.
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.
M. BENJELLOUN : 2005 Le but final est de programmer un jeu où l'ordinateur choisira un nombre aléatoire entre 0 et 100 que vous devez deviner.
Les structures de base Listes chainées. Listes Les listes(similaire aux tableaux) sont des structures informatiques qui permettent de garder en mémoire.
Transcription de la présentation:

Cours C++ Master Actuariat Séance 9: La classe Liste chaînée Année universitaire 2014/2015

La classe Vecteur : Une autre alternative Pourquoi implémenter la classe Vecteur à l’aide d’un tableau ? Essayons de faire le même exercice mais en utilisant une liste chaînée ! En effet, notre Vecteur peut être considéré comme étant une liste chaînée de doubles C++ - F.CHAKER - M1 Actuariat

Une nouvelle définition de la classe Vecteur struct noeud { double sommet; noeud * suiv; }; class Vecteur { int _taille; noeud * start; public: Vecteur(); // constructeur par défaut Vecteur(const Vecteur &); / / constructeur de recopie ~Vecteur(); void deleteliste(); void ajouter(double); noeud * copier(noeud *); double read_element(int); Vecteur & operator=(const Vecteur &); friend ostream& operator<<(ostream &, Vecteur &); double& operator [](int); C++ - F.CHAKER - M1 Actuariat

Explications : L’idée de base : Stocker les données dans une liste chaînée Le reste de l’interface est pratiquement le même Note : Le champs _taille est dans ce cas pas très important Nous pouvons ainsi utiliser le constructeur par défaut (sans arguments). C++ - F.CHAKER - M1 Actuariat

Constructeur Vecteur:: Vecteur() { this->_taille=0; Le rôle du constructeur est de créer une liste vide ! Pour le moment il n’ y aura pas d’allocation de mémoire Vecteur:: Vecteur() { this->_taille=0; this->start=NULL; } C++ - F.CHAKER - M1 Actuariat

Destructeur (1/3) Les données sont stockées da,s une liste chaînée (pointée par start) Lorsqu’un vecteur est supprimé, nous aurons besoin alors de supprimer la liste ! (et c’est à nous de le faire !! le compilateur ne le fait pas à notre place !! Exercice: Ecrire le destructeur qui permet de réaliser cette tâche. C++ - F.CHAKER - M1 Actuariat

Destructeur (2/3) 1ère solution : Vecteur::~Vecteur() { Noeud *tmp = start; while(tmp){ start = tmp->suiv; delete(tmp); tmp = start; }} C++ - F.CHAKER - M1 Actuariat

Destructeur (3/3) Vecteur::~Vecteur() { deleteliste(); } 2ème solution : Utiliser un appel à une fonction membre qui nous sera utile à chaque fois qu’on aura besoin de supprimer la liste (cf. surcharge de l’opérateur d’affectation) Vecteur::~Vecteur() { deleteliste(); } ======================================== Prototype de la fonction deleteliste (dans le Vecteur.h) : void deleteliste(); Définition dans le (Vecteur.cpp) void Vecteur::deleteliste() {noeud *tmp=start; while(tmp) { start=tmp->suiv; delete(tmp); tmp=start; }} C++ - F.CHAKER - M1 Actuariat

Constructeur de recopie (1/4) Objectif : Créer un nouvel objet (de type vecteur) ayant les mêmes données qu’un ancien vecteur. Nous devrons copier les éléments de la liste chaînée un par un ! C++ - F.CHAKER - M1 Actuariat

Constructeur de recopie (2/4) Exercice: programmer le constructeur de copie de la classe Vecteur Vecteur(const Vecteur &); Pour celà vous allez commencer par définir une fonction membre : noeud * copier(noeud *source) Cette fonction permet de copier la liste chaînée source dans une autre liste et retourne la nouvelle liste copiée ! Attention au bug qui peut survenir lors de la recopie !!! Faire appel à cette fonction dans le constructeur de recopie C++ - F.CHAKER - M1 Actuariat

Constructeur de recopie (3/4) noeud * Vecteur::copier(noeud * start) {if (start==NULL) return NULL; noeud *tete=new noeud; noeud *tmp=tete; tete->sommet=start->sommet; start=start->suiv; while(start!=NULL) { tmp->suiv=new noeud; tmp=tmp->suiv; tmp->sommet=start->sommet; } tmp->suiv=NULL; return tete; Pour éviter le bug !! Pour que les deux listes ne pointent pas sur la même adresse ! C++ - F.CHAKER - M1 Actuariat

Constructeur de recopie (4/4) Vecteur:: Vecteur(const Vecteur &source) { this->_taille=source._taille; this->start=copier(source.start); } C++ - F.CHAKER - M1 Actuariat

La fonction membre Ajouter Cette fonction permet d’ajouter une valeur à la liste chaînée. Prototype : void ajouter(double val) Cette fonction permet d’ajouter un nouveau nœud ayant comme sommet la valeur val transmis en argument. On suppose que l’ajout se fera en fin de liste. Exercice : Développer cette fonction ? C++ - F.CHAKER - M1 Actuariat

Ajouter une nouvelle valeur void Vecteur::ajouter(double val) { // on suppose que l’ajout se fait en fin de liste _taille++; noeud *newn=new noeud; newn->sommet=val; newn->suiv=NULL; noeud* precedent=start; if(precedent==NULL) // liste vide start=newn; else { while(precedent->suiv!=NULL) precedent=precedent->suiv; precedent->suiv=newn; } C++ - F.CHAKER - M1 Actuariat

La fonction Read_element Cette fonction retourne la valeur (double) stockée dans l’indice « indice » de la liste ! Prototype : double read_element(int indice) Exercice : Développer cette fonction ? C++ - F.CHAKER - M1 Actuariat

La fonction Read_element Vecteur::read_element(int indice) { noeud *tmp=start; int i=1; while(tmp) if(i==indice) return tmp->sommet; else {i++; tmp=tmp->suiv; } {cout<<"Indice supérieur à la taille de la liste"<<endl; return 0; C++ - F.CHAKER - M1 Actuariat

Surcharger l’opérateur [ ] Une décision de conception doit être prise pour l’opérateur [ ]  Qu’est ce qu’il est censé faire si on essaye d’accéder à un indice inexistant ?  Est ce qu’il doit l’ajouter à la liste ?  Est ce qu’il retourne simplement un 0 ?  Mais dans ce cas il y aura un problème !! La fonction retourne un double & !!!!  Comment peut-on faire pour affecter une valeur à cet élément retourné ???? C++ - F.CHAKER - M1 Actuariat

Surcharger l’opérateur [ ] Décision : si l’élément n’existe pas  l’ajouter à la liste (ajout en tête de liste) Exercice : Utiliser une fonction qui permet de tester si l’élément se trouve dans la liste ? Prototype : noeud* find_element(int indice, noeud *start) Développer ensuite la surcharge de l’opérateur [ ] en utilisant cette fonction. C++ - F.CHAKER - M1 Actuariat

Surcharger l’opérateur [ ] noeud * Vecteur::find_element(int indice, noeud *start) { int i=1; //position while(start) if(i == indice) return start; else { i++; start = start->suiv; } return 0; C++ - F.CHAKER - M1 Actuariat

Surcharger l’opérateur [ ] double & Vecteur::operator[ ](int indice) { noeud *tmp = find_element(indice,start); if(tmp) return tmp->sommet; _taille++; tmp = new noeud; tmp -> sommet = 0; tmp -> suiv = start; start=tmp; return tmp->sommet; } C++ - F.CHAKER - M1 Actuariat

Attention au bug !! N’oublier pas de supprimer l’ancienne liste !! Surcharger l’opérateur d’affectation = Exercice : Développer la fonction operator =. Attention au bug !! N’oublier pas de supprimer l’ancienne liste !! Rappel : Pourquoi avons-nous développer les fonctions deleteliste() et copier ??? C++ - F.CHAKER - M1 Actuariat

Surcharger l’opérateur d’affectation = Vecteur & Vecteur::operator=(const Vecteur & V) { if (this !=&V) deleteliste(); _taille=V._taille; start=copier(V.start); } return *this; C++ - F.CHAKER - M1 Actuariat

Surcharger l’opérateur << Fonction amie : friend ostream& operator<<(ostream &, Vecteur &) Définition ostream& operator<<(ostream & out, Vecteur & V) Exercice : Programmer cet opérateur C++ - F.CHAKER - M1 Actuariat

Surcharger l’opérateur << ostream& operator<<(ostream & out, Vecteur & V) { noeud *tmp=V.start; cout<<"["; while(tmp!=NULL) {out<< tmp->sommet <<","; tmp=tmp->suiv; } out<<"]"<<endl; return out; C++ - F.CHAKER - M1 Actuariat

Exemple d’utilisation de la classe Vecteur : #include"vecteur_liste.h" #include<iostream> using namespace std; int main() { Vecteur V1,V3; //appel du constructeur par défaut cout<<"donner la taille de votre liste"; int N; double valeur; cin>>N; cout<<"Saisie des valeurs de la liste"<<endl; for (int i=1;i<=N;i++) {cout<<"Donner la "<< i <<" eme valeur"; cin>>valeur; V1.ajouter(valeur); // ou V1[i]=valeur; mais // attention les valeurs sont stockées en ordre //inverse : premier saisi sera le dernier de la //liste } cout<<"Affichage de la liste creee :"<<endl; cout<<V1; // grâce à la surcharge de l’opérateur << Vecteur V2=V1; //appel au constructeur de recopie cout<<"La liste copiée avec le constructeur de recopie est :"<<endl; cout<<V2; cout<<"Donner l'indice de l'élément à afficher"; int indice; double val; cin>>indice; val=V1.read_element(indice); if(val!=0) cout<<"L'element qui se trouve à l'indice "<< indice <<" est égal à :"<< val<<endl; V3=V1; // grâce à la surcharge de l’opérateur = cout<<"Le vecteur V3 obtenu a travers une operation d'affectation :"<<endl; cout<<V3; V3[8]=3.1; // grâce à la surcharge de l’opérateur [ ] cout<<"La nouvelle liste est :"<< V3<<endl; system("pause"); return 0; } C++ - F.CHAKER - M1 Actuariat