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()