Exercice POO de base gestion de pharmacie

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.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253import 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 Pharmacie1 : Achat de médicament2 : Approvisionnement en médicaments3 : Etats des stocks et des crédits4 : Quitter2Nom du medicament?:AspironDonner la Quantité :21 : Achat de médicament2 : Approvisionnement en médicaments3 : Etats des stocks et des crédits4 : Quitter3Affichage des stocksStock du médicament Aspiron :7Stock du médicament Rhinoplexil :5Affichage des créditsCrédit du client Malfichu :0.0Crédit du client Palichon :0.01 : Achat de médicament2 : Approvisionnement en médicaments3 : Etats des stocks et des crédits4 : Quitter1Nom du client?:MalfichuNom du medicament?:Aspironquel est le montant du paiement?30.0quelle est la quantité achetée?31 : Achat de médicament2 : Approvisionnement en médicaments3 : Etats des stocks et des crédits4 : Quitter3Affichage des stocksStock du médicament Aspiron :4Stock du médicament Rhinoplexil :5Affichage des créditsCrédit du client Malfichu :31.199999999999996Crédit du client Palichon :0.01 : Achat de médicament2 : Approvisionnement en médicaments3 : Etats des stocks et des crédits4 : Quitter1Nom du client?:PalichonNom du medicament?:Aspironquel est le montant du paiement?5quelle est la quantité achetée?5Achat Impossible. Quantité insuffisante1 : Achat de médicament2 : Approvisionnement en médicaments3 : Etats des stocks et des crédits4 : Quitter3Affichage des stocksStock du médicament Aspiron :4Stock du médicament Rhinoplexil :5Affichage des créditsCrédit du client Malfichu :31.199999999999996Crédit du client Palichon :0.01 : Achat de médicament2 : Approvisionnement en médicaments3 : Etats des stocks et des crédits4 : Quitter1Nom du client?:PalichonNom du medicament?:Rhinoplexilquel est le montant du paiement?200quelle est la quantité achetée?5 1 : Achat de médicament2 : Approvisionnement en médicaments3 : Etats des stocks et des crédits4 : Quitter3Affichage des stocksStock du médicament Aspiron :4Stock du médicament Rhinoplexil :0Affichage des créditsCrédit du client Malfichu :31.199999999999996Crédit du client Palichon :-104.25 1 : Achat de médicament2 : Approvisionnement en médicaments3 : Etats des stocks et des crédits4 : Quitter1Nom du client?:FebrilClient inconnu. Veuilliez recommencer MalfichuNom du medicament?:PlaceboMedicament inconnu. Veuilliez recommencer Aspironquel est le montant du paiement?2quelle est la quantité achetée?1 1 : Achat de médicament2 : Approvisionnement en médicaments3 : Etats des stocks et des crédits4 : Quitter3Affichage des stocksStock du médicament Aspiron :3Stock du médicament Rhinoplexil :0Affichage des créditsCrédit du client Malfichu :49.599999999999994Crédit du client Palichon :-104.25 1 : Achat de médicament2 : Approvisionnement en médicaments3 : Etats des stocks et des crédits4 : Quitter4Programme 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

  1. Modifier la classe Pharmacie1 de sorte à la doter des attributs sus-mentionnés.
  2. 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
  3. Adapter la méthode main() de la classe GestionPharmacie de manière appropriée.
  4. Placez les méthodes auxiliaires qui n'ont pu être transformées en méthodes d'instance de Pharmacie1 dans GestionPharmacie.
Fichiers:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238import 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'objetsclass 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:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264import 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'objetsclass 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; }}
Article publié le 17 Août 2010 Mise à jour le Lundi, 06 Juin 2022 17:59 par Salim KHALIL