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

C++ Discussion :

Je besoin d'aide pour terminer mon code


Sujet :

C++

  1. #1
    Paulinho
    Invité(e)
    Par défaut Je besoin d'aide pour terminer mon code
    J'ai fait le code suivant:

    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
     
    #include <iostream>
    #include <cmath>
     
    using namespace std;
     
    class Pair &#123;
     
    private&#58; 
        double left;
        double right;
     
    public&#58;
        Pair&#40;&#41; &#123;left = 0; right = 0;&#125;
        Pair&#40;double l, double r&#41; &#123;left = l; right = r;&#125;
     
        void set_left&#40;double n&#41; &#123;left = n;&#125;
        void set_right&#40;double n&#41; &#123;right = n;&#125;
        double get_left&#40;&#41; const &#123;return left;&#125;
        double get_right&#40;&#41; const &#123;return right;&#125;
        virtual void print&#40;&#41; const &#123;
        	cout << "&#40;" << get_left&#40;&#41; << "," << get_right&#40;&#41; << "&#41;" << endl;&#125;
    &#125;;
     
    class Point&#58; public Pair &#123;
     
    public&#58;
        Point&#40;&#41;&#58;Pair&#40;&#41; &#123;&#125;;
        Point&#40;double x, double y&#41;&#58;Pair&#40;x,y&#41; &#123;&#125;;
     
        void set_abc&#40;int x&#41; &#123;set_left&#40;x&#41;;&#125;
        void set_ord&#40;int y&#41; &#123;set_right&#40;y&#41;;&#125;
        double get_abc&#40;&#41; &#123;return get_left&#40;&#41;;&#125;
        double get_ord&#40;&#41; &#123;return get_right&#40;&#41;;&#125;
        virtual void print&#40;&#41; const &#123;
        	cout << "&#40;" << get_left&#40;&#41; << "," << get_right&#40;&#41; << "&#41;" << endl;&#125;
    &#125;;
     
    template <class C, int I>
     
    class Pille
    &#123;
    private&#58;
        typedef struct pille_node
      &#123; 
      	C * elem;
        struct pille_node * next;
      &#125; Pille_node, * Pille_node_ptr;
     
      Pille_node_ptr pille;
     
     
    public&#58;
        Pille&#40;&#41; &#123;pille = NULL;&#125;
        int count;  
     
        virtual C pop&#40;&#41;&#123;
         if &#40;pille == NULL&#41; &#123;cout << " Pille vide " << endl;&#125;
         else &#123;Pille_node_ptr aux = pille;
         pille = pille -> next;
         delete aux;  	
         &#125;
        &#125;; 
     
        void push&#40;C& i&#41; 
        &#123; 
          Pille_node_ptr aux = new Pille_node;
          aux -> elem = &i;
          aux -> next = pille;
          pille = aux;
          &#125;
     
        virtual void printpille&#40;&#41; const
         &#123;
         	Pille_node_ptr aux = pille;
         	while &#40;aux != NULL&#41;
                &#123;aux -> elem -> print&#40;&#41;;
                 aux = aux -> next;&#125;
         &#125;
    &#125;;
     
    int main&#40;&#41;
    &#123; 
      int j = 1;
      int k = 1;
      int l = 1;
      int a, b;
      int x, y;
      int count = 1;
      Pille<Pair, 10> pp;
      while &#40;j != 0&#41; &#123;
      	cout << " Voulez-vous insérer ou éliminer un object da pille? " << endl;
      	cout << " 1. Insérer " << endl;
      	cout << " 2. Éliminer " << endl;
      	cout << " 0. Sortie " << endl;
      	cin >> j;
      	if &#40;j == 1&#41; &#123;
      		cout << " Chosis l'object que vous voulez insérer&#58; " <<endl;	                cout << " 1. Object de la class Pair " << endl;
      		cout << " 2. Object de la class Point " << endl;
      		cout << " 0. Sortie" << endl;
      		cin >> k;
      		switch&#40;k&#41; &#123;
      		case 1&#58; &#123;cout << " Introduit l'élément gauche&#58; ";
      		         cin >> a;
      		         cout << " Introduit ´l'élément droite&#58; ";
      		         cin >> b;
      		         Pair p&#40;a,b&#41;;
      		         pp.push&#40;p&#41;;
      		         count = count++;
      		         pp.printpille&#40;&#41;;
      		         cout << "Pour continuer presse dans une touche númerique ";
      		         cin >> l;
      		         break;&#125;
            case 2&#58; &#123;cout << " Introduit l'abcisse du point&#58; ";
      		         cin >> x;
      		         cout << " Introduit l'ordénné du point&#58; ";
      		         cin >> y;
      		         Point p&#40;x,y&#41;;
      		         pp.push&#40;p&#41;;Pour continuer presse dans une touche númerique ";
     
      		         count = count++;
      		         pp.printpille&#40;&#41;;
      		         cout << "
      		         cin >> l;
      		         break;&#125;
      		         j=0;
      	&#125;&#125;
        if &#40;j == 2&#41; &#123;pp.pop&#40;&#41;; pp.printpille&#40;&#41;; count=count--;break;j=0;&#125;
      	if &#40;j == 0&#41; &#123;cout << "Merci" << endl;&#125;
      &#125;
     
     
     
    &#125;;
    Il marche avec un élément dans la pille. Mais quand j'insère le deuxiéme et j'appelle pp.printpille() je vois qu'il apparaît deux fois, voire le programme disparait avec le premier élément.

    Example:

    J'insère le Pair p(1,1), pp.printpille() sort le Pair p.
    J'insère un nouveau Pair p(2,2). j'appelle pp.printpille() mais le programme sort cela:

    (2,2)
    (2,2).

    Alors que quand je faisait le code sans le while et case, ça marchais très bien.

    Je faisait ainsi:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int main&#40;&#41; &#123;
    Pille<Pair, 10> pp;
    Pair p&#40;1,1&#41;;
    pp.push&#40;p&#41;;
    Pair q&#40;2,2&#41;;
    pp.push&#40;q&#41;;
    pp.printpille&#40;&#41;;
    &#125;;
    La sortie était:

    (2,2)
    (1,1).

    Je ne comprends pas pourquoi...

    Merci d'avance.

  2. #2
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 130
    Points : 66
    Points
    66
    Par défaut
    Salut

    ton objet Par est créé dans ta boucle while
    quand tu quites ta boucle l'objet est detruit
    et toi tu mets le Par dans le Phila via l'adresse
    utilise une copie du Par et ca devrait le faire

  3. #3
    Paulinho
    Invité(e)
    Par défaut
    Salut!

    Je compris ta explication de la boucle while mais je ne sais pas comme se crie une copie de Par et l'emplacement correct. Je suis débutant et je ne comprends que peu des choses de C++.

    Merci pour ton aide!

  4. #4
    Paulinho
    Invité(e)
    Par défaut
    Je cherche partout mais je n'arrive pas a solutionner le problème. Quelqu'un a une idéé? C'est pp.push(p) qui ne fonctionne pas comme prévu dès la deuxième accèss.

    Merci a tous et bonne soirée!

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ton push stocke une référence sur un objet donc virtuellement l'adresse de cet objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Pair p&#40;a,b&#41;; 
    pp.push&#40;p&#41;;
    Comme tu utilise le même p la première et la deuxième fois, c'est le même objet qui sera empilé. Et encore parce que tu as la chance que la deuxième fois, p soit à la même adresse que la première parce que dans la réalité, le premier objet p mis par référence sur la pile a été détruit à la fin du case.
    Change le code de push pour stocker une copie de l'objet, pas une référence de l'objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main&#40;&#41; &#123; 
    Pille<Pair, 10> pp; 
    Pair p&#40;1,1&#41;; 
    pp.push&#40;p&#41;; 
    Pair q&#40;2,2&#41;; 
    pp.push&#40;q&#41;; 
    pp.printpille&#40;&#41;; 
    &#125;;
    marchait parce que tu empilais deux objets différents p et q et qu'ils n'étaient pas détruits au moment du printpille
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Paulinho
    Invité(e)
    Par défaut
    Salut!

    Mais comment faire pour stocker une copie de l'object dans push? Je ne connais pas grand chose des pointeurs, parce que je travaille et je n'ai eu la possibilité d'assister la classe de POO (C++) sur pointeurs.
    Peut tu m'aider encore?

    Un grand merci pour toi!

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Modifie la classe Pille pour y mettre un C au lieu d'un C*.
    Modifie push pour avoir la copie de l'argument
    Modifie printpille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aux -> elem.print&#40;&#41;;
    Corrige Pop qui doit renvoyer un C et qui pour le moment ne renvoie rien
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  8. #8
    Paulinho
    Invité(e)
    Par défaut
    Merveille!

    Je fait ce qui tu as dit et ça marche!!!!

    Je tente maintenant de corriger pop.

    Merci beaucoup pour ton aide!!!!!

Discussions similaires

  1. [XL-2007] Besoin d'aide pour parfaire mon code enregistrement
    Par capi81 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 14/08/2014, 17h31
  2. [XL-2007] Besoin d'aide pour améliorer mon code copier-coller
    Par capi81 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 31/07/2014, 17h14
  3. [Débutant] Besoin d'aide pour restructurer mon code autour de l'objet Process
    Par BasicZX81 dans le forum VB.NET
    Réponses: 10
    Dernier message: 01/02/2014, 17h01
  4. [VB.NET] besoin d'aide pour déchiffrer un code
    Par pcdj dans le forum Windows Forms
    Réponses: 10
    Dernier message: 27/06/2006, 12h32
  5. [VBA-E] Aide pour éxécuter mon code en cliquant sur un bouton dans excel.
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 53
    Dernier message: 29/05/2006, 14h47

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