Commit f8ba984b authored by Chemspro's avatar Chemspro
Browse files

final version

parent 692c4106
#include "gares.hpp"
using namespace std;
std::vector<string> gares;
\ No newline at end of file
#ifndef GARES_HPP
#define GARES_HPP
/* Fichier qui permet l'utilisation du vecteur gares dans tous les fichiers */
#include<vector>
#include<string>
using namespace std;
extern std::vector<string> gares;
#endif
\ No newline at end of file
#include "iteneraire.hpp"
#include "gares.hpp"
#include "colormod.hpp"
using namespace std;
Color::Modifier red(Color::FG_RED);
Color::Modifier green(Color::FG_GREEN);
Color::Modifier def(Color::FG_DEFAULT);
Graph::Graph(int p_s)
{
qt_sommets = p_s;
aretes.resize(static_cast<uint>(p_s));
// allouer la mémoire nécessaire
aretes.resize(static_cast<size_t>(p_s));
}
// Méthode pour ajouter une gare
void Graph::ajouterArete(int depart, int cible, uint poids)
{
if (depart > qt_sommets || cible > qt_sommets)
{
return;
throw std::domain_error("La quantités des sommets est plus petite.");
}
arete sommets{cible, poids};
aretes[static_cast<uint>(depart)].push_back(sommets);
arete sommets{cible, poids}; /* gare d'arrivé */
aretes[static_cast<uint>(depart)].push_back(sommets); /* ajouter la gare au vecteur */
}
// Méthode pour affichage en mode developpeur
void Graph::affichage_dev(void)
{
for (size_t i = 0; i < aretes.size(); i++)
{
liste_adjacences temp = aretes[i];
cout << "Sommet " << i << " contient: ";
// Afficher tous les chemins possible entre les gares.
for (size_t k = 0; k < aretes[i].size(); k++)
{
arete a = temp.front();
......@@ -39,55 +44,58 @@ void Graph::affichage_dev(void)
}
}
// Méthode pour avoir le chemin le plus optimisé d'une gare à une autre.
void Graph::plusCourtChemin(int o)
{
set<pair<int, int>> e_set;
vector<int> distances_poids(static_cast<uint>(qt_sommets), 9999);
e_set.insert(make_pair(0, o));
vector<uint> distances_poids(static_cast<uint>(qt_sommets), 9999); /* représentation de la distance entre un point A et un point B*/
e_set.insert(make_pair(0, o)); /* la racine */
distances_poids[static_cast<uint>(o)] = 0;
while (!e_set.empty())
while (!e_set.empty()) /* tant que y a un sommet */
{
pair<uint, uint> temp = *(e_set.begin());
pair<uint, uint> temp = *(e_set.begin()); /* sommet courant */
e_set.erase(e_set.begin());
uint u = temp.second;
uint u = temp.second; /* poids du sommet courant */
for (auto i = aretes[static_cast<uint>(u)].begin(); i != aretes[static_cast<uint>(u)].end(); i++)
for (auto i = aretes[u].begin(); i != aretes[u].end(); i++)
{
uint v = static_cast<uint>((*i).first);
int poids = (*i).second;
uint v = (*i).first; /* sommet */
uint poids = (*i).second; /* poids */
if (distances_poids[v] > distances_poids[u] + poids)
{
if (distances_poids[v] != 9999)
if (distances_poids[v] != 9999) /* un sommet existant trouvé ! */
{
e_set.erase(e_set.find(make_pair(distances_poids[v], v)));
e_set.erase(e_set.find(make_pair(distances_poids[v], v))); /* retirer son ancien poids (distance) */
}
distances_poids[v] = distances_poids[u] + poids;
e_set.insert(make_pair(distances_poids[v], v));
e_set.insert(make_pair(distances_poids[v], v)); /* ajouter le poids correspondant */
}
}
}
for (size_t i = 0; i < static_cast<size_t>(qt_sommets-1); i++)
// Affichage:
for (int i = 0; i < static_cast<int>(qt_sommets - 1); i++)
{
if(i==o){
if (i == o)
{
continue;
}
if(distances_poids[i]==0)
if (distances_poids[static_cast<uint>(i)] == 0)
{
cout << "Gare d'arrivée : " << gares.at(static_cast<size_t>(i)) << " " << red << "Il n'y a aucun trajet que relie ces deux gares." << def << endl;
}
else
{
cout << "Gare d'arrivée : " << i << " " << red << "Il n'y a aucun trajet que relie ces deux gares." << def << endl;
} else {
cout << "Gare d'arrivée : " << i << " " << green << "Temps de trajet : " << distances_poids[i] << " min" << def << endl;
cout << "Gare d'arrivée : " << gares.at(static_cast<size_t>(i)) << " " << green << "Temps de trajet : " << distances_poids[static_cast<uint>(i)] << " minutes." << def << endl;
}
}
}
// Methode d'un plus court chemin entre une gare A et une gare B
int Graph::plusCourtCheminUnique(int o, int a)
{
set<pair<int, int>> e_set;
vector<int> distances_poids(static_cast<uint>(qt_sommets), 9999);
vector<uint> distances_poids(static_cast<uint>(qt_sommets), 9999);
e_set.insert(make_pair(0, o));
distances_poids[static_cast<uint>(o)] = 0;
......@@ -97,22 +105,22 @@ int Graph::plusCourtCheminUnique(int o, int a)
e_set.erase(e_set.begin());
uint u = temp.second;
for (auto i = aretes[static_cast<uint>(u)].begin(); i != aretes[static_cast<uint>(u)].end(); i++)
for (auto i = aretes[u].begin(); i != aretes[u].end(); i++)
{
uint v = static_cast<uint>((*i).first);
int poids = (*i).second;
uint v = (*i).first;
uint poids = (*i).second;
if (distances_poids[v] > distances_poids[u] + poids)
{
if (distances_poids[v] != 9999)
if (distances_poids[v] != 9999) /* un sommet existant trouvé ! */
{
e_set.erase(e_set.find(make_pair(distances_poids[v], v)));
e_set.erase(e_set.find(make_pair(distances_poids[v], v))); /* retirer son ancien poids (distance) */
}
distances_poids[v] = distances_poids[u] + poids;
e_set.insert(make_pair(distances_poids[v], v));
e_set.insert(make_pair(distances_poids[v], v)); /* ajouter le poids correspondant */
}
}
}
return distances_poids[a];
// récupérer la distance du trajet.
return distances_poids[static_cast<uint>(a)];
}
\ No newline at end of file
#ifndef DJKS_ITENERAIRE_HPP
#define DJKS_ITENERAIRE_HPP
/* Les includes nécessaire */
#include <iostream>
#include <fstream>
#include <list>
......@@ -11,26 +11,22 @@
#include <queue>
#include <set>
#include <string>
#include <unordered_map>
using namespace std;
typedef std::pair<uint,uint> arete;
typedef std::list<arete> liste_adjacences;
class Graph
{
std::vector<liste_adjacences> aretes;
int qt_sommets;
public:
// Constructeur:
Graph(int);
// Les méthodes:
void ajouterArete(int, int, uint);
void affichage_dev(void);
void plusCourtChemin(int);
int plusCourtCheminUnique(int,int);
};
......
/* Projet ASD2 - Semestre 4 */
/*
Université Paris 8
Projet de fin de semestre - ASD2 - semestre 4
Mme. CHALENÇON Sylvia
---
L2-X Informatique - STN
PEREIRA MANFRIN Felipe - n. étudiant 20034559
DAHMANI Chemseddine - n. étudiant 22022336
*/
#include <iostream>
#include "iteneraire.hpp"
#include "gares.hpp"
#include "colormod.hpp"
using namespace std;
#include <map>
using namespace std;
int main(void)
{
// Initialisation des couleurs d'utilisation:
Color::Modifier blue(Color::FG_BLUE);
Color::Modifier magenta(Color::FG_MAGENTA);
Color::Modifier yellow(Color::FG_YELLOW);
......@@ -16,134 +28,160 @@ int main(void)
Color::Modifier cyan(Color::FG_CYAN);
Color::Modifier red(Color::FG_RED);
Color::Modifier def(Color::FG_DEFAULT);
// lire les fichiers nécessaire:
fstream origine("origine.csv", ios::in);
fstream destination("destination.csv", ios::in);
fstream temps("temps.csv", ios::in);
vector<string> gares,tem;
std::unordered_map<int,string> npgares;
while(origine.good())
vector<string> tem;
std::map<int, string> npgares;
while (origine.good()) /* vérifier que tout est bon */
{
string o;
getline(origine,o);
getline(origine, o);
if(std::count(gares.begin(),gares.end(),o)){
if (std::count(gares.begin(), gares.end(), o))
{
continue;
} else {
gares.push_back(o);
}
else
{
gares.push_back(o); /* ajouter la gare au vecteur */
}
}
int sz = gares.size();
cout << sz << endl;
gares.pop_back();
for(size_t i = 0; i < gares.size();i++)
npgares[i] = gares[i];
int sz = gares.size(); /* récupérer la taille du vecteur "gares" */
gares.pop_back(); /* retirer le sommet vide */
for (size_t i = 0; i < gares.size(); i++)
npgares[i] = gares[i]; /* assignation à chaque index une gare */
cout << endl;
Graph maille(sz);
fstream origine2("origine.csv", ios::in);
while(temps.good())
while (temps.good())
{
string t;
getline(temps,t);
tem.push_back(t);
getline(temps, t);
tem.push_back(t); /* ajouter le temps entre chaque gare */
}
tem.pop_back();
tem.pop_back(); /* retirer le sommet vide */
size_t count = 0;
while(destination.good() && count<tem.size())
while (destination.good() && count < tem.size())
{
string o,d;
string o, d;
int i = stoi(tem.at(count));
getline(origine2,o);
getline(destination,d);
getline(origine2, o);
getline(destination, d);
// vérifier si le sommet existe
auto it = find(gares.begin(), gares.end(), o);
auto it2 = find(gares.begin(), gares.end(), d);
int pos1 = it - gares.begin(),pos2 = it2 - gares.begin();
int pos1 = it - gares.begin(), pos2 = it2 - gares.begin(); /* les positions */
// si oui, on l'ajoute.
maille.ajouterArete(pos1, pos2, i);
maille.ajouterArete(pos1,pos2,i);
count++;
}
cout << blue << "============================================================================" << def << endl;
cout << red << "\nBonjour. Bienvenue au système de vérification des trajets TGV.\n" << def << endl;
cout << "Vous avez la possibilité de vérifier les plus courts temps de trajets pour les liaisons de TGV en France et à l'étranger. Le temps affiché est donné en minutes.\n" << endl;
cout << "Pour l'utiliser, veuillez suivre les instructions suivantes : \n" << endl;
cout << red << "\nBonjour. Bienvenue au système de vérification des trajets TGV.\n"
<< def << endl;
cout << "Vous avez la possibilité de vérifier les plus courts temps de trajets pour les liaisons de TGV en France et à l'étranger. Le temps affiché est donné en minutes.\n"
<< endl;
cout << "Pour l'utiliser, veuillez suivre les instructions suivantes : \n"
<< endl;
cout << "A - Vous verrez une liste avec les noms des gares en question et leur numéro de correspondence dans notre système." << endl;
cout << "B - Vous devez vérifier le numéro de la gare desirée et après entrez l'option souhaitez." << endl;
cout << "C - Les options disponibles pour ce programme sont :" << endl;
cout << magenta << " 1 - tapez '0' si vous voulez quitter le programme." << def << endl;
cout << green << " 2 - tapez '1' si vous voulez afficher tous les plus courts chemins depuis une gare. Puis, tappez le numéro de la gare de départ." << def << endl;
cout << yellow << " 3 - tapez '2' si vous voulez savoir le temps de trajet entre une gare de départ X et une gare d'arrivée Y." << def << endl;
cout << cyan << " 4 - [option dev] tappez '3' si vous voulez voir la construction/affichage du graphe réalisé.\n" << def << endl;
cout << cyan << " 4 - [option dev] tappez '3' si vous voulez voir la construction/affichage du graphe réalisé.\n"
<< def << endl;
cout << blue << "============================================================================" << def << endl;
int afficher_gares = -1;
cout << "\nVeuillez entrer '0' pour afficher la liste des gares disponibles." << endl;
while(afficher_gares != 0)
while (afficher_gares != 0)
{
cin >> afficher_gares;
if (afficher_gares != 0)
cerr << red << "Le numéro fourni est incorrect, veuillez vous assurer de bien indiqué '0', Merci." << def << endl;
}
cout << endl;
for(auto it:npgares){
for (auto it : npgares)
{
cout << it.first << ": " << it.second << endl;
}
cout << "\nMaintenant, veuillez faire votre choix parmi les options cités dans les instructions :" << endl;
int choix = -1, gare_depart = -1, gare_arrivee = -1;
while(choix < 0 || choix > 3)
while (choix < 0 || choix > 3)
{
cin >> choix;
if (choix > 3)
cerr << red << "L'option mentionné n'est pas dans notre manuel de commande, veuillez le relire en le retrouvant ci-dessus, Merci." << def << endl;
}
if(choix == 0)
if (choix == 0)
{
cout << green << "\nLe programme est terminé, merci pour votre visite." << def << endl;
return 0;
}else if(choix==1)
}
else if (choix == 1)
{
cout << "\nVous avez sélectionné l'option 1. Veuillez maintenant choisir votre gare de départ." << endl;
while(gare_depart < 0 || gare_depart > 58)
while (gare_depart < 0 || gare_depart > 58)
{
cin >> gare_depart;
if (gare_depart < 0 || gare_depart > 58)
cerr << red << "La gare indiqué n'existe pas dans notre base de données,veuillez en choisir une parmi ceux disponible dans notre liste, Merci." << def << endl;
}
cout << "\nVoici vos temps de trajets depuis la gare : " << yellow << gares.at(gare_depart) << def << "\n" << endl;
cout << "\nVoici vos temps de trajets depuis la gare : " << yellow << gares.at(gare_depart) << def << "\n"
<< endl;
maille.plusCourtChemin(gare_depart);
} else if(choix==2)
}
else if (choix == 2)
{
cout << "\nVous avez sélectionné l'option 2. Vous devez choisir la gare de départ et la gare d'arrivée." << endl;
cout << "\nGare de départ : " << endl;
while(gare_depart < 0 || gare_depart > 58)
while (gare_depart < 0 || gare_depart > 58)
{
cin >> gare_depart;
if (gare_depart < 0 || gare_depart > 58)
cerr << red << "La gare indiqué n'existe pas dans notre base de données,veuillez en choisir une parmi ceux disponible dans notre liste, Merci." << def << endl;
}
cout << "\nGare d'arrivée : " << endl;
while(gare_arrivee < 0 || gare_arrivee > 58)
while (gare_arrivee < 0 || gare_arrivee > 58)
{
cin >> gare_arrivee;
if (gare_arrivee < 0 || gare_arrivee > 58)
cerr << red << "La gare indiqué n'existe pas dans notre base de données,veuillez en choisir une parmi ceux disponible dans notre liste, Merci." << def << endl;
}
int temps = maille.plusCourtCheminUnique(gare_depart, gare_arrivee);
if (temps != 0)
{
cout << "\nPour aller de la gare " << yellow << gare_depart << " (" << gares.at(gare_depart) << ") " << def
<< "à la gare " << yellow << gare_arrivee << " (" << gares.at(gare_arrivee) << ")" << def
<< ", en empruntant un trajet TGV de la SNCF, le temps minimum est de : " << green << temps << " minutes." << def << endl;
}
int temps = maille.plusCourtCheminUnique(gare_depart,gare_arrivee);
if(temps != 0)
else
{
cout << "\nPour aller de la gare " << yellow << gare_depart << " (" << gares.at(gare_depart) << ") " << def
<< "à la gare " << yellow << gare_arrivee << " (" << gares.at(gare_arrivee) << ")" << def
<< ", en empruntant un trajet TGV de la SNCF, le temps minimum est de : " << green << temps << " min" << def << endl;
} else {
cout << red << "Nous sommes vraiment désolés ! Aucun trajet reliant ces deux gares a été trouvé." << def << endl;
}
} else
{
cout << "\nVous avez sélectionné l'option 3. Voici le graphe construit pour ce projet : \n" << endl;
}
else
{
cout << "\nVous avez sélectionné l'option 3. Voici le graphe construit pour ce projet : \n"
<< endl;
maille.affichage_dev();
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment