Объектно-ориентированное программирование. Написание программы, которая в заданной Базе маршрутов поездов находит минимальный по времени маршрут между двумя пунктами, страница 3

}

CTime::CTime(int h, int m)

{

mm = m;

hh = h;

while(mm>=60) {mm-=60; ++hh;}

while(mm<0) {mm+=60;--hh;}

}

CTime::CTime(CTime& time)

{

hh = time.hh;

mm = time.mm;

}

CTime& CTime::operator = (CTime& time)

{

hh = time.hh;

mm = time.mm;

return *this;

}

CTime CTime::operator + (CTime& time)

{

CTime result;

result.mm = mm+time.mm;

result.hh = hh+time.hh;

while(result.mm>=60) {result.mm-=60; ++result.hh;}

while(result.mm<0) {result.mm+=60; --result.hh;}

return result;

}

CTime CTime::operator - (CTime& time)

{

CTime ttime(-time.hh, -time.mm), result=*this+ttime;

return result;

}

char CTime::operator == (CTime& time)

{

if (hh==time.hh && mm==time.mm) return 1;

return 0;

}

char CTime::operator > (CTime& time)

{

if (hh>time.hh || hh==time.hh && mm>time.mm) return 1;

return 0;

}

char CTime::operator < (CTime& time)

{

if (hh<time.hh || hh==time.hh && mm<time.mm) return 1;

return 0;

}

void CTime::set(int h, int m)

{

hh = h;

mm = m;

while(mm>=60) {mm-=60; ++hh;}

while(mm<0) {mm+=60;--hh;}

}

char CTime::null()

{

if (hh==0 && mm==0) return 1;

return 0;

}

  • CBase (CBase.cpp)

#include "cbase.h"

CBase::CBase(char *file_name)

{

FILE *f;

char city[255];

int i, time;

f = fopen(file_name, "r+t");

// Ввод кол-ва городов

fscanf(f, "%u", &num_city);

// Ввод названий городов

city_name = new CString[num_city];

for (i=0; i<num_city; ++i)

{

fscanf(f, "%s", city);

city_name[i] = city;

}

// Ввод координат городов

city_coor = new int[num_city*2];

for (i=0; i<2*num_city; ++i)

fscanf(f, "%d", &city_coor[i]);

// Ввод матрицы времени пути

path_time = new CTime[num_city*num_city];

for (i=0; i<num_city*num_city; ++i)

{

fscanf(f, "%d", &time);

path_time[i].set(0, time);

}

// Ввод матрицы отправлений

depar_time = new CTime[num_city*num_city];

for (i=0; i<num_city*num_city; ++i)

{

fscanf(f, "%d", &time);

depar_time[i].set(0, time);

}

fclose(f);

// Выделение памяти для вспомогательных переменных

visited = new char[num_city];

cur_path = new char[num_city];

best_path = new char[num_city];

}

CBase::~CBase()

{

// Удаление вспомогательных переменных

delete [] visited;

delete [] cur_path;

delete [] best_path;

// Удаление основных данных

delete [] city_name;

delete [] city_coor;

delete [] path_time;

delete [] depar_time;

}

CString CBase::search_path(CString& city_from, CString& city_to)

{

CString result;

CTime time;

int i;

num_from = -1; num_to = -1;

len_best_path = 0;

// Получение номеров городов

for (i=0; i<num_city; ++i)

{

if (city_name[i]==city_from)  num_from = i;

if (city_name[i]==city_to)  num_to = i;

}

// Проверка введенных данных

if (num_from==-1 || num_to==-1)

{

result = city_from+"-"+city_to+" отсутствует маршрут...\n";

return result;

}

if (num_from==num_to)

{

result = "Станции отправления и назначения совпадают...";

return result;

}

// Инициализация структур алгоритма

for (i=0; i<num_city; ++i)

{

visited[i] = 0;

cur_path[i] = 0;

best_path[i] = 0;

}

best_time.set(32767, 0);

depth = -1;

// Главная функция

dfs(num_from, time);

// Обработка результатов

if (best_time.hour()==32767)

result = city_name[num_from]+"-"+city_name[num_to]+" отсутствует маршрут...";

else

{

i=0;

result = "";

while (best_path[i]!=num_to)

{

result = result+city_name[best_path[i]]+" ";

++i;

}

result = result+city_name[num_to];

len_best_path = i+1;

}

return result;

}

void CBase::dfs(int v, CTime time0)

{

CTime wait, time;

int h, m;

int i;

// Отмечаем вершину как пройденную

visited[v] = 1;

// Добавляем в путь

cur_path[++depth] = v;

// Если приехали - проверяем оптимальность

if (v==num_to && time0<best_time)

{

for (i=0; i<depth+1; ++i) best_path[i] = cur_path[i];

best_time = time0;