Программа определения достижимости населенного пункта в системе односторонних дорог

Функциональное и эксплуатационное назначение изделия, методологические ограничения. Требования к составу и параметрам технических средств. Описание алгоритма, входные и выходные данные. Стадии и этапы разработки, технико-экономическое обоснование.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.01.2014
Размер файла 564,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Введение

Определение достижимости населенного пункта в системе односторонних дорог рассматривается при помощи некоторого математического объекта, называемого графом.

Граф - это совокупность непустого множества вершин и наборов пар вершин (связей между вершинами).

Наиболее эффективным алгоритмом нахождения кратчайшего пути является алгоритм Дейкстры.

Основная задача данного курсового проекта: определение достижимости населенного пункта в системе односторонних дорог. Решить задачу можно средством программирования. В данной курсовой работе задача была решена в среде C++ Builder.

1. Техническое задание

Программа определения достижимости населенного пункта в системе односторонних дорог. Описание: даны несколько населенных пунктов, соединенных между собой (произвольным образом) односторонними дорогами некоторой длины. Определить, есть ли населенный пункт, из которого можно добраться до каждого из остальных пунктов, проезжая не более 100 км. Отобразить решение графически, выделив цветом найденный результат.

1.1 Основания для разработки

Основанием для разработки программы является задание к курсовому проекту по предмету «Программирование».

1.2 Функциональное и эксплуатационное назначение изделия

Перечень требований пользователя к программному изделию.

Программа должна обеспечивать:

удобный интерфейс;

лёгкость в использовании;

оптимальность при использовании физических ресурсов компьютера.

1.3 Методологические ограничения

программа алгоритм технический

Часто попадаются задачи, в условиях которых заданы некоторые объекты и между некоторыми их парами имеются определенные связи. Если объекты изобразить точками (вершинами), а связи - линиями (ребрами), соединяющими соответствующие пары точек, то получится рисунок, называемый графом. Историю теории графов принято исчислять с 1736 г., когда Эйлер исследовал «задачу о кенигсбергских мостах»: построить в графе циклический путь, проходящий по одному разу через каждое ребро. В середине 19-го века Гамильтон заинтересовался задачей построения циклического пути, проходящего по одному разу через каждую вершину графа. В это же время графы использовали для анализа электрических цепей (Кирхгоф) и химических молекул (Кэли). Развитие современной теории графов относится к 30-м годам 20-го столетия. Они нашли многочисленные применения в электротехнике, электронике, биологии, экономике, программировании и в других областях.

Общие сведения о графах

Граф G (рис. 1.1) задается множеством точек (вершин) х1, х2,…, хn. (которое обозначается через Х) и множеством линий (ребер) а1, а2,…, аm. (которое обозначается символом А), соединяющих между собой все или часть этих точек. Таким образом, граф G полностью задается (и обозначается) парой (Х, А). Если ребра из множества А ориентированы, что обычно показывается стрелкой, то они называются дугами, и граф с такими ребрами называется ориентированным графом.

Рис. 1.1 Граф G

Рис. 1.2 Пути и последовательности дуг

Например, если дорога имеет не двух-, а одностороннее движение то направление этого движения будет показано стрелкой.

Если ребра не имеют ориентации, то граф называется неориентированным, (двухстороннее движение).

В ориентированном графе дуга обозначается упорядоченной парой, состоящей из начальной и конечной вершин, ее направление предполагается заданным от первой вершины ко второй. Путем (или ориентированным маршрутом) ориентированного графа называется последовательность дуг, в которой конечная вершина всякой дуги, отличной от последней, является начальной вершиной следующей.

Так, на рис. 1.2 путями являются последовательности дуг:

а6, а5, а9, а8, а4. (1)

а1, а6, а5, а9. (2)

а1, а6, а5, а9, а10, а6, а4. (3)

Ориентированной цепью (орцепью) называется такой путь, в котором каждая дуга используется не больше одного раза.

Простой орцепью называется такой путь, в котором каждая вершина используется не более одного раза. Например, путь (2).

Маршрут есть неориентированный «двойник» пути, и это понятие рассматривается в тех случаях, когда можно пренебречь направленностью дуг в графе. Таким образом, маршрут есть последовательность ребер a1, a2,…, aq, в которой каждое ребро аi, за исключением первого и последнего ребер, связано с ребрами аi-1 и аi+1 своими концевыми вершинами.

