correction tp4 atelier c++ /gl2 insat / tunisie

6
[TP N°4 : INITIATION AU MONDE DE LA PROGRAMMATION C++] Atelier C++ INSTITUT NATIONAL DES SCIENCES APPLIQUEES ET DE TECHNOLOGIE - TUNISIE 1 Prof : Mariem ZAOUALI – Niveau : GL2 1. Objectif de la séance Le but de la séance est de manipuler les notions suivantes : Fonctions amies Surcharge des opérateurs Sauvegarde dans un fichier et récupération des données NB : Durant ce TP, créez les fichiers headers et leurs implémentations, le main fera l’objet d’un fichier .cpp à part 2. Fonctions amies On va reprendre l’exemple du cours. On veut développer une fonction intitulée vecteur produit (const matrice &, const vecteur &) avec : Vecteur est le type de retour de la fonction produit Vecteur et matrice sont deux classes à définir o Vecteur Attribut : un tableau double de taille 3 Méthodes : Un constructeur et une méthode membre d’affichage du vecteur o Matrice Attribut : un tableau de deux dimensions 3x3 de type double Méthodes : un constructeur Question 1 : A votre avis, pourquoi choisit-on le passage de paramètres constants par référence ? Le passage de paramètres constants nous permet d’être à l’abri de toute tentative de modification de valeur du paramètre en question. Le passer par référence veut dire qu’on veut éviter de le copier. En combinant les deux modes ensemble, et c’est bel et bien le cas du constructeur par recopie, l’objet passé en paramètre ne peut être ni modifié, ni avoir une copie … utile pour un accès en « lecture seule ». Question 2 : Où peut-on définir cette fonction, dans la classe vecteur ou matrice ? Justifier votre réponse. Cette fonction doit être définie/déclarée dans une autre classe à part matrice et vecteur. Ceci est grâce au fait que la signature de la fonction comprend les deux types matrice et vecteur comme paramètre. Question 3 : Écrivez un petit programme de test. On fournira séparément les deux déclarations de chacune des classes, la définition du produit et le programme de test. //vecteur.h class matrice; //pour pouvoir compiler la déclaration du vecteur class vecteur {

Upload: mariem-zaouali

Post on 07-Aug-2015

63 views

Category:

Education


1 download

TRANSCRIPT

[TP N°4 : INITIATION AU MONDE DE LA PROGRAMMATION C++] Atelier C++

INSTITUT NATIONAL DES SCIENCES APPLIQUEES ET DE TECHNOLOGIE - TUNISIE 1

Prof : Mariem ZAOUALI – Niveau : GL2

1. Objectif de la séance Le but de la séance est de manipuler les notions suivantes :

Fonctions amies

Surcharge des opérateurs

Sauvegarde dans un fichier et récupération des données

NB : Durant ce TP, créez les fichiers headers et leurs implémentations, le main fera l’objet d’un fichier .cpp à part

2. Fonctions amies On va reprendre l’exemple du cours. On veut développer une fonction intitulée

vecteur produit (const matrice &, const vecteur &)

avec :

Vecteur est le type de retour de la fonction produit

Vecteur et matrice sont deux classes à définir o Vecteur

Attribut : un tableau double de taille 3 Méthodes : Un constructeur et une méthode membre d’affichage du vecteur

o Matrice Attribut : un tableau de deux dimensions 3x3 de type double Méthodes : un constructeur

Question 1 : A votre avis, pourquoi choisit-on le passage de paramètres constants par référence ?

Le passage de paramètres constants nous permet d’être à l’abri de toute tentative de modification de valeur du paramètre en question. Le passer par référence veut dire qu’on veut éviter de le copier. En combinant les deux modes ensemble, et c’est bel et bien le cas du constructeur par recopie, l’objet passé en paramètre ne peut être ni modifié, ni avoir une copie … utile pour un accès en « lecture seule ».

Question 2 : Où peut-on définir cette fonction, dans la classe vecteur ou matrice ? Justifier votre réponse.

Cette fonction doit être définie/déclarée dans une autre classe à part matrice et vecteur. Ceci est grâce au fait que la signature de la fonction comprend les deux types matrice et vecteur comme paramètre.

Question 3 : Écrivez un petit programme de test. On fournira séparément les deux déclarations de chacune

des classes, la définition du produit et le programme de test.

//vecteur.h class matrice; //pour pouvoir compiler la déclaration du vecteur class vecteur {

[TP N°4 : INITIATION AU MONDE DE LA PROGRAMMATION C++] Atelier C++

INSTITUT NATIONAL DES SCIENCES APPLIQUEES ET DE TECHNOLOGIE - TUNISIE 2

private: double tab[3]; public : vecteur(); vecteur(double,double,double); void affichage(); friend vecteur produit(const matrice&,const vecteur &); };

//matrice.h class vecteur; class matrice { private : double mat[3][3]; public: matrice(); matrice(double t[3][3]); friend vecteur produit(const matrice&,const vecteur&); };

//vecteur.cpp #include "vecteur.h" #include "matrice.h" #include <iostream> using namespace std; vecteur::vecteur() { for(int i=0; i<3; i++) tab[i]=0; } vecteur::vecteur(double a,double b,double c) { tab[0]=a; tab[1]=b; tab[2]=c; } void vecteur::affichage() { for (int i=0; i<3; i++) cout<<tab[i]<<" "; }

