fix issues
This commit is contained in:
parent
616d08822e
commit
8d3b9973a6
8 changed files with 31 additions and 31 deletions
4
TODO.md
4
TODO.md
|
@ -39,12 +39,12 @@ TODO avant rendu :
|
||||||
- [x] Tâche `début`
|
- [x] Tâche `début`
|
||||||
- [x] Tâche `fin`
|
- [x] Tâche `fin`
|
||||||
- Méthodes (cf. le PDF du prof) **⇒ Tout ça avec l'ordre topologique**
|
- Méthodes (cf. le PDF du prof) **⇒ Tout ça avec l'ordre topologique**
|
||||||
|
|
||||||
- Pas de méthode d'ajout d'un objet `Tache`
|
- Pas de méthode d'ajout d'un objet `Tache`
|
||||||
- [x] `bool ajoute(nom, durée)` : sélectionne au hasard 2 tâches déjà
|
- [x] `bool ajoute(nom, durée)` : sélectionne au hasard 2 tâches déjà
|
||||||
enregistrer et **ajoute** la nouvelle tâche entres-elles
|
enregistrer et **ajoute** la nouvelle tâche entres-elles
|
||||||
- [x] `bool ajoute(nom, durée, id)` : **déplace** une tâche qui doit se réaliser
|
- [x] `bool ajoute(nom, durée, id)` : **ajoute** une tâche qui doit se réaliser
|
||||||
**après** la tâche qui à l'`id` correspondant (et avant la tâche finale)
|
**après** la tâche qui à l'`id` correspondant (et avant la tâche finale)
|
||||||
**⇒ création d'une dépendance**
|
|
||||||
- [x] `bool ajoute(nom, durée, id1, id2)` : **ajoute** une tâche entre les 2 tâches
|
- [x] `bool ajoute(nom, durée, id1, id2)` : **ajoute** une tâche entre les 2 tâches
|
||||||
qui ont l'identifiant `id1` et `id2`
|
qui ont l'identifiant `id1` et `id2`
|
||||||
- [x] Surcharge de `<<`
|
- [x] Surcharge de `<<`
|
||||||
|
|
|
@ -43,7 +43,10 @@ protected:
|
||||||
const std::vector<Tache *> consult_tasks() const;
|
const std::vector<Tache *> consult_tasks() const;
|
||||||
|
|
||||||
// Corrige les éventuelles anomalies du vector de tâches
|
// Corrige les éventuelles anomalies du vector de tâches
|
||||||
std::vector<Tache *> topologicalSort();
|
void topologicalSort();
|
||||||
|
|
||||||
|
// Remet tous les marquages à leur valeur initiale
|
||||||
|
virtual void cleanMarks() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -14,7 +14,6 @@ public:
|
||||||
ProtoProjet(const ProtoProjet &); // copy constructor
|
ProtoProjet(const ProtoProjet &); // copy constructor
|
||||||
const ProtoProjet &operator=(const ProtoProjet &); // copy assignement
|
const ProtoProjet &operator=(const ProtoProjet &); // copy assignement
|
||||||
|
|
||||||
// Remet tous les marquages à leur valeur initiale
|
|
||||||
void cleanMarks() const;
|
void cleanMarks() const;
|
||||||
|
|
||||||
// Insère une nouvelle tâche en la plaçant entre deux tâches au hasard
|
// Insère une nouvelle tâche en la plaçant entre deux tâches au hasard
|
||||||
|
|
|
@ -51,7 +51,7 @@ public:
|
||||||
int dureeParal() const;
|
int dureeParal() const;
|
||||||
|
|
||||||
// Parcours en profondeur
|
// Parcours en profondeur
|
||||||
void PP_postfixe(std::vector<Tache *>);
|
void PP_postfixe(std::vector<Tache *> &);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "../includes/Projet.hpp"
|
#include "../includes/Projet.hpp"
|
||||||
|
|
||||||
Projet::Projet() : debut(new Tache("Début", 0)), fin(new Tache("Fin", 0)) {
|
Projet::Projet() : debut(new Tache("Début", 0)), fin(new Tache("Fin", 0)) {
|
||||||
fin->depends_from(*debut);
|
fin->ajouteDependance(*debut);
|
||||||
|
|
||||||
taches.push_back(fin);
|
taches.push_back(fin);
|
||||||
taches.push_back(debut);
|
taches.push_back(debut);
|
||||||
|
@ -13,7 +13,8 @@ void Projet::_copy(const Projet &src) {
|
||||||
// Copie des tâches
|
// Copie des tâches
|
||||||
taches.reserve(src.taches.size());
|
taches.reserve(src.taches.size());
|
||||||
for (Tache *t : src.taches) {
|
for (Tache *t : src.taches) {
|
||||||
taches.push_back(new Tache(*t));
|
Tache *tache = new Tache(*t);
|
||||||
|
taches.push_back(tache);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +41,7 @@ const Projet &Projet::operator=(const Projet &src) {
|
||||||
|
|
||||||
std::ostream &operator<<(std::ostream &out, const Projet &data) {
|
std::ostream &operator<<(std::ostream &out, const Projet &data) {
|
||||||
for (Tache *t : data.taches) {
|
for (Tache *t : data.taches) {
|
||||||
out << *t << " ";
|
out << *t << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
|
@ -55,8 +56,7 @@ const std::pair<const int, const int> Projet::pick_two_random_tasks() const {
|
||||||
Tache *tache1 = this->taches[rand1];
|
Tache *tache1 = this->taches[rand1];
|
||||||
Tache *tache2 = this->taches[rand2];
|
Tache *tache2 = this->taches[rand2];
|
||||||
|
|
||||||
// - tache2 ne doit pas dépendre transitivement de tache1
|
// tache2 ne doit pas dépendre transitivement de tache1
|
||||||
// - permet aussi de vérifier si tache1 == tache2
|
|
||||||
if (tache2->depends_from(*tache1)) {
|
if (tache2->depends_from(*tache1)) {
|
||||||
return pick_two_random_tasks();
|
return pick_two_random_tasks();
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ Tache *Projet::contains(const std::string name) const {
|
||||||
|
|
||||||
const std::vector<Tache *> Projet::consult_tasks() const { return taches; }
|
const std::vector<Tache *> Projet::consult_tasks() const { return taches; }
|
||||||
|
|
||||||
std::vector<Tache *> Projet::topologicalSort() {
|
void Projet::topologicalSort() {
|
||||||
// Construction de la pile
|
// Construction de la pile
|
||||||
std::vector<Tache *> pile;
|
std::vector<Tache *> pile;
|
||||||
for (Tache *it : taches) {
|
for (Tache *it : taches) {
|
||||||
|
@ -97,9 +97,12 @@ std::vector<Tache *> Projet::topologicalSort() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Nettoyage des marques
|
||||||
|
cleanMarks();
|
||||||
|
|
||||||
// Reverse de la pile
|
// Reverse de la pile
|
||||||
std::reverse(pile.begin(), pile.end());
|
std::reverse(pile.begin(), pile.end());
|
||||||
|
|
||||||
// Renvoie la liste de tâches topologiquement triée
|
// Modifie la liste des tâches topologiquement triée
|
||||||
return pile;
|
taches = pile;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ const ProtoProjet &ProtoProjet::operator=(const ProtoProjet &src) {
|
||||||
|
|
||||||
std::ostream &operator<<(std::ostream &out, const ProtoProjet &data) {
|
std::ostream &operator<<(std::ostream &out, const ProtoProjet &data) {
|
||||||
for (Tache *t : data.taches) {
|
for (Tache *t : data.taches) {
|
||||||
out << *t << " ";
|
out << *t << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
|
@ -53,12 +53,7 @@ bool ProtoProjet::ajoute(const std::string nom, const int duree, const int id1,
|
||||||
|
|
||||||
// Création des dépendances
|
// Création des dépendances
|
||||||
Tache *tache = new Tache(nom, duree);
|
Tache *tache = new Tache(nom, duree);
|
||||||
if (!tache1->ajouteDependance(*tache)) {
|
if (!tache1->ajouteDependance(*tache) && !tache->ajouteDependance(*tache2)) {
|
||||||
// Problème de dépendance
|
|
||||||
delete tache;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!tache->ajouteDependance(*tache2)) {
|
|
||||||
// Problème de dépendance
|
// Problème de dépendance
|
||||||
delete tache;
|
delete tache;
|
||||||
return false;
|
return false;
|
||||||
|
@ -66,6 +61,6 @@ bool ProtoProjet::ajoute(const std::string nom, const int duree, const int id1,
|
||||||
|
|
||||||
// Mise à jour du vecteur avec tri topologique
|
// Mise à jour du vecteur avec tri topologique
|
||||||
taches.push_back(tache);
|
taches.push_back(tache);
|
||||||
taches = topologicalSort();
|
topologicalSort();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ int Tache::counter_id = 0;
|
||||||
|
|
||||||
Tache::Tache(const std::string n, const int duree)
|
Tache::Tache(const std::string n, const int duree)
|
||||||
: duree_total(duree), etat(EnAttente), dependances(std::vector<Tache *>()),
|
: duree_total(duree), etat(EnAttente), dependances(std::vector<Tache *>()),
|
||||||
unique_id(++counter_id), name(n) {}
|
unique_id(counter_id++), name(n), visite(false) {}
|
||||||
|
|
||||||
Tache::~Tache() {}
|
Tache::~Tache() {}
|
||||||
|
|
||||||
|
@ -17,8 +17,8 @@ void Tache::_copy(const Tache &src) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Tache::Tache(const Tache &src)
|
Tache::Tache(const Tache &src)
|
||||||
: duree_total(src.duree_total), etat(src.etat), unique_id(++counter_id),
|
: duree_total(src.duree_total), etat(src.etat), unique_id(counter_id++),
|
||||||
name(src.name) {
|
name(src.name), visite(src.visite) {
|
||||||
_copy(src);
|
_copy(src);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ const Tache &Tache::operator=(const Tache &src) {
|
||||||
duree_total = src.duree_total;
|
duree_total = src.duree_total;
|
||||||
etat = src.etat;
|
etat = src.etat;
|
||||||
name = src.name;
|
name = src.name;
|
||||||
|
visite = src.visite;
|
||||||
_copy(src);
|
_copy(src);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
@ -86,7 +87,7 @@ bool Tache::depends_from(const Tache &x) const {
|
||||||
bool Tache::ajouteDependance(Tache &x) {
|
bool Tache::ajouteDependance(Tache &x) {
|
||||||
// On ne créer pas de dépendances cyclique aka 2 tâches
|
// On ne créer pas de dépendances cyclique aka 2 tâches
|
||||||
// qui dépendent l'une de l'autre
|
// qui dépendent l'une de l'autre
|
||||||
if (depends_from(x)) {
|
if (x.depends_from(*this)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +115,7 @@ int Tache::dureeParal() const {
|
||||||
return ret_value + max_duree;
|
return ret_value + max_duree;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tache::PP_postfixe(std::vector<Tache *> pile) {
|
void Tache::PP_postfixe(std::vector<Tache *> &pile) {
|
||||||
visite = true;
|
visite = true;
|
||||||
for (Tache *it : dependances) {
|
for (Tache *it : dependances) {
|
||||||
if (!it->visite) {
|
if (!it->visite) {
|
||||||
|
|
|
@ -5,18 +5,17 @@
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
ProtoProjet pp;
|
||||||
/* ProtoProjet pp;
|
|
||||||
|
|
||||||
pp.ajoute("a", 10); // probablement numero 2
|
pp.ajoute("a", 10); // probablement numero 2
|
||||||
cout << pp; // avec ses 3 taches
|
cout << pp; // avec ses 3 taches
|
||||||
cout << "----------" << endl;
|
cout << "\n----------" << endl;
|
||||||
|
|
||||||
pp.ajoute("b", 15, 0, 1); // en supposant que 0: fin et 1: début
|
pp.ajoute("b", 15, 0, 1); // en supposant que 0: fin et 1: début
|
||||||
cout << pp;
|
cout << pp;
|
||||||
cout << "----------" << endl;
|
cout << "\n----------" << endl;
|
||||||
|
|
||||||
RunProjet rp{pp};
|
/* RunProjet rp{pp};
|
||||||
cout << "----- verification : ProtoProjet vide " << endl;
|
cout << "----- verification : ProtoProjet vide " << endl;
|
||||||
cout << pp << endl;
|
cout << pp << endl;
|
||||||
|
|
||||||
|
|
Reference in a new issue