Автор: Пользователь скрыл имя, 28 Марта 2013 в 16:34, курсовая работа
Курсовой проект выполняется с целью закрепления знаний и развития навыков самостоятельного проектирования алгоритмов и программ.
Задачами курсового проекта являются:
Исследование графов
изучение основных свойств графов
изучить один алгоритм на грае
написание программы, которая выполняет один из алгоритмов на графе
Введение 3
1. Основные сведения о матрицах смежности. 5
2. Математические зависимости для определения заданных свойств графа 6
2.1. Основные определения. 6
2.2. Алгоритм Дейкстры «Нахождение минимального пути» 7
3. Структура программы 14
3.1 Хранение информации о графе 15
3.2 Входные и выходные данные 16
3.3 Анализ программы 16
4. Руководство пользователя 23
Заключение 25
Список литературы 26
Размещение объектов в Delphi связано с более тесными отношениями между объектами и реальным программным кодом. Объекты помещаются на форму, при этом код, отвечающий объектам, автоматически записывается в исходный файл. Этот код компилируется, обеспечивая существенно более высокую производительность, чем визуальная среда, которая интерпретирует информацию лишь в ходе исполнения программы.
Для удобства пользователя создан визуальный редактор работы с графами. Данный редактор позволяет вводить граф в виде изображения вершин и ребер на плоскости.
Для изображения контекстного меню потребовалось обработать нажатие правой кнопки мышки.
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; // по нажатию на кнопку и даже Shift: TShiftState; X, Y: Integer); begin if button <>mbLeft then // если нажали левой кнопкой PopupMenu1.Popup(Mouse. end; |
Для размещения ребра или вершины используется следующая схема.
3.3 Интерфейс программы
При запуске программы перед вами появляется окно графического интерфейса.
Данное окно позволяет создавать новые графы ( через матрицу смежности и графический интерфейс). Загружать и сохранять их используя пункты меню. Пример решения задачи
Для сохранения и загрузки используется стандартный диалог выбора файлов.
На вкладке палитры компонентов Dialogs находятся компонент Delphi OpenDialog и компонент Delphi SaveDialog. Все Delphi диалоги, находящиеся на этой вкладке, в том числе и Delphi диалоги выбора файла, невизуальные, т.е. при переносе их на Форму в работающей программе их не видно, они видны только на этапе конструирования. Компонент Delphi OpenDialog позволяет открыть в нашей программе стандартное Windows-окно диалога открытия файла, компонент Delphi SaveDialog - окно диалога сохранения. Данные полученные из диалогов передаются в программу для работы с конкретным файлом графа.
Граф в программе хранится в виде матрицы смежности. Данная матрица используется для сохранения весов дуг. В столбцах находятся вершины куда направлена дуга, а в строках откуда.
Для ориентированного графа матрица может быть не симметрична относительно главной диагонали. Для неориентированного графа она всегда симметрична.
Компонент StringGrid представляет собой таблицу, содержащую строки. Данные таблицы могут быть только для чтения или редактируемыми. Таблица может иметь полосы прокрутки, причем заданное число первых строк и столбцов может быть фиксированным и не прокручиваться. Таким образом, можно задать заголовки столбцов и строк, постоянно присутствующие в окне компонента. Каждой ячейке таблицы может быть поставлен в соответствие некоторый объект.
Компонент StringGrid предназначен в первую очередь для отображения таблиц текстовой информации.
Основные свойства компонента, определяющие отображаемый текст:
В качестве курсового проекта было разработано и спроектировано приложение, позволяющее определять некоторые свойства графов. Были получены навыки разработки алгоритмов для прикладных приложений, программирования пользовательского интерфейса, чтения технической документации, а также реализации алгоритмов на графах с использованием языков программирования высокого уровня. Использование графовых структур. Кроме практических результатов при выполнении курсовой работы был изучен теоретический материал по основам теории графов.
1. Абдеев Р.Ф. Философия
2. Адамар Ж. Исследование
3. Болтянский В.Г. Информатика и преподавание математики// Математика в школе. 1989. № 4.-С.86-90
4. Вейценбаум Дж. Возможности вычислительных машин и человеческий разум. - М.: Радио и связь, 1982.
5. Вирт Н. Алгоритмы+Структуры данных=Программа. - М.:Мир, 1989
6. Вирт Н. Систематическое
7. Громов Г.Р. Очерки
8. Дейкстра Э. Дисциплина
9. Ильенков Э. В. Философия и культура. - М.: Полит. лит., 1991.
10. Йодан Э. Структурное
11. Майерс Г. Надежность
12. Махмутов М.И. Организация проблемного обучения в школе. - М., 1986.
ПРИЛОЖЕНИЕ А
Для упрощения понимания программы и возможности использовать в дальнейшем написанного кода было принято решение разработать модуль для реализации алгоритма Дейкстры. Работа данного модуля полностью соответсвует описанному алгоритму:
unit deikstra; // модуль реализации алгоритма дейкстры interface const max = 100; // максимальное количество вершин inf =100*100*100; // замена бесконечности Type TJarak = Array [1..max,1..max] of Integer; // матрица смежности (тип)
TPath = record // запись для хранения дерева решений nodeke : byte; Arraypath : Array [1..max] of byte; Jarak : Integer; end; Procedure RuteTerpendek(var Data : TJarak; var Closed : TPath;var awal,tujuan : integer;count : byte); Implementation Procedure RuteTerpendek(var Data : TJarak; var Closed : TPath;var awal,tujuan : integer;count : byte);
Var// локальные переменные Path : Array [ 1..max] of TPath; Open,Jauh : Array[1..max] of Real ;
procedure Initdata(count : byte); // иницаилизация переменных и выделение памяти var i,j : byte; begin fillchar(Open,sizeof(Open), fillchar(jauh,sizeof(jauh), fillchar(Path ,sizeof(Path ),inf);
for i := 1 to count do // вносим переданные данные в начало дерева решений begin open[i] := 0 ; path[i].Jarak := 0; jauh[i] := data[awal,i] ; path[i].arraypath[1] := awal; |
ПРИЛОЖЕНИЕ А
path[i].nodeke := 1; path[i].arraypath[2] := i; path[i].nodeke := path[i].nodeke + 1; path[i].Jarak := Data[path[i].arraypath[1], end; open[awal] := awal ; end; procedure update_close(var Closed: TPath); // обновление последней вершины решшения begin closed := path[Tujuan] ; // возвращаем путь end ;
function successor(count : byte) : byte ; // проверка на достижисомть var i,j : byte ; minimum : Real ; begin minimum := inf; for i := 1 to count do if (jauh[i] < minimum) and (open[i] = 0) then // если путь лежащий через И меньше минимума и до этой вершины можно добраться то этот путь лучше begin minimum := jauh[i] ; j := i ; end ; successor := j ; end ;
procedure lessthen(count,x : byte) ; // var i : byte ; a,b : Real ; begin for i := 1 to count do begin a := jauh[x] + data[x,i] ; b := jauh[i] ; if a < b then begin jauh[i] := a ; path[i] := path[x]; path[i].nodeke := path[i].nodeke + 1; path[i].arraypath[path[i]. path[i].Jarak := path[i].Jarak
+ Data[path[i].arraypath[path[i] end; end ; end ; |
ПРИЛОЖЕНИЕ А
procedure disktra(count : byte) ; // вызов процедуры поиска пути var i,j : byte ; begin for i := 1 to count do // для всех вершин графа begin lessthen(count,successor( update_close(closed); // заменили последний достигнутый пунтк open[successor(count)] := successor(count) ; // теперь кратчайший путь лежит через него end ;end ; begin initdata(count); disktra(count); end;
end. |