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