1. [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
{
2. [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]<<" ";
}
3. [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 () ;
4. [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])
5. [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
6. [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;
}