Pour ce premier tp, l'unique produit considéré sera du type char. On utilisera le type elem pour faciliter les modifications ultérieures. Dans les TP suivants, il faudra gérer des stocks de produits (boissons) et ensuite également de pièces. La gestion d'erreur est plutôt "sale", mais le système des exceptions sera utilisé par la suite.
Le fichier STOCK.H contenant les déclarations est fourni dans le
répertoire
E:\TS2\PROF\BUREAUD\POO\TP1.
Le fichier TESTSTOC.INC contenant le programme de test (main) est également
fourni.
Recopiez ces deux fichiers sur un répertoire de C: .
Vous devez créer le fichier STOCK.CPP
qui implémente toutes les fonctions déclarées dans STOCK.H.
File/New, Files/C++ Source File, Location:, File Name:, OK.
Lisez le sujet jusqu'au bout, puis reprenez les questions dans l'ordre.
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 un répertoire TP1 sur votre compte, dans lequel vous recopierez tous les fichiers sources à la fin du TP.
Les deux tableaux sont "parallèles" car ils ont le même nombre de cases utilisées, et le nombre présent dans la case i de quantites correspond à la quantité du produit dont l'adresse est dans la case i de rails (voir dessin ci-dessous).
La variable index représente le nombre de sortes de produits présentes dans le stock, c'est-à-dire le nombre de cases occupées dans chacun des tableaux rails et quantites. Mais il est intéressant de constater que la variable index représente aussi le numéro de la première case libre de chacun des deux tableaux (voir dessin ci-dessous).
index rails indices quantites
+-----+ +-------+ +-------+ +-------+
| 2 | | 'U' |<-------+---* | 0 | 4 |
+-----+ +-------+ +-------+ +-------+
+---+---* | 1 | 10 |
+-------+ | +-------+ +-------+
| 'D' |<---+ | ? | 2 | ? |
+-------+ +-------+ +-------+
| ? | 3 | ? |
+-------+ +-------+
| ? | 4 | ? |
+-------+ +-------+
Situation obtenue après le programme de test fourni (voir TESTSTOC.INC).
nb sortes = 0
sortes, unite's(0), plein(0) = 1, 4, 0
sortes, unite's(1), plein(1) = 2, 10, 1
vide(0,1),limite = 0, 0, 0
retirer ERR = 2
vide(0,1),limite = 1, 0, 1
// TESTSTOC.INC
// Programme de test de Stock (a` inclure)
// sera transforme' en .CPP lors du deuxie`me TP
#include <iostream.h>
int main()
{
int err;
char * p;
init_stock();
cout << "nb sortes = " << nb_sortes() << endl;
p = new char( 'U' );
if ((err=stocker( p, 4 )) != OK)
cout << "stocker ERR = " << err << endl;
if (*p != 'U')
cout << "Probleme dans: stocker" << endl;
cout << "sortes, unite's(0), plein(0) = " << nb_sortes() << ", "
<< nb_unites( 0 ) << ", " << est_plein( 0 ) << endl;
p = new char( 'D' );
if ((err=stocker( p, 10 )) != OK)
cout << "stocker ERR = " << err << endl;
if (*p != 'D')
cout << "Probleme dans: stocker" << endl;
cout << "sortes, unite's(1), plein(1) = " << nb_sortes() << ", "
<< nb_unites( 1 ) << ", " << est_plein( 1 ) << endl;
if ( nb_unites(-1) != ERR_INTERVALLE ||
nb_unites( 2) != ERR_INTERVALLE )
cout << "methode nb_unites incorrecte." << endl;
if (p != ieme( 1 ) || (int)ieme(-1) != ERR_INTERVALLE
|| (int)ieme( 2) != ERR_INTERVALLE)
cout << "methode ieme incorrecte." << endl;
if ( est_vide(-1) != ERR_INTERVALLE ||
est_vide( 2) != ERR_INTERVALLE )
cout << "methode est_vide incorrecte." << endl;
if ( est_plein(-1) != ERR_INTERVALLE ||
est_plein( 2) != ERR_INTERVALLE )
cout << "methode est_plein incorrecte." << endl;
if ( retirer(-1) != ERR_INTERVALLE || retirer( 2) != ERR_INTERVALLE )
cout << "methode retirer incorrecte." << endl;
cout << "vide(0,1),limite = " << est_vide( 0 ) << ", "
<< est_vide( 1 ) << ", " << est_limite() << endl;
for ( int i=0; i<4+1; i++ )
if ((err=retirer( 0 )) != OK)
cout << "retirer ERR = " << err << endl;
cout << "vide(0,1),limite = " << est_vide( 0 ) << ", "
<< est_vide( 1 ) << ", " << est_limite() << endl;
return 0;
} // main
// STOCK.H // De'claration des fonctions de Stock typedef char elem; // seulement pour le premier TP // Constantes const int FAUX = 0; const int VRAI = 1; const int MAX_SORTES = 5; const int MAX_QUANTITE = 10; const int ERR_INCONNU = -2; const int ERR_INTERVALLE = -1; const int OK = 0; const int ERR_PLEIN = 1; const int ERR_VIDE = 2; const int ERR_DEP = 3; // Initialiseur void init_stock(); // Accesseurs int nb_sortes(); int nb_unites( int ); elem* ieme( int ); // Fonctions d'e'tat int est_vide( int ); int est_plein( int ); int est_limite(); // Autres fonctions int stocker( elem*, int ); int retirer( int ); int traite_vide( int ); // Fonction utilitaire int rechercher( elem* ); // Donne'es int index; int quantites[MAX_SORTES]; elem* rails[MAX_SORTES];