- •Міністерство освіти і науки, молоді та спорту україни тернопільський національний економічний університет факультет комп’ютерних інформаційних технологій
- •Визначення вимог
- •2. Алгоритм розв’язку задачі
- •Об’єктно – орієнтований аналіз
- •Об’єктно-орієнтоване проектування
- •Об’єктно-орієнтоване програмування
- •Тестування
Об’єктно-орієнтоване програмування
Програмна реалізація класів.
class TransportSystem
{
public:
virtual void ShowInformation() = 0;
virtual void SetInformation() = 0;
};
class Vehicle: public TransportSystem
{
public:
char* TypeOfTransport;
float Speed;
float AmountOfFuel;
int Capacity;
int Count;
int StartTime;
int EndTime;
int
Number;
Vehicle()
{
Count = 0;
StartTime = 6;
EndTime = 23;
}
void ShowInformation();
void SetInformation();
static void ShowFreeVehicles();
void ShowBrokenVehicles();
static vector<Vehicle> GetVehiclesFromFile(char* fileName);
vector<Vehicle> GetFreeVehicles();
vector<Vehicle> GetBrokenVehicles();
static void SaveVehiclesToFile();
void SaveFreeVehicles();
void SaveBrokenVehicles();
static int Time(int allTimeOfDay, int time);
static float Fueling(float amountOfFuel);
static int RemoveVehicle(int routeIndex, int vehicleIndex);
static void ReplaceVehicle(int routeIndex, int vehicleIndex);
};
class Route: public TransportSystem
{
public:
char* Name;
vector<pair<char*, int> > NamesOfStreets;
int NumberOfStops;
float Distance;
int Duration;
vector<Vehicle> Vehicles;
void ShowInformation();
void SetInformation();
friend void Demostrate(Route route);
friend void Simulate(void* arg);
vector<pair<char*, int> > GetStreetsFromFile(char* fileName);
vector<Route> GetDataFromFile();
void SaveRoutesToFile();
};
class Passanger: public TransportSystem
{
public:
int StartTime;
int EndTime;
Passanger()
{
StartTime = 7;
EndTime = 18;
}
void ShowInformation();
void SetInformation();
Passanger GetInformationAboutPassangerToFile();
void SaveInformationAboutPassangerToFile(Passanger pass);
};
Повний текст прорами знаходиться у додатку Б.
Тестування
На рис. 6.1 представлені можливі опції для користувача при запуску програми.
Рис. 6.1. Головне меню.
При виборі опції під номером ‘1’ на екрані з’являються опції для керуванням поточними даними (рис. 6.2.).
Рис. 6.2. Меню керування поточними даними.
При виборі опції під номером ‘1’ на екрані з’являються опції для керуванням поточними даними про транспортні засоби (рис. 6.3.).
Рис. 6.3. Меню керуванням поточними даними про транспортні засоби.
При виборі опції під номером ‘1’ покроково вводим інформацію про транспортний засіб (рис. 6.4.).
Рис. 6.4. Введення інформації про транспортний засіб.
При
виборі опції під номером ‘2’ покроково
виводим інформацію про транспортні
засоби (рис. 6.5.).
Рис. 6.5. Виведення інформації про транспортні засоби.
При виборі опції під номером ‘2’ переходим до демонстрації роботи вказаного користувачем транспотрного засобу за вказаним маршрутом протягом одного дня (рис. 6.6.).
Рис. 6.6. Демонстрація роботи транспортного засобу протягом дня.
Під час роботи виникає нештатна ситуація: потрібно реагувати на відповідну ситуацію (рис. 6.7.).
Рис. 6.7. Транспортний засіб потрапив у ДТП.
При виборі опції ‘1’ виключаємо даний транспортний засіб з даного маршруту (рис. 6.8.).
Рис. 6.8. Введення інформації про транспортний засіб.
При виборі опції ‘3’ запускаєм симуляцію роботи всіх транспортних засобів на всіх маршрутах.
При виборі опції ‘4’ виходимо з програми.
ВИСНОВКИ
Підводячи підсумки, можна сказати, що транспорт – найважливіша ланка у сфері економічних стосунків. Він бере участь у створенні продукції та доставці її споживачам, здійснює зв’язок між виробництвом та споживанням, між різними галузями господарства, між країнами та регіонами. Він впливає на розвиток господарства і як споживач металу, енергії, деревини, гуми, інших продуктів. На нього припадає значна частина основних виробничих фондів та промислово-виробничого персоналу.
Отже, цей курсовий проект допоміг засвоїти теоретичні знання об’єктно-орієнованого програмування. Це дало можливість засвоїти практичні навички по створенню об’єктно-орієнтованих програм. В ході виконання проекту були отримані практичні навички створення об’єктно-орієнтованих моделей. Успішно дослідив предметну область, що дало можливість з легкістю реалізувати проект об’єктно-орієнтованим способом.
Для реалізації об’єктно-орієнтованої модулі використав засоби об’єктно-орієнтованої мови програмування С++.
При об’єктно-орієнтованій декомпозиції та урахуванні особливостей розробив основні класи для реалізації програми.
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
Транспортна система України. – К.: Основа, 2006. – 704 с.
Карпінський Б., Макух Б. Транспортна система України в контексті
європейської інтеграції // Економіка України. – № 7 (440), 1998. – с.17-23.
[Електронний ресурс]. – Режим доступу: http://www.microsoft.com.
[Електронний ресурс]. – Режим доступу:http://www.uk.wikipedia.org
[Електронний ресурс]. – Режим достпу: http://www.cplusplus.com
Навч.-методичний посібник / В.В.Войтенко, А.В.Морозов. – Житомир: ЖДТУ, 2004. – 324 стор.
Б.Страуструп «Введение в язык С++», Киев, «Диа Софт», 1995
Г.Буч. «Обьектно-ориентированное проектирование с примерами применения», Киев, Диалектика, 1992.
Б.Страуструп «Язык программирования С++», специальное издание, Москва, «Бином», 2001
Т.А.Павловская «С/С++. Программирование на языке високого уровня», «Питер» С-П, 2002
Герберт Шилдт. «Полний справочник по С++, 4-е издание.: Пер. с англ. – М. : Издательский дом «Вильямс», 2010. – 800с.: ил. – Парал. тит. англ.
Фаулер М., Скотт К. «UML. Основи. – Пер. с англ. - СПб: Символ-Плюс, 2002. – 192 с., ил.
Додаток А.
Діаграма класів.
Додаток Б. Лістинг коду.
Файл
«Kursova.cpp»:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <vector>
#include <string.h>
#include <Windows.h>
#include <time.h>
#include <process.h>
#include <Windows.h>
using namespace std;
#include "TransportSystem.h"
#pragma region Generic Methods
bool ContinueOrExit()
{
cout<<"Do you want to continue? - (y / n): ";
int key = getch();
if (key == 121)
{
return true;
}
if (key == 110)
{
return false;
}
}
#pragma endregion Generic Methods
int _tmain(int argc, _TCHAR* argv[])
{
srand(time(0));
TransportSystem* transportSystem;
Vehicle vehicle;
Route route;
Passanger passanger;
Routes = route.GetDataFromFile();
BrokenVehicles = vehicle.GetBrokenVehiclesFromFile();
FreeVehicles = vehicle.GetFreeVehiclesFromFile();
while(1)
{
system("cls");
int key;
cout<<"\n 1 - Current data\n 2 - Demonstration of the specified route within one working day\n 3 - Run simulation\n 4 - Exit\n Choose the action: ";
cin>>key;
switch(key)
{
case 1: {
system("cls");
int key;
cout<<"\n 1 - Transports\n 2 - Routes\n 3 - Passanger\n 4 - Exit\n Choose the action: ";
cin>>key;
switch(key)
{
case 1:{
transportSystem = &vehicle;
cout<<"\n 1 - Set information\n 2 - Show information\n 3 - Exit\n Choose the action: ";
int key;
cin>>key;
if (key == 1)
{
transportSystem->SetInformation();
}
else
if (key == 2)
{
transportSystem->ShowInformation();
}
break;
}
case 2:{
transportSystem = &route;
cout<<"\n 1 - Set information\n 2 - Show information\n 3 - Exit\n Choose the action: ";
int key;
cin>>key;
if (key == 1)
{
transportSystem->SetInformation();
}
else
if (key == 2)
{
transportSystem->ShowInformation();
}
break;
}
case 3:{
transportSystem = &passanger;
cout<<"\n 1 - Change information\n 2 - Show information\n 3 - Exit\n Choose the action: ";
int key;
cin>>key;
if (key == 1)
{
transportSystem->SetInformation();
}
else
if (key == 2)
{
transportSystem->ShowInformation();
}
break;
}
case 4:{
return 0;
}
}
break;
}
case 2:
{
Demostrate(route);
break;
}
case 3:
{
for (int i = 0; i < Routes.size(); i++)
{
for (int j = 0; j < Routes[i].Vehicles.size(); j++)
{
int k = (i * 10) + j;
_beginthread(Simulate, 0, (void*)k);
}
}
break;
}
case 4:
{
return 0;
}
}
if (!ContinueOrExit())
{
return 0;
}
}
return 0;
}
Файл
«TrasportSystem.h»:
class TransportSystem
{
public:
virtual void ShowInformation() = 0;
virtual void SetInformation() = 0;
};
class Passanger: public TransportSystem
{
public:
int StartTime;
int EndTime;
Passanger()
{
StartTime = rand() % 10 + 0;
EndTime = rand() % 20 + 15;
}
void ShowInformation();
void SetInformation();
static bool ContinueOrExit();
};
class Vehicle: public TransportSystem
{
public:
char* TypeOfTransport;
float Speed;
float AmountOfFuel;
int Capacity;
int FilledPassangers;
int Count;
int StartTime;
int EndTime;
int Number;
vector<Passanger> Passangers;
Vehicle()
{
Count = 0;
StartTime = 6;
EndTime = 23;
}
void ShowInformation();
void SetInformation();
static void ShowFreeVehicles();
void ShowBrokenVehicles();
static vector<Vehicle> GetVehiclesFromFile(char* fileName);
vector<Vehicle> GetFreeVehiclesFromFile();
vector<Vehicle> GetBrokenVehiclesFromFile();
static void SaveVehiclesToFile();
void SaveFreeVehiclesToFile();
void SaveBrokenVehiclesToFile();
static int Time(int allTimeOfDay, int time);
static float Fueling(float amountOfFuel);
static void ReplaceVehicle(int routeIndex, int vehicleIndex);
};
class Route: public TransportSystem
{
public:
char* Name;
vector<pair<char*, int> > NamesOfStreets;
int NumberOfStops;
float Distance;
int Duration;
vector<Vehicle> Vehicles;
void ShowInformation();
void SetInformation();
friend void Demostrate(Route route);
friend void Simulate(void* arg);
vector<pair<char*, int> > GetStreetsFromFile(char* fileName);
vector<Route> GetDataFromFile();
void SaveRoutesToFile();
};
vector<Route> Routes;
vector<Vehicle> FreeVehicles;
vector<Vehicle> BrokenVehicles;
void PrintTime(int minutes);
void Vehicle::SetInformation()
{
Vehicle vehicle;
cout<<"Enter the type: ";
vehicle.TypeOfTransport = "";
cin>>vehicle.TypeOfTransport;
cout<<"Enter the speed: ";
cin>>vehicle.Speed;
cout<<"Enter the amount of fuel: ";
cin>>vehicle.AmountOfFuel;
cout<<"Enter the capacity: ";
cin>>vehicle.Capacity;
cout<<"Enter the number: ";
cin>>vehicle.Number;
FreeVehicles.push_back(vehicle);
Vehicle::SaveVehiclesToFile();
Vehicle::SaveFreeVehiclesToFile();
Vehicle::SaveBrokenVehiclesToFile();
}
void Vehicle::ShowInformation()
{
system("cls");
cout<<"Vehicles\n";
for (int i = 0; i < Routes.size(); i++)
{
for (int k = 0; k < Routes[i].Vehicles.size(); k++)
{
cout<<"\tWorking route - "<<Routes[i].Name<<endl;
cout<<"\tType - "<<Routes[i].Vehicles[k].TypeOfTransport<<endl;
cout<<"\tSpeed - "<<Routes[i].Vehicles[k].Speed<<" km/hod"<<endl;
cout<<"\tCapacity - "<<Routes[i].Vehicles[k].Capacity<<endl;
cout<<"\tAmountOfFuel - "<<Routes[i].Vehicles[k].AmountOfFuel<<" lt"<<endl;
cout<<"\tNumber - "<<Routes[i].Vehicles[k].Number<<endl<<endl;
}
cout<<endl;
}
ShowFreeVehicles();
ShowBrokenVehicles();
}
void Vehicle::ShowFreeVehicles()
{
cout<<"\n\n Free Vehicles:\n";
for (int k = 0; k < FreeVehicles.size(); k++)
{
cout<<k+1<<"\tType - "<<FreeVehicles[k].TypeOfTransport<<endl;
cout<<"\tSpeed - "<<FreeVehicles[k].Speed<<" km/hod"<<endl;
cout<<"\tCapacity - "<<FreeVehicles[k].Capacity<<endl;
cout<<"\tAmountOfFuel - "<<FreeVehicles[k].AmountOfFuel<<" lt"<<endl;
cout<<"\tNumber - "<<FreeVehicles[k].Number<<endl<<endl;
}
cout<<endl;
}
void Vehicle::ShowBrokenVehicles()
{
cout<<"\n\n Broken Vehicles:\n";
for (int k = 0; k < BrokenVehicles.size(); k++)
{
cout<<"\tType - "<<BrokenVehicles[k].TypeOfTransport<<endl;
cout<<"\tSpeed - "<<BrokenVehicles[k].Speed<<" km/hod"<<endl;
cout<<"\tCount of full circles: "<<BrokenVehicles[k].Count<<endl;
cout<<"\tCapacity - "<<BrokenVehicles[k].Capacity<<endl;
cout<<"\tAmountOfFuel - "<<BrokenVehicles[k].AmountOfFuel<<" lt"<<endl;
cout<<"\tNumber - "<<BrokenVehicles[k].Number<<endl<<endl;
}
cout<<endl;
}
void Vehicle::ReplaceVehicle(int routeIndex, int vehicleIndex)
{
int index = rand() % (FreeVehicles.size() - 1) + 0;
try
{
Routes[routeIndex].Vehicles[vehicleIndex] = FreeVehicles[index];
BrokenVehicles.push_back(Routes[routeIndex].Vehicles[vehicleIndex]);
FreeVehicles.erase(FreeVehicles.begin() + index);
}
catch(...){}
}
vector<Vehicle> Vehicle::GetVehiclesFromFile(char* fileName)
{
vector<Vehicle> vehicles;
std::strcat(fileName, ".txt");
std::ifstream file( fileName ) ;
char* line ;
while( !file.eof() )
{
Vehicle vehicle;
line = new char;
file.getline(line, 256, '\n');
vehicle.TypeOfTransport = line;
line = new char;
file.getline(line, 256, '\n');
vehicle.Speed = strtod(line, NULL);
line = new char;
file.getline(line, 256, '\n');
vehicle.AmountOfFuel = strtod(line, NULL);
line = new char;
file.getline(line, 256, '\n');
vehicle.Capacity = atoi(line);
line = new char;
file.getline(line, 256, '\n');
vehicle.Number = atoi(line);
vehicle.FilledPassangers = rand() % vehicle.Capacity + 0;
vehicle.Passangers = vector<Passanger>(vehicle.FilledPassangers);
vehicles.push_back(vehicle);
}
return vehicles;
}
vector<Vehicle> Vehicle::GetFreeVehiclesFromFile()
{
vector<Vehicle> freeVehicles;
std::ifstream file( "freeVehicles.txt" ) ;
char* line ;
while( !file.eof() )
{
Vehicle vehicle;
line = new char;
file.getline(line, 256, '\n');
vehicle.TypeOfTransport = line;
line = new char;
file.getline(line, 256, '\n');
vehicle.Speed = strtod(line, NULL);
line = new char;
file.getline(line, 256, '\n');
vehicle.AmountOfFuel = strtod(line, NULL);
line = new char;
file.getline(line, 256, '\n');
vehicle.Capacity = atoi(line);
line = new char;
file.getline(line, 256, '\n');
vehicle.Number = atoi(line);
freeVehicles.push_back(vehicle);
}
return freeVehicles;
}
vector<Vehicle> Vehicle::GetBrokenVehiclesFromFile()
{
vector<Vehicle> vehicles;
std::ifstream file( "brokenVehicles.txt" ) ;
char* line ;
while( !file.eof() )
{
Vehicle vehicle;
line = new char;
file.getline(line, 256, '\n');
vehicle.TypeOfTransport = line;
line = new char;
file.getline(line, 256, '\n');
vehicle.Speed = strtod(line, NULL);
line = new char;
file.getline(line, 256, '\n');
vehicle.AmountOfFuel = strtod(line, NULL);
line = new char;
file.getline(line, 256, '\n');
vehicle.Capacity = atoi(line);
line = new char;
file.getline(line, 256, '\n');
vehicle.Number = atoi(line);
vehicles.push_back(vehicle);
}
return vehicles;
}
void
Vehicle::SaveVehiclesToFile()
{
int i = 0;
int j = 0;
for (i = 0; i < Routes.size(); i++)
{
std::ofstream file;
char* fileName = Routes[i].Name;
strcat(fileName, ".txt");
file.open(fileName, ofstream::out);
file.clear();
for (j = 0; j < Routes[i].Vehicles.size() - 1; j++)
{
file<<Routes[i].Vehicles[j].TypeOfTransport<<endl;
file<<Routes[i].Vehicles[j].Speed<<endl;
file<<Routes[i].Vehicles[j].AmountOfFuel<<endl;
file<<Routes[i].Vehicles[j].Capacity<<endl;
file<<Routes[i].Vehicles[j].Number<<endl;
}
file<<Routes[i].Vehicles[j].TypeOfTransport<<endl;
file<<Routes[i].Vehicles[j].Speed<<endl;
file<<Routes[i].Vehicles[j].AmountOfFuel<<endl;
file<<Routes[i].Vehicles[j].Capacity<<endl;
file<<Routes[i].Vehicles[j].Number;
file.close();
fileName = new char;
}
}
void Vehicle::SaveFreeVehiclesToFile()
{
int i = 0;
std::ofstream file ;
file.open("freeVehicles.txt", ofstream::out);
file.clear();
for (i = 0; i < FreeVehicles.size() - 1; i++)
{
file<<FreeVehicles[i].TypeOfTransport<<endl;
file<<FreeVehicles[i].Speed<<endl;
file<<FreeVehicles[i].AmountOfFuel<<endl;
file<<FreeVehicles[i].Capacity<<endl;
file<<FreeVehicles[i].Number<<endl;
}
file<<FreeVehicles[i].TypeOfTransport<<endl;
file<<FreeVehicles[i].Speed<<endl;
file<<FreeVehicles[i].AmountOfFuel<<endl;
file<<FreeVehicles[i].Capacity<<endl;
file<<FreeVehicles[i].Number;
file.close();
}
void Vehicle::SaveBrokenVehiclesToFile()
{
int i = 0;
std::ofstream file ;
file.open("brokenVehicles.txt", ofstream::out);
file.clear();
for (i = 0; i < BrokenVehicles.size() - 1; i++)
{
file<<BrokenVehicles[i].TypeOfTransport<<endl;
file<<BrokenVehicles[i].Speed<<endl;
file<<BrokenVehicles[i].AmountOfFuel<<endl;
file<<BrokenVehicles[i].Capacity<<endl;
file<<BrokenVehicles[i].Number<<endl;
}
file<<BrokenVehicles[i].TypeOfTransport<<endl;
file<<BrokenVehicles[i].Speed<<endl;
file<<BrokenVehicles[i].AmountOfFuel<<endl;
file<<BrokenVehicles[i].Capacity<<endl;
file<<BrokenVehicles[i].Number;
file.close();
}
float Vehicle::Fueling(float amountOfFuel)
{
return amountOfFuel;
}
int Vehicle::Time(int allTimeOfDay, int time)
{
Passanger pass;
int d = rand() % 100;
if (allTimeOfDay == pass.StartTime * 60 || allTimeOfDay == pass.EndTime * 60 || (d > 50 && d < 60))
{
int r = rand()%10;
cout<<"\nTraffic jam!!! Wait!!!";
Sleep(r * 1000);
return time + r;
}
else
return time;
}
void Route::SetInformation()
{
Route route;
cout<<"Enter the name: ";
route.Name = new char;
cin>>route.Name;
cout<<"Enter the number of stops: ";
cin>>route.NumberOfStops;
cout<<"Enter the distance: ";
cin>>route.Distance;
cout<<"Enter the duration: ";
cin>>route.Duration;
cout<<"Enter the streets: \n";
for(int i = 0; i < route.NumberOfStops; i++)
{
cout<<"Enter the name of "<<i+1<<" street: ";
char* streetName = new char;
cin>>streetName;
cout<<"Enter the duration of "<<i+1<<" street: ";
int duration = 0;
cin>>duration;
pair<char*, int> p;
p.first = streetName;
p.second = duration;
route.NamesOfStreets.push_back(p);
}
Vehicle::ShowFreeVehicles();
while(1)
{
cout<<" 1 - Continue\n 2 - Exit\n"<<"Choose the action: ";
int key;
cin>>key;
if (key == 1)
{
cout<<"Choose the vehicle: ";
int vehicleIndex = 0;
cin>>vehicleIndex;
route.Vehicles.push_back(FreeVehicles[vehicleIndex]);
FreeVehicles.erase(FreeVehicles.begin() + vehicleIndex);
}
else
{
break;
}
}
Routes.push_back(route);
SaveRoutesToFile();
}
void Route::ShowInformation()
{
system("cls");
cout<<"Routes\n";
for (int i = 0; i < Routes.size(); i++)
{
cout<<"Name - "<<Routes[i].Name<<endl;
cout<<"Number of stops - "<<Routes[i].NumberOfStops<<endl;
cout<<"Distance - "<<Routes[i].Distance<<" km"<<endl;
cout<<"Duration - "<<Routes[i].Duration<<" hod"<<endl;
cout<<"Streets: ";
for (int j = 0; j < Routes[i].NamesOfStreets.size(); j++)
{
cout<<Routes[i].NamesOfStreets[j].first<<", ";
}
cout<<"\nVehicles:\n";
for (int k = 0; k < Routes[i].Vehicles.size(); k++)
{
cout<<"\tType - "<<Routes[i].Vehicles[k].TypeOfTransport<<endl;
cout<<"\tNumber of full circles - "<<Routes[i].Vehicles[k].Count<<endl;
cout<<"\tSpeed - "<<Routes[i].Vehicles[k].Speed<<" km/hod"<<endl;
cout<<"\tCapacity - "<<Routes[i].Vehicles[k].Capacity<<endl;
cout<<"\tAmountOfFuel - "<<Routes[i].Vehicles[k].AmountOfFuel<<" lt"<<endl;
cout<<"\tNumber - "<<Routes[i].Vehicles[k].Number<<endl<<endl;
}
cout<<endl<<endl;
}
}
void Route::SaveRoutesToFile()
{
int i = 0;
int j = 0;
std::ofstream file ;
file.open("routes.txt", ofstream::out);
file.clear();
for (i = 0; i < Routes.size() - 1; i++)
{
file<<Routes[i].Name<<endl;
file<<Routes[i].Distance<<endl;
file<<Routes[i].NumberOfStops<<endl;
file<<Routes[i].Duration<<endl;
ofstream streets;
char* stretsName = new char;
stretsName = Routes[i].Name;
strcat(stretsName, "-S.txt");
streets.open(stretsName, ofstream::out);
file.clear();
for (j = 0; j < Routes[i].NamesOfStreets.size() - 1; j++)
{
streets<<Routes[i].NamesOfStreets[j].first<<endl;
streets<<Routes[i].NamesOfStreets[j].second<<endl;
}
streets<<Routes[i].NamesOfStreets[j].first<<endl;
streets<<Routes[i].NamesOfStreets[j].second;
streets.close();
}
file<<Routes[i].Name<<endl;
file<<Routes[i].Distance<<endl;
file<<Routes[i].NumberOfStops<<endl;
file<<Routes[i].Duration<<endl;
file.close();
Vehicle::SaveVehiclesToFile();
}
void Demostrate(Route route)
{
system("cls");
int routeIndex = 0;
int vehicleIndex = 0;
for (int i = 0; i < Routes.size(); i++)
{
cout<<i+1<<" - "<<Routes[i].Name<<" (";
for (int j = 0; j < Routes[i].NamesOfStreets.size()-1; j++)
{
cout<<Routes[i].NamesOfStreets[j].first<<", ";
}
cout<<Routes[i].NamesOfStreets[Routes[i].NamesOfStreets.size()-1].first;
cout<<")\n\n";
}
cout<<"\nChoose the route: ";
cin>>routeIndex;
routeIndex--;
cout<<endl<<endl;
for (int k = 0; k < Routes[routeIndex].Vehicles.size(); k++)
{
cout<<k+1<<".\n";
cout<<"Type - "<<Routes[routeIndex].Vehicles[k].TypeOfTransport<<endl;
cout<<"Number - "<<Routes[routeIndex].Vehicles[k].Number<<endl<<endl;
}
cout<<"Choose the vehicle: ";
cin>>vehicleIndex;
vehicleIndex--;
system("cls");
int startTime = Routes[routeIndex].Vehicles[vehicleIndex].StartTime * 60;
int endTime = Routes[routeIndex].Vehicles[vehicleIndex].EndTime * 60;
cout<<"starts at : ";
PrintTime(startTime);
cout<<endl;
int allTimeOfWork = startTime;
int i = 0;
int passedTime = 0;
float amountOfFuel = Routes[routeIndex].Vehicles[vehicleIndex].AmountOfFuel;
while(allTimeOfWork <= (endTime - passedTime))
{
if (i < Routes[routeIndex].NamesOfStreets.size())
{
int t = Vehicle::Time(allTimeOfWork, Routes[routeIndex].NamesOfStreets[i].second);
allTimeOfWork += t;
passedTime = Routes[routeIndex].NamesOfStreets[i].second - t;
cout<<"\ncurrent street: "<<Routes[routeIndex].NamesOfStreets[i].first<<endl;
cout<<"time: ";
PrintTime(allTimeOfWork);
i++;
int goOut = rand() % Routes[routeIndex].Vehicles[vehicleIndex].FilledPassangers + 0;
Routes[routeIndex].Vehicles[vehicleIndex].Passangers.erase(Routes[routeIndex].Vehicles[vehicleIndex].Passangers.begin(), Routes[routeIndex].Vehicles[vehicleIndex].Passangers.begin() + goOut);
Routes[routeIndex].Vehicles[vehicleIndex].FilledPassangers -= goOut;
int goIn = rand() % (Routes[routeIndex].Vehicles[vehicleIndex].Capacity - Routes[routeIndex].Vehicles[vehicleIndex].FilledPassangers) + 0;
for (int k = 0; k < goIn; k++)
{
Passanger pass;
Routes[routeIndex].Vehicles[vehicleIndex].Passangers.push_back(pass);
}
Routes[routeIndex].Vehicles[vehicleIndex].FilledPassangers += goIn;
}
else
{
Routes[routeIndex].Vehicles[vehicleIndex].Count++;
if (Routes[routeIndex].Vehicles[vehicleIndex].AmountOfFuel == 0)
{
Routes[routeIndex].Vehicles[vehicleIndex].AmountOfFuel = Vehicle::Fueling(amountOfFuel);
}
else
{
Routes[routeIndex].Vehicles[vehicleIndex].AmountOfFuel -= 5;
}
i = 0;
}
int abnormal_termination = rand() % 1000 + 0;
if (abnormal_termination == 10)
{
int cryteriaOfBrealDown = rand() % 10;
cout<<"Breakdown of transport!!!\n\n";
if(cryteriaOfBrealDown > 7)
{
Vehicle::ReplaceVehicle(routeIndex, vehicleIndex);
}
else
{
Sleep(cryteriaOfBrealDown * 100);
}
Sleep(2000);
return;
}
if (abnormal_termination == 33)
{
int cryteriaOfAccident = rand() % 10;
cout<<"Road traffic accidents!!!\n\n";
if(cryteriaOfAccident > 7)
{
Vehicle::ReplaceVehicle(routeIndex, vehicleIndex);
}
else
{
Sleep(cryteriaOfAccident * 100);
}
Sleep(2000);
return;
}
Sleep(Routes[routeIndex].Duration * 10);
}
}
void Simulate(void* arg)
{
int vehicleIndex = (INT_PTR)arg % 10;
int routeIndex = (INT_PTR)arg / 10;
Passanger pass;
int startTime = Routes[routeIndex].Vehicles[vehicleIndex].StartTime * 60;
int endTime = Routes[routeIndex].Vehicles[vehicleIndex].EndTime * 60;
int allTimeOfWork = startTime;
int i = 0;
int passedTime = 0;
float amountOfFuel = Routes[routeIndex].Vehicles[vehicleIndex].AmountOfFuel;
while(allTimeOfWork <= (endTime - passedTime))
{
if (i < Routes[routeIndex].NamesOfStreets.size())
{
int d = rand() % 100;
int time = Routes[routeIndex].NamesOfStreets[i].second;
if (allTimeOfWork == pass.StartTime * 60 || allTimeOfWork == pass.EndTime * 60 || (d > 50 && d < 60))
{
int r = rand() % 10 + 2;
Sleep(r * 1000);
time += r;
}
allTimeOfWork += time;
passedTime = Routes[routeIndex].NamesOfStreets[i].second - time;
i++;
int goOut = rand() % Routes[routeIndex].Vehicles[vehicleIndex].FilledPassangers + 0;
Routes[routeIndex].Vehicles[vehicleIndex].Passangers.erase(Routes[routeIndex].Vehicles[vehicleIndex].Passangers.begin(), Routes[routeIndex].Vehicles[vehicleIndex].Passangers.begin() + goOut);
Routes[routeIndex].Vehicles[vehicleIndex].FilledPassangers -= goOut;
int goIn = rand() % (Routes[routeIndex].Vehicles[vehicleIndex].Capacity - Routes[routeIndex].Vehicles[vehicleIndex].FilledPassangers) + 0;
for (int k = 0; k < goIn; k++)
{
Passanger pass;
Routes[routeIndex].Vehicles[vehicleIndex].Passangers.push_back(pass);
}
Routes[routeIndex].Vehicles[vehicleIndex].FilledPassangers += goIn;
}
else
{
Routes[routeIndex].Vehicles[vehicleIndex].Count++;
if (Routes[routeIndex].Vehicles[vehicleIndex].AmountOfFuel == 0)
{
Routes[routeIndex].Vehicles[vehicleIndex].AmountOfFuel = Vehicle::Fueling(amountOfFuel);
}
else
{
Routes[routeIndex].Vehicles[vehicleIndex].AmountOfFuel -= 5;
}
i = 0;
}
int abnormal_termination = rand() % 1000 + 0;
if (abnormal_termination == 10)
{
int cryteriaOfBrealDown = rand() % 10;
if(cryteriaOfBrealDown > 7)
{
Vehicle::ReplaceVehicle(routeIndex, vehicleIndex);
}
else
{
Sleep(cryteriaOfBrealDown * 100);
}
Sleep(2000);
return;
}
if (abnormal_termination == 33)
{
int cryteriaOfAccident = rand() % 10;
if(cryteriaOfAccident > 7)
{
Vehicle::ReplaceVehicle(routeIndex, vehicleIndex);
}
else
{
Sleep(cryteriaOfAccident * 100);
}
Sleep(2000);
return;
}
Sleep(Routes[routeIndex].Duration * 10);
}
}
vector<pair<char*, int> > Route::GetStreetsFromFile(char* fileName)
{
vector<pair<char*, int> > streets;
strcat(fileName, "-S.txt");
std::ifstream file( fileName ) ;
char* line ;
while( !file.eof() )
{
pair<char*, int> p;
line = new char;
file.getline(line, 256, '\n');
p.first = line;
line = new char;
file.getline(line, 256, '\n');
p.second = atoi(line);
streets.push_back(p);
}
return streets;
}
vector<Route> Route::GetDataFromFile()
{
vector<Route> routes;
std::ifstream file( "routes.txt" ) ;
char* line ;
while( !file.eof() )
{
Route route;
line = new char;
file.getline(line, 256, '\n');
route.Vehicles = Vehicle::GetVehiclesFromFile(line);
line[strlen(line) - 4] = NULL;
route.NamesOfStreets = GetStreetsFromFile(line);
line[strlen(line) - 6] = NULL;
route.Name = line;
line = new char;
file.getline(line, 256, '\n');
route.Distance = strtod(line, NULL);
line = new char;
file.getline(line, 256, '\n');
route.NumberOfStops = atoi(line);
line = new char;
file.getline(line, 256, '\n');
route.Duration = atoi(line);
routes.push_back(route);
}
return routes;
}
void Passanger::SetInformation()
{
cout<<"Enter the start time of entering the job: ";
cin>>StartTime;
cout<<"Enter the end time of the job: ";
cin>>EndTime;
}
void Passanger::ShowInformation()
{
system("cls");
cout<<"Start time of entering the job: "<<StartTime<<endl;
cout<<"End time of the job: "<<EndTime<<endl;
}
bool Passanger::ContinueOrExit()
{
cout<<"Do you want to continue? - (y / n): ";
int key = getch();
if (key == 121)
{
return true;
}
if (key == 110)
{
return false;
}
}
#pragma
region Generic Methods
void PrintTime(int minutes)
{
int hour = minutes / 60;
minutes -= (hour * 60);
cout<<hour<<":"<<minutes<<endl;
}
#pragma endregion Generic Methods
