Programmation C++/Les classes/Exercices
Exercices
[modifier | modifier le wikicode]Dans tous ces exercices, qui sont sur le thème des transports, les mesures doivent être exprimées en double
.
Exercice 1
[modifier | modifier le wikicode]Créez une classe position2D qui vous permet de repérer un point unique sur un plan. Vous devrez prévoir tous les constructeurs et destructeurs strictement nécessaires (et uniquement ceux là), ainsi que les opérateurs d'affectation, d'égalité et la possibilité de l'envoyer dans un flux sous la forme "(x,y)". Le point est considéré comme nul si ses coordonnées sont (0,0). Cette valeur sera affectée par défaut au point (mais donner la possibilité d'initialiser les valeur à la création).
Un certain nombre de constructeurs et d'opérateurs sont définis automatiquement par le compilateur. La classe ne comportant aucun membre de type pointeur, il est inutile de les redéfinir.
class Position2D
{
public:
Position2D () : X_(0), Y_(0) {}
Position2D (double X, double Y) : X_(X), Y_(Y) {}
bool operator == (const Position2D& P) const { return X_ == P.X_ && Y_ == P.Y_;}
bool operator != (const Position2D& P) const {return !(*this == P); }
operator bool () const { return (*this == Position2D(0,0)); }
bool operator ! () const { return !static_cast<bool>(*this); }
private:
double X_, Y_;
friend std::ostream& operator << (std::ostream& o, const Position2D& P);
};
std::ostream& operator << (std::ostream& o, const Position2D& P)
{
o << '(' << P.X_ << ',' << P.Y_ << ')';
return o;
}
Le constructeur de copie et l'opérateur d'affectation sont automatiquement générés par le compilateur. Comme les membres de la classe sont de type POD, ils font le travail comme attendu. Il est donc inutile de les définir ici. Dans cet exemple, les opérateur de comparaison sont définis comme membre de classe. Il est généralement préférable de les définir hors de la classe.
Exercice 2
[modifier | modifier le wikicode]Créer une classe segment utilisant la classe position2D précédemment créé. Elle devra définir tous les jeux d'opérateurs nécessaires à son fonctionnement (les mêmes que position2D). Elle devra en plus donner la norme (la longueur) du segment. Elle devra pouvoir être envoyée dans un flux sous la forme "[(x1,y1),(x2,y2)]". Par défaut, le segment est initialisé avec les valeur "[(0,0),(1,1)]".
Exercice 3
[modifier | modifier le wikicode]Créez une classe Magicien dérivée de la classe Personnage située dans l'annexe 1. Certaines méthodes devront être réécrites pour garder la cohérence. Écrivez le moins de code possible Créez une classe Position3D dérivée de la classe Position2D située dans l'annexe 1. Certaines méthodes devront être réécrites pour garder la cohérence. Écrivez le moins de code possible.
#include <string>
class Personnage
{
public:
Personnage( std::string const & nom, size_t vie, int poids):m_nom(nom),m_vie(vie), m_poids(poids) {}
virtual void attaquer(Personnage const &) = 0;
void subirDegats(size_t degats){
m_vie = degats>m_vie? 0 : m_vie-degats;
}
bool enVie() const{
return m_vie>0;
}
int getPoids() const {
return m_poids;
}
private:
std::string m_nom;
size_t m_vie;
int m_poids; // poids en kilo
};
La manière dont un personnage attaquera un autre variera en fonction de la catégorie à laquelle il appartient et de ses capacité propre
class Magicien: Personnage
{
public:
Magicien(std::string const & nom):Personnage(nom,35,),m_mana(40){
}
void attaquer(Personnage & p){
if(mana > 10){
p.subirDegats(15);
mana -=10;
}else{
std::cout<<"pas assez de mana\n";
}
}
private:
size_t m_mana;
};
Exercice 4
[modifier | modifier le wikicode]Créez une classe Véhicule utilisant de Position3D. Ce véhicule a une vitesse et un nombre de passagers (en entier). Il a une méthode double trajet(Position3D& pos1, Position3D& pos2)
pour évaluer en combien de temps il couvre une distance (vitesse en Km/h). Vous devrez choisir correctement entre héritage et composition.
class Véhicule
{
public:
double vitesse;
int passagers;
Position3D position;
public:
Véhicule() : position(), vitesse(0), passager(0) {}
static double trajet(const Position3D& pos1, const Position3D& pos2)
{
double d = pos1.distance(pos2);
return d/v; // t = d / v
}
};
L'héritage doit répondre à la question "est un" ce qui n'est clairement pas le cas ici. Un véhicule n'est pas une position, mais sa position est une de ses propriétés. Ici, la composition est de mise. La fonction trajet ne travaille pas sur les propriétés d'une instance de classe. Elle doit donc être déclarée static et peut s'utiliser directement.
Exercice 5
[modifier | modifier le wikicode]En utilisant la classe véhicule de l'exercice précédent, créez une classe Avion. Il a un nombre maximal de passagers (qui ne pourra jamais être supérieur à 300). Vous devez pouvoir ajouter et retirer des passagers et afficher ces derniers soit tous, soit en précisant son numéro de place. Les passager sont des instances de la classe personnage de l'exercice 3. En tant qu'appareil volant il est sensible au poids. Son poids est une propriété constante exprimée en tonnes. Vous devez fournir une fonction qui donne la quantité de carburant à embarquer en mètres cube pour effectuer le vol sachant qu'il consomme 1l de kérosène par kilo pour 10 km parcouru (le kérosène est considéré comme dépourvu de poids pour cet exercice).