Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème d’incompréhension avec le système de Liste

Sujet résolu
    29 avril 2012 à 19:51:12

    Bonjour, j'ai un problème dans mon code que je n'arrive pas à comprendre même après des heures de recherches.

    Afin de situer le contexte, mon code correspond à un exercice de programmation.
    Son sujet : Construire une maison dans le main avec une classe etage, une classe piece, une classe equipement.

    J'ai créer la classe equipement.
    Dans la classe piece, j'utilise une classe liste fournie par mon prof et retravaillée pour cette classe.

    Dans mon main je n'ai pour l'instant que du code qui me sert à tester le fonctionnement de la classe piece.

    Mon problème se situe au niveau de l'affichage des composantes de la liste equipement.

    Lorsque j'ai plusieurs composantes, mon code affiche le bon nombre de composantes mais en affiche toutes les mêmes.
    Par exemple si crée deux composantes chaise et table, cela va m'afficher table table, j'ai donc bien deux objets créer mais ceux sont les mêmes.


    Donc je n'arrive pas à déterminer si cela vient de la fonction d'ajout d'objet dans la liste ou si cela vient de la fonction de récursivité de la liste pour l'affichage.

    Voici des bouts de code mais l'essentiel de ce qu'il faut (je pense) :

    la classe equipement :

    public class equipement 
    {	
    	static String nomEquipement;
    	
    	
    	public equipement()
    	{
    		nomEquipement = null;
    	}
    	
    	public equipement (String nom)
    	{
    		nomEquipement = nom;
    	}
    }
    


    la classe piece :

    public class piece 
    {
    	String nomPiece;
    	ListeEquipement listEquip;
    
    	piece(String nom, ListeEquipement list)
    	{
    		this.nomPiece = nom;
    		this.listEquip = list;
    
    	public boolean ajoutEquipement(String nom)
    	{
    		equipement e = new equipement(nom);
    		
    		listEquip = new ListeEquipement(e, listEquip);
    		
    		if (listEquip._premier != e)
    			return false;
    		else
    			return true;
    	}
    
    	public void afficher(ListeEquipement L)
    	{
    		if(L.estVide(L))
    			throw new operationIllegaleSurListeVide();
    		else if (L.estVide(L.reste(L)))
    			Terminal.ecrireString("\n\t\t" +L._premier.nomEquipement);
    		else
    		{
    			Terminal.ecrireString("\n\t\t" + L._premier.nomEquipement);
    			Terminal.ecrireString(L.dernier(listEquip).nomEquipement);
    		}
    	}
    



    La classe ListeEquipement

    class ListeEquipement {
      /**
       * attribut permettant de stocker le premier élément d'une liste non vide
       */
      equipement   _premier;
      
      /**
       * attribut permettant de stocker le reste d'une liste non vide
       */
      ListeEquipement _reste;
      
      /**
       * réalisation de l'opération 'vide' : constante (variable statique finale)
       * définissant la liste vide
       */
      static final ListeEquipement vide = null;
      
      /**
       * réalisation de l'opération 'estVide', retournant vrai ou faux
       * selon que la liste est vide ou non, respectivement
       */
      static boolean estVide(ListeEquipement L) { return L == vide; }
    
      /**
       * réalisation de l'opération 'premier', retournant le premier élément d'une
       * liste non vide (lève une exception si la liste est vide)
       */
      static equipement premier(ListeEquipement L) {
        if (estVide(L)) throw new operationIllegaleSurListeVide();
        else            return L._premier;
      }
      
      /**
       * réalisation de l'opération 'reste', retournant le reste d'une
       * liste non vide (lève une exception si la liste est vide)
       */
      static ListeEquipement reste(ListeEquipement L) {
        if (estVide(L)) throw new operationIllegaleSurListeVide();
        else            return L._reste;
      }
    
      /**
       * constructeur exploité par 'ajout'
       */
       ListeEquipement(equipement e, ListeEquipement L) {
        this._premier = e;
        this._reste   = L;
      }
      
      /**
       * réalisation de l'opération 'ajout', retournant une liste
       */
      static ListeEquipement ajout(equipement e, ListeEquipement L) { return new ListeEquipement(e, L); }
    
      /**
       * fonction permettant de construire rapidement une liste à partir d'un tableau d'entiers
       */
      static ListeEquipement depuisTableau(equipement[] T) {
        ListeEquipement L = vide;
        for (int i=T.length-1; i>=0; i--) L = ajout(T[i], L);
        return L;
      }
      
     
      /**
       * fonction produisant la représentation d'une liste sous forme de texte
       */
      static String versString(ListeEquipement L) {
        String représentation = "[", séparateur = "";
        for (; ! estVide(L); L = reste(L)) {
          représentation += séparateur+premier(L);
          séparateur = " ";
        };
        return représentation+"]";
      }
    
      
    
      /**
       * fonction retournant le nombre d'éléments d'une liste
       */
      static int longueur(ListeEquipement L) {
        if (estVide(L)) return 0;
        else            return 1+longueur(reste(L));
      }
      
      /**
       * fonction retournant le dernier élément d'une liste non vide, -1 sinon
       */
      static equipement dernier(ListeEquipement L) {
        if (estVide(L))             throw new operationIllegaleSurListeVide();
        else if (estVide(reste(L))) return premier(L);
        else                        return dernier(reste(L));
      }
    
      /**
       * fonction comptant le nombre d'occurences d'un entier e dans une liste L
       */
      static int compter(ListeEquipement L, equipement e) {
        if (estVide(L))           return 0;
        else if (premier(L) == e) return 1+compter(reste(L), e);
        else                      return compter(reste(L), e);
      }
      
      
      /**
       * fonction effaçant toutes les occurences d'un entier e dans une liste L
       */
      static ListeEquipement effacer(ListeEquipement L, equipement e) {
        if (estVide(L))           return L;
        else if (premier(L) == e) return effacer(reste(L), e);
        else                      return ajout(premier(L), effacer(reste(L), e));
      }
    }
    


    Et pour finir le main :

    public class main {
    
    	/**
    	 Ce code à été développé par NEF Silvère
    	 Dans le cadre du devoir n° 6
    	 pour l'UE NFA002
    	 au CNAM de Montpellier
    	 */
    	public static void main(String[] args) {
    		
    		
    		piece p = new piece("rdz");
    		
    		p.ajoutEquipement("chaise");
    		p.afficher(p.listEquip);
    		
    		p.ajoutEquipement("table");
    		p.afficher(p.listEquip);
    		
    		//p.ajoutEquipement("bureau");		
    		//p.afficher(p.listEquip);
    		
    	}
    
    }
    


    Voilà j'ai sélectionné les partie intéressantes, si vous voyez des parties qui n'y sont pas dites le moi je les mettrais.

    Ce que je souhaite c'est que quelqu'un puisse m'expliquer pourquoi la fonction affichage ne fonctionne pas comme elle le devrait.

    Merci d'avance pour vos réponses
    • Partager sur Facebook
    • Partager sur Twitter
      29 avril 2012 à 20:53:17

      Bonsoir,

      Pour commencer, enlève vite les caractères accentués dans le nom de tes variables car ça pique les yeux:
      static String versString(ListeEquipement L) {
          String représentation = "[", séparateur = "";
      


      Même remarque pour les noms de variable en majuscule (la convention Java étant maVariable s'il y a plusieurs mots ou tout simplement variable):
      public void afficher(ListeEquipement L)
      


      Et le nom d'une classe commence TOUJOURS par une majuscule.
      Sérieusement, comment peux-tu compiler ce bazar?

      Ensuite, j'ai du mal à saisir certains trucs.

      Pourquoi perdre du temps à faire appel à une fonction perso Terminal.ecrireString alors que System.out.println() existe déjà et n'a pas besoin d'être encapsulée?

      Es-tu obligé d'utiliser ta propre implémentation d'une liste? Parce que sinon, ArrayList (voire LinkedList) existent. Pas besoin de réinventer la roue.
      • Partager sur Facebook
      • Partager sur Twitter
        29 avril 2012 à 22:01:52

        En plus de ce que vous a signalé Fumble, vous pouvez également préciser que les attributs de vos classe sont privés et ne pas utilisé des static à tout va qui ne respecte pas du tout le modèle objet que vous essayez d'utiliser (je pense par exemple à
        p.afficher(p.listEquip);
        
        qui devrait être
        p.afficherListeEquipement();
        
        ).
        D'ailleurs votre problème vient sans doute du
        static String nomEquipement;
        
        qui fait que tous vos équipement auront un nom unique.
        • Partager sur Facebook
        • Partager sur Twitter
          1 mai 2012 à 12:29:51

          Merci pour vos réponses.

          Fumble : il est vrai que j'ai des petits problèmes dans la syntaxe, je vais les corrigés.
          La classe Terminal, nous est imposé, car lors des tests de codes, le prof utilise cette classe. Le cours sur lequel s'appuie mon prof à été fait pour la version java 4 alors que System.out.println() à été introduit je crois dans la version java 5 ou 6.

          Ensuite si le but est justement de réinventer la roue puisque j'avais résolu l'exercice avec la classe LinkedList et cela m'à été refusé.
          J'ai donc dû reprendre la classe Liste du prof qui avait été créer pour manipuler des liste de int et la ré-implémenter mon cas .

          mac.aque : je suis consient que mon utilisation n'est pas tout à fait selon un modèle objet, mais je suis débutant et m'y étant pris à la dernière minute pour la réalisation du devoir, j'ai commis pas mal de faute.

          Je vais essayé d'enlever le mot static devant mon String mais l'utilisation du mot static est-elle pour spécifié au code que cette variable doit garder les valeurs qui lui sont donné même après la fin d'un bloc ?

          Merci
          • Partager sur Facebook
          • Partager sur Twitter
            1 mai 2012 à 16:08:17

            Citation

            Je vais essayé d'enlever le mot static devant mon String mais l'utilisation du mot static est-elle pour spécifié au code que cette variable doit garder les valeurs qui lui sont donné même après la fin d'un bloc ?


            Non, static signifie que l'attribut est rattaché à la classe elle-même et non à ses instances.
            Dans tous les cas un attribut de classe gardera sa valeur tant que l'objet auquel il appartient n'est pas détruit.
            Seul une variable définit dans un bloc n'existera plus en dehors de celui-ci (et donc si on repasse dans le bloc et recrée une variable avec le même nom on ne récupera bien sûr pas la valeur de la première variable).
            Si tu fais :
            public class Equipement 
            {	
            	private String nom;
            	
            	public Equipement (String nom)
            	{
            		this.nom = nom;
            	}
            
            	public String getNom()
            	{
            		return nom;
            	}
            }
            

            Puis que tu utilises par exemple :
            Equipement chaise = new Equipement("chaise");
            Equipement table = new Equipement("table");
            System.out.println(chaise.getNom());
            System.out.println(table.getNom());
            

            Tu aura bien :
            chaise
            table

            Alors que si tu utilises un attribut "nom" static tu aura :
            table
            table
            car les deux instances Equipement partageront la même variable "nom".

            Mais c'est vraiment les bases là, ça serait bien de se replonger dans ton cours (ou s'il n'est pas terrible de chercher un peu sur le web).

            System.out.println() doit daté du JDK 1.0, ça a toujours existé quoi. Mais que le prof vous impose d'utiliser sa classe est une raison suffisante.
            • Partager sur Facebook
            • Partager sur Twitter

            Problème d’incompréhension avec le système de Liste

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown