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 :

[Débutant][Conception] Modéliser une pile d'entiers


Sujet :

Java

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    451
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 451
    Points : 287
    Points
    287
    Par défaut [Débutant][Conception] Modéliser une pile d'entiers
    bonjour à tous, je viens de me mettre au java et à la prog objet au passage...
    J'ai reussi à realiser une pile d'entier avec 2 classes(pile et cellul) et 1 classe pour avoir un main :

    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
    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
    public class Cellul 
    {
    	private int valeur; // valeur de la cellule
    	private Cellul suivant; //cellule suivante
    	public Cellul(int v) {this.valeur = v;} //constructeur
    	public int getValeur()     {return this.valeur;} //accesseur
    	public Cellul getSuivant() {return this.suivant;} //accesseur
    	public void setSuivant(Cellul c) {this.suivant = c;} //accesseur
    	public void setValeur(int v)     {this.valeur = v;} //accesseur
    }
     
    public class Pile 
    {
    	private Cellul sommet;
     
    	public Pile(int t) // constructor 
    	{
    		this.sommet = new Cellul(t);
    	}
     
    	public boolean pile_vide() // vérifie si la pile est vide
    	{
    		if (this.sommet == null) 
    			{return true;}
    		else 
    			{return false;}
    	}
     
    	public void empiler(int t) // empile un élément
    	{
    		if (pile_vide())  
    			{this.sommet = new Cellul(t);}
    		else
    		{
    			Cellul c = new Cellul(t);
    			c.setSuivant(this.sommet);
    			this.sommet = c;
    		}
    	}
     
    	public void depiler() // dépile un élément
    	{
    		if (this.sommet != null) {this.sommet = this.sommet.getSuivant();}		
    	}
     
    	public int dernier_insere() // retourne le dernier élément entré
    	{
    		if (!pile_vide()) 
    			return this.sommet.getValeur();
    		else
    			return -1; //gestion erreurs
    	}
     
    	public int nb_element() // retourne le nombre d'élément de la pile
    	{
    		if (!pile_vide())
    		{
    			Cellul c;
    			int cpt = 0;
     
    			for (c = this.sommet; c != null; c = c.getSuivant()) cpt++;
    			return cpt;
    		}
    		else return 0;
     
    	}
     
    	public void afficher_pile() // affiche le contenu de la pile
    	{
    		String str_msg;
    		if (!pile_vide())
    		{
    			Cellul c;
    			c = this.sommet;
    			str_msg = "Contenu de la pile : ";
    			while (c != null)
    			{
    				str_msg += c.getValeur();
    				if (c.getSuivant() != null) str_msg += " - ";
    				c = c.getSuivant();
    			}
    		}
    		else str_msg = "Pile vide";
    		System.out.println(str_msg);
    	}
    }
     
    public class Principale 
    {
    	public static void main(String[] args)
    	{
    		Pile maPile = new Pile(1); //instanciation de l'objet maPile
     
    		maPile.empiler(2); //empiler une cellule de valeur 2
    		maPile.empiler(3); //empiler une cellule de valeur 3
    		maPile.depiler();  //depiler le dernier element insere
    		maPile.empiler(4); //empiler une cellule de valeur 4
    		maPile.empiler(5); //empiler une cellule de valeur 5
    		maPile.empiler(6); //empiler une cellule de valeur 6
    		maPile.depiler();  //depiler le dernier element insere
     
    		maPile.afficher_pile(); // affichage du contenu de la pile
    		System.out.println("nombre d'element : " + maPile.nb_element()); // afficher le nombre d'elements de la pile
    		System.out.println("Dernier element insere : " + maPile.dernier_insere()); //afficher le dernier element insere
     
    		while (!maPile.pile_vide()) // on depile tous les elements 
    		{
    			maPile.depiler();
    		}
     
    		maPile.afficher_pile(); // affichage du contenu de la pile
    		System.out.println("nombre d'element : " + maPile.nb_element()); // afficher le nombre d'elements de la pile
    		System.out.println("Dernier element insere : " + maPile.dernier_insere()); //afficher le dernier element insere
     
    	}
    }
    bon ca ca marche et ca ne pose pas de problemes.

    maintenant je voudrais faire une pile d'entier avec une seule classe et la je seche, je n'arrive pas à la concevoir.

    elle devrait avoir cette forme :

    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
    public class Pile_entier 
    {
    	private int valeur;
    	private Pile_entier suivant;
     
    	public Pile_entier(){} // constructeur
     
    	public boolean pile_vide() // Renvoie true si la pile est vide
    	{}
     
    	public void empiler(int n)
    	{}
     
    	public void depiler()
    	{}
    }
    donc si quelqu'un pouvait m'aider...
    @+

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 147
    Points : 155
    Points
    155
    Par défaut
    As tu le droit d'utiliser des types de l'API java.

    Genre vector ou Array ?

    Ta pile ne serait ni plus ni moins qu'un tableau d'entier.

    vide : taille du tableau == 0 ?
    empiler : ajouter en queue de tableau
    depiler : recuperation du dernier element du tablea / et suppression


    Sinon qu'avec des entiers tu pourras pas. Y faut que tu puisses implémenter la relation "suivant". Ce qui correspondrait à réimplémenter le concept de Liste qui est ce que tu as fait à travers la classe Cellul

  3. #3
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Les piles existent déjà dans java

    Cf. la classe Stack

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 147
    Points : 155
    Points
    155
    Par défaut
    Oué mais peut être y doit la recoder pour un besoin scolaire
    C'est incroyable ckon peut faire recoder dans les écoles.

  5. #5
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    C'est un très bon exercice scolaire ( je suis passé par là aussi ) qui te permet de comprendre les allocations dynamiques...
    C'est vrai que d'utiliser bêtement les classes toutes faites ( Stack, LinkedList etc. ) ça va plus vite, mais des fois, comprendre ce qu'il y a derrière peut être vraiment très intéressant.

  6. #6
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    451
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 451
    Points : 287
    Points
    287
    Par défaut
    salut
    Alors oui c'est pour un besoin scolaire.

    En utilisant un tableau d'entiers cela devient tres simple mais le sujet ne m'en donne pas le droit.

    si je comprends bien mon sujet est de redoder la classe stack?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 147
    Points : 155
    Points
    155
    Par défaut
    Si t'as pas le droit au tableau et que tu veux le faire qu'avec une seul classe, ben faut intégrer ta classe Cellule dans ta classe Pile.

    Ca a très peu d'intérêt, que ce soit en terme de conception et même pédagogiquement.
    A priori t'as pigé le principe, et intégrer le data dans la liste, ca limite les possibilité de réutilisation, qui font l'intérêt des langages objets.

  8. #8
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 42
    Points : 50
    Points
    50
    Par défaut
    Bonjour,

    Voici une proposition:

    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
     
     
    public class Pile_entier
    {
       private int valeur;
       private Pile_entier suivant;
     
       public Pile_entier(int n){
         valeur = n;
       } 
     
       public Pile_entier(){ this(0);} // constructeur
     
       public boolean pile_vide() // Renvoie true si la pile est vide
       {
          return (suivant == null);
       }
     
       public void empiler(int n)
       {
          if(suivant == null){
             suivant = new Pile_entier(n);
          }
          else{
             suivant.empiler(n);
          }
       }
     
       public void depiler()
       {
          if(suivant == null){ return;}
          if(suivant.getSuivant() == null){
             System.out.println("Dépiler : " + suivant.getValeur());
             suivant = null;
          }
          else{
             suivant.depiler();
          }
       }
     
       public Pile_entier getSuivant(){return suivant;}
     
       public int getValeur(){return valeur;}
    }

  9. #9
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    451
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 451
    Points : 287
    Points
    287
    Par défaut
    Citation Envoyé par professeur
    Bonjour,

    Voici une proposition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
       public Pile_entier(int n){
         valeur = n;
       } 
     
       public Pile_entier(){ this(0);} // constructeur
    pourkoi y a t il 2 constructeurs?

  10. #10
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par philippe123
    Citation Envoyé par professeur
    Bonjour,

    Voici une proposition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
       public Pile_entier(int n){
         valeur = n;
       } 
     
       public Pile_entier(){ this(0);} // constructeur
    pourkoi y a t il 2 constructeurs?
    Pourquoi pas?

    Le constructeur vide mets des valeurs par défaut mais rien n'empêche d'avoir un constructeur qui permet d'avoir un paramètre pour tout de suite initialiser un membre de la classe.

  11. #11
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    451
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 451
    Points : 287
    Points
    287
    Par défaut
    Citation Envoyé par fearyourself

    Pourquoi pas?

    Le constructeur vide mets des valeurs par défaut mais rien n'empêche d'avoir un constructeur qui permet d'avoir un paramètre pour tout de suite initialiser un membre de la classe.
    ok mais là, dans le code, on passe un parametre pour l'instanciation et apres on lui force la valeur 0??

    c'est ce qui me trouble...

    this(0) ??

  12. #12
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 42
    Points : 50
    Points
    50
    Par défaut
    Le deuxième constructeur ne prenant pas de paramètre s'appelle le constructeur par défaut, il t'autorise à déclarer une instance de classe comme ceci: Pile_entier p = new Pile_entier() et lorsqu'il est appelé la valeur par défaut de l'attribut "valeur" est 0 d'où le this(0). au fait le this(0) correspond au premier constructeur.
    Par ailleurs le deuxième constructeur (par défaut) ne modifie pas le premier si c'est cela qui te trouble.

    A+

  13. #13
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 42
    Points : 50
    Points
    50
    Par défaut
    Est-ce la classe marche? je l'ai pas testé!

  14. #14
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    451
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 451
    Points : 287
    Points
    287
    Par défaut
    pourkoi ne pas faire directement le constructeur this(0)
    et apres j'empilerais et depilerais dans mon objet pile

  15. #15
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    451
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 451
    Points : 287
    Points
    287
    Par défaut
    Citation Envoyé par professeur
    Est-ce la classe marche? je l'ai pas testé!
    je fais un ptit main et je te repost

  16. #16
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    451
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 451
    Points : 287
    Points
    287
    Par défaut
    oui chef, ca marche bien à part le depiler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      public void depiler() 
       { 
          if(suivant == null){ return;} 
          if(suivant.getSuivant() == null){ 
             System.out.println("Dépiler : " + suivant.getValeur()); 
             suivant = null; 
          } 
          else{ 
             suivant.depiler(); 
          } 
       }

  17. #17
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    451
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 451
    Points : 287
    Points
    287
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Principale 
    {
    	public static void main(String[] args)
    	{
    		Pile_entier maPile = new Pile_entier(8); //instanciation
    		maPile.depiler();
    		System.out.println(maPile.getValeur());
    	}
    }
    voici mon main et retour est 8 donc il a pas depiler

  18. #18
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 42
    Points : 50
    Points
    50
    Par défaut
    Tu peux rajouter le toString() pour l'affichage:

    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
     
     
    public String toString(){
       if(suivant == null){
          return val + "\n";
     
      return suivant + "\n" + val;
     
    }
     
    //appel
     
    Pile_entier p = new Pile_entier(2);
    //....
    System.out.print(p);

  19. #19
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par philippe123
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Principale 
    {
    	public static void main(String[] args)
    	{
    		Pile_entier maPile = new Pile_entier(8); //instanciation
    		maPile.depiler();
    		System.out.println(maPile.getValeur());
    	}
    }
    voici mon main et retour est 8 donc il a pas depiler
    C'est normal, cela vient du fait que tu crées une pile à un élément (initialisé à 8). Vu que tu n'as rien empiler en plus, maPile.suivant sera égal à null.

    Donc lors de l'appel maPile.depiler, tu sors tout de suite...

    Jc

  20. #20
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    451
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 451
    Points : 287
    Points
    287
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public String toString(){ 
    	   if(suivant == null){ 
    	      return valeur + "\n";} 
    	   else
    	  return suivant + "\n" + valeur; 
     
    	}
    ok j'ai rajoute le tostring

    mais ca ne depile toujours pas (ca affiche 8 et apres 8 )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args)
    	{
    		Pile_entier maPile = new Pile_entier(8); //instanciation
    		System.out.println(maPile);
    		maPile.depiler();
    		System.out.println(maPile);
    	}

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [Débutant] Conception d'une GUI avec PyQt
    Par Franck.H dans le forum EDI/RAD
    Réponses: 4
    Dernier message: 14/04/2011, 17h21
  2. [Débutante]Conception d'une IHM
    Par asie86 dans le forum Architecture
    Réponses: 6
    Dernier message: 07/05/2008, 16h27
  3. débutante : concept de modélisation
    Par juglachant dans le forum Access
    Réponses: 2
    Dernier message: 04/01/2007, 10h12
  4. Réponses: 3
    Dernier message: 12/10/2006, 16h39
  5. Réponses: 2
    Dernier message: 10/10/2006, 12h38

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