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:
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:
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:
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 |