Pour chacune d'entre-elles, vous écrirez un fichier .H contenant
la déclaration de la classe, un fichier .CPP contenant les
définitions des fonctions membres de la classe, et un fichier de test
(.CPP) qui vérifie le bon fonctionnement dans un maximum de cas.
Sauf indication contraire, le destructeur est toujours vide.
Appelez un intervenant dès que quelquechose ne semble pas clair dans le sujet ou si, après avoir réfléchi, vous ne trouvez pas la solution.
Utilisez si possible les noms de variables et de fonctions donnés dans les sujets pour rester compatible avec les solutions partielles qui vous seront données.
Utilisez les fonctions qui accèdent aux données à chaque fois que c'est possible, plutôt que d'accéder aux données directement.
Créez sur C: un répertoire TP22 et des sous-répertoires ex1 à ex2. N'oubliez pas de recopier tous les fichiers sources sur votre compte à la fin du TP.
Empêchez systématiquement les éventuelles inclusions multiples.
Ce TP est le plus long de cette unité; faire l'investissement en temps nécessaire dès maintenant vous permettra de profiter au mieux des TP suivants. Garder du retard d'un TP sur l'autre vous empêchera de poser les bonnes questions pendant les TP et vous demandera un gros travail à la fin pour rendre la version finale du ditributeur.
// TESTMONN.CPP
// Programme de test de la classe Monnayeur
#include <iostream.h>
#include "monnayeu.h"
int main()
{
Monnayeur m;
m.memorise_prix( 5.00 );
m.recevoir( 0.50 );
m.recevoir( 2.00 );
if (m.annulation() == 2.50)
cout << "annulation OK." << endl;
else
cout << "annulation ERR !" << endl;
m.memorise_prix( 5.00 );
m.recevoir( 2.00 );
m.recevoir( 2.00 );
cout << "assez:" << m.assez() << endl;
m.recevoir( 2.00 );
cout << "exact: " << m.exact() << ", assez:" << m.assez() << endl;
if (m.rendre_monnaie() == 1.00)
cout << "rendre_monnaie OK." << endl;
else
cout << "rendre_monnaie ERR !" << endl;
return 0;
}
// TESTDIST.CPP
// Programme de test du Distributeur
#include "distribu.h"
int main()
{
Distributeur distri;
distri.Run();
return 0;
}
// DISTRIBU.H
// De'claration de la classe Distributeur
#ifndef _distribu_h // Pre'vention des inclusions multiples
#define _distribu_h
#include "stock.h"
#include "monnayeu.h"
class Distributeur
{
public:
// Constructeur / Destructeur
Distributeur();
~Distributeur() {};
// Fonctions d'e'tat
int produit_demande() const;
// Autres me'thodes
void delivre_produit();
void annule_demande();
void demande_produit( int num );
void Run();
// Donne'es membres
private:
int num_produit;
Stock stock_produits;
Monnayeur monnayeur;
};
#endif
// DISTRIBU.CPP a` comple'ter
// De'finition des fonctions membres de Distributeur
#include <iostream.h>
#include "distribu.h"
#define NBMAXPROD 10
// Constructeur
Distributeur::Distributeur()
{
num_produit = -1; // aucun produit demande'
// initialisation des produits
Produit *produit;
produit = new Produit( "Orange", 3.00 );
stock_produits.stocker( produit, 5 );
produit = new Produit( "Cafe_sans", 5.00 );
stock_produits.stocker( produit, 4 );
produit = new Produit( "Cafe_unpeu", 6.00 );
stock_produits.stocker( produit, 3 );
produit = new Produit( "Cafe_beaucoup", 7.00 );
stock_produits.stocker( produit, 2 );
}
// Fonctions d'e'tat
int Distributeur::produit_demande() const
{
// ici
}
// Autres me'thodes
void Distributeur::delivre_produit()
{
// ici
if (stock_produits.est_limite())
cout << " [appelez le remplisseur !] " << endl;
else
cout << " [remplissage OK] " << endl;
}
void Distributeur::demande_produit( int num )
{
// ici
}
void Distributeur::annule_demande()
{
// ici
}
void Distributeur::Run()
{
char rep1, rep2;
int fini = 0;
float piece;
while (! fini)
{
cout << "[P]roduits, [M]onnayeur, [Q]uitter ? ";
cin >> rep1;
switch( rep1 )
{
case 'P' :
cout << "[Q]uitter ou nume'ro du produit ? ";
cin >> rep2;
switch( rep2 )
{
case 'Q' :
break;
case '1' :
case '2' :
case '3' :
case '4' :
// ici
break;
default :
cout << "Q ou un chiffre !" << endl;
} // switch2
break;
case 'M' :
// monnayeur.Run();
cout << "[Q]uitter ou [A]nnulation ou" << endl;
cout << "[0]: 0F50, [1]: 1F, [2]: 2F, [5]: 5F, [D]: 10F ? ";
cin >> rep2;
piece = 0.00;
switch( rep2 )
{
case 'Q' :
break;
case 'A' :
// ici
break;
case 'D' : piece += 5.00;
case '5' : piece += 3.00;
case '2' : piece += 1.00;
case '1' : piece += 0.50;
case '0' : piece += 0.50;
// ici
break;
default :
cout << "Q ou A ou 0, 1, 2, 5, D !" << endl;
} // switch2
break;
case 'Q' :
fini = 1;
break;
default :
cout << "P ou M ou Q !" << endl;
} // switch1
} // while !fini
} // Run()