Vous êtes sur la page 1sur 37

Introduction la programmation

oriente objet (en Java)


Exercices supplmentaires
Semaine 2 : Classes et objets (avec constructeurs)
Cercles et triangles revisits Cherchez l'erreur Pharmacie

Semaine 2 : Classes et objets (avec


constructeurs)
Exercice 4 : cercles et triangles revisits (niveau 1)
Corrigez les exercices 1 et 3 de la semaine1 en remplaant les mthodes d'initialisation ad hoc par des
constructeurs.

Vous ne garderez comme mthodes publiques que celles utiles au fonctionnement du programme principal fourni
dans les corrigs.

Exercice 2 : cherchez l'erreur (niveau 1)


Le code donn ci-dessous contient les dclarations de deux classes _

La classe Erreurs contient une mthode main et sert dmarrer le


programme.

La classe Score sert reprsenter des scores dans le programme sous


forme d'objets dots de deux variables d'instance (attributs) : l'anne
d'obtention du score et le nombre de points marqus. Il y a galement une
mthode d'instance afficher que l'on peut appliquer sur un objet de
type Score afin d'afficher les valeurs de ses variables d'instance.

1. Eclipse vous signale des messages d'erreurs propos de ce programme.


Pourquoi? Corrigez-les.
2. L'affichage lors de l'excution montre que la variable d'instance points a la
valeur 0 pour les deux scores mme si l'on a envoy une autre valeur la
mthode constructeur. Pourquoi? Corrigez le programme.

Exemple d'excution du programme (aprs correction):

Objet de type Score avec variables d'instance annee = 2009 et points = 2

Objet de type Score avec variables d'instance annee = 2010 et points = 4

Code donn:

class Erreurs {

public static void main(String[] args) {

Score s1 = new Score(2009, 2);

s1.afficher();

Score s2 = new Score(2010, 4);

s2.afficher();

class Score {

private int annee;

private int points;

private Score(int a, int points) {

annee = a;

points = points;

private void afficher() {

System.out.println(

"Objet de type Score avec variables d'instance annee = " +


annee + " et points = " + points);

Exercice 3: Pharmacie (POO de base, Niveau 2)


Ecrivez un programme orient objets qui permet de grer une pharmacie. La classe principale dbute comme suit. Il
s'agira de la complter.

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 = 0;

while (choix < 4) {

choix = menu();

switch (choix) {
case 1 :

achat(clients, medicaments);

break;

case 2 :

approvisionnement(medicaments);

break;

case 3 :

affichage(clients, medicaments);

break;

case 4:

quitter();

break;

default :

// On reste dans la boucle.

// C'est redondant avec le test dans la mthode menu()

// mais c'est un bon rflexe de grer tous les cas dans un

// switch-case.

choix = 0;

// Les mthodes utilitaires

static int menu() {

int choix = 0;

System.out.println();

System.out.println();

System.out.println("1 : Achat de medicament");

System.out.println("2 : Approvisionnement en medicaments");

System.out.println("3 : Etats des stocks et des credits");

System.out.println("4 : Quitter");

while ((choix != 1) && (choix != 2) && (choix != 3) && (choix != 4)) {


choix = scanner.nextInt();

return choix;

// Mthodes auxiliaires complter

// Autres classes complter

La pharmacie gre des clients et des mdicaments. Un client est caractris par un nom et un crdit. Le crdit
reprsente la somme que ce client doit la pharmacie. Le crdit peut tre ngatif si le client a vers plus d'argent
que le montant. Un mdicament est caractris par un nom (de type String ), un prix (de type double ) et un stock
(de type int ). Les mthodes complter auront les caractristiques suivantes:

affichage(..) permet d'afficher les clients et leurs crdits respectifs ainsi

que les mdicaments et leurs stocks respectifs.

approvisionnement(..) permet d'approvisionner le stock d'un mdicament.

Le nom du mdicament approvisionner ainsi que la quantit ajouter au


stock doivent tre lus depuis le terminal. Lorsque le nom du mdicament
est introduit, il faut vrifier qu'il s'agit bien d'un nom connu dans la liste des
mdicaments de la pharmacie. Le programme doit boucler jusqu'
introduction d'un nom correct. Cette procdure de vrification sera prise en
charge par la mthode lireMedicament(..) dcrite plus bas.

achat(..) permet de traiter un achat fait par un client. l'achat porte sur un

mdicament donn dans une quantit donne. Pour cette transaction le


client paie un certain prix. Une opration d'achat aura pour effet de dduire
la quantit achete du stock du mdicaments correspondant et
d'augmenter le crdit du client (d'un montant quivalent au montant de
l'achat moins la somme paye).
Les noms du client et du mdicament doivent tre lus depuis le terminal.
Le programme doit boucler jusqu' introduction de noms connus aussi bien
pour les clients que les mdicament. Ces procdures de vrification seront
prises en charge par les mthodes lireClient et lireMedicament (voir plus
bas). La quantit achete et le montant pay sont aussi lus depuis le
terminal. Ils seront supposs corrects.
quitter(..) affiche le message "programme termin!".

Vous dfinirez une mthode auxiliaire lireClient(..) prenant comme


paramtre un tableau de clients. Elle permettra de lire le nom d'un client
depuis le terminal et de vrifier si ce client existe dans le tableau des
clients. Dans ce cas le client sera retourn. Cette mthode doit boucler
jusqu' ce qu'un client soit trouv. Elle sera utilise par la
mthode achat(..) . Une mthode similaire, lireMedicament(..) sera fournie
pour les mdicaments. Elle sera utilise par les
mthodes achat(..) et approvisionnement(..) .

Vous tes libre de dfinir, en plus de ces mthodes, toutes celles que vous
jugerez ncessaires.

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


mthodes auxiliaires de la mthode main() et sous forme de classes pour
les objets du programme. En particulier:

o Chaque variable et mthode doit tre dclare dans la classe la plus


adapte.

o Dans chaque classe lie un objet, il faut utiliser le mot-


cl private autant que possible. En particulier, toutes les variables
d'instances seront prives.

o Votre programme doit montrer une utilisation judicieuse de tableaux


aux endroits adapts.

o la comparaison de deux chaines s1 et s2 se fera au moyen de la


mthode java equals() ( s1.equals(s2) retourne true si s1 et s2 sont
identiques).

Vous pouvez utiliser les


mthodes scanner.nextInt() , scanner.nextDouble() et scanner.nextLine() .

Exemple d'excution:
> java Pharmacie

1 : Achat de medicament

2 : Approvisionnement en medicaments

3 : Etats des stocks et des credits

4 : Quitter

Nom du medicament?:

Aspiron

Donner la Quantite :

1 : Achat de medicament

2 : Approvisionnement en medicaments

3 : Etats des stocks et des credits

4 : Quitter

Affichage des stocks

Stock du medicament Aspiron :7

Stock du medicament Rhinoplexil :5

Affichage des credits

Credit du client Malfichu :0.0

Credit du client Palichon :0.0

1 : Achat de medicament

2 : Approvisionnement en medicaments

3 : Etats des stocks et des credits


4 : Quitter

Nom du client?:

Malfichu

Nom du medicament?:

Aspiron

quel est le montant du paiement?

30.0

quelle est la quantite achetee?

1 : Achat de medicament

2 : Approvisionnement en medicaments

3 : Etats des stocks et des credits

4 : Quitter

Affichage des stocks

Stock du medicament Aspiron :4

Stock du medicament Rhinoplexil :5

Affichage des credits

Credit du client Malfichu :31.199999999999996

Credit du client Palichon :0.0

1 : Achat de medicament

2 : Approvisionnement en medicaments

3 : Etats des stocks et des credits

4 : Quitter

Nom du client?:

Palichon
Nom du medicament?:

Aspiron

quel est le montant du paiement?

quelle est la quantite achetee?

Achat Impossible. Quantite insuffisante

1 : Achat de medicament

2 : Approvisionnement en medicaments

3 : Etats des stocks et des credits

4 : Quitter

Affichage des stocks

Stock du medicament Aspiron :4

Stock du medicament Rhinoplexil :5

Affichage des credits

Credit du client Malfichu :31.199999999999996

Credit du client Palichon :0.0

1 : Achat de medicament

2 : Approvisionnement en medicaments

3 : Etats des stocks et des credits

4 : Quitter

Nom du client?:

Palichon

Nom du medicament?:

Rhinoplexil

quel est le montant du paiement?


200

quelle est la quantite achetee?

1 : Achat de medicament

2 : Approvisionnement en medicaments

3 : Etats des stocks et des credits

4 : Quitter

Affichage des stocks

Stock du medicament Aspiron :4

Stock du medicament Rhinoplexil :0

Affichage des credits

Credit du client Malfichu :31.199999999999996

Credit du client Palichon :-104.25

1 : Achat de medicament

2 : Approvisionnement en medicaments

3 : Etats des stocks et des credits

4 : Quitter

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 quantite achetee?

1 : Achat de medicament

2 : Approvisionnement en medicaments

3 : Etats des stocks et des credits

4 : Quitter

Affichage des stocks

Stock du medicament Aspiron :3

Stock du medicament Rhinoplexil :0

Affichage des credits

Credit du client Malfichu :49.599999999999994

Credit du client Palichon :-104.25

1 : Achat de medicament

2 : Approvisionnement en medicaments

3 : Etats des stocks et des credits

4 : Quitter

Programme termine!

Amlioration du code objet


Une pharmacie peut tre vue comme une classe d'objets ayant pour attribut un tableau de clients et un tableau de
mdicaments. Copiez votre programmePharmacie.java dans un fichier GestionPharmacie.java. Renommer la
classe Pharmacie dans
GestionPharmacie.java en Pharmacie1 . Dplacez la mthode 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-
mentionns.

2. Transformer les mthodes statiques se rapportant uniquement aux attributs


de Pharmacie1 en des mthodes d'instances.
Indication: si vous avez respect les directives de la premire question,
les mthodes lireClient() et lireMedicament() par exemple, deviennent
des mthodes d'instance de la classe Pharmacie1

3. Adapter la mthode main() de la classe GestionPharmacie de manire


approprie.

4. Placez les mthodes auxiliaires qui n'ont pu tre transformes en


mthodes d'instance de Pharmacie1 dans GestionPharmacie .

Corrigs des exercices supplmentaires

Semaine 2 : Classes et objets (avec constructeurs)

Cercles et triangles revisits Cherchez l'erreur Pharmacie

Les corrigs proposs correspondent l'ordre des apprentissages : chaque corrig correspond la solution
laquelle vous pourriez aboutir au moyen des connaissances acquises jusqu' la semaine correspondante.

Cercles et triangles revisits


Exercice 1 revisit
class TestCercle

/**

* Programme principal testant les fonctionnalits de la classe Cercle

*/

public static void main(String[] args)

Cercle c1 = new Cercle(1.0, 2.0, Math.sqrt(5.0)); // passe par (0, 0)


Cercle c2 = new Cercle(-2.0, 1.0, 2.25); // 2.25 > sqrt(5) => inclus le point
(0, 0)

Cercle c3 = new Cercle(-2.0, -5.0, 1.0);

System.out.println("Surface de c1 : " + c1.surface());

System.out.println("Surface de c2 : " + c2.surface());

System.out.println("Surface de c3 : " + c3.surface());

afficherPosition("c1", c1, 0.0, 0.0);

afficherPosition("c2", c2, 0.0, 0.0);

afficherPosition("c3", c3, 0.0, 0.0);

/* Mthode utilitaire affichant si un point est en dehors ou en dedans

* d'un cercle donn

* @param c : le cercle

* @param x, y: les coordonnes du point

* @paramm nom : le nom donn au cercle pour l'affichage

*/

static void afficherPosition(String nom, Cercle c, double x, double y)

System.out.print("Position du point (" + x + ", " + y + ") : ");

if (c.estInterieur(x,y))

System.out.print("dans ");

else

System.out.print("hors de ");

System.out.println(nom);
}

/* Classe Cercle

*/

class Cercle {

private double rayon;

// on pourrait aussi programmer

// une classe Position pour les coordonnes:

private double x; // abscisse du centre

private double y; // ordonne du centre

//avec constructeur!

Cercle(double x, double y, double r) {

// on pourrait faire encore mieux en programmant

// une classe Position pour les coordonnes

this.x = x;

this.y = y;

if (r < 0.0) r = 0.0;

rayon = r;

// calcul de la surface du cercle

public double surface() { return Math.PI * rayon * rayon; }

/* mthode testant la position d'un point par rapport au cercle

* @return : true si le point de coordonnes unX et unY est

* dans le cercle

*/
public boolean estInterieur(double unX, double unY) {

return (((unX-x) * (unX-x) +

(unY-y) * (unY-y))

<= rayon * rayon);

Exercice 3 revisit
class Geometrie {

/**

* Le programme principal se content de construire un

* triangle, d'afficher son primtre et d'afficher

* s'il est isocle ou non.

*/

private static Scanner scanner = new Scanner(System.in);

public static void main(String[] args) {

Triangle t = new Triangle(lirePoint(), lirePoint(), lirePoint());

double perimetre = t.calculerPerimetre();

System.out.println("Perimetre : " + perimetre);

boolean isocele = t.testerIsocele();

if (isocele)

System.out.println("Le triangle est isocele");

else

System.out.println("Le triangle nst pas isocele");

// une mthode auxiliaire de main

static Point lirePoint() {

double x = 0;

double y = 0;

System.out.println("Construction d'un nouveau point");


System.out.print(" Veuillez entrer x : ");

x = scanner.nextDouble();

System.out.print(" Veuillez entrer y : ");

y = scanner.nextDouble();

return (new Point(x,y));

class Triangle {

private Point p1, p2, p3;

private double longueur1, longueur2, longueur3;

/**

* Le constructeur d'un Triangle fait appel

* au constructeur de Point. Ce dernier lit les

* coordonnes depuis le terminal.

*/

public Triangle(Point point1, Point point2, Point point3) {

// Construction de trois points:

p1 = point1;

p2 = point2;

p3 = point3;

// Les distances sont calcules et stockes dans des variables

// d'instance. Les mthodes calculerPerimetre et testerIsocele

// peuvent ainsi accder aux valeurs prcalcules et nous vitons

// de les recalculer plusieurs fois.

longueur1 = p1.calculerDistance(p2);

longueur2 = p2.calculerDistance(p3);

longueur3 = p3.calculerDistance(p1);

}
/**

* Calcul du perimtre de l'instance courante (this).

* @return le perimetre sous la forme d'un double

*/

public double calculerPerimetre() {

return (longueur1 + longueur2 + longueur3);

/**

* Teste si l'instance courante (this) est un triangle isocle

* @return true si le triangle est isocle et false sinon

*/

public boolean testerIsocele() {

return (longueur1 == longueur2

|| longueur2 == longueur3

|| longueur3 == longueur1);

class Point {

private double x, y;

public Point(double x, double y) {

this.x = x;

this.y = y;

public double getX() {


return x;

public double getY() {

return y;

/**

* Calcule la distance entre this et un point p

* @param p un Point par rapport auquel on calcule la distance

* @return la distance de this p

*/

public double calculerDistance(Point p) {

// Calcule la distance entre deux points. Le premier point est

// l'objet actuel (this). Le deuxime point (p) est envoy en

// paramtre.

double x1 = this.x;

double y1 = this.y;

double x2 = p.getX();

double y2 = p.getY();

double xdiff = x1 - x2;

double ydiff = y1 - y2;

double somme = xdiff * xdiff + ydiff * ydiff;

double distance = Math.sqrt(somme);

return distance;

}
Les getters/setters inutiles ont disparu !

Cherchez l'erreur
1. Le programmeur a trop utilis le mot-cl private au point que l'on ne peut mme pas accder la mthode
constructeur depuis l'extrieur de la classe, ni la mthode afficher(). Il faut rendre ces deux mthodes
publiques en supprimant le mot-cl private.

2. Les variables d'instance (mais pas les variables locales) reoivent toujours des valeurs par dfaut. Si la
variable d'instance points n'est pas initialise, elle aura donc la valeur 0. Dans la mthode constructeur, il y a
une situation de shadowing o le paramtre a le mme nom que la variable d'instance. Il faut utiliser
l'objet this pour diffrencier les deux et ainsi affecter la valeur du paramtre points la variable
d'instance points.

/* Version corrige */

class Erreurs {

public static void main (String[] args) {

Score g1 = new Score(2009, 2);

g1.afficher();

Score g2 = new Score(2010, 4);

g2.afficher();

class Score {

private int annee;

private int points;

// !!! pas de private

public Score (int a, int points) {


annee = a;

// !!! this

this.points = points;

// !!! pas de private

public void afficher() {

System.out.println(

"Objet de type Score avec variables d'instance anne = " +

annee + " et points = " + points);

Pharmacie
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 = 0;
while (choix < 4) {

choix = menu();

switch (choix) {

case 1:

achat(clients, medicaments);

break;

case 2:

approvisionnement(medicaments);

break;

case 3:

affichage(clients, medicaments);

break;

case 4:

quitter();

break;

default:

// On reste dans la boucle par dfaut.

choix = 0;

// Les mthodes utilitaires

static int menu() {

int choix = 0;

System.out.println();

System.out.println();

System.out.println("1 : Achat de medicament");

System.out.println("2 : Approvisionnement en medicaments");


System.out.println("3 : Etats des stocks et des credits");

System.out.println("4 : Quitter");

while ((choix != 1) && (choix != 2) && (choix != 3) && (choix != 4)) {

choix = scanner.nextInt();

// se dbarasser du \n

scanner.nextLine();

return choix;

/**

* Mthode auxiliaire de main permettant un client

* d'acheter un mdicament

*/

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. Quantite insuffisante");

/**

* Mthode auxiliaire de main permettant d'augmenter le

* stock d'un mdicament

*/
static void approvisionnement(Medicament[] medicaments) {

Medicament medicament = lireMedicament(medicaments);

System.out.println("Donner la Quantite : ");

int quantite = scanner.nextInt();

// se dbarasser du \n

scanner.nextLine();

medicament.augmenterStock(quantite);

/**

* Mthode auxiliaire de main permettant d'afficher les

* donnes stockes 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 medicament " + medicaments[i].getNom()

+ " :" + medicaments[i].getStock());

System.out.println("Affichage des credits");

for (int i = 0; i < clients.length; i++) {

System.out.println("Credit 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 = null;

boolean trouve = false;

Client c = null;

System.out.println("Nom du client?:");

while (!trouve) {

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");

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 mdicament contenu dans le tableau medicaments

*/

static Medicament lireMedicament(Medicament[] medicaments) {

String nom = null;

boolean trouve = false;

Medicament m = null;

System.out.println("Nom du medicament?:");
while (!trouve) {

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");

return m;

static double lirePaiement() {

double paiement = 0.0;

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 quantite achetee?");

quantite = scanner.nextInt();

scanner.nextLine();

return quantite;

}
static void quitter() {

System.out.println("Programme termine!");

// Les classes d'objets

class Client {

// Un client est caractris par son nom et un crdit.

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 mdicament 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;
}

Amlioration du code objet:

import java.util.Scanner;

class GestionPharmacie {

protected static Scanner scanner = new Scanner(System.in);

/**

* Le programme principal cre un objet Pharmacie

* sur lequel les oprations suivantes peuvent tre effectues:

* - achat (d'un mdicament par un client),

* - approvisionnement (ajout d'un mdicament au stock)

* - affichage (des donnes 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 = 0;

while (choix < 4) {

choix = menu();
switch (choix) {

case 1:

p.achat();

break;

case 2:

p.approvisionnement();

break;

case 3:

p.affichage();

break;

case 4:

quitter();

break;

default :

// On reste dans la boucle.

choix = 0;

// Les mthodes utilitaires

static int menu() {

int choix = 0;

System.out.println();

System.out.println();

System.out.println("1 : Achat de medicament");

System.out.println("2 : Approvisionnement en medicaments");

System.out.println("3 : Etats des stocks et des credits");

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 termine!");

// Les classes d'objets

class Pharmacie1 {

// une pharmacie est une liste de client et

// une liste de mdicaments

private Client[] clients;;

private Medicament[] medicaments;

public Pharmacie1(Client[] clients, Medicament[] medicaments) {

this.clients = clients;

this.medicaments = medicaments;

public Client[] getClients() {

return this.clients;

public Medicament[] getMedicaments() {

return this.medicaments;

/**
* Permet un client d'acheter un mdicament.

* si le client est connu de la pharmacie, son crdit

* va diminuer en fonction de son paiement.

* Le stock associ au mdicament 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. Quantite insuffisante");

/**

* Permet la pharmacie de s'approvisionner en un

* mdicament connu.

*/

public void approvisionnement() {

Medicament medicament = this.lireMedicament();

System.out.println("Donner la Quantite : ");

int quantite = GestionPharmacie.scanner.nextInt();

medicament.augmenterStock(quantite);

/**
* Affichage des stocks et des crdits 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 medicament " + medicaments[i].getNom()

+ " :" + medicaments[i].getStock());

System.out.println("Affichage des credits");

for (int i = 0; i < clients.length; i++) {

System.out.println("Credit 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 = null;

boolean trouve = false;

Client c = null;

System.out.println("Nom du client?:");

while (!trouve) {

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");

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 mdicament connu de la pharmacie

*/

public Medicament lireMedicament() {

String nom = null;

boolean trouve = false;

Medicament m = null;

System.out.println("Nom du medicament?:");

while (!trouve) {

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("Medicament inconnu. Veuilliez recommencer");

}
}

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 quantite achetee?");

return GestionPharmacie.scanner.nextInt();

class Client {

// Un client est caractris par son nom et un crdit.

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 mdicament 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;

}
Created Thu 23 Jan 2014 3:25 PM WET

Last Modified Wed 19 Feb 2014 8:45 PM WET