Corrigé du TD 5 : chaînes de caractères, cartes à jouer

Chaînes de caractères

Fichier ''String.h''

#ifndef String_h
#define String_h
 
class String
{
public :
    String();
    String(String const & autre);
    String const & operator=(String const & autre);
    ~String();
 
    String(char const * src);
 
    int size() const;
    char operator[](int i) const;
    String const & operator+=String const & autre);
    int find(String const & autre) const;
    void replace(int position, String const & autre);
 
private :
    int taille;
    char* data;
};
 
String operator+(String const & s1, String const & s2);
bool operator<(String const & s1, String const & s2);
 
std::ostream & operator<<(std::ostream & stream, String const & str);
 
#endif

Fichier ''String.cpp''

String::String()
: taille(0), data(NULL)
{
}
 
String::String(String const & autre)
: taille(0), data(NULL)
{
    operator=(autre);
}
 
String::String const & operator=(String const & autre)
{
    if(this!=&autre)
    {
        if(data!=NULL)
        {
            delete[] data;
        }
        taille = autre.size();
        data = new char[taille];
        for(int i=0; i<taille; ++i)
        {
            data[i] = autre[i];
        }
    }
    return (*this);
}
 
String::~String()
{
    delete[] data;
}
 
String::String(char const * src)
{
    taille = strlen(src);
    data = new char[taille];
    for(int i=0; i<taille; ++i)
    {
        data[i] = src[i];
    }
}
 
int String::size() const
{
    return taille;
}
 
char String::operator[](int i) const
{
    return data[i];
}
 
String const & String::operator+=String const & autre)
{
    if(size()==0)
    {
        operator=(autre);
    }
    else if(autre.size()!=0)
    {
        int nouvelleTaille = taille + autre.size();
        char nouveauData = new char[nouvelleTaille];
        for(int i=0; i<taille; ++i)
        {
            nouveauData[i] = data[i];
        }
        for(int i=0; i<autre.size(); ++i)
        {
            nouveauData[i+taille] = autre[i];
        }
        delete[] data;
        taille = nouvelleTaille;
        data = nouveauData;
    }
 
    return (*this);
}
 
int String::find(String const & autre) const
{
    if(taille<autre.taille) return -1;
 
    int i=0;
    bool trouve=false;
    while(i<taille && !trouve)
    {
        int j=0;
        while(data[i+j] == autre[j] && j<autre.size() )
        {
            ++j;
        }
        if(j==autre.size())
        {
            trouve = true;
        }
        else
        {
            ++i;
        }
    }
 
    return ( trouve?i:-1 );
}
 
void String::replace(int position, String const & autre)
{
    int const nouvelleTaille = std::max(position+autre.taille, taille);
 
    char* nouveauTableau = new char[nouvelleTaille];
    for(int i=0; i<position; ++i)
    {
        nouveauTableau[i] = data[i];
    }
    for(int i=position; i<position+autre.taille; ++i)
    {
        nouveauTableau[i] = autre[i];
    }
    for(int i=position+autre.taille; i<nouvelleTaille; ++i)
    {
        nouveauTableau[i] = data[i];
    }
 
    delete[] data;
    data = nouveauTableau;
    taille = nouvelleTaille;
}
 
String operator+(String const & s1, String const & s2)
{
    String resultat(s1);
    resultat += s2;
    return resultat;
}
 
bool operator<(String const & s1, String const & s2)
{
    int const tailleMin = std::min(s1.size(), s2.size());
 
    for(int i=0; i<tailleMin; ++i)
    {
        if(s1[i]<s2[i]) return true;
        else if(s1[i]>s2[i]) return false;
        // sinon on continue
    }
 
    // Les deux chaines sont egales
    return false;
}
 
std::ostream & operator<<(std::ostream & stream, String const & str)
{
    for(int i=0; i<str.size(); ++i)
    {
        stream << str[i];
    }
    return stream;
}

Cartes à jouer

Rang

''Fichier rang.h''

#ifndef rang_h
#define rang_h
 
enum Rang
{
    as,
    deux,
    trois,
    quatre,
    cinq,
    six,
    sept,
    huit,
    neuf,
    dix,
    valet,
    dame,
    roi
}; // enum Rang
 
Rang & operator++(Rang & r);
Rang operator++(Rang & r, int);
 
