T2.poo : Sujet du TP2.2 T2.poo : Sujet du TP2.2
Groupe ESIEE, Denis BUREAU, juin 2003.
Attention ! Le sujet peut être modifié jusqu'à la veille du TD.

I.  Les objectifs

II.  Notions abordées dans le cours 2

III.  Références dans les documents

Le polycopié "C++ : les classes." et le corrigé du TP2.1.

IV.  Conseils généraux

Il s'agit de créer un distributeur simple mais complet, utilisant un monnayeur très simple. Quatre classes donc quatre étapes seront nécessaires: Produit, Stock, Monnayeur, et Distributeur.

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.

V.  Exercice 1

  1. Ouvrir un nouveau projet TESTMONN (dans ex1).
  2. Créez la classe Monnayeur (MONNAYEU .H et .CPP) avec :
  3. Récupérer le programme de test (TESTMONN.CPP).
  4. Écrire sur une feuille de brouillon ce que vous pensez qu'il va s'afficher sur l'écran.
  5. Fabriquer l'exécutable et comparer les affichages avec vos prévisions.
  6. Tout sauvegarder et fermer le projet.

VI.  Exercice 2

  1. Ouvrir un nouveau projet TESTDIST (dans ex2).
  2. Récupérer les fichiers DISTRIBU.H, DISTRIBU.CPP et TESTDIST.CPP .
  3. Comprendre DISTRIBU.H :
  4. Comprendre et compléter DISTRIBU.CPP :
  5. Comprendre TESTDIST.CPP : on peut difficilement faire plus simple ...
  6. Fabriquer l'exécutable et l'essayer.
  7. Tout sauvegarder et fermer le projet.

VII.  Travail personnel

Il est indispensable que ce travail soit fait AVANT le prochain TP.

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.

VIII.  TESTMONN.CPP

// 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;
  }
 

IX.  TESTDIST.CPP

// TESTDIST.CPP
// Programme de test du Distributeur

#include "distribu.h"

int main()
  {
  Distributeur distri;

  distri.Run();

  return 0;
  }
 

X.  DISTRIBU.H

// 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
 

XI.  DISTRIBU.CPP

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



File translated from TEX by TTH, version 2.75.
On 19 Nov 2001, 14:46.