IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

Implémentation d'une quincaillerie (TP)


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut Implémentation d'une quincaillerie (TP)
    Bonsoir à tous,

    Je me suis amusé a faire un petit TP sur l'implémentation d'une quincaillerie, mais j'ai un petit problème sur une méthode d'affichage.
    Mais avant, je vais vous donner une partie de l'énoncé pour vous situer le contexte.

    Trois sortes de pièces se distinguent essentiellement, les pièces de base, les pièces composites en kit et les pièces composites montées.

    Les pièces de base correspondent à des éléments de quincaillerie simple. Elles sont décrites par une référence de préfixe 00, un prix, une durée de garantie (en mois), une durée de fabrication (en jours). On doit pouvoir éditer une fiche caractéristiques sous le format suivant :
    nom : vis
    référence : 007152
    prix : 0.01 euros
    garantie : 12 mois
    durée de fabrication : 1 jour(s)
    Les pièces composites correspondent à des éléments de quincaillerie construits à partir d'autres éléments, simples ou eux-mêmes composites.
    Les pièces composites en kit sont livrés en pièces détachées avec une notice de montage. Elle se caractérisent par une référence de préfixe 01 et une durée moyenne de montage par un particulier (en minutes). Leur prix se calcule en prenant la somme des prix de leurs composants. Leur durée de garantie s'obtient en prenant la plus courte durée de garantie parmi celle de leurs composants et en la divisant par deux. Leur durée de fabrication s'obtient en prenant la durée de fabrication la plus longue d'un composant.
    La fiche caractéristique a la forme suivante :
    nom : roue de brouette en kit
    référence : 011512
    prix : 24 euros
    garantie : 10 mois
    durée de fabrication : 4 jour(s)
    durée de montage particulier : 15 min
    composants :
    pneu - 004741
    chambre à air - 004565
    jante - 014541
    disque de jante - 001214
    rayon - 004748
    rayon - 004748
    rayon - 004748
    Les pièces composites montées se caractérisent par une référence de préfixe 02, un prix de montage et une durée de montage en atelier (en jours). Leur prix se calcule en prenant la somme des prix de leurs composants à laquelle on ajoute le prix de montage. Leur durée de garantie s'obtient en prenant la plus courte durée de garantie parmi celles de leurs composants et en lui ajoutant un bonus de garantie de 6 mois. Leur durée de fabrication s'obtient en prenant la durée de fabrication la plus longue d'un composant augmentée de la durée de montage en atelier. La fiche caractéristique est basé sur le même format que pour les pièces composites en kit.
    On me demande ensuite de faire apparaitre les constructeurs et les méthodes toString(), ajoute(), prix(), duréeGarantie(), duréeFabrication(), affiche().
    J'ai donc fait ceci :


    Piece.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public abstract class Piece {
    	protected String nom;
    	protected String reference;
    	protected float prix; // en euros
    	protected int garantie; // en mois
    	protected int dureeFabrication; // en jours
     
    	public Piece(String n, String r){
    		nom = n;
    		reference = r;
    	}
     
    	public String toString() {
    		String resultat = nom + " (ref: " + reference + ") coûte " + prix() + "€, a une garantie de " + dureeGarantie()
    		+ " mois  et une duree de fabrication de " + dureeFabrication() + " jour(s).";
    		return resultat;
    	}
     
    	public abstract int dureeFabrication();
    	public abstract float prix();
    	public abstract int dureeGarantie();
     
    	public void affiche() {
    		System.out.println("nom : " + nom);
    		System.out.println("référence : " + reference);
    		System.out.println("prix : " + prix() + " euros");
    		System.out.println("garantie : " + dureeGarantie() + " mois");
    		System.out.println("durée de fabrication : " + dureeFabrication() + " jour(s)");
    	}
    }
    PieceBase.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class PieceBase extends Piece {
     
    	public PieceBase(String n, String r, float p, int g, int dF){
    		super(n,r);
    		reference = "00" + r;
    		prix = p;
    		garantie = g;
    		dureeFabrication = dF;
    	}
     
    	public float prix() {
    		return prix;
    	}
     
    	public int dureeFabrication() {
    		return dureeFabrication;
    	}
     
    	public int dureeGarantie() {
    		return garantie;
    	}
    }
    PieceComposite.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    import java.util.Vector;
     
    public abstract class PieceComposite extends Piece {
     
    	Vector<Piece> composants = new Vector<Piece>();
     
    	public PieceComposite(String n, String r) {
    		super(n,r);
    	}
     
    	public void ajoute(Piece p) {
    		composants.add(p);
    	}
     
    	public int dureeGarantie() {
    		if (!composants.isEmpty()) {
    			int garantieMin = composants.get(0).dureeGarantie();
    		 	for (int i=1 ; i < composants.size() ; i++) {
    		 		if (garantieMin > composants.get(i).dureeGarantie()) {
    		 			garantieMin = composants.get(i).dureeGarantie();
    		 		}
    		 	}
    		 	return garantieMin;
    		}
    		else return 0;
    	}
     
    	public int dureeFabrication() {
    		if (!composants.isEmpty()) {
    			int dureeFabricationMax = composants.get(0).dureeFabrication();
    			for (int i=1 ; i < composants.size() ; i++) {
    				if (dureeFabricationMax < composants.get(i).dureeFabrication()) {
    					dureeFabricationMax = composants.get(i).dureeFabrication();
    				}
    			}
    			return dureeFabricationMax;
    		}
    		else return 0;
    	}
     
    	public float prix() {
    		float resultat = 0;
    		for (int i=0 ; i < composants.size() ; i++) {
    			resultat += composants.get(i).prix();
    		}
    		return resultat;
    	}
    }
    PieceCompositeKit.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public class PieceCompositeKit extends PieceComposite {
     
    	private int dureeMontageParticulier; // en minutes
     
    	public PieceCompositeKit(String n, String r, int dMP) {
    		super(n,r);
    		prix = prix();
    		reference = "01" + r;
    		dureeMontageParticulier = dMP;
    		garantie = dureeGarantie();
    		dureeFabrication = dureeFabrication();
    	}
     
    	public int dureeGarantie() {
    		return (super.dureeGarantie() / 2);
    	}
     
    	public String toString() {
    		String resultat = super.toString() + " Duree montage particulier : " + dureeMontageParticulier + " min.";
    		return resultat;
    	}
     
    	public void affiche() {
    		super.affiche();
    		System.out.println("duree de montage particulier : " + dureeMontageParticulier + " mn");
    		System.out.println("composants :");
    		for (int i=0 ; i < composants.size() ; i++) {
    			System.out.println("     " + composants.get(i).nom + " - " + composants.get(i).reference);
    		}
    	}	
    }
    Je vous mets pas PieceCompositeMontee.java qui fonctionne sur le même principe que PieceCompositeKit.java.


    Alors premièrement, je voulais connaitre votre avis, et si éventuellement vous voyez des erreurs de conception.

    Et ensuite, j'ai un problème pour la méthode affiche().
    Pas de souci pour ce qui est d'afficher la fiche d'une pièce de base, mais c'est plus compliqué pour afficher la fiche d'une pièce composée.
    En effet, je n'arrive pas a afficher les composants de mes pièces composés. Voyez plutôt.

    Au lieu de :
    nom : roue de brouette en kit
    référence : 011512
    prix : 24 euros
    garantie : 10 mois
    durée de fabrication : 4 jour(s)
    durée de montage particulier : 15 min
    composants :
    pneu - 004741
    chambre à air - 004565
    jante - 014541
    disque de jante - 001214
    rayon - 004748
    rayon - 004748
    rayon - 004748
    Je parviens seulement a afficher :
    nom : roue de brouette en kit
    référence : 011512
    prix : 24 euros
    garantie : 10 mois
    durée de fabrication : 4 jour(s)
    durée de montage particulier : 15 min
    composants :
    pneu - 004741
    chambre à air - 004565
    jante - 014541
    Quel puis-je faire pour remédier a ça ? Je ne trouve pas de solution.

    PS : J'ai lu une partie de la FAQ, et je suis au courant qu'il n'est pas conseillé d'utiliser la classe Vector, malheureusement c'est dans le programme de ma licence, d’où son utilisation dans mon application.

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    Bonjour,
    Pour ce qui est de la conception du projet, ça présente bien mais je ne suis pas un spécialiste...
    Pour la méthode affiche(), je pense que l'on peut s'en sortir en utilisant la récursivité ce qui oblige à créer une nouvelle méthode. Dis moi ce que tu en penses??


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public void affiche() {
    	super.affiche();
    	System.out.println("duree de montage particulier : " + dureeMontageParticulier + " mn");
    	System.out.println("composants :");
    	for (int i=0 ; i < composants.size() ; i++) {
    		afficherComposants(composants.get(i));			
    	}
    }
     
    public void afficherComposants(Piece c) {
    	System.out.println("     " + c.nom + " - " + c.reference);
    	if (c instanceof PieceComposite) {
    		for (int i=0; i< c.composants.size(); i++) {
    			afficheComposants(c.composants.get(i));
    		}
    	}
    }

  3. #3
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut
    Salut,

    Tout d'abord je te remercie de m'avoir lu jusqu'au bout et d'avoir pris le temps de me répondre.

    Je me disais bien qu'il fallait utiliser la récursivité, mais je savais pas comment m'y prendre, merci à toi.

    Par contre y'a 2 petites erreurs de compilation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public void afficheComposants(Piece c) {
    		System.out.println("     " + c.nom + " - " + c.reference);
    		if (c instanceof PieceComposite) {
    			for (int i=0; i< c.composants.size(); i++) {
    				afficheComposants(c.composants.get(i));
    			}
    		}
    	}
    "composants cannot be resolved or is not a field"
    Et Eclipse me propose de créer une variable "composants" dans Pièce.
    Pourtant si on est entré dans la condition c'est que notre "c" est une instance de "PièceComposite" et il devrait donc avoir accès a "composants"... Non?

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    Je ne peux pas tester mais essayes de caster c en PieceComposant??

    Tiens moi au courant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	public void afficheComposants(Piece c) {
    		System.out.println("     " + c.nom + " - " + c.reference);
    		if (c instanceof PieceComposite) {
                            PieceComposite d = (PieceComposite)c;
    			for (int i=0; i< d.composants.size(); i++) {
    				afficheComposants(d.composants.get(i));
    			}
    		}
    	}

  5. #5
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut
    T'es un bon.

    J'ai juste rajouté un petite ligne pour l'indentation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	public void afficheComposants(Piece c) {
    		System.out.println("     " + c.nom + " - " + c.reference);
    		if (c instanceof PieceComposite) {
                PieceComposite d = (PieceComposite)c;
    			for (int i=0; i< d.composants.size(); i++) {
    				System.out.print("     ");
    				afficheComposants(d.composants.get(i));
    			}
    		}
    	}
    Merci a toi ludomacho.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/04/2006, 23h22
  2. Implémentation d'une jointure "rien=tout"
    Par lafeuil dans le forum Langage SQL
    Réponses: 3
    Dernier message: 15/03/2006, 16h26
  3. Implémentation d'une liste chaînée
    Par Yux dans le forum C
    Réponses: 22
    Dernier message: 02/03/2006, 20h31
  4. Réponses: 5
    Dernier message: 23/02/2006, 00h34
  5. Réponses: 12
    Dernier message: 01/07/2004, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo