C++ : Details du Projet
C++ : Détails du projet
Groupe ESIEE, Denis BUREAU, janvier 2002.
Attention !
Le sujet peut être modifié jusqu'à la veille du TP.
Finalisation du projet "Distributeur"
1 Stock
- est_limite() est virtuelle pure.
- Les tableaux sont du type générique Tabdyn .
2 Stock_pieces
- est_limite() se déclenche à partir d'un seuil
inversement proportionnel à la valeur de la pièce,
par exemple : 0 pour la plus grosse, puis 1 ...
3 Monnayeur
- Créer une fonction Run() en récupérant le traitement
qui était auparavant dans le distributeur ;
un nouveau problème survient, car le monnayeur veut appeler une
fonction du distributeur.
- Créer un attribut et deux méthodes pour établir la connexion
du monnayeur vers le distributeur
(mémorisation + accès).
4 Distributeur
- Run() ne doit plus faire le travail du monnayeur, mais
simplement appeler monnayeur.Run() quand on tape
'M' .
- Doit donc appeler la méthode qui permet au monnayeur de se
connecter.
5 Tabdyn
- Classe générique implémentant un tableau alloué
dynamiquement.
- Des contrôles sont faits sur l'indice par l'opérateur [] .
- Une fonction agrandit() permet d'augmenter la taille du
tableau (en préservant les informations existantes, évidemment).
Trouver une utilisation de cette fonction quelquepart dans le projet.
6 Exceptions
- Traiter au moins les exceptions suggérées au précédent TP
(indices et taille dans Tabdyn, numéros et dépassements
dans Stock, etc ...).
- Stocker des informations dans les objets "exception" et
prévoir une fonction message() pour afficher ces données.
- En général, ne pas récupérer l'exception dans la fonction
où elle est déclenchée, car cela n'apporte rien par rapport
à un test classique et on ne sait généralement pas quoi
faire dans le cas général (c'est-à-dire pour tout appel de
cette fonction).
- Déclarer les exceptions dans les entêtes.
Attention !
Visual C++ ne respecte pas le standard ANSI dans ce domaine
et refuse les spécifications d'exception dans les entêtes de
fonctions ; il faut donc les mettre en commentaires pour
pouvoir compiler.
unexpected().
7 Interface Homme-Machine
- Il est possible de simuler une véritable IHM textuelle à l'aide
des fichiers .H et .CPP :
MESLABEL, MESBOUT, et MAJAUGE
fournis dans E:\TS2\PROF\BUREAUD\POO\PROJET\IHMdos .
- imaginer que les indications entre [ ] sont des afficheurs
lumineux qu'il faut mettre à jour à chaque évènement.
- lorsque la pièce ou le produit est choisi (en tapant un
caractère), appeler la fonction Clicke() du bouton
correspondant.
- Il est également possible de réaliser une IHM graphique si
l'ensemble du projet reste compilable et exécutable sur les
PC des salles "banalisées". Toutefois, il vaut mieux une IHM
textuelle et un programme qui fonctionne bien, plutôt qu'une
IHM graphique et un programme qui ne fonctionne pas parfaitement.
- Respecter la séparation de l'ihm et des classes de l'application.
- Utiliser des TabDyn pour stocker des tableaux de boutons
ou des tableaux de jauges.
- Les exemples fournis dans
IHMdos pour l'interface textuelle précédemment décrite,
dans IHMdsg pour une version DOS semi-graphique, et
les exemples d'interfaces graphiques sont donnés à titre
purement récréatif, et ne constituent en aucun cas des
"modèles".
8 Avant de rendre le projet
- Tester extensivement en vérifiant la cohérence des affichages.
- Vérifier également la cohérence du comportement lorsqu'il n'y
a plus de produit ou de pièces; prévoir les erreurs de
l'utilisateur.
- Parfaire l'écriture du code dans chacun des fichiers.
- Regrouper dans un seul répertoire tous les .H et
les .CPP utiles, ainsi que le .EXE
(supprimer les éventuels .BAK, .OBJ, DEBUG,
etc... ).
- Y joindre un fichier RAPPORT.TXT décrivant succintement le
projet, les fichiers, les limitations et/ou extensions et/ou
particularités de votre implémentation, notamment le système
d'exceptions et son test, ainsi que l'IHM
(un fichier RAPPORT.DOC est également accepté).
9 Autres contraintes
- Le programme doit compiler et tourner sur les PC de l'école;
une autre version, éventuellement graphique, peut être
développée dans un autre environnement,
mais ne comptera pas dans l'évaluation.
- La coopération entre projets est possible
à condition de ne pas reprendre intégralement des
morceaux de code des autres. Le fait que des corrigés aient
été distribués au fur et à mesure ne permet pas aux
versions finales de deux projets d'avoir des parties identiques,
compte tenu notamment de l'IHM et du système d'exception.
- En cas de doute sur ce qu'il faut faire, ou en cas de problème,
il vaut mieux poser une question
(éventuellement par mail) AVANT la date limite,
plutôt que de prendre une mauvaise décision.
Après la date limite, il sera trop tard.
10 Aide à l'utilisation de la librairie IHM textuelle
LabelFlag::LabelFlag( char * message_vrai, char * message_faux );
déclare un afficheur à deux états;
le 1er argument est le message à afficher quand le booléen est vrai,
le 2ème argument est le message à afficher quand le booléen est faux.
LabelFlag::AfficheValeur( int nouvelle_valeur );
stocke la nouvelle valeur dans le booléen et affiche le bon message.
LabelFloat::LabelFloat( char * affichage_initial, char * format );
déclare un afficheur de nombre réel;
le 1er argument est le message à afficher à la création;
le 2ème argument est le format d'affichage pour les fois suivantes.
LabelFloat::AfficheValeur( float nouvelle_valeur );
stocke la nouvelle valeur et l'affiche.
TJaugeSep::TJaugeSep( int valeur_max, int valeur_init, char * nom );
déclare une jauge à valeur entière;
le 1er argument est la valeur maximum possible;
le 2ème argument est la valeur initiale;
le 3ème argument est le nom de la jauge.
TJaugeSep::Plus();
ajoute 1 et réaffiche la jauge.
TJaugeSep::Moins();
retranche 1 et réaffiche la jauge.
BoutonProduit::BoutonProduit( Distributeur * D, int numero_produit, char * texte );
déclare un bouton pour demander un produit;
le 1er argument est un pointeur sur le distributeur;
le 2ème argument est le numéro du produit;
le 3ème argument est l'étiquette du bouton.
BoutonProduit::Clicke();
est la fonction à appeler lorsqu'on clicke sur un bouton-produit;
appelle demande_produit().
BoutonPiece::BoutonPiece( Monnayeur * M, float valeur_piece, char * texte );
déclare un bouton pour introduire une pièce;
le 1er argument est un pointeur sur le monnayeur;
le 2ème argument est la valeur de la pièce;
le 3ème argument est l'étiquette du bouton.
BoutonPiece::Clicke();
est la fonction à appeler lorsqu'on clicke sur un bouton-pièce;
appelle recevoir() et éventuellement delivre_produit().
BoutonAnnul::BoutonAnnul( Monnayeur * M, char * texte );
déclare un bouton d'annulation;
le 1er argument est un pointeur sur le monnayeur;
le 2ème argument est l'étiquette du bouton.
BoutonAnnul::Clicke();
est la fonction à appeler lorsqu'on clicke sur le bouton d'annulation;
appelle annulation().
File translated from
TEX
by
TTH,
version 2.75.
On 8 Jan 2002, 19:41.