Rang & operator--(Rang & r);
Rang operator--(Rang & r, int);
 
#endif // rang_h

Fichier ''rang.cpp''

#include "rang.h"
 
Rang& operator++(Rang & r)
{
    int rangInt = r;
 
    if(r==roi)
    {
        rangInt = as;
    }
    else
    {
        ++rangInt;
    }
 
    r = Rang(rangInt);
 
    return r;
}
 
Rang operator++(Rang & r, int)
{
    Rang ancienRang = r;
    ++r;
    return ancienRang;
}
 
Rang& operator--(Rang & r)
{
    int rangInt = r;
 
    if(r==as)
    {
        rangInt = roi;
    }
    else
    {
        ++rangInt;
    }
 
    r = Rang(rangInt);
 
    return r;
}
 
Rang operator--(Rang & r, int)
{
    Rang ancienRang = r;
    --r;
    return ancienRang;
}

Couleur

Fichier ''couleur.h''

#ifndef couleur_h
#define couleur_h
 
enum Couleur
{
    trefle,
    carreau,
    coeur,
    pique
}; // enum Couleur
 
Couleur & operator++(Couleur & c);
Couleur operator++(Couleur & c, int);
 
Couleur & operator--(Couleur & c);
Couleur operator--(Couleur & c, int);
 
#endif // couleur_h

Fichier ''couleur.cpp''

#include "couleur.h"
 
Couleur& operator++(Couleur & c)
{
    int couleurInt = c;
 
    if(c==pique)
    {
        couleurInt = trefle;
    }
    else
    {
        ++couleurInt;
    }
 
    c = Couleur(couleurInt);
 
    return c;
}
 
Couleur operator++(Couleur & c, int)
{
    Couleur ancienneCouleur = c;
    ++c;
    return ancienneCouleur;
}
 
Couleur& operator--(Couleur & c)
{
    int couleurInt = c;
 
    if(c==trefle)
    {
        couleurInt = pique;
    }
    else
    {
        --couleurInt;
    }
 
    c = Couleur(couleurInt);
 
    return c;
}
 
Couleur operator--(Couleur & c, int)
{
    Couleur ancienneCouleur = c;
    --c;
    return ancienneCouleur;
}

Carte

Fichier ''carte.h''

#ifndef carte_h
#define carte_h
 
#include "rang.h"
#include "couleur.h"
 
struct Carte
{
 
    Rang rang;
    Couleur couleur;
 
    // La carte n'est pas initialisee
    Carte();
 
    Carte(Rang r, Couleur c);
 
    // Le constructeur de copie genere est correct
    // Le destructeur genere est correct
    // L'operateur d'affectation genere est correct
 
    Carte& operator++();
    Carte operator++(int);
 
    Carte& operator--();
    Carte operator--(int);
 
}; // struct Carte
 
bool operator<(Carte c1, Carte c2);
bool operator>(Carte c1, Carte c2);
 
#endif // carte_h

Fichier ''carte.cpp''

#include "carte.h"
 
Carte::Carte()
{
    // rien
}
 
Carte::Carte(Rang r, Couleur c)
: rang(r), couleur(c)
{
    // rien d'autre
}
 
Carte& Carte::operator++()
{
    if(rang==roi)
    {
        ++couleur;
    }
    ++rang;
 
    return (*this);
}
 
Carte Carte::operator++(int)
{
    Carte ancienneCarte = *this;
    operator++();
 
    return ancienneCarte;
}
 
Carte& Carte::operator--()
{
    if(rang==as)
    {
        --couleur;
    }
    --rang;
 
    return (*this);
}
 
Carte Carte::operator--(int)
{
    Carte ancienneCarte = *this;
    operator--();
 
    return ancienneCarte;
}
 
bool operator<(Carte c1, Carte c2)
{
    return (c1.couleur < c2.couleur || (c1.couleur == c2.couleur && c1.rang < c2.rang) );
}
 
bool operator>(Carte c1, Carte c2)
{
    return (c1.couleur > c2.couleur || (c1.couleur == c2.couleur && c1.rang > c2.rang) );
}

Exemple d'utilisation

#include "carte.h"
 
#include <iostream>
 
int main()
{
        Carte c(roi, carreau);
 
        Carte c2 = c;
 
        ++c;
 
        std::cout << (c<c2) << " " << (c2<c) << std::endl;
}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>