From 7db3257e4dde63a02a2043abc0681a82e8e302c5 Mon Sep 17 00:00:00 2001 From: Yohan Boujon Date: Wed, 6 Dec 2023 17:02:52 +0100 Subject: [PATCH] TP1, Exercice 1. --- tp/include/coloriable.h | 24 +++++++++++++++++++ tp/include/figure.h | 2 +- tp/include/polygone.h | 30 +++++++++++++++++++----- tp/src/main.cpp | 34 ++++++++++++++++++++++++++- tp/src/polygone.cpp | 52 +++++++++++++++++++++++++++++------------ 5 files changed, 119 insertions(+), 23 deletions(-) create mode 100644 tp/include/coloriable.h diff --git a/tp/include/coloriable.h b/tp/include/coloriable.h new file mode 100644 index 0000000..e6c37d2 --- /dev/null +++ b/tp/include/coloriable.h @@ -0,0 +1,24 @@ +#ifndef HEADER_COLORIABLE +#define HEADER_COLORIABLE +#include + +class Coloriable { +protected: + std::string couleur; + +public: + Coloriable(std::string coul) + { + couleur = coul; + } + std::string getCouleur() + { + return couleur; + } + void setCouleur(std::string coul) + { + couleur = coul; + } +}; + +#endif // HEADER_COLORIABLE \ No newline at end of file diff --git a/tp/include/figure.h b/tp/include/figure.h index 805de01..fb06721 100644 --- a/tp/include/figure.h +++ b/tp/include/figure.h @@ -5,7 +5,7 @@ class Figure { public: - virtual int perimetre()=0; + virtual float perimetre()=0; virtual std::string afficherCaracteristiques()=0; }; diff --git a/tp/include/polygone.h b/tp/include/polygone.h index f05960c..4bd12ed 100644 --- a/tp/include/polygone.h +++ b/tp/include/polygone.h @@ -1,24 +1,30 @@ #ifndef HEADER_POLYGONE #define HEADER_POLYGONE -#include "figure.h" #include +#include "figure.h" +#include "coloriable.h" + class Polygone : public Figure { public: Polygone(u_int64_t nb_cotes); + ~Polygone(); virtual std::string afficherCaracteristiques() override; - virtual int perimetre() override; + virtual float perimetre() override; + static uint getPolyCount() { return _polycount; }; protected: u_int64_t _nbcotes; +private: + static uint _polycount; }; class Rectangle : public Polygone { public: Rectangle(uint hauteur, uint longueur); virtual std::string afficherCaracteristiques() override; - virtual int perimetre() override; + virtual float perimetre() override; protected: uint _hauteur, _longueur; @@ -29,15 +35,27 @@ public: Carre(uint cote); }; -class TriangleEquilateral : public Polygone -{ +class TriangleEquilateral : public Polygone { public: TriangleEquilateral(uint cote); virtual std::string afficherCaracteristiques() override; - virtual int perimetre() override; + virtual float perimetre() override; + private: uint _cote; float _angle; }; +class Cercle : public Polygone, public Coloriable { +public: + Cercle(uint rayon, const std::string& couleur); + virtual std::string afficherCaracteristiques() override; + virtual float perimetre() override; + uint getRayon(); + void setRayon(uint rayon); + +private: + uint _rayon; +}; + #endif // HEADER_POLYGONE \ No newline at end of file diff --git a/tp/src/main.cpp b/tp/src/main.cpp index 96501df..ef30535 100644 --- a/tp/src/main.cpp +++ b/tp/src/main.cpp @@ -1,14 +1,46 @@ #include "../include/polygone.h" +#include #include +/** + * @brief Fonction de test utilisées pour les question 1 à 5 + */ +void test(); + int main(void) +{ + // Le polymorphisme ne fonctionne qu'avec des pointeurs + Polygone* polyTab[3] = { new Carre(2), new Cercle(5, "rouge"), new TriangleEquilateral(3) }; + std::cout << "Polycount: " << Polygone::getPolyCount() << std::endl; + for (size_t i = 0; i < Polygone::getPolyCount(); i++) { + std::cout << polyTab[i]->afficherCaracteristiques() << std::endl; + std::cout << "Perimetre: " << polyTab[i]->perimetre() << std::endl; + if (i == 1) { + auto cercle = static_cast(polyTab[i]); + std::cout << "Couleur du cercle: " << cercle->getCouleur() << std::endl; + } + } + // Suppression de chaque Polygone dans le tableau + while (Polygone::getPolyCount() > 0) + delete polyTab[Polygone::getPolyCount() - 1]; + // ! WARNING: Potential memory leak (je ne sais pas pourquoi...) + return 0; +} + +void test() { Polygone coolPoly(5); std::cout << coolPoly.afficherCaracteristiques() << std::endl; - Rectangle rect(4,8); + Rectangle rect(4, 8); std::cout << rect.afficherCaracteristiques() << std::endl; Carre car(2); std::cout << car.afficherCaracteristiques() << std::endl; TriangleEquilateral tri(5); std::cout << tri.afficherCaracteristiques() << std::endl; + Cercle cer(2, "bleu"); + std::cout << cer.afficherCaracteristiques() << std::endl; + std::cout << "Perimetre du cercle: " << cer.perimetre() << std::endl; + std::cout << "On change le rayon de 5" << std::endl; + cer.setRayon(5); + std::cout << "Perimetre du cercle: " << cer.perimetre() << std::endl; } \ No newline at end of file diff --git a/tp/src/polygone.cpp b/tp/src/polygone.cpp index 6e9c6c4..e8460a4 100644 --- a/tp/src/polygone.cpp +++ b/tp/src/polygone.cpp @@ -1,10 +1,22 @@ #include "../include/polygone.h" -#include +#include "coloriable.h" + +#include #include +#include +#include + +uint Polygone::_polycount = 0; Polygone::Polygone(u_int64_t nb_cotes) : _nbcotes(nb_cotes) { + _polycount++; +} + +Polygone::~Polygone() +{ + _polycount--; } std::string Polygone::afficherCaracteristiques() @@ -12,10 +24,7 @@ std::string Polygone::afficherCaracteristiques() return std::string("Nombre de cotes : " + std::to_string(_nbcotes)); } -int Polygone::perimetre() -{ - return 0; -} +float Polygone::perimetre() { return 0; } Rectangle::Rectangle(uint hauteur, uint longueur) : Polygone(4) @@ -26,13 +35,10 @@ Rectangle::Rectangle(uint hauteur, uint longueur) std::string Rectangle::afficherCaracteristiques() { - return Polygone::afficherCaracteristiques()+std::string("\tPerimetre :"+std::to_string(perimetre())); + return Polygone::afficherCaracteristiques() + std::string("\tPerimetre :" + std::to_string(perimetre())); } -int Rectangle::perimetre() -{ - return (2*_longueur)+(2*_hauteur); -} +float Rectangle::perimetre() { return (2 * _longueur) + (2 * _hauteur); } Carre::Carre(uint cote) : Rectangle(cote, cote) @@ -43,14 +49,30 @@ TriangleEquilateral::TriangleEquilateral(uint cote) : Polygone(3) , _cote(cote) , _angle(60.0f) -{} +{ +} std::string TriangleEquilateral::afficherCaracteristiques() { - return Polygone::afficherCaracteristiques()+std::string("\tPerimetre :"+std::to_string(perimetre())+"\t Angles :"+std::to_string(_angle)); + return Polygone::afficherCaracteristiques() + std::string("\tPerimetre :" + std::to_string(perimetre()) + "\t Angles :" + std::to_string(_angle)); } -int TriangleEquilateral::perimetre() +float TriangleEquilateral::perimetre() { return 3 * _cote; } + +Cercle::Cercle(uint rayon, const std::string& couleur) + : Polygone(INFINITY) + , Coloriable(couleur) + , _rayon(rayon) { - return 3*_cote; -} \ No newline at end of file +} + +std::string Cercle::afficherCaracteristiques() +{ + return std::string("Rayon: " + std::to_string(_rayon)); +} + +float Cercle::perimetre() { return 2 * std::numbers::pi * _rayon; } + +uint Cercle::getRayon() { return _rayon; } + +void Cercle::setRayon(uint rayon) { _rayon = rayon; } \ No newline at end of file