fix issues

This commit is contained in:
Mylloon 2023-10-28 01:34:58 +02:00
parent 616d08822e
commit 8d3b9973a6
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
8 changed files with 31 additions and 31 deletions

View file

@ -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 `<<`

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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;
} }

View file

@ -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;
} }

View file

@ -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) {

View file

@ -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;