В графе, изображенном на рис. 1.2, являются маршрутами; две точки над символом дуги означают, что ее ориентацией пренебрегают, т.е. дуга рассматривается как неориентированное ребро. Также путь или маршрут можно изображать последовательностью вершин. Например, путь (1) будет выглядеть следующем образом: х2, х5, х4, х3, х5, х6. Иногда дугам графа приписываются числа, называемые весом, стоимостью, или длиной этой дуги. В этом случае граф называется графом с взвешенными дугами. А если вес приписывается вершинам графа, то тогда получается граф с взвешенными вершинами. Если в графе веса приписаны и дугам и вершинам, то он называется просто взвешенным.

При рассмотрении пути µ представленного последовательностью дуг (a1, a2,…, aq), за его вес принимается число l(µ), равное сумме весов всех дуг, входящих в µ, т.е.

Алгоритм Дейкстры

На этом шаге приводится описание алгоритма Дейкстры.

Напомним, что алгоритм Дейкстры разработан для нахождения кратчайшего пути между заданным исходным узлом и любым другим узлом сети.

В процессе выполнения этого алгоритма при переходе от узла i к следующему узлу j используется специальная процедура пометки ребер. Обозначается через ui кратчайшее расстояние от исходного узла 1 до узла i, через dij - длину ребра (i, j). Тогда для узла j определим метку [uj, следующим образом:

[uj, i] = [ui + dij, i], dij >= 0

Метки узлов в алгоритме Дейкстры могут быть двух типов: временные и постоянные. Временная метка впоследствии может быть заменена на другую временную, если будет найден более короткий путь к данному узлу. Когда же станет очевидным, что не существует более короткого пути от исходного узла к данному, статус временной метки изменяется на постоянный.

Вычислительная схема алгоритма состоит из следующих шагов.

Шаг 0. Исходному узлу (узел 1) присваивается метка [0, -]. Полагаем i = 1.

Шаг i. а) Вычисляются временные метки [ui + dij, i] для всех узлов j, которые можно достичь непосредственно из узла i и которые не имеют постоянных меток. Если узел j уже имеет метку [uj, k], полученную от другого узла k, и если ui + dij < uj, тогда метка [uj, k] заменяется на [ui + dij, i].

b) Если все узлы имеют постоянные метки, процесс вычислений заканчивается. В противном случае выбирается метка [ur, s] с наименьшим значением расстояния ur среди всех временных меток (если таких меток несколько, то выбор произволен). Полагаем i = r и повторяем шаг i.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Пример. На рисунке 2 показана транспортная сеть, состоящая из пяти городов (расстояния между городами (в километрах) приведены возле соответствующих дуг сети). Необходимо найти кратчайшие расстояния от города 1 (узел 1) до всех остальных четырех городов.

Рис. 2. Транспортная сеть

Шаг 0. Назначаем узлу 1 постоянную метку [0, -].

Шаг 1. Из узла 1 можно достичь узлов 2 и 3. Вычисляем метки для этих узлов, в результате получаем следующую таблицу меток:

Узел Метка Статус метки

1 [0, -] Постоянная

2 [0 + 100, 1] = [100, 1] Временная

3 [0 + 30, 1] = [30, 1] <-Временная

Среди узлов 2 и 3 узел 3 имеет наименьшее значение расстояния (u3 = 30). Поэтому статус метки этого узла изменяется на «постоянная».

Шаг 2. Из узла 3 (последнего узла с постоянной меткой) можно попасть в узлы 4 и 5. Получаем следующий список узлов:

Узел Метка Статус метки

1 [0, -] Постоянная

2 [100, 1] Временная

3 [30, 1] Постоянная

4 [30 + 10, 3] = [40, 3] <-Временная

5 [30 + 60, 3] = [90, 3] Временная

Временный статус метки [40, 3] узла 4 заменяется на постоянный (u4 = 40).

Шаг 3. Из узла 4 можно достичь узлов 2 и 5. После вычисления меток получим следующий их список:

Узел Метка Статус метки

1 [0, -] Постоянная

2 [40 + 15, 4] = [55, 4] <-Временная

3 [30, 1] Постоянная

4 [40, 3] Постоянная

5 [90, 3] или [40 + 50, 4] = [90, 4] Временная

