/* 20 Fevrier 2K - v1.01 M.Lokbani modifications .... 15 Fevrier 2K - v1.00 Mohamed Lokbani & xv lokbani@iro.umontreal.ca UdM, IFT1166 -TP2- Session Hiver 2K avec le code de depart de xv, remis a jour pour accepter la classe C++ string, + ajout de qcqs fonctionnalites: test de disponibilite ou non, de produits dans le distributeur de boissons nombre de pieces de monnaie, Entree/Sortie avec ses fonctions de flush pour eviter les ennuies. Bugs: Faire attention, certaines declarations ne passeront pas la compilation sous vc++ (static const). Et d'autres c'est a l'execution que ca cassera, getline par exemple. Par ailleurs, un retour chariot sous DOS equivaut a deux caracteres de controle sous Unix (Linux). Le getline de ce programme ira ds un comma profond (boucle infinie) si vous tentez d'utiliser un fichier de simulation autre que le mien, cree sous Windows/DOS. Conclusion: g++ comme d'habitude, et meme si vous l'avez sur un pc, manipuler le fichier de simulation, si vous vez envi de l'ouvrir et changer des donnees, sous une console Unix (Linux). programme de test: je vous ai donne le source code du programme de test et non pas le fichier binaire, pour vous aiguiller un peu ainsi vous permettre de suivre les echanges d'operations possibles entre un consommateur et le distributeur de boissons. Le but n'est pas donc de comprendre toutes les commandes utilisees dans ce programme (je pense par exemple a ifstream etc.), mais uniquement les commandes interessantes pour ce tp (je pense par exemple a l'utilisation des fonctions insertPiece, ajoutProduit etc.). fonctionnement: On lit a partir du fichier simulation.dat une serie de donnees, organisees en deux categories: -1- Chargement du distributeur de boissons: nom du produit -1- prix du produit -1- quantite disponible du produit -1- dans le distributeur de boissons nom du produit -2- prix du produit -2- quantite disponible du produit -2- dans le distributeur de boissons END <======== signifie la fin de liste des produits disponibles dans le distributeur -2- Selection d'un produit par un consommateur Les symboles utilises sont: P pour piece entree dans le distributeur S pour selection d'un produit du distributeur de boissons E pour ejecter la somme d'argent entree dans le distributeur F fin des operations, pour signifier fin de fichier de simulation.dat Un consommateur se presente devant la machine de distributeur de boissons: Il entre les pieces une a une, Il effectue sa selection, le distributeur retourne sa selection ou sort avec l'un de message decrit dans db.h ainsi de suite jusqu'a la fin du fichier, representee par la lettre F. Le resultat de l'echange entre des consommateurs et le distributeur de boissons est donne dans le fichier sortie.dat */ #include #include #include #include #include "db.h" int main() { Distributeur boissons; // un distributeur string nom = "\0"; // nom du produit string end = "END"; // test de fin de lecture char commande = '\0'; // caractere de la commande int piece; // le montant int lequel; // le produit selectionne int prix; // son prix int nbre; // la quantite // lecture des donnes de simulation a partir d'un fichier ifstream in("simulation.dat"); // test d'ouverture ... en cas d'erreur on quitte le programme if(!in.is_open()){ cerr << "erreur a l'ouverture du fichier de donnees: simulation.dat\n"; exit(1); } // on lit la premiere ligne, normalement le nom du produit getline(in,nom) ; // on boucle a l'infini .... while (1){ // on lit le prix du produit in >> prix; // REMARQUE -1- // on fait un peu le menage retirer les caracteres inutiles // se trouvant sur la derniere ligne lue // necessaire car on lit un int, et s'il y avait des blancs // ou retour a la ligne apres le int, ils restent toujours disponibles // dans le buffer. On les efface donc de ce buffer. in.ignore(80,'\n'); // on lit la quantite disponible in >> nbre; // voir: REMARQUE -1- in.ignore(80,'\n'); // on ajoute le produit dans la liste de produits boissons.ajoutProduit(Produit(nom,prix,nbre)); // (re)belote, on lit le nom du produit getline(in,nom) ; // le test de sortie de cette boucle infinie, si on rencontre // le mot "END" on sort sinon .... l'infini semble etre eternel! if (nom.compare(end,0,3)==0) break; } // on vidange le flux de sortie, pour se debarasser de tous les caracteres qui se trouveraient // encore dans ce flux ... // flushhhhhh cout.flush(); // on affiche la liste de produits boissons.afficheProduits(); cout << endl << endl; // on lit notre selection a partir du fichier de simulation in >> commande; while ( commande != 'F'){ // F c'est pour FIN du programme! switch (commande){ case 'P': // on entre des pieces ... in >> piece; boissons.insertPiece(piece); break; case 'S': // on selectionne un produit, zut y a pas ma boisson preferee :-( in >> lequel; boissons.achatProduit(lequel); cout << endl; break; case 'E': // on a change d'avis => ejecte! Je veux mon argent! boissons.piecesRetournees(); // voila ton argent! Pourvu qu'il n'y est pas de bugs .... cout << endl; break; default: // on s'est melange les doigts! Pas bien reveille .... cout << "Commande Inconnue ....\n"; } // voir REMARQUE -1- in.ignore(80, '\n'); // (re)belote, prochaine selection ... in >> commande; } // avant de quitter on ferme notre fichier simulation.dat // a double tour .... click click click click! in.close(); // tout va bien! return 0; }