-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.cpp
186 lines (160 loc) · 4.83 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/**
* @file main.cpp
* @brief Programme principale
*
* Ce programme EST UN LOGICIEL LIBRE. Vous pouvez le redistribuer.
*/
/**
* Au dessus Doxygen-style documentation, qui facilite
* la generation des doc doxygen.
*/
#include <iostream>
#include <fstream>
#include <string>
#include "Graphe_or.h"
using namespace std;
void separer() {
cout << "\n\n*********************************************************"
<< "***********************************************************\n\n";
}
int main() {
while (1) {
ifstream monFlux;
separer();
cout << "\tVeuillez choisir un fichier" << endl << "[1]. Test1.txt"
<< endl << "[2]. Test2.txt" << endl << "[3]. Test3.txt" << endl
<< "[4]. Test4.txt" << endl << "[5]. Test5.txt" << endl
<< "[6]. Test6.txt (l'exemple du cours magistral)" << endl
<< "[7]. Terminer le programme" << endl;
int choix { };
cout << "Votre choix : ";
cin >> choix;
if (choix >= 1 && choix <= 6)
monFlux.open("Test" + to_string(choix) + ".txt");
else if (choix == 7) {
cout << "Programme termine" << endl << "Bye Bye :)" << endl;
monFlux.close();
exit(EXIT_SUCCESS);
} else {
cout << "Choix incorrect, veuillez resaisir :" << endl;
continue;
}
if (!monFlux) {
cout << "Le fichier n'existe pas" << endl;
exit(EXIT_FAILURE);
}
Graphe_or G;
monFlux >> G.nb_taches;
G.nb_sommets = G.nb_taches + 2;
for (int i { G.nb_taches }; i--;) {
/**
* Initialisation avec accolade pour des types built-in
* (depuis c++11)
*/
char c { }, nom { };
int duree { };
string pred;
monFlux >> nom >> duree;
monFlux.get(c);
if (c == ' ')
monFlux >> pred;
G.taches.push_back( { nom, duree, pred });
}
/* Ranged-for (depuis c++11) */
for (auto & p : G.taches)
G.taches_map[p.nom] = &p;
/**
* Calculer les successeurs de toutes les taches
* Trouver les etats initiaux.
*/
for (auto & p : G.taches) {
G.etats += p.nom;
if (!p.pred.empty()) {
G.contraintes += p.pred;
for (auto & q : p.pred)
G.taches_map[q]->succ += p.nom;
} else
G.etats_initiaux += p.nom;
}
/* Trouver les etats finals. */
for (auto & p : G.etats)
if (G.contraintes.find(p) == string::npos)
G.etats_finals += p;
G.map_arc_init();
separer();
cout << "\nCreation du graphe\n" << "----------------------\n"
<< "Proprietes du graphe :\n" << "- nombre de sommets : "
<< G.nb_sommets << "\n" << "- graphe oriente\n"
<< "- 1 valeur (numerique) pour chaque arc\n"
<< "- maximum 1 arc d'un sommet X donne vers un sommet Y donne\n"
<< "--> Ajout des sommets \"debut de projet\""
<< "('a') et \"fin de projet\" ('z')\n"
<< "--> Creation de la matrice d’adjacence :"
<< "Madj[x][y] = vrai si arc de x vers y\n"
<< "\t\t\tinitialise a faux\n"
<< "\tde la matrice des valeurs : Mval[x][y] = valeur de l'arc s'il existe\n"
<< "--> Creation des arcs associes aux contraintes"
<< "de type \"X ne peut commencer que lorsque Y est terminee\""
<< endl;
for (auto & p : G.map_arc)
cout << p.second << endl;
cout << "--> Recherche des points d'entree et points de sortie"
" - Ajout des arcs incidents au debut et a la fin de projet"
<< endl;
for (auto & p : G.etats_initiaux)
cout << Arc { 'a', 0, p } << endl;
for (auto & p : G.etats_finals)
cout << Arc { p, G.taches_map[p]->duree, 'z' } << endl;
separer();
/**
* Detecter des circuits dans le graphe oriente, abandonner le programme
* s'il existe au moins un circuit.
*/
if (G.top_sort()) {
cout << "Le programme ne peut plus continuer" << endl;
continue;
}
/* Initialiser la matrice d'adjacence et la matrice des valeurs. */
G.initialiser_matrice();
/* Remplir la matrice d'adjacence et la matrice des valeurs. */
G.remplir_matrice();
separer();
// G.afficher_matrice_adj();
G.afficher_matrice(0);
separer();
// G.afficher_matrice_val();
G.afficher_matrice(1);
/* Calculer les rangs pour toutes les taches. */
G.set_rang();
/* Trouver le rang maximum de toutes les taches. */
G.set_max_rang();
/**
* Etablir une mini table de hashage en fonction des rangs
* anciennement calcules.
*/
G.set_hash_table();
/* Calculer la date au plus tot pour toutes les taches. */
G.calculer_date_tot();
/* Calculer la date au plus tard pour toutes les taches. */
G.calculer_date_tard();
separer();
/* Afficher toutes les taches. */
G.afficher_taches();
separer();
/**
* Afficher le diagramme de gantt selon les dates au plus tot
* de toutes les taches.
*/
G.afficher_gantt(0);
separer();
/**
* Afficher le diagramme de gantt selon les dates au plus tard
* de toutes les taches.
*/
G.afficher_gantt(1);
/* Liberer la memoire anciennement allouee a la matrice d'adjacence. */
G.liberer_matrice();
separer();
cout << "Le programme a termine avec success." << endl;
}
}