Временная метка [100, 1], полученная узлом 2 на втором шаге, изменена на [55, 4]. Это указывает на то, что найден более короткий путь к этому узлу (проходящий через узел 4). На третьем шаге узел 5 получает две метки с одинаковым значением расстояния u5 = 90.

Шаг 4. Из узла 2 можно перейти только в узел 3, но он уже имеет постоянную метку, которую нельзя изменить. Поэтому на данном шаге получаем такой же список меток, как и на предыдущем шаге, но с единственным изменением: метка узла 2 получает статус постоянной. С временной меткой остается только узел 5, но так как из этого узла нельзя попасть ни в какой другой, процесс вычислений заканчивается.

Алгоритм позволяет проводить вычисления непосредственно по схеме сети, как показано на рисунке 3.

Рис. 3 Вычисления по схеме (в скобках указан номер шага)

Кратчайший маршрут между узлом 1 и любым другим узлом определяется начиная с узла назначения путем прохождения их в обратном направлении с помощью информации, представленной в постоянных метках. Например, для определения кратчайшего маршрута между узлами 1 и 2 получаем такую обратную последовательность узлов: (2) -> [55, 4] -> (4) -> [40, 3] -> (3) -> [30, 1] -> (1).

Таким образом, получаем путь 1->3->4->2 общей длиной 55 километров.

2. Программная совместимость

Программа должна работать под управлением операционной систем Windows 98/NT/XP/Vista/se7en/Win8.

программа алгоритм технический

2.2 Требования к составу и параметрам технических средств

Для работы программы желательно иметь персональный компьютер со следующей характеристикой:

микропроцессор Intel Pentium 4 с тактовой частотой 2.1 ГГц;

видеоадаптер SVGA с цветным дисплеем;

объём ОЗУ не менее 64 Мб;

объём свободного места на жестком диске 559 Кб;

USB-порт.

CD - ROM.

2.3 Описание алгоритма

Основным алгоритмом данной программы является нахождение кратчайшего пути из множества различных (Алгоритм Дейкстры).

2.4 Входные данные

Входными данными для моделируемых устройств, будут являться данные, вводимые пользователем с помощью мыши. Входными данными будет являться:

- вершина;

- ребро.

2.5 Выходные данные

Выходными данными являются: нахождение кратчайшего пути.

2.6 Безопасность и секретность

Программа не является секретной. Предназначена для всех лиц. Используется в качестве решение поставленной задачи.

2.7 Мобильность

Для копирования программы с диска или flash-USB на компьютер необходимо:

1. Распаковать RAR-архив, расположенный на диске (flash-USB), в какую-либо папку на жёстком диске компьютера.

2. Запустить программу.

2.8 Стадии и этапы разработки

Выполнение разработки должно включать две стадии:

1. Техническое задание

2. Пояснительная записка

На стадии «Техническое задание» проводится постановка задачи, разработка требований к программному изделию, изучение литературы по задаче и оформление документа «Техническое задание».

На стадии «Пояснительная записка» проводится разработка схем алгоритмов для каждого из функциональных модулей, физическое проектирование программного изделия. В заключение данного этапа оформляется документ «Пояснительная записка».

2.9 Технико-экономические показатели разработки

Программное изделие разрабатывается в качестве курсовой работы, поэтому технико-экономические показатели не рассчитываются.

2.10 Порядок контроля и приема

Данный программный продукт должен успешно пройти следующие тесты:

Тест 1. Пользователь рисует на image вершины и рёбра

Тест 2. Вводим данные в таблицу смежности

Тест 3. Выполнение задания, определение достижимости пункта

Тест 4. Вывод результата на экран

3. Пояснительная записка

3.1 Функциональные и эксплуатационные характеристики

Программа обладает следующими характеристиками:

удобный интерфейс;

лёгкость в использовании;

оптимальность при использовании физических ресурсов компьютера.

3.2 Интерфейс программного продукта

Рисунок 4. Рабочее меню программы

Рисунок 5. Пользователь рисует на image вершины и рёбра

Рисунок 6. Вводим данные в таблицу смежности

Рисунок 7. Выполнение задания

3.3 Описание модулей программы

Unit1 - модуль главного окна программы, его код приведен в приложении

Заключение

В ходе данного курсового проекта была проанализирована поставленная задача, создана и протестирована программа определения достижимости населенного пункта в системе односторонних дорог. Тестирование программы показало, что она находит кратчайший путь верно, при отсутствие пути выводит ошибку.

