Exercice POO de base gestion de pharmacie
Rédigé par GC Team, Publié le 17 Août 2010, Mise à jour le Lundi, 06 Juin 2022 17:59
But:
|
Ecrire un programme orienté objets qui permet de gérer une pharmacie | |||
Thème:
|
POO de base | |||
Fichiers:
|
Cet exercice a été donné en série notée une des années précédentes. Il constitue donc un bon entraînement ! Il est de niveau 3 si vous débutez avec la POO mais devrait devenir beaucoup plus accessible dès que les concepts de base sont absorbés.
Écrivez un programme orienté objets qui permet de gérer une pharmacie. La classe principale débute comme suit. Il s'agira de la compléter.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
import java.util.Scanner; class Pharmacie { private static Scanner scanner = new Scanner(System.in); public static void main (String args[]) { Client[] clients = new Client[2]; Medicament[] medicaments = new Medicament[2]; clients[0] = new Client("Malfichu",0.0); clients[1] = new Client("Palichon",0.0); medicaments[0] = new Medicament("Aspiron", 20.40, 5); medicaments[1] = new Medicament("Rhinoplexil",19.15, 5); int choix; do { choix = menu(); switch (choix) { case 1 : achat(clients, medicaments); break; case 2 : approvisionnement(medicaments); break; case 3 : affichage(clients, medicaments); break; case 4: quitter(); } } while (choix < 4); } // Les méthodes utilitaires static int menu() { int choix = 0; System.out.println(); System.out.println(); System.out.println("1 : Achat de médicament"); System.out.println("2 : Approvisionnement en médicaments"); System.out.println("3 : Etats des stocks et des crédits"); System.out.println("4 : Quitter"); while ((choix != 1) && (choix != 2) && (choix != 3) && (choix != 4)) { choix = scanner.nextInt(); } return choix; } // Méthodes auxiliaires à compléter } // Autres classes à compléter |
La pharmacie gère des clients et des médicaments. Un client est caractérisé par un nom et un crédit. Le crédit représente la somme que ce client doit à la pharmacie. Le crédit peut être négatif si le client a versé plus d'argent que le montant. Un médicament est caractérisé par un nom (de type String), un prix (de type double) et un stock (de type int). Les méthodes à compléter auront les caractéristiques suivantes:
- affichage(..) permet d'afficher les clients et leurs crédits respectifs ainsi que les médicaments et leurs stocks respectifs.
- approvisionner(..) permet d'approvisionner le stock d'un médicament. Le nom du médicament à approvisionner ainsi que la quantité à ajouter au stock doivent être lus depuis le terminal. Lorsque le nom du médicament est introduit, il faut vérifier qu'il s'agit bien d'un nom connu dans la liste des médicaments de la pharmacie. Le programme doit boucler jusqu'à introduction d'un nom correct. Cette procédure de vérification sera prise en charge par la méthode lireMedicament(..) décrite plus bas.
-
achat(..) permet de traiter un achat fait par un client. l'achat porte sur un médicament donné dans une quantité donnée. Pour cette transaction le client paie un certain prix. Une opération d'achat aura pour effet de déduire la quantité achetée du stock du médicaments correspondant et d'augmenter le crédit du client (d'un montant équivalent au montant de l'achat moins la somme payée).
Les noms du client et du médicament doivent être lus depuis le terminal. Le programme doit boucler jusqu'à introduction de noms connus aussi bien pour les clients que les médicament. Ces procédures de vérification seront prises en charge par les méthodes lireClient et lireMedicament (voir plus bas). La quantité achetée et le montant payé sont aussi lus depuis le terminal. Ils seront supposés corrects. - quitter(..) affiche le message ``programme terminé!''.
- Vous définirez une méthode auxiliaire lireClient(..) prenant comme paramètre un tableau de clients. Elle permettra de lire le nom d'un client depuis le terminal et de vérifier si ce client existe dans le tableau des clients. Dans ce cas le client sera retourné. Cette méthode doit boucler jusqu'à ce qu'un client soit trouvé. Elle sera utilisée par la méthode achat(..). Une méthode similaire, lireMedicament(..) sera fournie pour les médicaments. Elle sera utilisée par les méthodes achat(..) et approvisionnement(..).
- Vous êtes libre de définir, en plus de ces méthodes, toutes celles que vous jugerez nécessaires.
Lors de la programmation, il vous est demandé de respecter scrupuleusement les indications suivantes:
- Votre programme doit être bien modularisé à la fois sous forme de méthodes auxiliaires de la méthode main() et sous forme de classes pour les objets du programme. En particulier:
- Chaque variable et méthode doit être déclarée dans la classe la plus adaptée.
- Dans chaque classe liée à un objet, il faut utiliser le mot-clé private autant que possible. En particulier, toutes les variables d'instances seront privées.
- Votre programme doit montrer une utilisation judicieuse de tableaux aux endroits adaptés.
- la comparaison de deux chaines s1 et s2 se fera au moyen de la méthode java equals() (s1.equals(s2) retourne true si s1 et s2 sont identiques).
- Vous pouvez utiliser les méthodes scanner.nextInt(),
scanner.nextDouble() et scanner.nextLine().
Exemple d'exécution:
> java Pharmacie 1 : Achat de médicament 2 : Approvisionnement en médicaments 3 : Etats des stocks et des crédits 4 : Quitter 2 Nom du medicament?: Aspiron Donner la Quantité : 2 1 : Achat de médicament 2 : Approvisionnement en médicaments 3 : Etats des stocks et des crédits 4 : Quitter 3 Affichage des stocks Stock du médicament Aspiron :7 Stock du médicament Rhinoplexil :5 Affichage des crédits Crédit du client Malfichu :0.0 Crédit du client Palichon :0.0 1 : Achat de médicament 2 : Approvisionnement en médicaments 3 : Etats des stocks et des crédits 4 : Quitter 1 Nom du client?: Malfichu Nom du medicament?: Aspiron quel est le montant du paiement? 30.0 quelle est la quantité achetée? 3 1 : Achat de médicament 2 : Approvisionnement en médicaments 3 : Etats des stocks et des crédits 4 : Quitter 3 Affichage des stocks Stock du médicament Aspiron :4 Stock du médicament Rhinoplexil :5 Affichage des crédits Crédit du client Malfichu :31.199999999999996 Crédit du client Palichon :0.0 1 : Achat de médicament 2 : Approvisionnement en médicaments 3 : Etats des stocks et des crédits 4 : Quitter 1 Nom du client?: Palichon Nom du medicament?: Aspiron quel est le montant du paiement? 5 quelle est la quantité achetée? 5 Achat Impossible. Quantité insuffisante 1 : Achat de médicament 2 : Approvisionnement en médicaments 3 : Etats des stocks et des crédits 4 : Quitter 3 Affichage des stocks Stock du médicament Aspiron :4 Stock du médicament Rhinoplexil :5 Affichage des crédits Crédit du client Malfichu :31.199999999999996 Crédit du client Palichon :0.0 1 : Achat de médicament 2 : Approvisionnement en médicaments 3 : Etats des stocks et des crédits 4 : Quitter 1 Nom du client?: Palichon Nom du medicament?: Rhinoplexil quel est le montant du paiement? 200 quelle est la quantité achetée? 5 1 : Achat de médicament 2 : Approvisionnement en médicaments 3 : Etats des stocks et des crédits 4 : Quitter 3 Affichage des stocks Stock du médicament Aspiron :4 Stock du médicament Rhinoplexil :0 Affichage des crédits Crédit du client Malfichu :31.199999999999996 Crédit du client Palichon :-104.25 1 : Achat de médicament 2 : Approvisionnement en médicaments 3 : Etats des stocks et des crédits 4 : Quitter 1 Nom du client?: Febril Client inconnu. Veuilliez recommencer Malfichu Nom du medicament?: Placebo Medicament inconnu. Veuilliez recommencer Aspiron quel est le montant du paiement? 2 quelle est la quantité achetée? 1 1 : Achat de médicament 2 : Approvisionnement en médicaments 3 : Etats des stocks et des crédits 4 : Quitter 3 Affichage des stocks Stock du médicament Aspiron :3 Stock du médicament Rhinoplexil :0 Affichage des crédits Crédit du client Malfichu :49.599999999999994 Crédit du client Palichon :-104.25 1 : Achat de médicament 2 : Approvisionnement en médicaments 3 : Etats des stocks et des crédits 4 : Quitter 4 Programme terminé!
Amélioration du code objet
Une pharmacie peut être vue comme une classe d'objets ayant pour attribut un tableau de clients et un tableau de médicaments. Copiez votre programme Pharmacie.java dans un fichier GestionPharmacie.java. Renommer la classe Pharmacie dans
GestionPharmacie.java en Pharmacie1. Déplacez la méthode main() pour la placer dans la classe GestionPharmacie.java. Il vous est demandé de
- Modifier la classe Pharmacie1 de sorte à la doter des attributs sus-mentionnés.
- Transformer les méthodes statiques se rapportant uniquement aux attributs de Pharmacie1 en des méthodes d'instances.
Indication: si vous avez respecté les directives de la première question, les méthodes lireClient() et lireMedicament() par exemple, deviennent des méthodes d'instance de la classe Pharmacie1 - Adapter la méthode main() de la classe GestionPharmacie de manière appropriée.
- Placez les méthodes auxiliaires qui n'ont pu être transformées en méthodes d'instance de Pharmacie1 dans GestionPharmacie.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 |
import java.util.Scanner; class Pharmacie { private static Scanner scanner = new Scanner(System.in); public static void main(String args[]) { Client[] clients = new Client[2]; Medicament[] medicaments = new Medicament[2]; clients[0] = new Client("Malfichu", 0.0); clients[1] = new Client("Palichon", 0.0); medicaments[0] = new Medicament("Aspiron", 20.40, 5); medicaments[1] = new Medicament("Rhinoplexil", 19.15, 5); int choix; do { choix = menu(); switch (choix) { case 1: achat(clients, medicaments); break; case 2: approvisionnement(medicaments); break; case 3: affichage(clients, medicaments); break; case 4: quitter(); } } while (choix < 4); } // Les méthodes utilitaires static int menu() { int choix = 0; System.out.println(); System.out.println(); System.out.println("1 : Achat de médicament"); System.out.println("2 : Approvisionnement en médicaments"); System.out.println("3 : Etats des stocks et des crédits"); System.out.println("4 : Quitter"); while ((choix != 1) && (choix != 2) && (choix != 3) && (choix != 4)) { choix = scanner.nextInt(); } // se debarasser du \n scanner.nextLine(); return choix; } /** * Méthode auxiliaire de main permettant à un client * d'acheter un médicament */ static void achat(Client[] clients, Medicament[] medicaments) { Client client = lireClient(clients); Medicament medicament = lireMedicament(medicaments); double paiement = lirePaiement(); int quantite = lireQuantite(); if (quantite <= medicament.getStock()) { medicament.diminuerStock(quantite); client.augmenterCredit((medicament.getPrix() * quantite) - paiement); } else System.out.println("Achat Impossible. Quantité insuffisante"); } /** * Méthode auxiliaire de main permettant d'augmenter le * stock d'un médicament */ static void approvisionnement(Medicament[] medicaments) { Medicament medicament = lireMedicament(medicaments); System.out.println("Donner la Quantité : "); int quantite = scanner.nextInt(); // se debarasser du \n scanner.nextLine(); medicament.augmenterStock(quantite); } /** * Méthode auxiliaire de main permettant d'afficher les * données stockées dans les tableaux clients et medicaments */ static void affichage(Client[] clients, Medicament[] medicaments) { System.out.println("Affichage des stocks"); for (int i = 0; i < medicaments.length; i++) { System.out.println("Stock du médicament " + medicaments[i].getNom() + " :" + medicaments[i].getStock()); } System.out.println("Affichage des crédits"); for (int i = 0; i < clients.length; i++) { System.out.println("Crédit du client " + clients[i].getNom() + " :" + clients[i].getCredit()); } } /** * Retourne l'objet Client associé à un nom (String) * Le nom est lu et redemandé tant qu'il ne correspond * pas au nom d'un client contenu dans le tableau clients */ static Client lireClient(Client[] clients) { String nom; boolean trouve = false; Client c = null; System.out.println("Nom du client?:"); do { nom = scanner.nextLine(); for (int i = 0; (!trouve && i < clients.length); i++) { if ((clients[i].getNom()).equals(nom)) { trouve = true; c = clients[i]; } } if (!trouve) { System.out.println("Client inconnu. Veuilliez recommencer"); } } while (!trouve); return c; } /** * Retourne l'objet Medicament associé à un nom (String) * Le nom est lu et redemandé tant qu'il ne correspond * pas au nom d'un médicament contenu dans le tableau medicaments */ static Medicament lireMedicament(Medicament[] medicaments) { String nom; boolean trouve = false; Medicament m = null; System.out.println("Nom du medicament?:"); do { nom = scanner.nextLine(); for (int i = 0; (!trouve && i < medicaments.length); i++) { if ((medicaments[i].getNom()).equals(nom)) { trouve = true; m = medicaments[i]; } } if (!trouve) { System.out.println("Medicament inconnu. Veuilliez recommencer"); } } while (!trouve); return m; } static double lirePaiement() { double paiement; System.out.println("quel est le montant du paiement?"); paiement = scanner.nextDouble(); scanner.nextLine(); return paiement; } static int lireQuantite() { int quantite; System.out.println("quelle est la quantité achetée?"); quantite = scanner.nextInt(); scanner.nextLine(); return quantite; } static void quitter() { System.out.println("Programme terminé!"); } } // Les classes d'objets class Client { // Un client est caractérisé par son nom et un crédit. private String nom = ""; private double credit = 0.0; public Client(String nom, double credit) { this.nom = nom; this.credit = credit; } public void augmenterCredit(double montant) { credit = credit + montant; } public void diminuerCredit(double montant) { credit = credit - montant; } public double getCredit() { return credit; } public String getNom() { return nom; } } class Medicament { // un médicament a un nom, un prix et une quantité en stock private String nom; private double prix; private int stock; public Medicament(String nom, double prix, int stock) { this.nom = nom; this.prix = prix; this.stock = stock; } public void augmenterStock(int quantite) { stock = stock + quantite; } public void diminuerStock(int quantite) { stock = stock - quantite; } public int getStock() { return stock; } public double getPrix() { return prix; } public String getNom() { return nom; } } |
Amélioration du code objet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 |
import java.util.Scanner; class GestionPharmacie { protected static Scanner scanner = new Scanner(System.in); /** * Le programme principal crée un objet Pharmacie * sur lequel les opérations suivantes peuvent être effectuées: * - achat (d'un médicament par un client), * - approvisionnement (ajout d'un médicament au stock) * - affichage (des données relatives à la pharmacie */ public static void main(String args[]) { Client[] clients = new Client[2]; Medicament[] medicaments = new Medicament[2]; clients[0] = new Client("Malfichu", 0.0); clients[1] = new Client("Palichon", 0.0); medicaments[0] = new Medicament("Aspiron", 20.40, 5); medicaments[1] = new Medicament("Rhinoplexil", 19.15, 5); Pharmacie1 p = new Pharmacie1(clients, medicaments); int choix; do { choix = menu(); switch (choix) { case 1: p.achat(); break; case 2: p.approvisionnement(); break; case 3: p.affichage(); break; case 4: quitter(); break; } } while (choix < 4); } // Les méthodes utilitaires static int menu() { int choix = 0; System.out.println(); System.out.println(); System.out.println("1 : Achat de médicament"); System.out.println("2 : Approvisionnement en médicaments"); System.out.println("3 : Etats des stocks et des crédits"); System.out.println("4 : Quitter"); while ((choix != 1) && (choix != 2) && (choix != 3) && (choix != 4)) { choix = scanner.nextInt(); } return choix; } static void quitter() { System.out.println("Programme terminé!"); } } // Les classes d'objets class Pharmacie1 { // une pharmacie c'est une liste de client et // une liste de médicaments private Client[] clients;; private Medicament[] medicaments; public Pharmacie1(Client[] cs, Medicament[] ms) { clients = cs; medicaments = ms; } public Client[] getClients() { return this.clients; } public Medicament[] getMedicaments() { return this.medicaments; } /** * Permet à un client d'acheter un médicament. * si le client est connu de la pharmacie, son crédit * va diminuer en fonction de son paiement. * Le stock associé au médicament va diminuer */ public void achat() { Client client = this.lireClient(); Medicament medicament = this.lireMedicament(); double paiement = lirePaiement(); int quantite = lireQuantite(); if (quantite <= medicament.getStock()) { medicament.diminuerStock(quantite); client.augmenterCredit((medicament.getPrix() * quantite) - paiement); } else { System.out.println("Achat Impossible. Quantité insuffisante"); } } /** * Permet à la pharmacie de s'approvisionner en un * médicament connu. */ public void approvisionnement() { Medicament medicament = this.lireMedicament(); System.out.println("Donner la Quantité : "); int quantite = GestionPharmacie.scanner.nextInt(); medicament.augmenterStock(quantite); } /** * Affichage des stocks et des crédits de la pharmacie */ public void affichage() { System.out.println("Affichage des stocks"); for (int i = 0; i < medicaments.length; i++) { System.out.println("Stock du médicament " + medicaments[i].getNom() + " :" + medicaments[i].getStock()); } System.out.println("Affichage des crédits"); for (int i = 0; i < clients.length; i++) { System.out.println("Crédit du client " + clients[i].getNom() + " :" + clients[i].getCredit()); } } /** * Retourne l'objet Client associé à un nom (String) * Le nom est lu et redemandé tant qu'il ne correspond * pas au nom d'un client connu de la pharmacie */ public Client lireClient() { String nom; boolean trouve = false; Client c = null; System.out.println("Nom du client?:"); do { nom = GestionPharmacie.scanner.nextLine(); for (int i = 0; (!trouve && i < clients.length); i++) { if ((clients[i].getNom()).equals(nom)) { trouve = true; c = clients[i]; } } if (!trouve) { System.out.println("Client inconnu. Veuilliez recommencer"); } } while (!trouve); return c; } /** * Retourne l'objet Medicament associé à un nom (String) * Le nom est lu et redemandé tant qu'il ne correspond * pas au nom d'un médicament connu de la pharmacie */ public Medicament lireMedicament() { String nom; boolean trouve = false; Medicament m = null; System.out.println("Nom du medicament?:"); do { nom = GestionPharmacie.scanner.nextLine(); for (int i = 0; (!trouve && i < medicaments.length); i++) { if ((medicaments[i].getNom()).equals(nom)) { trouve = true; m = medicaments[i]; } } if (!trouve) { System.out.println("Médicament inconnu. Veuilliez recommencer"); } } while (!trouve); return m; } static double lirePaiement() { System.out.println("quel est le montant du paiement?"); return GestionPharmacie.scanner.nextDouble(); } static int lireQuantite() { System.out.println("quelle est la quantité achetée?"); return GestionPharmacie.scanner.nextInt(); } } class Client { // Un client est caractérisé par son nom et un crédit. private String nom = ""; private double credit = 0.0; public Client(String nom, double credit) { this.nom = nom; this.credit = credit; } public void augmenterCredit(double montant) { credit = credit + montant; } public void diminuerCredit(double montant) { credit = credit - montant; } public double getCredit() { return credit; } public String getNom() { return nom; } } class Medicament { // un médicament a un nom, un prix et une quantité en stock private String nom; private double prix; private int stock; public Medicament(String nom, double prix, int stock) { this.nom = nom; this.prix = prix; this.stock = stock; } public void augmenterStock(int quantite) { stock = stock + quantite; } public void diminuerStock(int quantite) { stock = stock - quantite; } public int getStock() { return stock; } public double getPrix() { return prix; } public String getNom() { return nom; } } |