summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--carre.cpp15
-rw-r--r--carre.h8
-rw-r--r--cercle.cpp43
-rw-r--r--cercle.h14
-rw-r--r--config.mk11
-rw-r--r--graphicus-02.cpp (renamed from graphicus-01.cpp)2
-rw-r--r--makefile46
-rw-r--r--rectangle.cpp68
-rw-r--r--rectangle.h17
-rw-r--r--vecteur.cpp70
-rw-r--r--vecteur.h39
11 files changed, 267 insertions, 66 deletions
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 <cmath>
-#include "forme.h"
+#include "cercle.h"
+#include <math.h>
-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-02.cpp
index b544cc8..b01b3a9 100644
--- a/graphicus-01.cpp
+++ b/graphicus-02.cpp
@@ -1,5 +1,5 @@
/********
- * Fichier: graphicus-01.cpp
+ * Fichier: graphicus-02.cpp
* Auteurs: C.-A. Brunet
* Date: 08 janvier 2018 (creation)
* Description: gestionnaire de tests pour l'application Graphicus. Ce
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 <iostream>
+#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();
+};
+