Определение достижимости города в изменяемой системе двусторонних дорог
Разработка программы для создания системы дорог и городов, позволяющей пользователю реализовать проверку достижимости любого города. Выбор среды разработки, определение требований к программному продукту. Основные компоненты пользовательского интерфейса.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 18.07.2012 |
Размер файла | 2,6 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
- 6 -
-4-
Содержание
Введение
1. Техническое задание
1.1 Основания для разработки
1.2 Назначение разработки
1.3 Рассмотренные альтернативы
1.4 Стандарты
1.5 Требования пользователя к программному изделию
2. Рабочий проект
2.1 Модули и объекты интерфейса пользователя
2.2 Описание подпрограмм модуля Unit 1
2.3 Описание подпрограмма модуля Unit 2
2.4 Описание подпрограмм модуля Unit 3
2.5 Описание подпрограмм модуля Unit 4
2.6 Тестовые наборы для отладки интерфейса пользователя
Заключение
Список использованных источников
Приложения
Введение
Данная курсовая работа реализует такую актуальную задачу, как определение достижимости города в изменяемой системе двусторонних дорог.
Эту проблему целесообразно решать через графы.
Сама задача является актуальной как для общественных предприятий, так и для индивидуальных пользователей, так как быстро и достоверно находить решение, основываясь на введенных данных. В самой программе используется создание системы дорог и городов, что дает пользователю возможность проверки достижимости до любого города, тем самым позволяя построить свой маршрут заранее.
Данная задача уже имеет ряд решений как с помощью графов, так и материального моделирования. Но данный продукт имеет ряд преимуществ, так как понятный даже не осведомленному в программировании пользователю интерфейс, удобную навигацию и быстроту расчетов.
1. Техническое задание
1.1 Основания для разработки
Основанием для разработки программного продукта служит задание по курсовой работе по дисциплине "Программирование на языках высокого уровня".
1.2 Назначение разработки
Даны несколько городов, соединенных между собой (произвольным образом) двусторонними дорогами. Определить, можно ли построив какие-нибудь 3 новые дороги, из заданного города А добраться до всех других городов. Отобразить решение графически, выделив цветом найденный результат.
1.3 Рассмотренные альтернативы
На этапе разработки было предложено 2 среды разработки:
- C++ Builder 6;
- Borland Delphi 7;
При постановке задачи на разработку данного программного изделия была выбрана среда разработки Borland Delphi 7 в силу легкости проектирования пользовательского интерфейса.
1.4 Стандарты
Разработка программной документации и программного изделия должна производиться согласно ГОСТ 19.701-90, ГОСТ 2.304-88. Единая система программной документации.
1.5 Требования пользователя к программному изделию
Входные и выходные данные
Входные данные:
- система дорог и городов, соединенных произвольным образом между собой;
- файл с расширением *.gph, содержащий вносимые пользователем данные.
Выходными данными являются:
- файл с расширением *.gph, в котором сохраняются данные,
- графическое изображение систем дорог и городов, соединенных произвольным образом между собой;
- матрица смежности и матрица достижимости;
Информационная совместимость
Форматы хранения данных должны быть разработаны на основе документов, приведенных 1.5.1 и по своей структуре полностью соответствовать им.
В качестве входных данных программа должна использовать файл формата *.ghp, матрица смежности. Выходными данными должен быть файл формата *.ghp; графическое изображение систем дорог и городов, соединенных произвольным образом между собой.
Программные ограничения, совместимость
Программное изделие должно работать в операционных системах Windows. Для переноса программы не должны требоваться специальные программные и аппаратные средства
Результирующие компоненты изделия
В программное изделие должны входить следующие компоненты:
- хранилище данных (файл с расширением *.gph);
- командный файл для запуска приложения;
- программная документация на изделие.
Носители информации
Программа должна размещаться в виде файла на жестком диске компьютера пользователя.
Требования к надежности
Программный продукт должен функционировать на всех разработанных тестах. Тесты требуется разработать на этапе рабочего проекта.
Рестарт
В случаях рестарта необходимо запустить на выполнение программу. Данные при рестарте не сохраняются.
Требования к составу и параметрам технических средств
Для работы программного модуля необходимо дисковое пространство не менее 610 Кб, свободная оперативная память в размере не менее 12 Мб, разрешение экрана не менее 1024*768, также микропроцессор 80486 или выше.
2. Рабочий проект
2.1 Модули и объекты интерфейса пользователя
Пользовательский интерфейс включает в себя следующие компоненты:
- набор кнопок управления;
- набор счетчиков;
- меню программы;
- таблица смежности;
- таблица достижимости;
Листинг программы представлен в приложении А.
Описание внешнего вида формы предоставлено в приложении Г.
2.2 Описание подпрограмм модуля Unit 1
Блок-схемы некоторых главных процедур предоставлены в приложении Б.
Подпрограмма procedure TForm1.Button1Click(Sender: TObject)
Входные данные: указатель на вызывающий объект *Sender.
Выходные данные: нет;
Процесс обработки: флажку reb присваивается значение true, перу присваивается режим перерисовки, xx и yy присваивается значении 0;
Используемые внешние переменные: флажок reb, который позволяет риcовать ребро от одной вершины до другой.
Подпрограмма procedure TForm1.Button2Click(Sender: TObject)
Входные данные: указатель на вызывающий объект *Sender.
Выходные данные: нет;
Процесс обработки: флажку reb присваивается значение false, перу присваивается режим перерисовки, xx и yy присваивается значении -100, флажку ver присваивается значение true ;
Используемые внешние переменные: флажок reb, который позволяет рисовать ребро от одной вершины до другой, если значение true, флажок ver, который позволяет рисовать на форме, если значение true;
Подпрограмма procedure TForm1.Button3Click(Sender: TObject)
Выходные данные: указатель на вызывающий объект *Sender.
Выходные данные: нет;
Процесс обработки: вызывается форма 3, вызывается подпрограмма redrow, которая рисует новые дороги и вызывается подпрограмма Button9.Click, которая перерисовывает всё.
Используемые внешние переменные: нет;
Подпрограмма procedure TForm1.Button4Click(Sender: TObject)
Входные данные: указатель на вызывающий объект *Sender;
Выходные данные: нет;
Процесс обработки: флажку del_ver присваивается значение true;
Используемые внешние переменные: флажок del_ver, который позволяет удалять вершину, если значение true.
Подпрограмма procedure TForm1.Button5Click(Sender: TObject)
Входные данные: запись ver;
Выходные данные: изображение на Image1;
Процесс обработки: города, расположенные на компоненте Image1 выстраиваются по окружности. Подпрограмма redrow перерисовывает изображение.
Используемые внешние переменные: step, которая позволяет выстроить вершины по окружности;
Подпрограмма procedure TForm1.Button6Click(Sender: TObject)
Входные данные: запись ver;
Выходных данных: запись ver;
Процесс обработки: через цикл, каждой вершине присваивается значении 0 и вызывается подпрограмма Button9.Click, которая задает новые координаты x и y каждой вершине через цикл.
Используемые внешние переменные: i- счетчик, ver[i].x и ver[i].y - координаты вершин.
Подпрограмма procedure TForm1.Button7Click(Sender: TObject)
Входные данные: файл с расширением *.gph;
Выходные данные: данные матрицы смежности;
Процесс обработки: из файла с расширением *.ghp считываются данные для изображения на компоненте Image1 системы дорог и городов.
Используемые внешние переменные: i,j,k -счетчики, f - имя файла.
Подпрограмма procedure TForm1.Button8Click(Sender: TObject)
Входные данные: данные матрица смежности;
Выходные данные: файл с расширением *.gph и именем f;
Процесс обработки: на диске создается файл с расширением *.gph, в который через цикл записывается содержание матрицы смежности.
Используемые внешние переменные: i,j,k - счетчики, f - имя файла.
Подпрограмма procedure TForm1.Button9Click(Sender: TObject)
Входные данные: запись ver;
Выходные данные: изображение на Image1;
Процесс обработки: устанавливается step, присваивается переменной ns количество городов, если есть города, у которых координаты равны 0 они изменяются на другие, не нулевые, и вызывается подпрограмма перерисовки.
Используемые внешние переменные: step - шаг, ns - количество городов, i - счетчик, vet[i] - запись вершины с её координатами.
Подпрограмма procedure TForm1.Button10Click(Sender: TObject)
Входные данные: указатель на вызывающий объект *Sender;
Выходные данные: нет;
Процесс обработки: ячейки матрицы смежности обнуляются через счетчик, после чего вызывается подпрограмма перерисовки Button9.Click.
Использование внешних переменных: i - счетчик, n - количество городов.
Подпрограмма procedure TForm1.Button11Click(Sender: TObject)
Входные данные: данные с матрицы смежности, данные с 2-х счетчиков на форме;
Выходные данные: данные матрицы достижимости;
Процесс обработки: через цикл с помощью матрицы смежности создается матрица достижимости, после чего через цикл идет изменение матрицы достижимости по алгоритму Флойда. После этого идёт проверка через условие на достижимость из заданного города А в заданный город В. Результат выводится на форму в форме текста.
Используемые переменные: i,j,k - счетчики, dost - двумерный динамический массив.
Подпрограмма procedure TForm1.Button12Click(Sender: TObject)
Входные данные: данные с матрицы смежности, данные с матрицы достижимости, данные с счетчика на форме;
Выходные данные: графическое решение и текстовая информация, матрица достижимости.
Процесс обработки: вызывается подпрограмма Matrix, которая составляет матрицу достижимости по матрице смежности. После выполнения подпрограммы Matrix, переменным doroga и vver присваиваются значения, которые показывают количество дорог, которые нужно достроить. Далее выполняется цикл на проверку матрицы достижимости, если матрица содержит во всех ячейках 1, то выводится сообщение «Все города достижимы», после чего начинается цикл, в котором выполняется проверка на добавление новых дорог.
Используемые переменные: i,j,k- счетчики, dost - двумерный динамический массив, dorog, vver - количества дорог, result - флажок на графическое решение.
Подпрограмма function Matrix;
Входные данные: переменная doroga, переменная vver, матрица смежности.
Выходные данные: матрица достижимости, переменные doroga, vver.
Процесс обработки: подпрограмма обрабатывает данные с матрицы смежности, подсчитывает количество нужных дорог.
Используемые внешние переменные: doroga, vver - количество дорог, dost - двумерный динамический массив.
Подпрограмма function findver(x,y,rad:integer):Integer;
Входные данные: x,y,rad;
Выходные данные: findver;
Процесс обработки: подпрограмма находит номер вершины по координатам x и y и радиусу, после чего выдает её номер.
Используемые внешние переменные: x,y - координаты, rad - радиус окружности.
Подпрограмма procedure TForm1.redrow;
Входные данные: количество городов, запись ver;
Выходные данные: изображение на компоненте Image1;
Процесс обработки: подпрограмма перерисовывает изображение на компоненте Image1;
Используемые внешние переменные: i,j - счетчики;
Подпрограмма procedure TForm1.FormCreate(Sender: TObject);
Входные данные: указатель на вызывающий объект *Sender;
Выходные данные: количество городов;
Процесс обработки: переменным pos и n присваивается значение 0;
Используемые внешние переменные: нет;
Подпрограмма procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
Входные данные: координаты xx и yy, флажки ver, reb2;
Выходные данные: изображение на компоненте Image1;
Процесс обработки: выполнение подпрограммы зависит от значений флажков ver и reb2, если они true, то подпрограмма по флажку ver рисует эллипс с координатами х,у на компоненте Image1, а по флажку reb2 подпрограмма рисует ребро(дорогу) до заданного города.
Используемые внешние переменные: нет;
Подпрограмма procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer)
Входные данные: флажки del_ver, reb, reb2, ver ; координаты клика x,y;
Выходные данные: изображение на компоненте Image1;
Процесс обработки: выполнение подпрограммы зависит от значений флажков del_ver, reb, reb2, ver.
Если del_ver true, то подпрограмма удаляет вершину, с заданными координатами и значение флажков ver, reb, reb2, del_ver изменяет на false, а также убирает на -1 строчку и столбец в матрице смежности и матрице достижимости, соответствующие данной вершине.
Если флажок reb true, то подпрограмма рисует линию от одной вершины до другой. Если другая вершина указана не указана, то значение reb становится false.
Если reb2 true, то reb false, reb2 false и строится линия от одной вершины до другой и в матрицу смежности в ячейке ставится значение «1», указывающее на ребро между этими городами.
Если ver true, то значение городов увеличивается на +1, запоминаются координаты в структуру ver - запись и в матрице смежности и достижимости добавляется строчка и столбец с соответствующим номером города.
Используемые внешние переменные: xx,yy - координаты с компонента Image1, i,j,k,i2 - счетчики;
Подпрограмма procedure TForm1.N5Click(Sender: TObject)
Входные данные: нет;
Выходные данные: нет;
Процесс обработки: выход из программы;
Используемые внешние переменные: нет;
Подпрограмма procedure TForm1.N2Click(Sender: TObject);
Входные данные: нет;
Выходные данные: нет;
Процесс обработки: вызов подпрограммы Button7.Click;
Используемые внешние переменные: нет;
Подпрограмма procedure TForm1.N3Click(Sender: TObject);
Входные данные: нет;
Выходные данные: нет;
Процесс обработки: вызов подпрограммы Button8.Click;
Используемые внешние переменные: нет;
Подпрограмма procedure TForm1.N4Click(Sender: TObject);
Входные данные: нет;
Выходные данные: нет;
Процесс обработки: создание нового графа;
Используемые внешние переменные: i,j - счетчики ;
Подпрограмма procedure TForm1.StringGrid3KeyPress(Sender: TObject; var Key: Char);
Входные данные: числа;
Выходные данные: нет;
Процесс обработки: подпрограмма запрещает вводить числа на главной диагонали в матрице достижимости, а так же ограничивает ввод чисел, кроме 0 и 1 и использование клавиш, кроме Backspace.
Используемые внешние переменные: нет;
Подпрограмма procedure TForm1.Edit1Change(Sender: TObject)
Входные данные: число городов;
Выходные данные: данные матрицы смежности, изображение на компоненте Image1;
Процесс обработки: создается матрица смежности и матрица достижимости размером [pos*pos], где pos - количество городов, а также заполнение ячеек матрицы смежности и матрицы достижимости значением «0».
Используемые внешние переменные: pos, n - количество городов, i,j-счетчики.
Подпрограмма procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Входные данные: координаты места клика левой клавишей мыши X и Y ;
Выходные данные: изображение контекстного меню на компоненте Image1;
Процесс обработки: если нажата не левая клавиша мыши, то показать контекстное меню.
Используемые внешние переменные: нет;
Подпрограмма procedure TForm1.N7Click(Sender: TObject);
Входные данные: нет;
Выходные данные: нет;
Процесс обработки: вызов подпрограммы Button2.Click;
Используемые внешние переменные: нет;
Подпрограмма procedure TForm1.N8Click(Sender: TObject);
Входные данные: нет;
Выходные данные: нет;
Процесс обработки: вызов подпрограммы Button1.Click;
Используемые внешние переменные: нет;
Подпрограмма procedure TForm1.N9Click(Sender: TObject);
Входные данные: нет;
Выходные данные: нет;
Процесс обработки: вызов подпрограммы Button4.Click;
Используемые внешние переменные: нет;
Подпрограмма procedure TForm1.StringGrid3KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
Входные данные: данные с матрицы смежности;
Входные данные; изображение на компоненте Image1;
Процесс обработки: подпрограмма вызывает подпрограмму redrow.
Используемые внешние переменные: нет;
Подпрограмма procedure TForm1.vvChange(Sender: TObject);
Входные данные: данные с счетчика vv.Value;
Входные данные: нет;
Процесс обработки: подпрограмма делает ограничение на ввод в счетчик vv.Value значение больше значения количества городов.
Используемые внешние переменные: pos - количество городов.
Подпрограмма procedure TForm1.IsvChange(Sender: TObject);
Входные данные: данные с счетчика Isv.Value;
Входные данные: нет;
Процесс обработки: подпрограмма делает ограничение на ввод в счетчик Isv.Value значение больше значения количества городов.
Используемые внешние переменные: pos - количество городов.
Подпрограмма procedure TForm1.IzverChange(Sender: TObject);
Входные данные: данные с счетчика Izver.Value;
Входные данные: нет;
Процесс обработки: подпрограмма делает ограничение на ввод в счетчик Izver.Value значение больше значения количества городов.
Используемые внешние переменные: pos - количество городов.
Подпрограмма procedure TForm1.N6Click(Sender: TObject);
Входные данные: нет;
Выходные данные: нет;
Процесс обработки: вызов формы 2;
Используемые внешние переменные: нет;
Подпрограмма procedure redrow_result_true;
Входные данные: количество городов, запись ver;
Выходные данные: изображение на компоненте Image1;
Процесс обработки: аналогичен подпрограмме redrow за исключением выделения ответа другим цветом. В данном случае зеленым, который показывает достижимость всех городов из заданного города А.
Используемые внешние переменные: i,j - счетчики.
Подпрограмма procedure redrow_result_false;
Входные данные: количество городов, запись ver;
Выходные данные: изображение на компоненте Image1;
Процесс обработки: аналогичен подпрограмме redrow за исключением выделения ответа другим цветом. В данном случае синим, который показывает не достижимость некоторых городов из заданного города А.
Используемые внешние переменные: i,j - счетчики.
Подпрограмма procedure TForm1.StringGrid3Set(Sender: TObject; ACol, ARow: Integer; const Value: String);
Входные данные: нет;
Выходные данные: нет;
Процесс обработки: подпрограмма выполняет заполнение матрицы смежности симметрично относительно главной диагонали.
Используемые внешние переменные: нет;
Подпрограмма procedure Dostizhimost(izver:integer);
Входные данные: номер города;
Выходные данные: текстовое сообщение о достижимости или не достижимости до всех городов из заданного города А;
Процесс обработки: подпрограмма строит матрицу достижимости по матрице смежности, делает проверку на достижимость до всех городов из заданного города А через цикл и выводит сообщение с соответствующим результатом.
Используемые внешние переменные: dost - двумерный динамический массив, или матрица достижимости; i,j,k - счетчики.
2.3 Описание подпрограмма модуля Unit 2
Подпрограмма procedure TForm2.Label1Click(Sender: TObject)
Входных данных: нет;
Выходных данных: нет;
Процесс обработки: подпрограмма выполняет закрытие формы 2 по клику на содержимое формы;
Используемые внешние переменные: нет;
2.4 Описание подпрограмм модуля Unit 3
Подпрограмма procedure TForm3.Button1Click(Sender: TObject);
Входные данные: нет;
Выходные данные: нет;
Процесс обработки: закрытие формы;
Используемые внешние переменные: нет;
2.5 Описание подпрограмм модуля Unit 4
Подпрограмма procedure TForm4.Button1Click(Sender: TObject)
Входные данные: нет;
Выходные данные: нет;
Процесс обработки: подпрограмма выполняет закрытие заставочной формы при нажатии на клавишу «ОК».
Используемые внешние переменные: нет.
2.6 Тестовые наборы для отладки интерфейса пользователя
Для отладки интерфейса разработаны следующие тестовые наборы:
1. Случай использования: запуск программы.
Предусловие: открыта заставочная форма.
Тестовый случай: нажатие пользователем на кнопку «ОК»;
Ожидаемый результат: закрытие заставочной формы, появление окна главной формы. (Приложение В, рисунок 1)
2. Случай использования: добавление нового города на компонент Image1.
Предусловие: открыта главная форма;
Тестовый случай: нажатие пользователем на кнопку «Разместить город 1» и нажатие левой клавишей мыши на область компонента Image1;
Ожидаемый результат: на компоненте Image1 появится эллипс с номером города в центре желтого цвета. (Приложение Г, рисунок 2)
3. Случай использования: добавление дороги между городами;
Предусловие: открыта головная форма, имеются 2 города, не соединенных между собой дорогой.
Тестовый случай: нажатие пользователем на кнопку «Добавить дорогу» на главной форме или же в контекстном меню, после последующее нажатие на город 1 и город 2.
Ожидаемый результат: на компоненте Image1 между двумя городами появится линия, на концах который расположено по 4 красных маленьких эллипса разного диаметра. (Приложение Г, рисунок 3)
4. Случай использования: удаление города.
Предусловие: открыта головная форма, имеется хотя бы 2 города на компоненте Image1.
Тестовый случай: нажатие пользователем на кнопку «Удалить город» на главной форме или же через контекстное меню.
Ожидаемый результат: на компоненте Image1 исчезнет изображение города, на который было произведено нажатие левой клавишей мыши, также уменьшение матрицы смежности и достижимости на -1 строку и столбец и удаление дорог, если они были от этого города. (Приложение Г, рисунок 4)
5. Случай использования: просмотр задания;
Предусловие: открыта главная форма;
Тестовый случай: нажатие пользователем на кнопку «Задание»;
Ожидаемый результат: появление формы, с содержанием задания, которое выполняет данная программа. (Приложение Г, рисунок 5)
6. Случай использования: проверка на достижимость из заданного города А в заданный город В;
Предусловие: задана система дорог и координат, указан начальный и конечный город проверки.
Тестовый случай: нажатие пользователем на клавишу «Проверить достижимость»;
Ожидаемый результат: вывод сообщения на главную форму о достижимости или не достижимости из указанного города А в указанный город В. (Приложение Г, рисунок 6)
7. Случай использования: достижимости до всех городов из заданного города А.
Предусловие: задана система дорог и городов, заданный город А.
Тестовый случай: нажатие пользователя на кнопку «Проверить достижимость»;
Ожидаемый результат: вывод результата на главную форму в виде графического решения с цветом дорог:
- если дороги зеленые - все города достижимы из города А;
- если дороги желтые - не все города достижимы из города А; (Приложение Г, рисунок 7(а,б))
8. Случай использования: задание определенного количества городов через счетчик.
Предусловие: на компоненте Image1 имеется хотя бы 1 город.
Тестовый случай: увеличение или уменьшение счетчика количества городов.
Ожидаемый результат: на компоненте Image1 появится заданное количество город. (Приложение Г, рисунок 8)
9. Случай использования: загрузка графа из файла.
Предусловие: имеется файл формата *.gph с данными матрицы смежности.
Тестовый случай: нажатие пользователя на кнопку «Загрузить файл графа с файла» и указание файла через проводник.
Ожидаемый результат: заполнение матрицы смежности по данным из файла и графическое отображение городов на компоненте Image1. (Приложение Г, рисунок 9)
10. Случай использования: сохранения текущего графа в файл.
Предусловие: имеется система дорог и городов.
Тестовый случай: нажатие пользователя на кнопку «Сохранить текущий граф в файл», указание места сохранения через проводник и имя файла.
Ожидаемый результат: на диске появится файл с именем, который задал пользователь и форматом *.gph, содержащий данные матрицы смежности. (Приложение Г, рисунок 10)
11. Случай использования: удаление всех дорог;
Предусловие: имеется система дорог и городов.
Тестовый случай: нажатие пользователя на кнопку «Удалить все дороги»;
Ожидаемый результат: в имеющейся системе дорог и городов будут удалены все дороги. (Приложение Г, рисунок 11)
Заключение
Таким образом, данный программный продукт полностью реализует поставленную задачу. Программа предоставляет возможность для создания системы дорог и городов, а так же быстро и точно определяет достижимость до всех других городов и изменяемой системе дорог. Также проект содержит понятный пользователю интерфейс, на котором предоставляется решение задачи в виде системы дорог и городов и полученных в результате решения данных.
Список использованных источников
1. Круз Р.Л. Структуры данных и проектирование программ / Р.Л. Круз; пер.с англ. - М.: БИНОМ. Лаборатория знаний, 2008 - 765 с.: ил. - (Программисту).
2. Кузнецов А.В., Сакович В.А., Холод Н.И. Высшая математика. Математическое программирование. - Минск: Высшая школа, 2010 г.- С.792.
3. Оре О. Теория Графов. - М.: Наука, 2010 г.
4. Белов. Теория Графов. - М.: Наука, 2011 г.
5. Нефедов В.Н., Осипова В.А. Курс дискретной математики. - М.: МАИ, 2010 г.
Приложение А
Листинг программы
дорога город достижимость интерфейс
unit Unit1; // модуль формы 1 «Проверка достижимости из города А до всех других дорог в изменяемой системе дорог»
interface
uses // стандартные модули
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ExtCtrls, ComCtrls, Menus, ExtDlgs, Spin, XPMan;
type
TForm1 = class(TForm) // типы объектов графического интерфейса и процедуры модуля
Image1: TImage;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N5: TMenuItem;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
N4: TMenuItem;
PopupMenu1: TPopupMenu;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
GroupBox1: TGroupBox;
PageControl1: TPageControl;
TabSheet3: TTabSheet;
Button10: TButton;
Button9: TButton;
Button5: TButton;
Button6: TButton;
GroupBox2: TGroupBox;
Button2: TButton;
Button1: TButton;
Button4: TButton;
XPManifest1: TXPManifest;
GroupBox3: TGroupBox;
Label2: TLabel;
Label3: TLabel;
vv: TSpinEdit;
Label4: TLabel;
isv: TSpinEdit;
Button11: TButton;
N6: TMenuItem;
Label5: TLabel;
TabSheet1: TTabSheet;
StringGrid1: TStringGrid;
Button3: TButton;
Button12: TButton;
Izver: TSpinEdit;
Label6: TLabel;
TabSheet2: TTabSheet;
Label1: TLabel;
StringGrid3: TStringGrid;
Edit1: TSpinEdit;
Button7: TButton;
Button8: TButton;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure redrow;
procedure Button1Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure StringGrid3KeyPress(Sender: TObject; var Key: Char);
procedure Edit1Change(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure N7Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure N10Click(Sender: TObject);
procedure Button11Click(Sender: TObject);
procedure StringGrid3KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure vvChange(Sender: TObject);
procedure isvChange(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure StringGrid3Set(Sender: TObject; ACol,
ARow: Integer; const Value: String);
procedure Button3Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
procedure IzverChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
vv = record
x,y:Integer;
num:Integer;
end;
var
Form1: TForm1;
pos,pos2:Integer;
n,xx,yy,xb,yb,ugol,doroga,vver,i,j,k:Integer;
ver,reb,reb2,del_ver,result:Boolean;
vers:array[1..100] of vv;
dost :array of array of integer;
implementation
uses Math, Unit2, Unit3, Unit4;
{$R *.dfm}
function findver(x,y,rad:integer):Integer; // находит вершину в графе на которую указали сейчас.
var i:Integer;
begin
findver:=0;
for i:=1 to pos do begin
if (x>vers[i].x-rad) and (x<vers[i].x+rad) and (y>vers[i].y-rad) and (y<vers[i].y+rad) then
findver:=i;
end;
end;
procedure Matrix; //алгоритм Флойда.
begin
SetLength(dost, pos,pos);
for i:=1 to pos do
for j:=1 to pos do
if Form1.StringGrid3.Cells[j,i]<>'0' then
dost[i-1,j-1]:=1 else dost[i-1,j-1]:=0;
for i:=1 to pos do
for j:=1 to pos do
if dost[j-1,i-1]=0 then doroga:=doroga+1;
for k:=0 to pos-1 do // ищем можно ли сократить путь через третью вершину К
for i:=0 to pos-1 do
for j:=0 to pos-1 do
dost[i,j]:= dost[i,j] or (dost[i,k] and dost[k,j]) ;
for i:=1 to pos do
for j:=1 to pos do
begin
if dost[j-1,i-1]=0 then vver:=vver+1;
Form1.StringGrid1.Cells[j,i]:=inttostr(dost[i-1,j-1]);
end;
end;
procedure TForm1.redrow; // перерисовка изображения графа на картинке
var i,j:Integer; // вспомогательные переменные
begin
if pos =0 then exit;
n:=stringgrid3.ColCount-1;
Image1.Canvas.Pen.Mode := pmCopy;
Image1.Canvas.Brush.Color := clWhite;
Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.Height); // очистка канваса без мигания
Image1.Canvas.Pen.Width:=1;
for i:=1 to n do // рисуем дуги
for j:=1 to n do
if strtoint(StringGrid3.Cells[i,j])>0 then
begin
Image1.Canvas.MoveTo(vers[i].x,vers[i].y);
Image1.Canvas.lineTo(vers[j].x,vers[j].y);
/// красная точка направления
Image1.Canvas.pen.Color := clRed;
Image1.Canvas.Brush.Color := clRed;
Image1.Canvas.ellipse(round(vers[j].x+(vers[i].x- vers[j].x)*0.9)-4,round(vers[j].y+(vers[i].y- vers[j].y)*0.9)-4,
round(vers[j].x+(vers[i].x- vers[j].x)*0.9)+4,round(vers[j].y+(vers[i].y- vers[j].y)*0.9)+4);
Image1.Canvas.ellipse(round(vers[j].x+(vers[i].x- vers[j].x)*0.93)-3,round(vers[j].y+(vers[i].y- vers[j].y)*0.93)-3,
round(vers[j].x+(vers[i].x- vers[j].x)*0.93)+3,round(vers[j].y+(vers[i].y- vers[j].y)*0.93)+3);
Image1.Canvas.ellipse(round(vers[j].x+(vers[i].x- vers[j].x)*0.95)-2,round(vers[j].y+(vers[i].y- vers[j].y)*0.95)-2,
round(vers[j].x+(vers[i].x- vers[j].x)*0.95)+2,round(vers[j].y+(vers[i].y- vers[j].y)*0.95)+2);
Image1.Canvas.ellipse(round(vers[j].x+(vers[i].x- vers[j].x)*0.97)-1,round(vers[].y+(vers[i].y- vers[j].y)*0.97)-1,
round(vers[j].x+(vers[i].x- vers[j].x)*0.97)+1,round(vers[j].y+(vers[i].y- vers[j].y)*0.97)+1);
Image1.Canvas.Pen.Color := clBlack;
Image1.Canvas.Brush.Color := clWhite;
Image1.Canvas.pen.Style:= psSolid ;
end;
for i:=1 to n do
begin // вершины - кружки с номером вершины
Image1.Canvas.Brush.Color:=RGB(234,228,36);
Image1.Canvas.Ellipse(vers[i].x-10,vers[i].y-10,vers[i].x+10,vers[i].y+10);
Image1.Canvas.TextOut(vers[i].x-3,vers[i].y-6,inttostr(i));
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
pos:=0;
n:=0;
result:=false;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
reb:=false;
xx:=-100;
yy:=-100;
Image1.Canvas.Pen.Mode := pmNotXor;
ver:= True;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ver then
begin
Image1.Canvas.Ellipse(xx-10,yy-10,xx+10,yy+10);
xx:=x;
yy:=y;
Image1.Canvas.Ellipse(x-10,y-10,x+10,y+10);
end;
if reb2 then
begin
Image1.Canvas.MoveTo(xb,yb);
Image1.Canvas.LineTo(xx,yy);
xx:=x;
yy:=y;
Image1.Canvas.MoveTo(xb,yb);
Image1.Canvas.LineTo(x,y);
end
else
begin
xb:=x;
yb:=y;
end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var j,k,i,i2,xx,yy:integer;
begin
If del_ver then
begin // удаление вершины
//найти удаляемую вершину
k:=findver(x,y,10); //удалить все ребра которые входят и выходят их этой вершины
ver:= false;
reb := false;
reb2:=false;
del_ver:=false;
if k=0 then exit;
for i:=1 to StringGrid3.ColCount-1 do
if i>=k then vers[i]:=vers[i+1];
// будем копировать на единицу назад столбцы, если они стоят правее удаляемой вершины
for i:=1 to StringGrid3.RowCount-1 do
for j:=1 to StringGrid3.RowCount-1 do
if j>=k then StringGrid3.Cells[i,j]:=StringGrid3.cells[i,j+1];
for j:=1 to StringGrid3.RowCount-1 do
for i:=1 to StringGrid3.RowCount-1 do
if i>=k then StringGrid3.Cells[i,j]:=StringGrid3.cells[i+1,j];
pos:=pos-1;
edit1.Value:=edit1.Value-1;
StringGrid3.cells[0,0]:='*';
redrow;
Image1.Canvas.Pen.Mode := pmCopy;
Button2.Caption:= 'Разместить город '+IntToStr(pos+1);
end;
If ver then
begin
inc(pos);
vers[pos].x:=x;
vers[pos].y:=y;
xx:=-100;yy:=-100;
vers[pos].num:=pos;
ver:=False;
Button2.Caption:= 'Разместить город '+IntToStr(pos+1);
If pos>1 then
begin
StringGrid3.ColCount:=StringGrid3.ColCount+1;
StringGrid3.RowCount:=StringGrid3.RowCount+1;
Edit1.Value :=pos;
end;
for i:=1 to edit1.value+1 do
begin // рисуем новые номера вершин после изм. количества вершин
StringGrid3.Cells[i,0]:= inttostr(i);
StringGrid3.Cells[0,i]:= inttostr(i);
end;
for i:=1 to edit1.value do
begin
for i2:=1 to edit1.value do
begin
if StringGrid3.Cells[i2,i]='' then
StringGrid3.cells[i2,i]:='0';
end;
end;
redrow;// перерисуем что получилось после добавления вершины
end;
if reb2 then begin
try
reb:=false;
reb2:=false;
xx:=0;
yy:=0;
i:=findver(x,y,10);
If i <>0 then
begin // если указали все верно из одного кружка вершины в другой, то добавим в матрицу смежности запись
StringGrid3.Cells[findver(x,y,10),findver(xb,yb,10)]:='1';
StringGrid3.Cells[findver(xb,yb,10),findver(x,y,10)]:='1'
end;
StringGrid3.cells[0,0]:='*';
redrow;
except;
redrow;
end;
end;
if reb then
begin
try
xb:=x;
yb:=y;
xx:=x;
yy:=y;
reb2:=True;
Image1.Canvas.MoveTo(0,0);
Image1.Canvas.LineTo(x,y);
i:=findver(x,y,10);
If i <>0 then
begin
inc(n);
StringGrid3.Cells[pos2,0]:=inttostr(i);
i:=findver(x,y,10); // найти к какой вершине мы сейчас добавляем ребро
end;
except;
reb:=false; // неудачная попытка добавить ребро
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
xx:=0;
yy:=0;
Image1.Canvas.Pen.Mode := pmNotXor;
reb:=true;
end;
procedure TForm1.Button9Click(Sender: TObject);
var ns,ms, x,y,i,j:Integer;
step:real;
begin
step:= 4*3.14/ edit1.value;
ns:=(edit1.value);
for i:=1 to edit1.value do
if ((vers[i].x=0) or(vers[i].y=0)) then
begin
while ((findver(x,y,20)>0) or (x<50) or ((y+50)>image1.Height) or (y<50) or ((x+50)>image1.Width)) do
begin
ns:=image1.Width-random(image1.Width*2);
ms:=image1.Height-random(image1.Height*2);
x:=ns+ 300+ trunc(cos(i*step+ms+ugol/100)*100);
y:=ms+ 150+ trunc(sin(i*step+ns+ugol/100)*100);
end;
vers[i].x:=x; vers[i].y:=y;
end;
redrow;
end;
procedure TForm1.Button5Click(Sender: TObject);
var x,y:Integer;
i:Integer;
step:real;
begin
step:=2*3.14/ edit1.value;
for i:=1 to edit1.value do
begin
vers[i].x:= 300+ trunc(cos(i*step+ugol/100)*100);
vers[i].y:= 150+ trunc(sin(i*step+ugol/100)*100);
end;
redrow;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
del_ver:=true;
end;
procedure TForm1.Button10Click(Sender: TObject);
var i,j:Integer;
begin
// очистка грида
n:=edit1.Value;
pos:=edit1.Value;
for i:=1 to n do
for j:=1 to n do
StringGrid3.cells[j,i]:='0';
Button9.Click;
end;
procedure TForm1.N5Click(Sender: TObject);
begin
Halt(0);
end;
procedure TForm1.N2Click(Sender: TObject);
begin
button7.Click; // вызов открытия из меню
end;
procedure TForm1.N3Click(Sender: TObject);
begin
button8.click; // вызов сохранения их меню
end;
procedure TForm1.N4Click(Sender: TObject); // новый граф
var i,j:integer;
begin
Button10.click; // вначале очистка грида
edit1.Value:=1; // убираем лишние строки и столбцы
label5.Caption:=' ';
Button9.click; // обновляем картинку
Button2.Caption:= 'Разместить город '+IntToStr(pos+1);
for i:=0 to pos-1 do
for j:=0 to pos-1 do
begin
StringGrid1.Cells[i,j]:='0';
StringGrid3.Cells[i,j]:='0';
end;
end;
procedure TForm1.StringGrid3KeyPress(Sender: TObject; var Key: Char);
begin
if (Sender as TStringGrid).col=(Sender as TStringGrid).row // нельзя ставить на главное диагонали
then key := Chr(0);
case Key of
#8,'1','0':; // цифры и клавиша <Backspace>
else key := Chr(0); // остальные символы запрещены
end;
end;
procedure TForm1.Edit1Change(Sender: TObject);
var i,j : integer;
begin
try
StringGrid3.ColCount:=edit1.Value+1;// при изменении спинбокса нужно перерисовать матрицу
StringGrid3.RowCount:=edit1.Value+1;
StringGrid1.ColCount:=edit1.Value+1;// при изменении спинбокса нужно перерисовать матрицу
StringGrid1.RowCount:=edit1.Value+1;
n:=edit1.Value;
pos:=edit1.Value;
// надписи о номерах
for i:=1 to n+1 do
begin
StringGrid3.Cells[i,0]:= inttostr(i);
StringGrid3.Cells[0,i]:= inttostr(i);
end;
for i:=1 to n+1 do
begin
StringGrid1.Cells[i,0]:= inttostr(i);
StringGrid1.Cells[0,i]:= inttostr(i);
end;
for i:=1 to n do
for j:=1 to n do
begin
if StringGrid3.Cells[j,i]='' then
StringGrid3.cells[j,i]:='0';
end;
for i:=1 to n do
for j:=1 to n do
begin
if StringGrid1.Cells[j,i]='' then
StringGrid1.cells[j,i]:='0';
end;
button9.Click; // обновить картинку
Button2.Caption:= 'Разместить город '+IntToStr(pos+1);
except;
end;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; // по нажатию на имаже
Shift: TShiftState; X, Y: Integer);
begin
if button <>mbLeft then // если нажали левой кнопкой
PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.y); // показать контекстное меню
end;
procedure TForm1.N7Click(Sender: TObject);
begin
Button2.Click ;
end;
procedure TForm1.N8Click(Sender: TObject);
begin
Button1.Click ;
end;
procedure TForm1.N9Click(Sender: TObject);
begin
Button4.Click;
end;
procedure TForm1.Button6Click(Sender: TObject);
var i :integer;
begin
for i:=1 to edit1.value do
begin
vers[i].x:=0; vers[i].y:=0;
end;
Button9.Click ;
end;
procedure TForm1.Button7Click(Sender: TObject);
var
f: TextFile;
iTmp, i, k: Integer;
strTemp: String;
begin
if (not OpenDialog1.Execute()) then exit;
AssignFile(f,OpenDialog1.FileName);
Reset(f);
with StringGrid3 do
begin
Readln(f, iTmp);
ColCount := iTmp;
Readln(f, iTmp);
RowCount := iTmp;
edit1.Value:=ColCount-1;
for i := 0 to ColCount - 1 do
for k := 0 to RowCount - 1 do
begin
Readln(f, strTemp);
Cells[i, k] := strTemp;
end;
Label5.Caption:='';
end;
CloseFile(f);
if StringGrid3.ColCount>10 then button6.Click else button5.Click;// обновим изображение
Button2.Caption:= 'Разместить город '+IntToStr(pos+1);
end;
procedure TForm1.Button8Click(Sender: TObject);
var
f: TextFile;
i, k: Integer;
begin
if (not SaveDialog1.Execute()) then exit; // проверяем открылся ли диалог загрузки
AssignFile(f, SaveDialog1.FileName);
Rewrite(f);
with StringGrid3 do
begin
Writeln(f, ColCount);
Writeln(f, RowCount);
for i := 0 to ColCount - 1 do
for k := 0 to RowCount - 1 do
Writeln(F, Cells[i, k]);
end;
CloseFile(F);
end;
procedure TForm1.N10Click(Sender: TObject);
begin
button11.Click; // вызов решения гамильтонова цикла
end;
procedure TForm1.Button11Click(Sender: TObject);
var i,j,k: integer;
dost :array of array of integer;
begin
if pos<2 then exit;
SetLength(dost, pos,pos);
for i:=1 to pos do
for j:=1 to pos do
if StringGrid3.Cells[j,i]<>'0' then
dost[i-1,j-1]:=1 else dost[i-1,j-1]:=0;
for k:=0 to pos-1 do // ищем можно ли сократить путь через третью вершину К
for i:=0 to pos-1 do
for j:=0 to pos-1 do
dost[i,j]:= dost[i,j] or (dost[i,k] and dost[k,j]) ;
if dost[ isv.Value-1, vv.Value-1]=0 then
label5.Caption:='Город НЕ достижим'
else
begin
label5.Caption:='Город достижим';
for i:=1 to pos do
for j:=1 to pos do
StringGrid1.Cells[j,i]:=inttostr(dost[i-1,j-1]);
end;
end;
procedure TForm1.StringGrid3KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
redrow;
end;
procedure TForm1.vvChange(Sender: TObject);
begin
if vv.Value>pos then vv.Value:=pos;
end;
procedure TForm1.isvChange(Sender: TObject);
begin
if isv.Value>pos then isv.Value:=pos;
end;
procedure TForm1.IzverChange(Sender: TObject);
begin
if izver.Value>pos then izver.Value:=pos;
end;
procedure TForm1.N6Click(Sender: TObject);
begin
form2.show;
end;
procedure redrow_result_true;
var i,j:integer;
begin
if pos =0 then exit;
n:=form1.stringgrid3.ColCount-1;
form1.Image1.Canvas.Pen.Mode := pmCopy;
form1.Image1.Canvas.Brush.Color := clWhite;
form1.Image1.Canvas.Rectangle(0,0,form1.Image1.Width,form1.Image1.Height); // очистка канваса без мигания
form1.Image1.Canvas.Pen.Width:=3;
form1.Image1.Canvas.Pen.Color := clGreen;
for i:=1 to n do // рисуем ребра
for j:=1 to n do
if strtoint(form1.StringGrid3.Cells[i,j])>0 then
begin
form1.Image1.Canvas.MoveTo(vers[i].x,vers[i].y);
form1.Image1.Canvas.lineTo(vers[j].x,vers[j].y);
/// красная точка направления
form1.Image1.Canvas.pen.Color := clRed;
form1.Image1.Canvas.Brush.Color := clRed;
form1.Image1.Canvas.ellipse(round(vers[j].x+(vers[i].x- vers[j].x)*0.9)-4,round(vers[j].y+(vers[i].y- vers[j].y)*0.9)-4,
round(vers[j].x+(vers[i].x-vers[j].x)*0.9)+4,round(vers[j].y+(vers[i].y- vers[j].y)*0.9)+4);
form1.Image1.Canvas.ellipse(round(vers[j].x+(vers[i].x- vers[j].x)*0.93)-3,round(vers[j].y+(vers[i].y- vers[j].y)*0.93)-3,
round(vers[j].x+(vers[i].x- vers[j].x)*0.93)+3,round(vers[j].y+(vers[i].y- vers[j].y)*0.93)+3);
form1.Image1.Canvas.ellipse(round(vers[j].x+(vers[i].x- vers[j].x)*0.95)-2,round(vers[j].y+(vers[i].y- vers[j].y)*0.95)-2,
round(vers[j].x+(vers[i].x- vers[j].x)*0.95)+2,round(vers[j].y+(vers[i].y- vers[j].y)*0.95)+2);
form1.Image1.Canvas.ellipse(round(vers[j].x+(vers[i].x- vers[j].x)*0.97)-1,round(vers[j].y+(vers[i].y- vers[j].y)*0.97)-1,
round(vers[j].x+(vers[i].x- vers[j].x)*0.97)+1,round(vers[j].y+(vers[i].y- vers[j].y)*0.97)+1);
form1.Image1.Canvas.Pen.Width:=3;
form1.Image1.Canvas.Pen.Color := clGreen;
form1.Image1.Canvas.Brush.Color := clWhite;
form1.Image1.Canvas.pen.Style:= psSolid ;
end;
form1.Image1.Canvas.Pen.Width:=1;
form1.Image1.Canvas.Pen.Color := clBlack;
for i:=1 to n do
begin // вершины - кружки с номером вершины
Form1.Image1.Canvas.Brush.Color:=RGB(234,228,36);
Form1.Image1.Canvas.Ellipse(vers[i].x-10,vers[i].y-10,vers[i].x+10,vers[i].y+10);
Form1.Image1.Canvas.TextOut(vers[i].x-3,vers[i].y-6,inttostr(i));
end;
end;
procedure redrow_result_false;
var i,j:integer;
begin
if pos =0 then exit;
n:=form1.stringgrid3.ColCount-1;
form1.Image1.Canvas.Pen.Mode := pmCopy;
form1.Image1.Canvas.Brush.Color := clWhite;
form1.Image1.Canvas.Rectangle(0,0,form1.Image1.Width,form1.Image1.Height); // очистка канваса без мигания
form1.Image1.Canvas.Pen.Width:=3;
form1.Image1.Canvas.Pen.Color := clYellow;
for i:=1 to n do // рисуем ребра
for j:=1 to n do
if strtoint(form1.StringGrid3.Cells[i,j])>0 then
begin
form1.Image1.Canvas.MoveTo(vers[i].x,vers[i].y);
form1.Image1.Canvas.lineTo(vers[j].x,vers[j].y);
/// красная точка направления
form1.Image1.Canvas.pen.Color := clRed;
form1.Image1.Canvas.Brush.Color := clRed;
form1.Image1.Canvas.ellipse(round(vers[j].x+(vers[i].x- vers[j].x)*0.9)-4,round(vers[j].y+(vers[i].y- vers[j].y)*0.9)-4,
round(vers[j].x+(vers[i].x-vers[j].x)*0.9)+4,round(vers[j].y+(vers[i].y- vers[j].y)*0.9)+4);
form1.Image1.Canvas.ellipse(round(vers[j].x+(vers[i].x- vers[j].x)*0.93)-3,round(vers[j].y+(vers[i].y- vers[j].y)*0.93)-3,
round(vers[j].x+(vers[i].x- vers[j].x)*0.93)+3,round(vers[j].y+(vers[i].y- vers[j].y)*0.93)+3);
form1.Image1.Canvas.ellipse(round(vers[j].x+(vers[i].x- vers[j].x)*0.95)-2,round(vers[j].y+(vers[i].y- vers[j].y)*0.95)-2,
round(vers[j].x+(vers[i].x- vers[j].x)*0.95)+2,round(vers[j].y+(vers[i].y- vers[j].y)*0.95)+2);
form1.Image1.Canvas.ellipse(round(vers[j].x+(vers[i].x- vers[j].x)*0.97)-1,round(vers[j].y+(vers[i].y- vers[j].y)*0.97)-1,
round(vers[j].x+(vers[i].x- vers[j].x)*0.97)+1,round(vers[j].y+(vers[i].y- vers[j].y)*0.97)+1);
form1.Image1.Canvas.Pen.Width:=3;
form1.Image1.Canvas.Pen.Color := clYellow;
form1.Image1.Canvas.Brush.Color := clWhite;
form1.Image1.Canvas.pen.Style:= psSolid ;
end;
form1.Image1.Canvas.Pen.Width:=1;
form1.Image1.Canvas.Pen.Color := clBlack;
for i:=1 to n do
begin // вершины - кружки с номером вершины
Form1.Image1.Canvas.Brush.Color:=RGB(234,228,36);
Form1.Image1.Canvas.Ellipse(vers[i].x-10,vers[i].y-10,vers[i].x+10,vers[i].y+10);
Form1.Image1.Canvas.TextOut(vers[i].x-3,vers[i].y-6,inttostr(i));
end;
end;
procedure TForm1.StringGrid3Set(Sender: TObject; ACol,
ARow: Integer; const Value: String);
begin
TStringGrid(Sender).Cells[ARow, ACol] := Value;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Form3.Show;
redrow;
Button9.Click;
end;
procedure Dostizhimost(izver:integer);
begin
izver:=izver;
doroga:=0;
vver:=0;
if pos<2 then exit;
Matrix;
for i:=1 to pos do
if dost[izver-1,i-1]<>0 then
begin
result:=true;
Form1.Label5.Caption:='Все города достижимы';
end;
doroga:=Round((doroga-pos)/(5*pos));
vver:=Round(vver/pos);
if (doroga<=3) and ((vver<5) or (vver=6) or (vver=10)) then
begin
for i:=1 to pos do
begin
for j:=1 to pos+1 do
if dost[izver-1,j-1]=0 then
begin
Form1.StringGrid3.Cells[izver,j]:='1';
Form1.StringGrid3.Cells[j,izver]:='1';
Form1.Label5.Caption:='Все города достижимы';
result:=true;
Matrix;
end;
for j:=1 to pos do
if dost[izver-1,j-1]=0 then
begin
Form1.StringGrid3.Cells[izver,j]:='1';
Form1.StringGrid3.Cells[j,izver]:='1';
Form1.Label5.Caption:='Все города достижимы';
Matrix;
end;
end;
end
else begin
result:=false;
Form1.Label5.Caption:='Не все города достижимы';
end;
end;
procedure TForm1.Button12Click(Sender: TObject);
var i,j:integer;
begin
Dostizhimost(Form1.izver.Value);
if result then redrow_result_true else redrow_result_false;
end;
end.
unit Unit2; // модуль формы 2 «О программе»
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Label1: TLabel;
procedure Label1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Label1Click(Sender: TObject);
begin
Close;
end;
end.
unit Unit3; // модуль формы 3 «Задание»
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,unit1;
type
TForm3 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
Close;
end;
end.
unit Unit4; // модуль формы 4 «Заставочная форма»
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm4 = class(TForm)
Timer1: TTimer;
Button1: TButton;
Label1: TLabel;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.Button1Click(Sender: TObject);
begin
Form4.Timer1.Enabled:=false;
close;
end;
end.
Приложение Б
Блок-схемы основных подпрограмм.
1. Достижимость до всех городов (подпрограмма procedure Dostizhimost(izver:integer))
Размещено на http://www.allbest.ru/
- 6 -
-4-
Размещено на http://www.allbest.ru/
- 6 -
-4-
Размещено на http://www.allbest.ru/
- 6 -
-4-
2. Построение матрицы достижимости по матрице смежности (подпрограмма Matrix)
Размещено на http://www.allbest.ru/
- 6 -
-4-
Размещено на http://www.allbest.ru/
- 6 -
-4-
Приложение В
Описание внешнего вида пользовательского интерфейса
На рисунке представлена главная форма программы.
Компоненты главной формы:
- Image1;
- Buttons;
- SpinEdit;
- StringGrid;
- GroupBox;
- PageControl;
- MainMenu;
- PopupMenu
- Label;
На рисунке 1 отмечено 4 области:
1. Визуальный редактор, который состоит из 4-х кнопок: «Разместить город», «Добавить дорогу», «Удалить город», «Задание»; каждой из которых привязана своя подпрограмма.
2. Решение, которое состоит из 3-х счетчиков: а) - пункт А, б) пункт В, в) - пункт В; 2-х кнопок: «Проверить достижимость», «Достижимость до всех городов»; и поля для рисования системы дорог и городов.
3. Меню программы, которое содержит в себе 2 подменю :
· Файл:
· О программе:
4. Граф, который содержит в себе:
· Матрицу смежности:
· Матрицу достижимости:
· Управление графом:
· 2 кнопки: «Загрузить граф из файла», «Сохранить текущий граф в файл»;
· Счетчик городов.
Приложение Г
Тестовый случай 1
Рисунок 1
Тестовый случай 2:
Рисунок 2
Тестовый случай 3
Рисунок 3
Тестовый случай 4
Рисунок 4
Тестовый случай 5
Рисунок 5
Тестовый случай 6
Рисунок 6
Тестовый случай 7
Рисунок 7 (а)
Рисунок 7 (б)
Тестовый случай 8
Подобные документы
Функциональное и эксплуатационное назначение изделия, методологические ограничения. Требования к составу и параметрам технических средств. Описание алгоритма, входные и выходные данные. Стадии и этапы разработки, технико-экономическое обоснование.
курсовая работа [564,4 K], добавлен 18.01.2014Изучение правил проектирования (предоставление пользователю контроля над программой, уменьшение загрузки памяти, увеличение визуальной ясности, последовательность) и принципов разработки пользовательского интерфейса на примере программы "Tidy Start Menu".
курсовая работа [286,6 K], добавлен 27.04.2010Понятие электронных учебников и их классификация, общие требования к ним. Порядок разработки электронных учебников, обзор средств их создания и определение затрат. Основные требования к программному продукту. Разработка программы, описание интерфейса.
дипломная работа [1,1 M], добавлен 07.05.2014Концептуальное проектирование информационной системы "Спортивные организации города". Анализ информационных потоков и определение требований к функциям проектируемой системы. Разработка основных элементов интерфейса, алгоритмов ввода и вывода информации.
курсовая работа [999,2 K], добавлен 06.01.2014Разработка программного приложения, производящего проверку синтаксиса простой программы: выбор метода создания синтаксического анализатора, описание требований к программному обеспечению, написание алгоритмов решения и тестирование конечного продукта.
курсовая работа [579,7 K], добавлен 03.07.2011Разработка программы создания заметок в любом месте компьютера. Выбор технологии, языка и среды разработки приложения. Описание основных алгоритмов работы программного обеспечения. Проектирование пользовательского интерфейса. Выбор стратегии тестирования.
отчет по практике [700,5 K], добавлен 24.11.2014Определение и виды пользовательского интерфейса как системы сопряжения пользователей с программами, принципы его разработки, используемые методы и приемы. Основные критерии и параметры оценки эффективности функционирования пользовательского интерфейса.
презентация [557,1 K], добавлен 06.10.2014Анализ предметной области. Основание, назначение для разработки, требования к программному средству. Выбор подхода и модели разработки ПС. Анализ требований, разработка и определение вариантов спецификаций. Описание объектов, свойств и методов.
курсовая работа [510,3 K], добавлен 23.02.2011Краткое описание этапов разработки программного продукта. Анализ поставленных задач и определение основных функций программы. Разработка пользовательского интерфейса. Составление программной документации. Техническое задание на разработку проекта.
дипломная работа [1,5 M], добавлен 06.04.2013Основные требования к программному средству. Компоненты интегрированной среды Delphi 7, алгоритм создания приложения. Разработка программы для редактирования и просмотра данных о клиентах, врачах, перечне медицинских услуг, стоимости медикаментов.
курсовая работа [2,6 M], добавлен 13.10.2012