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 `fin`
|
||||
- Méthodes (cf. le PDF du prof) **⇒ Tout ça avec l'ordre topologique**
|
||||
|
||||
- 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à
|
||||
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)
|
||||
**⇒ création d'une dépendance**
|
||||
- [x] `bool ajoute(nom, durée, id1, id2)` : **ajoute** une tâche entre les 2 tâches
|
||||
qui ont l'identifiant `id1` et `id2`
|
||||
- [x] Surcharge de `<<`
|
||||
|
|
|
@ -43,7 +43,10 @@ protected:
|
|||
const std::vector<Tache *> consult_tasks() const;
|
||||
|
||||
// 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
|
||||
|
|
|
@ -14,7 +14,6 @@ public:
|
|||
ProtoProjet(const ProtoProjet &); // copy constructor
|
||||
const ProtoProjet &operator=(const ProtoProjet &); // copy assignement
|
||||
|
||||
// Remet tous les marquages à leur valeur initiale
|
||||
void cleanMarks() const;
|
||||
|
||||
// Insère une nouvelle tâche en la plaçant entre deux tâches au hasard
|
||||
|
|
|
@ -51,7 +51,7 @@ public:
|
|||
int dureeParal() const;
|
||||
|
||||
// Parcours en profondeur
|
||||
void PP_postfixe(std::vector<Tache *>);
|
||||
void PP_postfixe(std::vector<Tache *> &);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include "../includes/Projet.hpp"
|
||||
|
||||
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(debut);
|
||||
|
@ -13,7 +13,8 @@ void Projet::_copy(const Projet &src) {
|
|||
// Copie des tâches
|
||||
taches.reserve(src.taches.size());
|
||||
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) {
|
||||
for (Tache *t : data.taches) {
|
||||
out << *t << " ";
|
||||
out << *t << "\n";
|
||||
}
|
||||
|
||||
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 *tache2 = this->taches[rand2];
|
||||
|
||||
// - tache2 ne doit pas dépendre transitivement de tache1
|
||||
// - permet aussi de vérifier si tache1 == tache2
|
||||
// tache2 ne doit pas dépendre transitivement de tache1
|
||||
if (tache2->depends_from(*tache1)) {
|
||||
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; }
|
||||
|
||||
std::vector<Tache *> Projet::topologicalSort() {
|
||||
void Projet::topologicalSort() {
|
||||
// Construction de la pile
|
||||
std::vector<Tache *> pile;
|
||||
for (Tache *it : taches) {
|
||||
|
@ -97,9 +97,12 @@ std::vector<Tache *> Projet::topologicalSort() {
|
|||
}
|
||||
}
|
||||
|
||||
// Nettoyage des marques
|
||||
cleanMarks();
|
||||
|
||||
// Reverse de la pile
|
||||
std::reverse(pile.begin(), pile.end());
|
||||
|
||||
// Renvoie la liste de tâches topologiquement triée
|
||||
return pile;
|
||||
// Modifie la liste des tâches topologiquement triée
|
||||
taches = pile;
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ const ProtoProjet &ProtoProjet::operator=(const ProtoProjet &src) {
|
|||
|
||||
std::ostream &operator<<(std::ostream &out, const ProtoProjet &data) {
|
||||
for (Tache *t : data.taches) {
|
||||
out << *t << " ";
|
||||
out << *t << "\n";
|
||||
}
|
||||
|
||||
return out;
|
||||
|
@ -53,12 +53,7 @@ bool ProtoProjet::ajoute(const std::string nom, const int duree, const int id1,
|
|||
|
||||
// Création des dépendances
|
||||
Tache *tache = new Tache(nom, duree);
|
||||
if (!tache1->ajouteDependance(*tache)) {
|
||||
// Problème de dépendance
|
||||
delete tache;
|
||||
return false;
|
||||
}
|
||||
if (!tache->ajouteDependance(*tache2)) {
|
||||
if (!tache1->ajouteDependance(*tache) && !tache->ajouteDependance(*tache2)) {
|
||||
// Problème de dépendance
|
||||
delete tache;
|
||||
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
|
||||
taches.push_back(tache);
|
||||
taches = topologicalSort();
|
||||
topologicalSort();
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ int Tache::counter_id = 0;
|
|||
|
||||
Tache::Tache(const std::string n, const int duree)
|
||||
: 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() {}
|
||||
|
||||
|
@ -17,8 +17,8 @@ void Tache::_copy(const Tache &src) {
|
|||
}
|
||||
|
||||
Tache::Tache(const Tache &src)
|
||||
: duree_total(src.duree_total), etat(src.etat), unique_id(++counter_id),
|
||||
name(src.name) {
|
||||
: duree_total(src.duree_total), etat(src.etat), unique_id(counter_id++),
|
||||
name(src.name), visite(src.visite) {
|
||||
_copy(src);
|
||||
}
|
||||
|
||||
|
@ -29,6 +29,7 @@ const Tache &Tache::operator=(const Tache &src) {
|
|||
duree_total = src.duree_total;
|
||||
etat = src.etat;
|
||||
name = src.name;
|
||||
visite = src.visite;
|
||||
_copy(src);
|
||||
return *this;
|
||||
}
|
||||
|
@ -86,7 +87,7 @@ bool Tache::depends_from(const Tache &x) const {
|
|||
bool Tache::ajouteDependance(Tache &x) {
|
||||
// On ne créer pas de dépendances cyclique aka 2 tâches
|
||||
// qui dépendent l'une de l'autre
|
||||
if (depends_from(x)) {
|
||||
if (x.depends_from(*this)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -114,7 +115,7 @@ int Tache::dureeParal() const {
|
|||
return ret_value + max_duree;
|
||||
}
|
||||
|
||||
void Tache::PP_postfixe(std::vector<Tache *> pile) {
|
||||
void Tache::PP_postfixe(std::vector<Tache *> &pile) {
|
||||
visite = true;
|
||||
for (Tache *it : dependances) {
|
||||
if (!it->visite) {
|
||||
|
|
|
@ -5,18 +5,17 @@
|
|||
using namespace std;
|
||||
|
||||
int main() {
|
||||
|
||||
/* ProtoProjet pp;
|
||||
ProtoProjet pp;
|
||||
|
||||
pp.ajoute("a", 10); // probablement numero 2
|
||||
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
|
||||
cout << pp;
|
||||
cout << "----------" << endl;
|
||||
cout << "\n----------" << endl;
|
||||
|
||||
RunProjet rp{pp};
|
||||
/* RunProjet rp{pp};
|
||||
cout << "----- verification : ProtoProjet vide " << endl;
|
||||
cout << pp << endl;
|
||||
|
||||
|
|
Reference in a new issue