[TP N°4 : INITIATION AU MONDE DE LA PROGRAMMATION C++] Atelier C++

INSTITUT NATIONAL DES SCIENCES APPLIQUEES ET DE TECHNOLOGIE - TUNISIE 3

//matrice.cpp #include "matrice.h" #include "vecteur.h" #include <iostream> using namespace std; matrice::matrice() { for (int i=0; i<3; i++) for (int j=0; j<3; j++) mat[i][j]=0; } matrice::matrice (double t [3] [3]) { int i ; int j ; for (i=0 ; i<3 ; i++) for (j=0 ; j<3 ; j++) mat[i] [j] = t[i] [j] ; }

//main.cpp //Définition de la fonction produit #include "vecteur.h" #include "matrice.h" #include <iostream> using namespace std; vecteur produit(const matrice &m,const vecteur &x) { vecteur v; for (int i=0; i<3; i++) for (int j=0; j<3; j++) v.tab[i] += m.mat[i] [j] * x.tab[j] ; return v; } Int main() { vecteur w (1,2,3), res ; double tab [3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 } ; matrice a; //Remplir la matrice a par les valeurs du tab res = produit(a, w) ; res.affiche () ;

[TP N°4 : INITIATION AU MONDE DE LA PROGRAMMATION C++] Atelier C++

INSTITUT NATIONAL DES SCIENCES APPLIQUEES ET DE TECHNOLOGIE - TUNISIE 4

return 0 ; }

3. Surcharge des opérateurs On va rajouter d’autres méthodes à la classe vecteur. Définissez les opérateurs == et != de manière qu’ils

permettent de tester si deux vecteurs ont les même valeurs ou pas.

a. en utilisant des fonctions membres

// on rajoute ces lignes au niveau de la classe vecteur.h int operator ==(vecteur);

int operator !=(vecteur); //définir au niveau de la classe vecteur.cpp int vecteur::operator == (vecteur v) { for (int i=0; i<3; i++) if(v.tab[i]!=this->tab[i]) return 0; return 1; } int vecteur::operator != (vecteur v) { for (int i=0; i<3; i++) if(v.tab[i]!=this->tab[i]) return 1; return 0; }

b. en utilisant des fonctions amies.

// on rajoute ces lignes au niveau de la classe vecteur.h friend int operator ==(vecteur,vecteur); friend int operator !=(vecteur,vecteur);

//définir au niveau de la classe main.cpp Int operator == (vecteur v, vecteur w) { for (int i=0; i<3; i++) if(v.tab[i]!=w.tab[i]) return 0; return 1; } int operator != (vecteur v, vecteur w) { for (int i=0; i<3; i++) if(v.tab[i]!=w.tab[i])

[TP N°4 : INITIATION AU MONDE DE LA PROGRAMMATION C++] Atelier C++

INSTITUT NATIONAL DES SCIENCES APPLIQUEES ET DE TECHNOLOGIE - TUNISIE 5

return 1; return 0; }

4. Sauvegarde dans un fichier et récupération des données Nous allons manipuler dans ce dernier exercice, la lecture et l’écriture des données d’un fichier avec C++. Il

s’agit d’améliorer l’exercice de Homework fait en TP3. On veut rajouter la possibilité que l’utilisateur peut

enregistrer le contenu de la map dans un fichier, ou remplir la map à partir d’un fichier.

Q1 : Rajoutez une méthode où vous stockez les données de la map dans un fichier.

//On suppose que la classe est appelée event void event::insert_file(string file_name)

//Dans event.h , l’entête de la méthode sera la suivante

void event::insert_file(string file_name) { ofstream fichier(file_name,ios::out); if(fichier) { map<int,string>::iterator it; //ici map est un attribut de la classe event for(it=map.begin();it!=map.end();it++) { fichier<<it->first<<'-'; i=0; while(it->second[i]!='\0') { //on suppose que le séparateur dans la chaine est # if(it->second[i]==',') fichier<<'#'; else fichier<<it->second[i]; i++; } fichier<<"\n"; } fichier.close(); } else

cerr<<"impossible d\’ouvrir le fichier "<<endl; }

Q2 : Rajoutez une méthode où vous lisez les données contenues dans un fichier et vous remplissez la

map

[TP N°4 : INITIATION AU MONDE DE LA PROGRAMMATION C++] Atelier C++

INSTITUT NATIONAL DES SCIENCES APPLIQUEES ET DE TECHNOLOGIE - TUNISIE 6

void event::read_from_file(string file_name) { ifstream fichier(file_name, ios::in); if(fichier) { string ligne,res=””,l=””; int a,i; while(getline(fichier,ligne)) { i=0; while(ligne[i]!='-') { res=res+ligne[i]; i++; } res[i]='\0'; //convertir un tableau de char en entier a=atoi(res); i++; while(ligne[i]!='\0') { //séparateur dans la valeur de la map est « , » if(ligne[i]=='#') l=l+","; else l=l+ligne[i]; i++; } this->add_event(a,l); } fichier.close(); } else cerr<<"impossible d'ouvrir le fichier"<<endl; }