Можем констатировать, что курсовой проект сделан верно.

Список используемой литературы

1. Программирование в С++ Builder 6 / А.Я. Архангельский, 2006 г. с. 1304.

2. Программирование. Принципы и практика использования C++ / Бьерн Издательство Вильямс, 2013 г. с. 1248

3. C++ для начинающих. Серия «Шаг за шагом» Г. Шилдт, 2010 г.с. 640 с

Приложение

Код модуля Unit1

#include <vcl.h>

#pragma hdrstop

#include «Unit1.h»

#include <vector>

#include <math.h>

using namespace std;

 // -

#pragma package (smart_init)

#pragma resource «*.dfm»

int col = 0;

struct point {

int x, y;

int number;

};

struct rib {

int x1, x2;

bool k;

};

bool fr = false;

int xr, yr, ir;

vector<point> points;

vector<rib> ribs;

TForm1 *Form1;

 // -

__fastcall TForm1:TForm1 (TComponent* Owner)

: TForm(Owner)

{

}

 // -

 // Функция для рисования линии со стрелкой

void DrawLine (TCanvas* Canvas, double x0, double y0, double x1, double y1, double ArrowAngle, int ArrowLen) {

ArrowAngle = ArrowAngle*M_PI/180;

 // Длина основной линии

int Len = sqrt((x0-x1)*(x0-x1) + (y0-y1)*(y0-y1));

 // Угол наклона основной линии

double Angle;

if (x0==x1 && y0<y1) {

Angle = M_PI/2;

}

else if (x0==x1 && y0>y1) {

Angle = 3*M_PI/2;

}

else if (x0>x1 && y0==y1) {

Angle = 0;

}

else if (x0<x1 && y0==y1) {

Angle = M_PI;

}

else if (x0>x1 && y0<y1) {

Angle = asin((y1-y0)/Len);

}

else if (x0<x1 && y0<y1) {

Angle = M_PI - asin((y1-y0)/Len);

}

else if (x0<x1 && y0>y1) {

Angle = M_PI-asin((y1-y0)/Len);

}

else if (x0>x1 && y0>y1) {

Angle = 2*M_PI+asin((y1-y0)/Len);

}

int x2 = x1 + ArrowLen * cos (Angle+ArrowAngle); // конец первого лепестка по X

int y2 = y1 - ArrowLen * sin (Angle+ArrowAngle); // конец первого лепестка по Y

int x3 = x1 + ArrowLen * cos (Angle-ArrowAngle); // конец второго лепестка по X

int y3 = y1 - ArrowLen * sin (Angle-ArrowAngle); // конец конец второго лепестка по Y

 // рисуем саму линию

Canvas->MoveTo (x0, y0);

Canvas->LineTo (x1, y1);

 // Рисуем лепестки

TPoint points[3];

points[0] = Point (x1, y1);

points[1] = Point (x2, y2);

points[2] = Point (x3, y3);

Canvas->Polygon (points, 2);

}

int res = 0;

