From b4f16386c70bfeab700e7cc129f2f04295aa0059 Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Thu, 12 Jan 2023 23:40:59 -0500 Subject: vecteur est fomrmes sont finis --- carre.cpp | 15 ++++++++++++ carre.h | 8 +++++++ cercle.cpp | 43 +++++++++++++++++++--------------- cercle.h | 14 ++++++++++++ config.mk | 11 +++++++++ graphicus-01.cpp | 18 --------------- graphicus-02.cpp | 18 +++++++++++++++ makefile | 46 +++++++++++++++++++++++++++++-------- rectangle.cpp | 68 ++++++++++++++++++++++++------------------------------ rectangle.h | 17 ++++++++++++++ vecteur.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ vecteur.h | 39 +++++++++++++++++++++++++++++++ 12 files changed, 284 insertions(+), 83 deletions(-) create mode 100644 carre.cpp create mode 100644 carre.h create mode 100644 cercle.h create mode 100644 config.mk delete mode 100644 graphicus-01.cpp create mode 100644 graphicus-02.cpp create mode 100644 rectangle.h create mode 100644 vecteur.cpp create mode 100644 vecteur.h diff --git a/carre.cpp b/carre.cpp new file mode 100644 index 0000000..1d0ad44 --- /dev/null +++ b/carre.cpp @@ -0,0 +1,15 @@ +#include "carre.h" + +Carre::Carre(int x, int y, int cote) : Rectangle(x, y, cote, cote) { +}; + +Carre::~Carre() { +}; + +void Carre::afficher(ostream &s) { + s << "Carre(x=" << getAncrage().x + << ", y=" << getAncrage().y + << ", c=" << getLargeur() + << ", a=" << getAire() + << ")\n"; +}; diff --git a/carre.h b/carre.h new file mode 100644 index 0000000..80b9d57 --- /dev/null +++ b/carre.h @@ -0,0 +1,8 @@ +#include "rectangle.h" + +class Carre : public Rectangle { +public: + Carre(int x, int y, int cote); + ~Carre(); + void afficher(ostream &s); +}; diff --git a/cercle.cpp b/cercle.cpp index 100291b..4747258 100644 --- a/cercle.cpp +++ b/cercle.cpp @@ -1,27 +1,34 @@ -#include -#include "forme.h" +#include "cercle.h" +#include -class Cercle:Forme { - private: - int Rayon; - public: +Cercle::Cercle(int x, int y, int r):Forme(x,y) { + Coordonnee xy = {x,y}; + setAncrage(xy); + setRayon(r); +}; + +Cercle::~Cercle() { +}; - Cercle(int x, int y, int r):Forme(x,y),Rayon(r) { - Coordonnee t = {x,y}; - setAncrage(t); - SetRayon(r); +void Cercle::setRayon(int r) { + rayon = r; +}; - }; +int Cercle::getRayon() { + return rayon; +}; + +double Cercle::getAire() { + return M_PI*pow(rayon,2); +}; - void afficher(ostream & s); - int GetRayon(){return Rayon;}; - void SetRayon(int r){Rayon=r;}; - double aire(){return M_PI*Rayon*Rayon;}; - double perimetre(){return 2*M_PI*Rayon;}; +double Cercle::getPerimetre() { + return 2*M_PI*rayon; }; void Cercle::afficher(ostream & s) { s << "Cercle (x=" << getAncrage().x - << ", y=" << getAncrage().y - << ", r=" << GetRayon() << ", aire=" << aire() << ")"; + << ", y=" << getAncrage().y + << ", r=" << getRayon() + << ", aire=" << getAire() << ")\n"; }; diff --git a/cercle.h b/cercle.h new file mode 100644 index 0000000..d3eca66 --- /dev/null +++ b/cercle.h @@ -0,0 +1,14 @@ +#include "forme.h" + +class Cercle:Forme { + private: + int rayon; + public: + Cercle(int x, int y, int r); + ~Cercle(); + void setRayon(int r); + int getRayon(); + double getAire(); + double getPerimetre(); + void afficher(ostream & s); +}; diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..adcbe37 --- /dev/null +++ b/config.mk @@ -0,0 +1,11 @@ + +SHELL = /bin/bash + +# c++ compiler flags that are used for all targets: +# they make binaries faster and smaller +# -s : strips the binary +# -O3 : optimizes the binary +# -Ofast : optimizes the binary +# -march=native : optimizes the binary for the current CPU +# -flto : link time optimization +CFLAGS = -Ofast -march=native -flto -s diff --git a/graphicus-01.cpp b/graphicus-01.cpp deleted file mode 100644 index b544cc8..0000000 --- a/graphicus-01.cpp +++ /dev/null @@ -1,18 +0,0 @@ -/******** - * Fichier: graphicus-01.cpp - * Auteurs: C.-A. Brunet - * Date: 08 janvier 2018 (creation) - * Description: gestionnaire de tests pour l'application Graphicus. Ce - * fichier fait partie de la distribution de Graphicus. -********/ -#include "tests.h" - -using namespace std; - -int main() { - Tests tests; - - tests.tests_application(); - return 0; -} - diff --git a/graphicus-02.cpp b/graphicus-02.cpp new file mode 100644 index 0000000..b01b3a9 --- /dev/null +++ b/graphicus-02.cpp @@ -0,0 +1,18 @@ +/******** + * Fichier: graphicus-02.cpp + * Auteurs: C.-A. Brunet + * Date: 08 janvier 2018 (creation) + * Description: gestionnaire de tests pour l'application Graphicus. Ce + * fichier fait partie de la distribution de Graphicus. +********/ +#include "tests.h" + +using namespace std; + +int main() { + Tests tests; + + tests.tests_application(); + return 0; +} + diff --git a/makefile b/makefile index 86bcbe2..db6d4eb 100644 --- a/makefile +++ b/makefile @@ -1,27 +1,55 @@ # # Auteur: C.-A. Brunet # Date: 08 janvier 2018 -# Description: compilation de graphicus-01. Ce fichier fait partie de +# Description: compilation de graphicus-02. Ce fichier fait partie de # la distribution de Graphicus. # -graphicus-01: graphicus-01.o tests.o canevas.o couche.o forme.o - g++ -o graphicus-01 graphicus-01.o tests.o canevas.o couche.o forme.o +ALL := graphicus-02.o tests.o canevas.o couche.o forme.o vecteur.o cercle.o rectangle.o carre.o + + +include config.mk + +graphicus-02: $(ALL) + g++ ${CFLAGS} -o $@ $^ && strip $@ $^ + +# graphicus-02: $(ALL) +# g++ ${CFLAGS} -o $@ $^ -graphicus-01.o: graphicus-01.cpp canevas.h couche.h forme.h - g++ -c graphicus-01.cpp tests.o: tests.cpp tests.h canevas.h couche.h forme.h - g++ -c tests.cpp + g++ ${CFLAGS} -c tests.cpp canevas.o: canevas.cpp canevas.h couche.h forme.h - g++ -c canevas.cpp + g++ ${CFLAGS} -c canevas.cpp couche.o: couche.cpp couche.h forme.h - g++ -c couche.cpp + g++ ${CFLAGS} -c couche.cpp forme.o: forme.cpp forme.h - g++ -c forme.cpp + g++ ${CFLAGS} -c forme.cpp + +vecteur.o: vecteur.cpp vecteur.h coordonnee.h + g++ ${CFLAGS} -c vecteur.cpp + +rectangle.o: rectangle.cpp rectangle.h forme.h + g++ ${CFLAGS} -c rectangle.cpp + +carre.o: carre.cpp carre.h rectangle.h forme.h + g++ ${CFLAGS} -c carre.cpp + +cercle.o: cercle.cpp cercle.h forme.h + g++ ${CFLAGS} -c cercle.cpp + +graphicus-02.o: graphicus-02.cpp canevas.h couche.h forme.h + g++ ${CFLAGS} -c graphicus-02.cpp clean: rm -f *.o + +options: + @echo "Option de compilation de GRAPHICUS:" + @echo " graphicus-02: Construction de l'executable dans sa totalité" + @echo " clean: Nettoyage des fichiers temporaires '.o'" + @echo " *.o: Construction des fichiers objets" + diff --git a/rectangle.cpp b/rectangle.cpp index f719ff9..239ea81 100644 --- a/rectangle.cpp +++ b/rectangle.cpp @@ -1,52 +1,44 @@ -#include "forme.h" +#include "rectangle.h" -class Rectangle:Forme{ - private: - int Largeur; - int Hauteur; +Rectangle::Rectangle(int x, int y, int w, int h){ + Coordonnee xy = {x, y}; + setAncrage(xy); + setLargeur(w); + setHauteur(h); +}; - public: +Rectangle::~Rectangle(){ +}; - Rectangle(int x, int y, int l, int h):Forme(x,y),Largeur(l),Hauteur(h){ - Coordonnee t = {x,y}; - setAncrage(t); - SetHauteur(h); - SetLargeur(l); - }; +int Rectangle::getLargeur(){ + return largeur; +}; - int GetLargeur(){return Largeur;}; - int GetHauteur(){return Hauteur;}; - void SetLargeur(int l){Largeur=l;}; - void SetHauteur(int h){Hauteur=h;}; - double aire(){return Largeur*Hauteur;}; - void afficher(ostream &s); +int Rectangle::getHauteur(){ + return hauteur; }; -void Rectangle::afficher(ostream &s){ - // Resultat: "Rectangle (x=2, y=3, h=4, l=5, aire=5)" - s << "Rectangle (x=" << getAncrage().x - << ", y=" << getAncrage().y - << ", h=" << GetHauteur() - << ", l=" << GetLargeur() - << ", aire=" << aire() - << ")\n"; - /* << ")" << endl; */ +Coordonnee Rectangle::getAncrageForme(){ + return getAncrage(); }; -class Carre:Rectangle{ - public: +void Rectangle::setLargeur(int l){ + largeur=l; +}; - Carre(int x, int y, int c):Rectangle(x,y,c,c){}; +void Rectangle::setHauteur(int h){ + hauteur=h; +}; - void afficher(ostream &s); +double Rectangle::getAire(){ + return largeur*hauteur; }; -Carre::afficher(osstream &s){ - // Resultat: "Carre (x=2, y=3, c=4, aire=5)" - s << "Carre (x=" << getAncrage().x - << ", y=" << getAncrage().y - << ", c=" << GetHauteur() - << ", aire=" << aire() +void Rectangle::afficher(ostream &s){ + s << "Rectangle:(x=" << getAncrageForme().x + << ", y=" << getAncrageForme().y + << ", l=" << getLargeur() + << ", h=" << getHauteur() + << ", aire=" << getAire() << ")\n"; - /* << ")" << endl; */ }; diff --git a/rectangle.h b/rectangle.h new file mode 100644 index 0000000..3bdc8a1 --- /dev/null +++ b/rectangle.h @@ -0,0 +1,17 @@ +#include "forme.h" + +class Rectangle:public Forme{ + private: + int largeur; + int hauteur; + public: + Rectangle(int x, int y, int l, int h); + ~Rectangle(); + int getLargeur(); + int getHauteur(); + Coordonnee getAncrageForme(); + void setLargeur(int l); + void setHauteur(int h); + double getAire(); + void afficher(ostream &s); +}; diff --git a/vecteur.cpp b/vecteur.cpp new file mode 100644 index 0000000..d9a560c --- /dev/null +++ b/vecteur.cpp @@ -0,0 +1,70 @@ +#include "vecteur.h" + +Vecteur::Vecteur(){ + capacite = 1; + taille = 0; + formes = new Forme*[capacite]; +} + +Vecteur::~Vecteur(){ + vider(); + delete[] formes; +} + +bool Vecteur::estVide(){ + return (taille == 0); +}; + +Forme *Vecteur::getForme(int index){ + return (index < 0 || index >= taille) ? NULL : formes[index]; +}; + +int Vecteur::getTaille(){ + return taille; +}; + +void Vecteur::afficher(ostream &s){ + for (int i = 0; i < taille; i++) { + formes[i]->afficher(s); + } +}; + +bool Vecteur::ajouterForme(Forme *f) { + if (taille == capacite) { + // Double the size of the array + int newCapacite = capacite * 2; + Forme **newFormes = new (nothrow) Forme*[newCapacite]; + if(newFormes==nullptr) return false; + for (int i = 0; i < taille; i++) { + newFormes[i] = formes[i]; + } + capacite = newCapacite; + delete[] formes; + formes = newFormes; + } + formes[taille] = f; + taille++; + return true; +}; + +Forme *Vecteur::supprimerForme(int index) { + Forme *f = formes[index]; + while (index < taille) { + formes[index] = formes[index + 1]; + index++; + } + formes[taille] = NULL; + taille--; + return f; +}; + +void Vecteur::vider() { + for (int i = 0; i < taille; i++) { + delete formes[i]; + } + capacite = 1; + taille = 0; + Forme **newFormes = new Forme*[capacite]; + delete[] formes; + formes = newFormes; +} diff --git a/vecteur.h b/vecteur.h new file mode 100644 index 0000000..58843f7 --- /dev/null +++ b/vecteur.h @@ -0,0 +1,39 @@ +#include +#include "forme.h" + +using namespace std; + +// - [x] Items stockés sont des pointeurs de Forme +// - [ ] Items toujours contigus en mémoire +// - [ ] connaître la capacité maximale du vecteur +// - [ ] connaître la taille courante du vecteur +// - [ ] Lorsqu'il manque d'espace pour ajouter une forme, +// le vecteur double sa capacité +// - [ ] vider le vecteur en un seul appel +// - [ ] lorsque le vecteur est vidé, détruire ses formes +// - [ ] savoir si le vecteur est vide (bool) +// - [ ] ajouter une forme à la fin du vecteur (true si ok) +// - [ ] supprimer une forme à un index (retourne la forme) NULL on error +// - [ ] récupérer une forme à un index (retourne la forme) NULL on error +// - [ ] afficher le vecteur en utilisant Forme::afficher() + +class Vecteur { + private: + int capacite; // capacité maximale actuelle du vecteur + int taille; + // dynamic array of pointers to Forme + Forme **formes; + public: + Vecteur(); + ~Vecteur(); + // Informations + bool estVide(); + Forme *getForme(int index); + int getTaille(); + void afficher(ostream &s); + // Manipulations + bool ajouterForme(Forme *f); + Forme *supprimerForme(int index); + void vider(); +}; + -- cgit v1.2.3