170 likes | 269 Views
Correction TP1. Exercice 4. Enoncé. On veut écrire un programme qui permet de gérer une liste de notes grâce à un tableau de taille variable On créé la classe note :. Note. nom : string prenom : string valeur : int. Note( string,string , int ) ~Note() void affiche().
E N D
Correction TP1 Exercice 4
Enoncé • On veut écrire un programme qui permet de gérer une liste de notes grâce à un tableau de taille variable • On créé la classe note : Note nom : string prenom : string valeur : int Note(string,string,int) ~Note() void affiche()
Et les pointeurs? • L’avantage des pointeurs, c’est de pouvoir créer et détruire à volonté des notes : Note *ptr; ptr=new Note("thib", "Lelore",12); ptr->affiche(); deleteptr; ptr=new Note("Gaston", "Fourien",18); ptr->affiche(); deleteptr;
Source d’erreurs • Où est l’erreur : Note *ptr; ptr=new Note("thib", "Lelore",12); ptr=new Note("Gaston", "Fourien",18); ptr->affiche(); deleteptr;
Source d’erreurs • Où est l’erreur : Note *ptr; ptr=new Note("thib", "Lelore",12); deleteptr; ptr=new Note("Gaston", "Fourien",18); deleteptr; ptr->affiche();
Une liste de note • Le principe est d’utiliser un tableau de pointeurs : Note *tableau[6]; Tableau[0]=new Note("Lelore", "Thib",10); Tableau[1]=new Note("Fourien", "Gaston",18); Tableau[2]=new Note("Zarhi", "Fred",17); Tableau[3]=new Note("Chirac", "Jaco",4.5); Tableau[4]=new Note("Sarko", "Nico",8); Tableau[5]=new Note("Royal", "Sego",12); Lelore Thib 10 Fourien Gaston 18 Zarhi Fred 17 Chirac Jaco 4.5 Sarko Nico 8 Royal Sego 12
Nouvelle et ancienne représentation 23BA 23B7 23B3 23AF 23AB Lelore Thib 10 23A8 Fourien Gaston 18 23A7 23BA 23A6 Zarhi Fred 17 23B7 23A5 23B3 23A4 Chirac Jaco 4.5 23AF 23A3 23AB Sarko Nico 8 23A2 23A8 Royal Sego 12
Finalement • Quels sont les avantages par rapport à un tableau de Note simple? • Quand on écrit Note tableau[10]; • On créé 10 notes vides (en utilisant le constructeur par défaut) • Quand on écrit Note *tableau[10]; • On créé 10 cases qui ne pointent sur rien • On peut créer des Notes au besoin. • Plus logique (on créé des notes quand il faut) • Plus simple • pas besoin de penser à créer un constructeur par défaut
Donc la fonction ajoutNote • Ce qu’il faut c’est ajouter une note dans la bonne case voidajoutNote(string nom,stringprenom, int note){ this->tableau[this->nb]=new Note(nom,prenom,note); this->nb=this->nb+1; } • Donc on utilise une variable pour savoir dans quelle case ajouter la note (this->nb) • Par contre, on a oublié de tester si on ne sort pas du tableau (si on a 10 cases et qu’on veux créer une 11ème note…)
Afficher les notes • Pour afficher toutes les notes, il faut utiliser une boucle. • Deux manières de faire : voidafficherNotes(){ for(int i=0;i<this->nb;i++){ *(this->tableau[i]).affiche(); } } this->tableau[i]->affiche();
Conclusion • thisest un pointeur ! • C’est un pointeur sur nous même • -> permet d’utiliser les méthodes et attributs d’un pointeur • Si c’est this->, c’est les méthodes et attributs de notre classe • Si c’est ptr->, c’est les méthodes et attributs de la classe de l’objet pointé…
Mais c’est pas tout… • Il faut permettre de faire un tableau de différentes tailles • Il faut donc faire un pointeur sur un tableau de pointeurs • Deux manières : • Note **tableau; • Note *tableau[]; • Choisissez celle que vous préférez… • Ensuite, créer le tableau comme ça : • tableau=new Note*[10];
Ça se complique… • Bon, et le destructeur ? • On a tous pensé faire • delete [] this->tableau; • C’est pas suffisant : Lelore Thib 10 Fourien Gaston 18 23A8 Zarhi Fred 17 23AB 23AF 23A1 Chirac Jaco 4.5 23B3 23B7 Sarko Nico 8 23BA Royal Sego 12
Ça se complique… • Résultat : Lelore Thib 10 Fourien Gaston 18 23A8 Zarhi Fred 17 23AB 23AF 23A1 Chirac Jaco 4.5 23B3 23B7 Sarko Nico 8 23BA Royal Sego 12
Pour bien faire : • Parcourir le tableau pour détruire chaque case • Puis détruire le tableau : for (int i=0;i<this->nb;i++){ deletethis->tableau[i]; } delete [] tableau; • Et là, c’est bon…
Résultat : Lelore Thib 10 Fourien Gaston 18 23A8 Zarhi Fred 17 23AB 23AF 23A1 Chirac Jaco 4.5 23B3 23B7 Sarko Nico 8 23BA Royal Sego 12