void __fastcall TForm1: Image1MouseDown (TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{

if (res==0) {

this->Image1->Canvas->Pen->Color=RGB (2, 0, 0);

point el;

el.x = X;

el.y = Y;

el.number = col;

points.push_back(el);

this->Image1->Canvas->Ellipse (X-10, Y-10, X+10, Y+10);

this->Image1->Canvas->TextOutA (X+10, Y, IntToStr(col));

this->Image1->Canvas->MoveTo (X, Y);

this->StringGrid1->RowCount = col+2;

this->StringGrid1->ColCount = col+2;

this->StringGrid1->Cells [col+1] [0] = IntToStr(col);

this->StringGrid1->Cells[0] [col+1] = IntToStr(col);

for (int i=1; i<this->StringGrid1->ColCount; i++) {

this->StringGrid1->Cells[i] [col+1] = «0»;

this->StringGrid1->Cells [col+1] [i] = «0»;

}

col++;

}

if (res==1) { // если не используем матрицу смежности

this->Image1->Canvas->Pen->Color=RGB (208, 20, 201);

bool f = false;

for (int i=0; i<col; i++) {

int x= point (points[i]).x;

if ((point (points[i]).x>(X-10))&&(point (points[i]).x<(X+10))&&(point (points[i]).y>(Y-10))&&(point (points[i]).y<(Y+10))) {

if (! fr) {f=true; ir =i; fr=true; this->Image1->Canvas->MoveTo (point(points[i]).x, point (points[i]).y);}

else {

DrawLine (this->Image1->Canvas, point (points[ir]).x, point (points[ir]).y, point (points[i]).x, point (points[i]).y, 10,20);

this->StringGrid1->Cells [i+1] [ir+1] = «1»;

fr=false;

}

}

}

fr=f;

}

}

 // -

void __fastcall TForm1: BitBtn1Click (TObject *Sender)

{

res=0;

}

 // -

void __fastcall TForm1: BitBtn2Click (TObject *Sender)

{

res=1;

}

 // -

void __fastcall TForm1: BitBtn3Click (TObject *Sender)

{

points.clear();

ribs.clear();

col=0;

Image1->Canvas->FillRect (Image1->Canvas->ClipRect);

this->StringGrid1->ColCount = 1;

this->StringGrid1->RowCount = 1;

this->Memo1->Lines->Clear();

}

 // -

void __fastcall TForm1: StringGrid1EndDock (TObject *Sender,

TObject *Target, int X, int Y)

{

int k=0;

}

 // -

void __fastcall TForm1: StringGrid1SetEditText (TObject *Sender, int ACol,

int ARow, const AnsiString Value)

{

if (! StringGrid1->EditorMode) {

this->Image1->Canvas->Pen->Color=RGB (208, 20, 201);

DrawLine (this->Image1->Canvas, point (points[ARow-1]).x, point (points[ARow-1]).y, point (points[ACol-1]).x, point (points[ACol-1]).y, 10,20);

}

}

struct el {

int v;

};

 // -

void __fastcall TForm1: Button2Click (TObject *Sender)

{

int n =this->StringGrid1->ColCount-1; // Количество вершин в графе

float **a; // Матрица смежности графа

a=new float *[n];

for (int i=0; i<n; i++)

a[i]=new float [n];

 // инициализация

for (int i=1; i<this->StringGrid1->ColCount; i++) {

for (int j=1; j<this->StringGrid1->ColCount; j++) {

a [i-1] [j-1] = StrToFloat (this->StringGrid1->Cells[j] [i]);

}

}

int infinity=10000; // Бесконечность

el * put;

put= new el [n];

int sumDl =10000;

int punkt=-1;

for (int versh=0; versh<n; versh++) {

int sumB = 0;

for (int kversh=0; kversh<n; kversh++) {

if (kversh!=versh) {

int s=versh; // Номер исходной вершины

int g=kversh; // Номер конечной вершины

int * x; // Массив, содержащий единицы и нули для каждой вершины,

 // x[i]=0 - еще не найден кратчайший путь в i-ю вершину,

 // x[i]=1 - кратчайший путь в i-ю вершину уже найден

x = new int [n];

int *t; //t[i] - длина кратчайшего пути от вершины s в i

t = new int [n];

el * h; //h[i] - вершина, предшествующая i-й вершине

 // на кратчайшем пути

h = new el [n];

 //int * tr; // транспорт. 1-жд, 0-шоссе

 //tr = new int [n];

 // Инициализируем начальные значения массивов

int u; // Счетчик вершин

for (u=0; u<n; u++)

{

t[u]=infinity; // Сначала все кратчайшие пути из s в i

 // равны бесконечности

x[u]=0; // и нет кратчайшего пути ни для одной вершины

}

int v;

h[s].v=0; // s - начало пути, поэтому этой вершине ничего не предшествует

t[s]=0; // Кратчайший путь из s в s равен 0

x[s]=1; // Для вершины s найден кратчайший путь

v=s; // Делаем s текущей вершиной

while(1)

{

 // Перебираем все вершины, смежные v, и ищем для них кратчайший путь

for (u=0; u<n; u++)

{

if (a[v] [u]==0) continue; // Вершины u и v несмежные

if (x[u]==0 && t[u]>t[v]+a[v] [u]) // Если для вершины u еще не

 // найден кратчайший путь

 // и новый путь в u короче чем

 // старый, то

{

t[u]=t[v]+a[v] [u]; // запоминаем более короткую длину пути в

 // массив t и

h[u].v=v; // запоминаем, что v->u часть кратчайшего

 // пути из s->u

}

}

 // Ищем из всех длин некратчайших путей самый короткий

int w=infinity; // Для поиска самого короткого пути

v=-1; // В конце поиска v - вершина, в которую будет

 // найден новый кратчайший путь. Она станет

 // текущей вершиной

for (u=0; u<n; u++) // Перебираем все вершины.

{

if (x[u]==0 && t[u]<w) // Если для вершины не найден кратчайший

 // путь и если длина пути в вершину u меньше

 // уже найденной, то

{

v=u; // текущей вершиной становится u-я вершина

w=t[u];

}

}

if (v==-1)

{

sumB+=infinity;

 //Memo1->Lines->Add («Нет пути из вершины»);

break;

}

if (v==g && t[g]<100) // Найден кратчайший путь,

{ // выводим его

sumB+= t[g];

break;

}

x[v]=1;

}

}

}

if (sumDl>sumB) {

punkt = versh;

sumDl = sumB;

}

}

if (punkt!=-1) {

Memo1->Lines->Add («Это пункт «+IntToStr(punkt));

Memo1->Lines->Add (» - Выводим маршруты -»);

 // теперь высчитывем маршруты до каждого пункта и выводим их

for (int versh=0; versh<n; versh++) {

if (punkt!=versh) {

int s=punkt; // Номер исходной вершины

int g=versh; // Номер конечной вершины

int * x; // Массив, содержащий единицы и нули для каждой вершины,

 // x[i]=0 - еще не найден кратчайший путь в i-ю вершину,

 // x[i]=1 - кратчайший путь в i-ю вершину уже найден

x = new int [n];

int *t; //t[i] - длина кратчайшего пути от вершины s в i

t = new int [n];

el * h; //h[i] - вершина, предшествующая i-й вершине

 // на кратчайшем пути

h = new el [n];

 // Инициализируем начальные значения массивов

int u; // Счетчик вершин

for (u=0; u<n; u++)

{

t[u]=infinity; // Сначала все кратчайшие пути из s в i

 // равны бесконечности

x[u]=0; // и нет кратчайшего пути ни для одной вершины

}

int v;

h[s].v=0; // s - начало пути, поэтому этой вершине ничего не предшествует

t[s]=0; // Кратчайший путь из s в s равен 0

x[s]=1; // Для вершины s найден кратчайший путь

v=s; // Делаем s текущей вершиной

while(1)

{

 // Перебираем все вершины, смежные v, и ищем для них кратчайший путь

for (u=0; u<n; u++)

{

if (a[v] [u]==0) continue; // Вершины u и v несмежные

if (x[u]==0 && t[u]>t[v]+a[v] [u]) // Если для вершины u еще не

 // найден кратчайший путь

 // и новый путь в u короче чем

 // старый, то

{

t[u]=t[v]+a[v] [u]; // запоминаем более короткую длину пути в

 // массив t и

h[u].v=v; // запоминаем, что v->u часть кратчайшего

 // пути из s->u

}

}

 // Ищем из всех длин некратчайших путей самый короткий

int w=infinity; // Для поиска самого короткого пути

v=-1; // В конце поиска v - вершина, в которую будет

 // найден новый кратчайший путь. Она станет

 // текущей вершиной

for (u=0; u<n; u++) // Перебираем все вершины.

{

if (x[u]==0 && t[u]<w) // Если для вершины не найден кратчайший

 // путь и если длина пути в вершину u меньше

 // уже найденной, то

{

v=u; // текущей вершиной становится u-я вершина

w=t[u];

}

}

if (v==-1)

{

Memo1->Lines->Add («Нет пути из вершины»);

break;

}

if (v==g) // Найден кратчайший путь,

{ // выводим его

Memo1->Lines->Add («Путь с минимальной величиной из вершины «+IntToStr(s)+» в вершину «+IntToStr(g)+» (в обратном порядке)»);

u=g;

this->Image1->Canvas->Pen->Color=RGB (0, 0, 255);

int k=0;

while (u!=s)

{

k++;

this->Memo1->Lines->Add (IntToStr(u));

this->Image1->Canvas->Pen->Color=RGB (208, 158, 20);

DrawLine (this->Image1->Canvas, point (points[h[u].v]).x, point (points[h[u].v]).y, point (points[u]).x, point (points[u]).y, 10,20);

u=h[u].v;

}

this->Memo1->Lines->Add (IntToStr(u));

this->Memo1->Lines->Add («Длина пути = «+IntToStr (t[g]));

break;

}

x[v]=1;

}}

}

}

else

{

Memo1->Lines->Add («Нет такого пункта. Возможно не все пункты соединены»);

}

}

 // -

void __fastcall TForm1: Button1Click (TObject *Sender)

{

Image1->Canvas->FillRect (Image1->Canvas->ClipRect);

this->Image1->Canvas->Pen->Color=RGB (2, 0, 0);

for (int i=0; i<col; i++) {

int X = point (points[i]).x;

int Y = point (points[i]).y;

this->Image1->Canvas->Ellipse (X-10, Y-10, X+10, Y+10);

this->Image1->Canvas->TextOutA (X+10, Y, IntToStr(i));

this->Image1->Canvas->MoveTo (X, Y);

}

this->Image1->Canvas->Pen->Color=RGB (208, 20, 201);

for (int i=1; i<this->StringGrid1->ColCount; i++) {

for (int j=1; j<this->StringGrid1->ColCount; j++) {

if (this->StringGrid1->Cells[j] [i]!= «0»)

DrawLine (this->Image1->Canvas, point (points[i-1]).x, point (points[i-1]).y, point (points[j-1]).x, point (points[j-1]).y, 10,20);

}

}

}

 // -

void __fastcall TForm1: Button3Click (TObject *Sender)

{

res=1;

}

 // -

Размещено на Allbest.ru


Подобные документы

  • Функциональное и эксплуатационное назначение данного изделия. Требования к составу и параметрам технических средств. Описание алгоритма ГОСТ 28147-89 в режиме гаммирования. Технико-экономические показатели разработки. Интерфейс программного продукта.

    курсовая работа [1,7 M], добавлен 27.02.2015

  • Требования к функциональным характеристикам, составу и параметрам технических средств, информационной и программной совместимости. Описание программы: общие сведения, логическая структура. Средства и порядок испытаний. Входные и выходные данные.

    курсовая работа [6,3 M], добавлен 12.01.2015

  • Функциональное и эксплуатационное назначение изделия. Перечень требований пользователя к программному изделию. Программные ограничения, совместимость. Требования к параметрам технических средств. Безопасность и секретность, требования к надежности.

    курсовая работа [574,6 K], добавлен 27.04.2011

  • Требования к программе, составу и параметрам технических средств. Основные элементы языка программирования. Инструкция на выполнение программы учета клиентов: вызов и загрузка, входные и выходные данные. Расчет себестоимости программного продукта.

    дипломная работа [3,9 M], добавлен 29.06.2012

  • Функциональное и эксплуатационное назначение генератора. Требования к составу и параметрам технических средств. Информационная и программная совместимость. Результирующие компоненты изделия. Безопасность и секретность. Удобства эксплуатации, мобильность.

    курсовая работа [2,1 M], добавлен 07.03.2013

  • Требования к программному изделию, составу и параметрам технических средств (аппаратные ограничения). Технико-экономическое обоснование целесообразности разработки. Функция, реализующая метод "Северо-западного угла". Модуль Sz, Nst, Venger-m, М1.

    дипломная работа [1,6 M], добавлен 30.09.2013

  • Анализ использования разработки, обзор средств программирования и описание языков. Требования к составу и параметрам технических средств. Построение алгоритма и требования к его функциональности. Описание рабочего места на вычислительном центре.

    дипломная работа [2,6 M], добавлен 19.06.2017

  • Функциональное и эксплуатационное назначение изделия. Программная совместимость. Результирующие компоненты изделия. Носители информации. Безопасность и секретность. Требования к надежности. Мобильность. Стадии и этапы разработки.

    реферат [553,2 K], добавлен 13.08.2006

  • Программа по созданию стрелочных часов. Минимальные требования к составу и параметрам технических средств программы. Выбор и обоснование системы программирования Microsoft Visual Studio. Общее описание алгоритма. Руководство пользователя и программиста.

    контрольная работа [1017,1 K], добавлен 11.12.2012

  • Средства программирования, описание языка С++. Назначение программы, требования к документации. Стадии разработки, виды испытаний. Используемые технические, программные средства. Вызов и загрузка, входные и выходные данные. Программа и методика испытаний.

    контрольная работа [205,3 K], добавлен 23.07.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.