# ATELIER PROFESSIONNEL DELPHI [OCT-NOV 2003] --- SUJET D'EXERCICE # # JOUR 2 : TYPES DE DONNEES UTILISATEUR, STRUCTURES DE CONTROLES, ROUTINES # Référez-vous au support de cours pour la référence de syntaxe, etc. --> jour02-aide.txt ---------------------------------------------------------------------------- MODALITES DE RENDU ---------------------------------------------------------------------------- - Répertoire : ~/rendu/ap/delphi/jour02 -- ATTENTION aux minuscules !!! - Fichiers : Hotel.dpr, Hotel.res, Hotel.cfg, Hotel.dof --> NE RENDEZ PAS les fichiers .exe, .dcu, .~* et .dsk - Droits : 700 pour les répertoires, 600 pour les fichiers - Date : mercredi 15/10/2003 à 08:30 ---------------------------------------------------------------------------- Etape 1 - La chambre de base ---------------------------------------------------------------------------- - Créez un programme nommé Hotel dans votre U:\rendu\ap\delphi\jour02... - Définissez les types suivants : - Enumération TBedSize. Valeurs (dans cet ordre) : bsSingle, bsDouble, bsKing, bsQueen - Enumération TRoomOption. Valeurs (idem) : roTV, roMiniBar, roJacuzzi, roDryCleaning, roMassage, roEscort - Ensemble TRoomOptions, basé sur TRoomOption. - Enregistrement TRoom. Champs : - Id (entier) - Booked (booléen. indique si la chambre est utilisée/réservée) - CustomerName (chaîne. Nom du client) - Floor (entier. Etage) - BedSize (TBedSize) - Options (TRoomOptions) - Ecrivez une procédure InitRoom, qui prend une chambre en paramètre global (de façon à pouvoir en modifier les champs) nommée Room. Cette procédure demande à l'utilisateur de rentrer les informations pour la chambre (sauf le numéro, dont on ne s'occupe pas pour l'instant). La saisie se fait comme ceci (Entrée après chaque saisie, la syntaxe utilisée ci-dessous est celle des regex) : Question Réponses possibles ------------------------------------------------------------------- Booked: (y|n) Customer's name: le nom du client, rien si pas réservé Floor: [0-14] Bed size: (s|d|k|q) Has TV: (y|n) Has Mini-Bar: (y|n) Has Jacuzzi: (y|n) Has Dry-cleaning: (y|n) Has Massage: (y|n) Has Escort: (y|n) - Ajoutez le corps principal du programme pour qu'il ait une variable Room de type TRoom, initialise son Id à 42 et appelle InitRoom dessus. - Ecrivez une procédure DisplayRoom qui prend une chambre en paramètre par référence constante, et l'affiche comme suit (ex.) : Room #42 on floor 4 - Booked by TDD Has a Single Bed Has a TV, a Mini-Bar and a Jacuzzi. L'ensemble de l'affichage est bien sûr dynamique. Si la chambre n'est pas Booked, la 1ère ligne se termine par "Available". Les noms des types de lits sont dans un tableau constant global BED_SIZE_NAMES de string. Les chaînes valent, respectivement, 'Single', 'Double', 'King-Size' et 'Queen-Size'. Les noms des options sont dans un tableau constant global OPTION_NAMES, dont les éléments sont des string, que vous aurez déclaré et initialisé au niveau global. Les valeurs sont bien sûr celles mentionnées plus haut : 'TV', 'Mini-Bar', 'Jacuzzi', 'Dry-cleaning', 'Massage' et 'Escort'. La procédure boucle sur les valeurs possibles pour l'énumération et affiche les options dynamiquement. La liste des options affiche 'a ' avant chaque option, sauf la dernière, qui est préfixée par 'and a '. Si aucune option n'est présente (Options = []), on affiche 'no option' après le 'Has ' de départ. - Modifiez InitRoom pour que la partie des options soit dynamique, en fonction des valeurs possibles pour TRoomOption et des noms de OPTION_NAMES. ---------------------------------------------------------------------------- Etape 2 - Passage à l'hôtel ---------------------------------------------------------------------------- - Définissez un type THotel qui est un tableau de 142 TRoom, numérotées de 1 à 142. La borne supérieure est une constante ROOM_COUNT déclarée avant et qui doit être utilisée au lieu de "142" partout dans le code. - Remplacez la variable globale Room par une variable TheHotel de type THotel, et créez une procédure InitHotel qui prend en paramètre global (référence modifiable) un hôtel. Cette procédure initialise toutes les chambres de l'hôtel comme ceci : - Id : celui du rang de la chambre dans l'hôtel (1-ROOM_COUNT) - Booked : non - CustomerName : (vide) - Floor : défini d'après le numéro : chambres 1-10 au RdC, 11-20 au 1er, etc. - BedSize : la procédure cycle sur les possibilités : la chambre 1 a un Single, la 2 un Double, la 3 un King, la 4 un Queen, la 5 un Single... - Options : toutes les chambres ont au minimum la TV et un mini-bar. Elles ont en plus, au hasard, les autres options (chacune est tirée au hasard indépendemment, et vous devez explorer la liste des options possibles dynamiquement !). Modifiez votre programme principal pour qu'il passe la variable globale TheHotel à InitHotel puis affiche la 1ère chambre. ---------------------------------------------------------------------------- Etape 3 - Obtention de chambre libre ---------------------------------------------------------------------------- - Ecrivez une fonction GetFirstAvailableRoomId qui prend un hôtel en paramètre local (référence constante) et cherche la première chambre libre dans cet hôtel. Il renvoie 0 (zéro) s'il n'en trouve aucune, ou le n° de la chambre s'il en trouve une. - Votre programme principal doit devenir une boucle qui affiche toujours le menu suivant : -------------------------- HOTEL MANAGEMENT INTERFACE -------------------------- I - Check in D - Display room info O - Check out S - Stats R - Reset hotel U - Update room info Q - Quit -------------------------- L'utilisateur tape alors la lettre choisie, suivie de la touche Entrée. Votre programme ne fait pas la différence MAJ/min pour cette saisie. Si la touche est invalide, bouclez directement sur le réaffichage du menu. Sinon, effectuez le traitement indiqué ci-dessous (vous écrirez les procédures mentionnées ensuite) : - I : appelez la procédure CheckIn en lui passant l'hôtel - O : appelez la fonction GetRoomId pour obtenir le n° de chambre à libérer, puis appelez CheckOut avec la chambre concernée. - D : appelez la fonction GetRoomId pour obtenir le n° de chambre à afficher, puis appelez DisplayRoom avec la chambre concernée. - S : appelez la procédure ShowStats en lui passant l'hôtel - R : appelez la procédure InitHotel en lui passant l'hôtel - U : appelez la fonction GetRoomId pour obtenir le n° de chambre à modifier, puis appelez InitRoom avec la chambre concernée. - Q : sortez de la boucle A part Q, les autres options laissent la boucle itérer après exécution, affichant donc à nouveau le menu et attendant la saisie suivante. ---------------------------------------------------------------------------- Etape 4 - Routines supplémentaires ---------------------------------------------------------------------------- - Ecrivez GetRoomId, qui affiche une invite "Room#: " et permet à l'utilisateur de saisir un numéro de chambre, en validant que ce numéro est un entier entre 1 et ROOM_COUNT. Elle répète son invite tant qu'elle n'obtient pas un numéro valide. - Ecrivez CheckIn, qui prend un hôtel en paramètre global. Elle commence par une boucle qui affiche la question : First available room (F) or manual pick (P)? _ et saisit la réponse de l'utilisateur (on ignore MAJ/min), jusqu'à ce que cette réponse soit valide. Dans le 1er cas, on appelle GetFirstAvailableRoomId. Si elle renvoie zéro, on affiche "No available room. Sorry." et on sort de la procédure. Sinon, on va traiter la chambre. Dans le 2nd cas, on appelle GetRoomId en boucle jusqu'à obtenir un numéro de chambre libre. Quand le numéro saisi n'est pas libre, on affiche "This room is not available." et on revient à la question initiale ci-dessus. Une fois un numéro valide de chambre libre obtenu, on affiche : Room#: le_numéro_ici Customer's name: _ Et on saisit le nom du client. On met à jour les champs Booked et CustomerName de la chambre concernée dans l'hôtel. - Ecrivez CheckOut, qui prend une chambre en paramètre global. Elle réinitialise simplement les champs Booked et CustomerName. - Ecrivez ShowStats, qui prend un hôtel en paramètre local (référence constante) et affiche les statistiques sur cet hôtel au format suivant : Room count: 142 Available room count: 48 (33.8%) Amount of Jacuzzis: 57 (40.1%) Amount of Massages: 18 (12.7%) Amount of Escorts: 11 (7.7%) L'affichage du pourcentage doit être arrondi à une décimale (voyez la fonction standard Format et déterminez la bonne chaîne de format...). La liste des options est évidemment dynamique : toutes sauf TV et Mini-Bar, qui sont communes à toutes les chambres. Soyez malins : n'utilisez qu'une seule boucle pour déterminer toutes les statistiques, en incrémentant au fur et à mesure les différents compteurs. ---------------------------------------------------------------------------- Bilan - Les routines que vous êtes censés avoir au final ---------------------------------------------------------------------------- - CheckIn - CheckOut - DisplayRoom - GetFirstAvailableRoomId - GetRoomId - InitHotel - InitRoom - ShowStats Et votre programme principal, qui est principalement une boucle... BON COURAGE !!! -- Fin de Sujet --