Universit´e de Versailles IUT de V´elizy - Algorithmique
Vanessa Vitse 2007/2008
- TP n˚9 Mod´ elisation d’un complexe cin´ ematographique (d’apr` es un TP de Philippe Genoud)
Pr´ esentation du probl` eme On souhaite dans ce TP identifier et d´efinir les caract´eristiques d’une classe mod´elisant la gestion de billeterie des diff´erentes salles d’un complexe cin´ematographique. Les places de chacune des salles sont non num´erot´ees et peuvent ˆetre vendues selon deux tarifs : – le tarif normal qui d´epend du film repr´esent´e et de la qualit´e de salle (capacit´e, sonorisation ...), – le tarif r´eduit (pour les familles nombreuses, chˆomeurs et ´etudiants) qui offre 20% de r´eduction par rapport au plein tarif. Lors de chacune des s´eances, un certain nombre de places `a tarif normal ou r´eduit seront vendues ; ces chiffres devront ˆetre pris en compte pour la comptabilit´e et l’´evaluation du chiffre d’affaires du complexe.
Sp´ ecification de classes Apr`es analyse du probl`eme, il est d´ecid´e de repr´esenter les salles de cinema par des objets Java instances d’une classe SalleCinema. Un objet SalleCinema est caract´eris´e par 5 attributs (encore appel´es variables d’instance) : – l’attribut film de type String qui repr´esente le titre du film jou´e dans la salle, – l’attribut nbPlaces de type int qui d´enombre le nombre de places de la salle, – l’attribut prixTN de type double qui repr´esente le prix d’une place au tarif normal, – l’attribut npvTNormal de type int qui d´enombre le nombre de places vendues au tarif normal, – l’attribut npvTReduit de type int qui d´enombre le nombre de places vendues au tarif r´eduit. Les valeurs des trois attributs film, nbPlaces et prixTN sont fix´ees lors de la cr´eation d’un nouvel objet SalleCinema ; elles seront donc pass´ees en param`etres au constructeur de la classe. Les valeurs des attributs npvTNormal et npvTReduit peuvent par contre varier ; on les initialisera `a 0 lors de la cr´eation du nouvel objet SalleCinema. Pour acc´eder aux valeurs de ces attributs ou pour les modifier depuis un autre programme, on utilisera les m´ethodes ayant les signatures suivantes : – public int nbPlacesDisponibles() qui calcule et renvoie le nombre de places encore disponibles dans la salle, – public void vendrePlaces(int nbre, boolean tarifReduit) qui permet de vendre des billets pour la salle. Le nombre de places demand´e est pass´e dans le param`etre nbre
–
–
– –
et le bool´een tarifReduit indique si un tarif r´eduit s’applique (valeur du bool´een mise `a true) ou pas (valeur du bool´een mise `a false) pour ces places. Dans le cas particulier o` u le nombre de places demand´e serait sup´erieur au nombre de places encore disponibles, la vente n’est pas effectu´ee et la m´ethode affiche dans le terminal un message d’erreur pr´ecisant que la vente ne peut avoir lieu. Sinon les attributs npvTNormal et npvTReduit correspondant au nombre de places vendues `a tarif normal ou `a tarif r´eduit sont mis `a jour (selon la valeur du param`etre tarifReduit) et le prix `a payer est affich´e. public void remiseAZero() qui permet lorsque la vente de billets pour une s´eance est termin´ee de remettre `a 0 les compteurs npvTNormal et npvTReduit de nombre de places vendues, en vue de la vente de billets pour la prochaine s´eance public double chiffreAffaires() qui retourne le chiffre d’affaires produit par la salle pour la s´eance en cours (total des ventes depuis la cr´eation de l’objet SalleCinema ou la derni`ere remise `a z´ero du nombre de places vendues) public int tauxRemplissage() qui retourne le taux de remplissage de la salle sous la forme d’un pourcentage public String toString() qui retourne une repr´esentation sous forme d’une chaˆıne de caract`eres de l’objet SalleCinema. Cette chaˆıne indique la valeur de chacun des attributs de l’objet (le titre du film, le nombre de places de la salle, le nombre de places vendues `a tarif normal, le nombre de places vendues `a tarif r´eduit, le prix de la place). Par exemple, pour une salle de 60 places jouant le film L’Enfant dont 20 places ont ´et´e vendues au tarif normal (de 9, 5 e) et 14 places ont ´et´e vendues au tarif r´eduit l’affichage de la chaˆıne retourn´ee par toString pourrait ˆetre le suivant : Film jou´ e : L’enfant ; Nombre de places : 60 ; Prix d’une place : 9.5 e(tarif normal) 7.6 e(tarif r´ eduit) ; 20 places vendues au tarif normal ; 14 places vendues au tarif r´ eduit.
Exercices Exercice 1. Ouvrir le fichier SalleCinema.java et compl´eter le code Java, en respectant scrupuleusement les sp´ecifications donn´ees ci-dessus. Compiler-le. Une m´ethode suppl´ementaire permettant d’arrondir un nombre de type double avec deux chiffres apr`es la virgule pourra ˆetre utile pour un affichage convenable du prix des places ou du taux de remplissage d’une salle.
Exercice 2. Pourquoi la d´eclaration des attributs est-elle pr´efix´ee par le mot cl´e private, alors que celle des m´ethodes est pr´efix´ee par le mot cl´e public ? Expliquer l’utilit´e du mot cl´e this dans le constructeur.
Exercice 3. Ecrire dans un fichier nomm´e TestCinema.java un programme simple de test pour la classe SalleCinema. 2
Ce programme doit cr´eer deux salles correspondant aux informations d´efinies dans la table ci-dessous. Titre Nombre de places Prix de la place au tarif normal Les bronz´es 2 120 8, 5e La dolce vita 50 7, 5e Deux places `a tarif normal puis trois places `a tarif r´eduit doivent ˆetre achet´ees pour la premi`ere salle. Pour la deuxi`eme salle trois places `a tarif normal puis six places `a tarif r´eduit doivent ˆetre ensuite achet´ees. Finalement les attributs des deux salles doivent ˆetre affich´ees ainsi que le nombre de places encore disponibles et le chiffre d’affaires produit par chacune des deux salles. Cette classe pour ˆetre ex´ecutable devra imp´erativement poss´eder une m´ethode main.
Exercice 4. Afin que les autres programmeurs Java puissent profiter du code de votre nouvelle classe SalleCinema, vous allez g´en´erer une page Html de documentation dont le look and feel sera calqu´e sur celui de la documentation de l’API Java. Un outil tr`es pratique appel´e javadoc permet de produire une telle documentation de fa¸con automatique. Pour cr´eer tous les fichiers de documentation d’une classe, on utilise javadoc comme suit : javadoc -d
Le fichier principal de documentation est index.html cr´e´e dans le r´epertoire de destination. Cr´eer une page de documentation pour l’utilisation de votre classe dans un sous-r´epertoire du r´epertoire courant que vous nommerez Doc.
Exercice 5. javadoc peut interpr´eter des commentaires sp´ecifiques introduits dans le code source pour enrichir la documentation g´en´er´ee. Ces commentaires se situent juste avant la d´eclaration d’une classe, d’un attribut ou d’une m´ethode. Ils commencent par /** et se terminent par */. Ces commentaires contiennent une partie textuelle libre et des tags interpr´et´es pour certains commentaires sp´ecifiques. Quelques tags fr´equemment utilis´es – @author : l’auteur d’une classe – @version : le numero de version d’une classe – @param x : Une description du param`etre d’entr´ee x d’une m´ethode – @return : Une description de la valeur renvoy´ee par une m´ethode Exemple de classe comment´ee pour javadoc : /** * Cette classe est utilis´ ee pour repr´ esenter un mulot. * * @author Vanessa Vitse */ public class Mulot { /**
3
* Le nom du mulot */ private String nom; /** * La couleur du mulot */ private Color couleur ; /** * La position du mulot : posX repr´ esente l’abcisse et posY l’ordonn´ ee */ private int posX,posY ; /** * Le constructeur de la classe Mulot * * @param n Le nom du mulot * @param c La couleur du mulot * @param pX L’abcsisse de la position du mulot * @param pY L’ordonn´ ee de la position du mulot */ public Mulot(String n, Color c, int pX, int pY) { nom = n; couleur = c; posX = pX; posY = pY; } /** * Cette m´ ethode renvoie une cha^ ıne de caract` eres qui d´ ecrit * textuellement le mulot (par son nom, sa couleur et sa position) * * @return Une cha^ ıne de caract` ere d´ ecrivant le mulot */ public String toString() { String chaine; chaine = "Nom : "+nom+"\n"+ "couleur : "+couleur +"\n"+ "position : ("+posX +" , "+posY+")\n"; return chaine; } }
La commande suivante permet alors de g´en´erer dans le r´epertoire Doc une documentation prenant en compte les diff´erents tags introduits : javadoc -d Doc -author -private ExempleJavadoc.java
Ajoutez des commentaires et des tags pour que votre classe SalleCinema soit correctement document´ee. La page Html devra ressembler `a la page SalleCinema.html qui vous est donn´ee `a titre d’exemple.
Exercice 6. Utilisation de la classe SalleCinema Ecrire un programme de billeterie permettant d’enregistrer les entr´ees effectu´ees dans les 4
diff´erentes salles, de calculer et d’afficher le taux d’occupation (exprim´e sous la forme d’un pourcentage) et le chiffre d’affaires produit par chaque salle lorsque la vente des billets pour la s´eance est termin´ee. Le programme de billeterie est lanc´e au d´ebut de la mise en vente des billets pour la prochaine s´eance de projection. Chaque salle est identifi´ee par un num´ero unique (les num´eros allant de 1 `a n, n ´etant le nombre total de salles). Lorsqu’un client se pr´esente, le guichetier tape le num´ero de la salle pour lequel le client d´esire des billets. Le programme affiche alors les diff´erents attributs de la salle s´electionn´ee (le titre du film, le nombre de places de la salle, le nombre de places vendues...). Le guichetier fournit ensuite au programme le nombre de places que le client d´esire acheter en indiquant ´egalement si le client b´en´eficie ou non d’une r´eduction. Si la demande du client peut ˆetre satisfaite le programme affiche le prix `a payer sinon il affiche un message indiquant que le nombre de places demand´e est incorrect. Lorsque la vente des billets est termin´ee, le programme affiche alors pour chaque salle son ´etat (la valeur des ses attributs), son taux d’occupation et le chiffre d’affaires produit. Le programme calcule aussi le chiffre d’affaires total et l’affiche. La structure du programme pourra ˆetre la suivante : cr´ eation des objets SalleCinema venteTermin´ ee un boolean initialis´ e ` a false tantque (! venteTermin´ ee) lire un numero de salle si le num´ ero de la salle est correct { afficher les informations de la salle lire nb le nombre de places a ` acheter demander si r´ eduction ou non vendre pour la salle s´ electionn´ e les nb places demand´ ees demander ` a l’op´ erateur si il veut poursuivre ou non la vente selon la r´ eponse mettre ` a jour venteTermin´ ee } sinon afficher un message d’erreur "num´ ero de salle incorrect" fintantque calculer et afficher pour chaque salle le taux de remplissage et le chiffre d’affaire produit afficher le chiffre d’affaire total
Pour stocker les salles on pourra utiliser un tableau de type SalleCinema[].
5