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

CTime *time = base.get_path_time();

for (i=0; i<base.get_num_city(); ++i)

for (j=0; j<base.get_num_city();++j)

if (!time[i*base.get_num_city()+j].null())

{

moveto(coor[2*i], coor[2*i+1]);

lineto(coor[2*j], coor[2*j+1]);

}

// рисование лучшего пути

setlinestyle(SOLID_LINE, 1, 3);

if (base.get_len_best_path()>1)

{

char *best_path = base.get_best_path();

setcolor(RED);

moveto(coor[2*best_path[0]],coor[2*best_path[0]+1]);

for (i=0; i<base.get_len_best_path(); ++i)

lineto(coor[2*best_path[i]],coor[2*best_path[i]+1]);

}

// Завершающая часть

getch();

setbkcolor(BLACK);

cleardevice();

Application.mainform.draw();

}

}

/////// METHODS CQUITBUTTON ///////

CQuitButton::CQuitButton():CButton()

{

caption = "Выход";

}

void CQuitButton::press_key(CApplication &Application, unsigned char key)

{

if (key==13)

{

down_up();

Application.terminate();

}

}

/////// METHODS CFORM ///////

CForm::CForm():CObject()

{

caption = "Ввод данных";

city1.set(320, 145, 130, 15);

city2.set(320, 165, 130, 15);

label1.set(170, 150, "Пункт отправления: ");

label2.set(170, 170, "Пункт назначения: ");

find.set(280, 280, 80, 25);

quit.set(370, 280, 80, 25);

city1.set_focus(FOCUSED);

city2.set_focus(NOT_FOCUSED);

find.set_focus(NOT_FOCUSED);

quit.set_focus(NOT_FOCUSED);

}

void CForm::draw()

{

int poly[8];

setcolor(WHITE);

setlinestyle(SOLID_LINE, 1, 1);

settextstyle(GOTHIC_FONT,HORIZ_DIR, 4);

outtextxy(300, 0, "Russian Train Network");

settextstyle(DEFAULT_FONT,HORIZ_DIR, 1);

setfillstyle(SOLID_FILL, 7);

poly[0] = x;

poly[1] = y;

poly[2] = x+width;

poly[3] = y;

poly[4] = x+width;

poly[5] = y+height;

poly[6] = x;

poly[7] = y+height;

fillpoly(4, poly);

setfillstyle(SOLID_FILL, 1);

poly[5] = y+15; poly[7] = y+15;

fillpoly(4, poly);

setcolor(WHITE);

outtextxy(x+4, y+4, caption.get_data());

city1.draw();

city2.draw();

label1.draw();

label2.draw();

find.draw();

quit.draw();

}

void CForm::draw_elem()

{

city1.draw(); city2.draw();

label1.draw(); label2.draw();

find.draw(); quit.draw();

}

void CForm::press_key(unsigned char key)

{

if (key=='\t')

{

if (city1.focused())

{

city1.set_focus(NOT_FOCUSED);

city2.set_focus(FOCUSED);

}

else

if (city2.focused())

{

city2.set_focus(NOT_FOCUSED);

find.set_focus(FOCUSED);

}

else

if (find.focused())

{

find.set_focus(NOT_FOCUSED);

quit.set_focus(FOCUSED);

}

else

if (quit.focused())

{

quit.set_focus(NOT_FOCUSED);

city1.set_focus(FOCUSED);

}

}

else

if (city1.focused()) city1.press_key(key);

else

if (city2.focused()) city2.press_key(key);

else

if (find.focused()) find.press_key(Application, key);

else

quit.press_key(Application, key);

draw_elem();

}

/////// METHODS CAPPLICATION ///////

CApplication::CApplication()

{

int gdriver = VGA;   // Драйвер

int gmode = VGAHI;   // Режим

initgraph(&gdriver, &gmode, "egavga.bgi");

Quit = graphresult();

if (Quit)

{

printf("Graphics error: %s\n", grapherrormsg(0));

printf("Press any key...\n");

getch();

}

else

{

setbkcolor(BLACK);

mainform.set(160,120,300, 200);

mainform.draw();

}

}

CApplication::~CApplication()

{

closegraph();

}

void CApplication::execute()

{

char key;

key = 0;

while (!Quit)

{

key = getch();

if (key == 27) Quit = 1;

else

mainform.press_key(key);

}

}

void CApplication::terminate()

{

Quit = 1;

}

Головной модуль:

  • MainUnit.h

#ifndef _LAB4MAIN_H

#define _LAB4MAIN_H

#include <stdio.h>

#include <conio.h>

#include "app.h"

#endif

  • MainUnit.cpp

#include "MainUnit.h"

CApplication Application;

int main()

{

Application.execute();

return 0;

}

Недостатки этого решения:

  1. Считается, что из города A в город B существует только один поезд
  2. Не учитывается, что поезда могут ходить не каждый день
  3. Не взято во внимание, что по пути из A в B поезд может посетить пункт C

Результаты работы программы:

рис. 1. Ввод данных

рис. 2. Наилучший маршрут