---------------------------------------------------------------------------- Subject: [IFT1166] mise a jour -TP2- Date: Fri, 10 Mar 2000 17:55:07 -0500 Bonjour, 3 remarques .... Remarque -1- j'ai eu des echos sur les problemes rencontres pour obtenir "exactement" l'affichage suivant: 0. Coke 65 1. Diet Coke 65 2. Pepsi 50 3. Diet Pepsi 65 4. Sprit 50 5. Diet Sprit 50 si vous etes arrives a le faire, sautez cette remarque, sinon lisez ce qui suit: affichez le contenu du distributeur sous cette forme la et c'est ok! 0. Coke 65 1. Diet Coke 65 2. Pepsi 50 3. Diet Pepsi 65 4. Sprit 50 5. Diet Sprit 50 donc 3 champs: index_sur_le_produit. nom_du_produit prix_du_produit les 3 champs separes par des espaces blancs (un espace entre les champs suffit). pour le premier champ mettre . (point) apres le numero. 0. 1. 2. etc. Remarque -2- dans la classe distributeur: class Distributeur { private: int nProduits_; // nbre de produits }; si vous avez dans votre distributeur que: 0. Coke 65 1. Diet Coke 65 2. Pepsi 50 nProduit = 3; (Coke, Diet Coke et Pepsi) donc nProduits_ fait reference au nombre d'articles qu'il y a dans le distributeur Remarque -3- Dans l'enonce du tp2: 5.2. compilation globale ------------------------ Une fois les 3 fichiers compilés, liez-les ensemble avec la commande: g++ -Wall -o Tdb db.cpp monnaie.cpp produit.cpp testprg.cpp où Tdb est le nom du programme exécutable (vous pouvez choisir un autre nom). ++++++++ bien sur il s'agissait de prgtest.cpp et non pas du fichier testprg.cpp la ligne correcte est: g++ -Wall -o Tdb db.cpp monnaie.cpp produit.cpp prgtest.cpp Mohamed Lokbani. ---------------------------------------------------------------------------- Subject: [IFT1166] Q/R TP2 -4- Date: Wed, 01 Mar 2000 21:08:35 -0500 Bonjour, svp, lire attentivement la reponse 1.a de la question -1-, elle s'adresse a tout le monde question -1- ------------- >>concernant le tp2, est-ce qu'on doit définir un constructeur de recopie >>et un destructeur pour la classe Distributeur, même si ce n'est pas inclus >>dans les contraintes ? a- NE PAS TOUCHER AUX CONTENUS DES FICHIERS *.h si vous voulez les modifier pour que qu'ils compilent sur votre pc libre a vous de le faire, mais lors de la remise il faut que vos programmes compilent sur phobos/deimos, en utilisant d'une part le compilateur g++ d'autre part les *.h ORIGINAUX (ceux fournis pour ce tp). vous devez remettre que *.cpp qui seront compiles avec les *.h fournis. Si vous tentez de modifier les *.h c'est un ratage complet au niveau de la compilation. b- pour ta question .... un constructeur de recopie: pas besoin pour plusieurs raisons, dont: tu ne vas copier une machine distributrice de boissons dans une autre! Physiquement ce n'est pas faisable! Pour les autres raisons voir ce qui suit .... question dans la question .... destructeur: qu'en penses-tu! as-tu besoin d'un destructeur? si oui: pourquoi? sinon: pourquoi? question -2- ------------- >>j'ai une question concernant une fonction de la classe Monnaie. >>Monnaie(int) : elle prend un entier en paramètre puis le représante sous >>forme >> (2$-1$-50c-25c-10c-5c-1c) >>Ma question: pourquoi dans cet ordre? Si je consulte le code de >>«sortie.dat» on n'utilise >>pas ce format(ordre) de présentation des données. >>Est-ce un erreur? Est-ce utile dans notre programme? non ce n'est pas une erreur! Si tu relis ce que tu as ecrit toi-meme dans ta question ... >>Monnaie(int) : elle prend un entier en paramètre c'est l'entree .... >>«sortie.dat» c'est la sortie! Si je te donne 155 cents, tu ne vas pas me representer les 155 cents en pieces de 1c!! Tu representes la somme 155 cents de la piece la plus forte vers la piece la plus faible, et quand tu affiches le resultat, tu vas l'afficher de la piece la plus faible vers la piece la plus forte. 155 cents se transforme en : 1 piece de 1$, 1 piece de 50c et 1 piece de 5c. Si tu approchais le probleme comme tu l'as pense, je me serai retrouve avec 155 pieces de 1c!!! Et puis en sortie, j'afficherai: 1 CinqCents 1 CinquanteCents 1 UnDollar retournee(s). vois-tu la nuance? question -3- ------------- >> je me pose la question suivante : dans la fonction >>"Distributeur::ajoutProduit(const Produit& p)" >> comment puis-je ajouter le nom du produit (p.nom) au tableau de >>pointeur Produit* selections_[Maxproduit] >>j'ai bien essayé par toute sorte de moyen de faire : >>"selections_[0].nom_ = p.nom" >>mais il n'y a rien qui marche.. le compilateur dit qu'il y a une >>différence entre Produit* et Produit ... sur ce je suis plutot perdu.. divises le probleme en petits problemes ... comment dois-tu ecrire la fonction f de l'exemple suivant: class A { char* ptr; public: A() {}; // je ne fais rien f(char * = ""); //fonction quelconque pour initialiser ptr }; int main() { A x; x.f("test"); return 0; } -etape 2- maintenant ptr est un tableau de pointeurs. comment tu dois ecrire f dans ce cas. -etape 3- transformation: f devient ajoutProduit ; A -> db et char* -> Produit. comment tu dois ecrire ajoutProduit. passes me voir, aux horaires habituelles de reception, si tu ne t'en sors toujours pas de ces histoires de tableaux de pointeurs. Mohamed Lokbani. ---------------------------------------------------------------------------- Subject: [IFT1166] Q/R TP2 -3- Date: Tue, 29 Feb 2000 20:27:24 -0500 Bonjour, question -1- >>pour la methode Monnaie operator+(const Monnaie& M) dans la class Monnaie, >>si on a: >>Monnaie A,B; >>A.operator+(B); >>--> retounne A = A+B; ???? >> ou C = A+B; ???? >>je veux dire si A sera modifie ou il faut le garder telquel en creant >>un Monnaie C qui est la somme de A & B ??? si j'ecris C = A+B, cela se transforme en C++ comme suit: C.operator+(type& A,type& B); par contre: si j'ecris A+=B, cela se transforme en C++ comme suit: A.operator+(type& B). voir le cours & la demo#6 >>meme question pour Monnaie operator-(const Monnaie&) idem que precedemmment! question -2- >>J'ai une question a propos du tp2: >>L'operateur setw() ne semble vouloir affecter les variables de type >>string i.e. lorsque je fais, par exemple, >>cout << stew(5) << nom (de type sting) << "test"; >>il affiche: >>nom test >>et je veux >> nomtest >>Pouvez-vous resoudre ce probleme ? hummmm ..... nom contient : string nom = "cuicuic"; et je veux afficher nom puis "test". cuicuic test cuicuictest pour obtenir ce resultat j'ai du utiliser entre autre: setw(10) j'imagine que tu veux avoir les 2 blancs avant "cuicuic" (2nd cas), c'est ca? si oui, voir une petite astuce que j'ai utilise sur un probleme similaire dans la demo #1. Tu la reprends et tu la cuisines un peu i.e. elle demande un petit "bricolage" pour la faire fonctionner sur des strings. si au bout de qcqs bricolages tu t'en sors pas, tu appelles a l'aide en m'envoyant avec ton appel SOS ce que tu as bricole comme code. question -3- >>D'autre part, existe-t-il un fonction de type strlen pour les variables de >>type string ? (pour utiliser strlen je dois faire un type cast). regardes dans un livre C++, la section "classe string" tu dois trouver tous les details a ce sujet. Pour cette fois-ci je reponds a ta question: si s est du type string alors sa taille est determinee par: s.length(); Mohamed Lokbani. ------------------------------------------------------------------- Subject: [IFT1166] Q/R TP2 -2- Date: Tue, 29 Feb 2000 15:13:54 -0500 Bonjour, >> Dans le fichier "db.h", la fonction "achatProduit(int)" est declaree >>comme retournant un objet de type Monnaie. Pourtant, l'appel qui est fait >>dans le main() du fichier "prgtest.cpp" (cf. switch, case 'S'), est: >>boisson.achatProduit(lequel); >>Cela n'est pas coherent. La methode achatProduit ne doit-elle pas etre du >>type void? >>le meme commentaire vaut aussi pour la methode >>Monnaie Distributeur::piecesRetournees(); Dans l'exemple que j'ai donne je n'avais pas besoin d'utiliser le retour de certaines fonctions. Ceci ecrit, il serait possible que le retour soit necessaire dans certaines operations, pour cela, qu'il est preferable de prevoir a l'avance "tous" les cas d'utilisation d'une classe. Car des que cette classe est livree, on ne peut plus intervenir directement dessus. Au concepteur d'un programme donne utilisant ce *.h (et les *.cpp) de "jouer" avec les fonctions fournies tant que la specification fournie (*.h) est respectee. Dans le cas : achatProduit(int) on retourne par VALEUR un objet du type Monnaie. donc qu'on utilise (a condition de respecter le type de retour de la fonction) ou qu'on n'utilise pas le retour de fonction y a pas de danger. Un retour par VALEUR va disparaitre dans la nature sans causer de problemes au niveau de l'allocation memoire, qu'on utilise la valeur retournee ou pas. Question: "achatProduit" et "piecesRetournees" doivent retourner par VALEUR un objet de type Monnaie, de point de vue pratique, ces deux fonctions retournent quoi au juste? Le nom des fonctions, et les commentaires associes peuvent vous aider a trouver la reponse a cette question. Mohamed Lokbani. ------------------------------------------------------------------- Subject: [IFT1166] TP2 - Mise a jour db.h Date: Sat, 26 Feb 2000 19:23:22 -0500 Bonjour, J'ai remis a jour le fichier "db.h", quelques changements au niveau des commentaires. Pour plus de details, voir la section mise a jour du fichier "db.h". Mohamed Lokbani. ------------------------------------------------------------------- Subject: [IFT1166] Q/R TP2 -1- Date: Thu, 24 Feb 2000 19:56:16 -0500 Bonjour, avant de repondre a une question posee pas un des etudiants a propos du tp2, je reproduis dans cet email, les remarques que j'ai mentionnees durant le cours d'hier soir: la fonction "pieceRejetees" sert uniquement a retourner les pieces, si le consommateur a change d'avis et ne veut plus obtenir une boisson du distributeur. C'est l'equivalent de la fonction "eject". Cette fonction ("pieceRejetees") est differente de la fonction qui sert a retourner la monnaie apres que le consommateur est obtenu le produit qu'il a selectionne. pour la question ..... -------------- >>Concernant la classe monnaie du TP2. La classe contient le membre pieces_[7], >>est-ce que ce membre est sensé représenter le nombre de chaque type de piece. >>EX : Si la classe contient : 3 pieces de UnCent, 2 de DixCent et 8 de >>UnDollar est-ce que pieces_ aura les valeurs suivantes: >> pieces_[0] = 3 // UnCent >> pieces_[1] = 0 // CinqCent >> pieces_[2] = 2 // DixCent >> pieces_[3] = 0 // VingtCinqCent >> pieces_[4] = 0 // CinquanteCent >> pieces_[5] = 8 // UnDollar >> pieces_[6] = 0 // DeuxDollar -------------- pris de monnaie.h ..... ~~~~~~~ * Cette somme d'argent est representee par des pieces. Les pieces en circulation au Canada * sont au nombre de 7, voir : http://www.rcmint.ca/products/fr/Main.cfm?Area=Products&Section_Id=2 * * UnCent, CinqCents, DixCents, VingtCinqCents, CinquanteCentes, UnDollar, DeuxDollars static const int nbre_pieces = 7; // nombre de pieces int pieces_[nbre_pieces]; // tableau pour contenir le montant en pieces. ~~~~~~~ pour ta question la reponse, pour la representation que tu viens de choisir peu importe! Tu peux faire comme tu l'a mentionne dans ton email, comme tu peux mettre DeuxDollars en [0] et UnCent en [6]. Tu dois juste faire attention au fait que tu as 7 pieces, et que ces 7 pieces sont stockees dans le tableau pieces_. Maintenant comment les repartir dans ton tableau, a toi de choisir une representation qui te convient le mieux, tant que les *.h fournis dans la description soient respectes. au passage, faits attention au nom attribue a chaque piece. Mohamed Lokbani.