192 lines
5.6 KiB
C++
192 lines
5.6 KiB
C++
/************************************************
|
|
* Laboration 4 i
|
|
* Datastrukturer och Algoritmer
|
|
* Dijkstras Shortest Path
|
|
*************************************************
|
|
* Christian Ohlsson
|
|
* Karlstads universitet, 1999
|
|
*
|
|
* main.cpp
|
|
* Innehåller drivrutiner för
|
|
* Dijkstra labben.
|
|
* Skapat med Borland C++ 4.0
|
|
* Låt main.cpp och graph.cpp
|
|
* finnas i projektet.
|
|
* Kompilera för Easywin, Windows 3.x
|
|
* 16-bitar, target: Small
|
|
* Se till att filen network.txt finns
|
|
* i samma katalog som dijkstra.exe
|
|
*************************************************/
|
|
|
|
#include "header.h"
|
|
|
|
/*===============================================
|
|
* cities
|
|
* Alla städer i NeverNeverLand
|
|
-------------------------------------------------*/
|
|
const char cities[numOfCities][citySize] = {
|
|
{"Wonderland"},
|
|
{"Sanctuary"},
|
|
{"Battlefield"},
|
|
{"Octopus's Garden"},
|
|
{"Paradise City"},
|
|
{"Strawberry Fields"},
|
|
{"Chaos"},
|
|
{"El Dorado"},
|
|
{"Kozmic Place"},
|
|
{"Oz"},
|
|
{"Nowhereland"},
|
|
{"Shangrila"},
|
|
{"Southbound"}
|
|
};
|
|
|
|
graph myGraph; //Global klass för grafen
|
|
|
|
/*===============================================
|
|
* mataIn
|
|
* Ser till att bara tal matas in
|
|
-------------------------------------------------*/
|
|
int mataIn() {
|
|
char buffer[BUFFERSIZE];
|
|
int f;
|
|
do {
|
|
cin >> buffer;
|
|
if (strcmp(buffer,"0") == 0) return 0;
|
|
else {
|
|
f = atoi(buffer);
|
|
if (f!=0) return f;
|
|
else cout <<"NAN, try again: ";
|
|
}
|
|
}while (!f);
|
|
return 0;
|
|
}
|
|
|
|
/*===============================================
|
|
* getName
|
|
* Hämtar namn på stad, dvs det nummer staden
|
|
* motsvarar
|
|
-------------------------------------------------*/
|
|
int getName(char *text) {
|
|
int i = 0;
|
|
while(strcmp(text, cities[i]) !=0 && i < numOfCities)
|
|
i++;
|
|
if(i >= numOfCities) return -1;
|
|
else return i;
|
|
}
|
|
|
|
/*===============================================
|
|
* readGraph
|
|
* Läser in alla städer och tider från fil.
|
|
-------------------------------------------------*/
|
|
void readGraph()
|
|
{
|
|
graphNode node;
|
|
ifstream myFile;
|
|
char temp[citySize];
|
|
if(!myGraph.makeGraph(numOfCities)) { //Skapar en graf
|
|
cout<<"Could not make graph";getch();
|
|
return;
|
|
}
|
|
myFile.open("network.txt"); //Öppnar filen
|
|
do {
|
|
myFile.get(temp, citySize);
|
|
node.startCity = getName(temp); //Hämtar startstad
|
|
myFile.seekg(FORWARD, ios::cur);
|
|
myFile.get(temp, citySize);
|
|
node.endCity = getName(temp); //Hämtar slutstad
|
|
myFile.seekg(FORWARD, ios::cur);
|
|
myFile.get(temp, citySize);
|
|
node.Start = atoi(temp); //Hämtar starttid
|
|
myFile.seekg(FORWARD, ios::cur);
|
|
myFile.get(temp, citySize);
|
|
node.End = atoi(temp); //Hämtar sluttid
|
|
myFile.seekg(FORWARD, ios::cur);
|
|
myGraph.connect(node.startCity, node.endCity, node); //Sätter in noden
|
|
} while(myFile.peek() != EOF);
|
|
}
|
|
|
|
/*===============================================
|
|
* printPath
|
|
* Skriver ut kortaste vägen
|
|
-------------------------------------------------*/
|
|
void printPath() {
|
|
int index;
|
|
char text[citySize * 4], time[MAXTIME];
|
|
cout << "The shortest path is:"
|
|
<< "\n________________________________________________________";
|
|
for(index = 0; index < myGraph.prevSize; index++) {
|
|
text[0] = 0;
|
|
time[0] = 0;
|
|
cout << "\nFrom " << cities[myGraph.lastPath[index].startCity];
|
|
itoa(myGraph.lastPath[index].Start, time, BASE);
|
|
cout << " "<< time << ":00\t";
|
|
time[0] = 0;
|
|
|
|
cout << "to ";
|
|
cout << cities[myGraph.lastPath[index].endCity];
|
|
itoa(myGraph.lastPath[index].End, time, BASE);
|
|
cout << " " << time << ":00\t";
|
|
}
|
|
text[0] = 0; time[0] = 0;
|
|
itoa(myGraph.lastTime, time, BASE);
|
|
cout << "\n________________________________________________________";
|
|
cout << "\nThe total travelling time is "<<time<<" hours";
|
|
}
|
|
/*===============================================
|
|
* printTowns
|
|
* Skriver ut alla städer på skärmen
|
|
-------------------------------------------------*/
|
|
void printTowns()
|
|
{
|
|
clrscr();
|
|
cout << "\t\t\t\t\t\t\t\t<b-brox>"
|
|
<< "\n Welcome to the RailWay Company"
|
|
<< "\n in the NeverNeverLand..."
|
|
<< "\n ____________________________________________________"
|
|
<< "\n | 0. Wonderland 7. El Dorado |"
|
|
<< "\n | 1. Sanctuary 8. Kozmic Place |"
|
|
<< "\n | 2. Battlefield 9. Oz |"
|
|
<< "\n | 3. Octopus's Garden 10. Nowhereland |"
|
|
<< "\n | 4. Paradise City 11. Shangrila |"
|
|
<< "\n | 5. Strawberry Fields 12. Southbound |"
|
|
<< "\n | 6. Chaos |"
|
|
<< "\n |__________________________________________________|"
|
|
<< "\n";
|
|
}
|
|
|
|
/*===============================================
|
|
* main
|
|
* Huvudfunktionen för programmet.
|
|
* Läser in grafen och ber användaren
|
|
* mata in mellan vilka städer han skall resa
|
|
-------------------------------------------------*/
|
|
void main() {
|
|
int start, end, time;
|
|
char playAgain;
|
|
readGraph(); //Läs in filen
|
|
do{
|
|
printTowns(); //Skriv ut städerna
|
|
do {
|
|
cout <<"\nFrom wich town (0-"<<(numOfCities-1)<<"): ";
|
|
start=mataIn();
|
|
}while(start<0 || start>numOfCities-1);
|
|
do {
|
|
cout <<"To wich town (0-"<<(numOfCities-1)<<"): ";
|
|
end=mataIn();
|
|
}while(end<0 || end>numOfCities-1);
|
|
do {
|
|
cout <<"Time of departure (0-24): ";
|
|
time=mataIn();
|
|
}while(time<0 || time>24);
|
|
myGraph.dijkstra(start, end, time); //Beräkna kortaste väg
|
|
if(myGraph.prevSize > 0)
|
|
printPath(); //Skriv ut vägen
|
|
else
|
|
cout <<"\nStarttown and arrivaltown are the same! Are you stupid?";
|
|
cout <<"\n\nPlay Again (Y/N)? ";
|
|
cin >> playAgain;
|
|
}while(playAgain == 'y' || playAgain == 'Y');
|
|
}
|
|
|
|
|