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

Langage C++ Discussion :

Gestion d'une classe pile de caractères en c++


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2017
    Messages : 15
    Par défaut Gestion d'une classe pile de caractères en c++
    Bonjour dans le cadre d'un tp j'ai été amené à implémenter une classe pile composée de caractères. Elle contient des methodes pour empiler, desempiler, afficher, inverser les miniscules etc. J'ai presque finie l'implémentation de ma classe ainsi que celle de mon main. Mais j'ai 2 problèmes :
    - dans le main je ne vois pas quelle condition mettre sur ma boucle for, j'ai dû mettre i<5 et me contenter de taper "salut". Puisque p.CompterElements() commence forcément par 1 ma boucle ne fonctionne pas et j'ai uniquement l'affichage manuel du premier élément de la pile.

    - dans la fonction inversemajuscule, la boucle for que j'ai mise me permet de transformer "salut" en "TULAS" or je veux "SALUT". J'ai pensé à une boucle while et l'utilisation de la fonction DesempilerElem mais je tombe sur "tuLUT"... c'est farfelu.

    main.cpp
    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
    #include <iostream>
    #include "piledechar.h"
    using std::cout;
    using std::cin;
    using std::endl;
     
    void afficheinverse(piledechar &p);
    piledechar inversemajuscule(piledechar p);
     
    int main()
    {
      int buffersize=100;
      char buffer[buffersize];
      cout<<"Entrez un mot au clavier"<<endl;
      cin.getline(buffer,buffersize);
      cout<<"chaine : "<<buffer<<endl;
      piledechar p(100,0);
      p.EmpilerElem(buffer[0]);//empiler le premier élément de la pile pour eviter la condition i< mSommet=0
      for(int i=1; i<5;i++){
        p.EmpilerElem(buffer[i]); 
      }
      p.AfficherPile();
      cout<<"La chaine inversée : ";
      afficheinverse(p);
      piledechar q= inversemajuscule(p);
      afficheinverse(q);
        return 0;
    }
     
    void afficheinverse(piledechar &p)
    {
      if (p.CompterElements() >0){
        for(int i=p.CompterElements();i>0; i--){
          cout<<p.getElem(i); //impossible d'atteindre la valeur p.mPile[0] donc on l'extrait en dehors de la boucle
        }
        cout<<p.getElem(0)<<endl;
      }
      else
        cout<<"La pile est vide! \n";
    }
    piledechar inversemajuscule(piledechar p)
    {
      char res;
      piledechar nPile= piledechar(p);
      int i=0;
      /*while(i<p.CompterElements())
      {
          res=p.DesempilerElem();
          if(res >='a' && res <='z'){
              res -=32;
              //nPile.setElem(res,i);
          }
          nPile.setElem(res,i);
          i++;
      }*/
     
      for(int i=0;i<p.CompterElements();i++){
        if(nPile.getElem(i)>='a' && nPile.getElem(i)<='z'){
          res= nPile.getElem(i)-32;
          nPile.setElem(res,i);
        }
      nPile.setElem(res,i);
     
      }
     
      return nPile;
    }
    piledechar.cpp
    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
    #include "piledechar.h"
    #include <iostream>
    //on importe ce dont on a besoin depuis de la librairie std
    using std::cout;
    using std::endl;
     
    piledechar::piledechar(int mM=100, int mS=0)
    {
      cout<<"Création d'une pile \n";
      mMax=mM;
      mSommet=mS;
      mPile=new char[mMax];
    }
    bool piledechar::estVide()
    {
        if(mSommet>0)
        {      
            return false;
        }
        else 
            cout<<"La pile est vide"<<endl;
            return true;
    }
    piledechar::piledechar(const piledechar &p)
    {
      cout<<"Création d'une pile \n";
      mPile=new char[p.mMax];
      this->mMax=p.mMax;
      this->mSommet=p.mSommet;
      for(int i=0;i<mSommet;i++)
      {
          mPile[i]=p.mPile[i];
      }
    }
    piledechar::~piledechar()
    {
      cout<<"Destruction d'une pile \n";
      delete [] mPile;
    }
    int piledechar:: CompterElements(){
        if (!estVide())
            return mSommet;
    }
    void piledechar:: AfficherPile(){
        if (!estVide())
        {
            for(int i=0;i<mSommet;i++){
                cout<<"[ "<<mPile[i]<<" ]\n";
            }
        }
    }
    void piledechar::EmpilerElem(char c)
    {
      if(mSommet <mMax){//si la pile n'est pas pleine
      mPile[mSommet]=c;
      ++mSommet;
      }
      else
        cout<<"Pile pleine \n";
    }
     
    char piledechar::DesempilerElem()
    {
      if (!estVide())//si la pile n'est pas vide
        return mPile[--mSommet]; //valeur en dessous du sommet
     
    }
    char piledechar::getElem(int num)
    {
        return mPile[num];
    }
    void piledechar:: setElem(char c,int num) //besoin d'un setter pour pouvoir modifier les éléments dans le main
    {
        mPile[num]=c;
    }
    piledechar.h
    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
    #ifndef PILEDECHAR_H
    #define PILEDECHAR_H
    #include <iostream>
     
    using std::cout;
    class piledechar
    {
     public:
      int CompterElements();//renvoi de la valeur de mSommet
      void AfficherPile();
      void EmpilerElem(char c);
      char DesempilerElem();
      char getElem(int num);
      void setElem(char c, int num);
      bool estVide();
      piledechar(int mM, int mS);
      piledechar(const piledechar &p);
      ~piledechar();
     
     private:
      int mMax; //taille de la pile crée
      int mSommet; //numéro de la case vide
      char*mPile; //pointeur
     
    };
     
    #endif // PILEDECHAR_H

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2017
    Messages : 15
    Par défaut
    Update: Je viens de régler le deuxième problème, j'avais utilisé la fonction afficheinverse au lieu de AfficherPile.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/05/2007, 15h28
  2. Réponses: 2
    Dernier message: 29/03/2007, 14h08
  3. Bien programmer une classe avec sa gestion d'erreur
    Par chris81 dans le forum Framework .NET
    Réponses: 8
    Dernier message: 13/02/2007, 18h13
  4. [VB6] Sortir d'une classe par gestion d'évènement (Timer) externe ...
    Par marsup54 dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 04/05/2006, 23h13
  5. [Tableau][Base]Création d'une classe de gestion de tableau
    Par mariogarcia dans le forum Collection et Stream
    Réponses: 40
    Dernier message: 05/11/2005, 01h19

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