Система поиска автобусных маршрутов
Рассмотрение особенностей разработки приложения с использованием среды разработки Delphi для поиска автобусных маршрутов с использованием принципов объектно-ориентированного подхода. Описание модулей и функций программы. Пользовательские типы данных.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 07.11.2016 |
Размер файла | 259,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Министерство образования и науки Российской Федерации
ФГБОУ ВПО Рыбинский государственный авиационный технический университет им. П. А. Соловьева
Факультет радиоэлектроники и информатики
Кафедра вычислительных систем
КУРСОВАЯ РАБОТА
по дисциплине
«Объектно-ориентированное программирование»
на тему: Система поиска автобусных маршрутов
Пояснительная записка
Студент группы ИВБ-14 Бойцов П.В.
Руководитель Паламарь И. Н.
Рыбинск 2015
Содержание
delphi автобусный маршрут приложение
Введение
1. Алгоритм решения задачи
1.1 Постановка задачи
1.2 Математическая постановка задачи
1.3 Алгоритмизация
2. Исходные данные
2.1 Пользовательские типы данных
2.2 Описание переменных
2.3 Способы ввода/вывода информации
2.4 Интерфейс пользователя
3. Структура программы
3.1 Описание модулей программы
3.2 Описание функций программы
4. Тестирование программы
4.1 Тестирование программы
4.2 Обработка ошибок
Заключение
Список использованных источников
Приложение
Введение
Современные информационные системы характеризуются большой сложностью. Это выражается в разнообразии различных субъектов и объектов, которые могут взаимодействовать в рамках одной большой системы, разнообразии требований к системе и операциям, которые она должна выполнять. Для разработки эффективных современных приложений применяются различные методологии проектирования программного обеспечения.
Методология -- это система принципов, а также совокупность идей, понятий, методов, способов и средств, определяющих стиль разработки программного обеспечения.
Объектно-ориентированное проектирование -- это методология проектирования, соединяющая в себе процесс объектной декомпозиции и приемы представления как логической, так и физической моделей. Именно объектно-ориентированная декомпозиция отличает объектно-ориентированное проектирование от структурного проектирования; в первом случае логическая структура системы отражается абстракциями в виде классов и объектов, во втором - алгоритмами.
Заданием на данную курсовую работу является разработка приложения с использованием среды разработки Delphi для поиска автобусных маршрутов с использованием принципов объектно-ориентированного подхода.
В качестве средства разработки использована популярная среда разработки Delphi 7.
1. Алгоритм решения задачи
1.1 Постановка задачи
Необходимо разработать программу для поиска автобусных маршрутов. В качестве среды разработки должна использоваться Delphi 7.
В программе должно быть:
- использование объектно-ориентированного подхода, а именно, свои классы, конструкторы, деструкторы, ограничения области видимости, поля и наследование;
- использование MDI интерфейса;
- использование элементов управления CheckBox и RadioButton.
1.2 Математическая постановка задачи
Для решения задачи поиска автобусных маршрутов можно использовать алгоритм поиска путей в графе. Остановки автобусов представляют собой вершины графа. Вершины соединены ребрами, в том случае, если есть хотя бы один автобусный маршрут, у которого эти вершины представляют собой соседние остановки. Решив задачу поиска путей в графе, мы решим поставленную задачу.
Но алгоритм необходимо модифицировать, т.к. две остановки могут соединяться сразу несколькими маршрутами. Также необходимо исключить пути, содержащие кольца.
1.3 Алгоритмизация
На рисунке 1.1 приведена блок-схема основного алгоритма программы.
Рисунок 1.1 -- Блок-схема поиска путей в графе
2. Исходные данные
2.1 Пользовательские типы данных
В программе использовано несколько пользовательских типов данных. Так как программа написана с использованием объектно-ориентированного подхода, то пользовательские типы данных описаны как классы.
Класс для хранения элемента коллекции называется TCollectionElement. Этот класс имеет единственный абстрактный метод для сравнения двух элементов.
Класс для хранения произвольной коллекции TCollection. Класс представляет собой массив объектов произвольного типа. Класс содержит виртуальные методы добавления, удаления, поиска элементов, сохранения и загрузки из текстового файла, метод для возврата количества элементов.
Для описания автобусной остановки добавлен класс TOneStop, наследник от класса TCollectionElement. Класс расширен полем Title, предназначенным для хранения названия остановки.
Для описания списка автобусных остановок добавлен класс TStop, наследник класса TCollection. Для него переопределены методы загрузки из файла и сохранения данных в файл.
Аналогично, в программе описаны классы для описания автобусного маршрута TRouteElement и списка автобусных маршрутов TRoute. TRouteElement содержит список остановок, через которые проходит маршрут. Для TRoute переопределены методы загрузки из файла и сохранения данных в файл, а так же описан конструктор класса.
Основным классом в программе является класс TTown. Данный класс также является наследником класса TCollection. Данный класс содержит список остановок и список автобусных маршрутов.
2.2 Описание переменных
В программе описана и используется одна глобальная переменная Town: TTown.
Данная переменная содержит список остановок и автобусных маршрутов.
Остальные переменные проекта являются локальными и используются в функциях для хранения промежуточных результатов.
2.3 Способы ввода/вывода информации
Программа поддерживает два способа ввода исходных данных:
1. Ручной ввод с клавиатуры
В этом случае пользователь может воспользоваться графическим интерфейсом приложения для ручного ввода и коррекции данных программы.
2. Ввод из файла.
Вторым способом задания данных для работы программы является загрузка из текстовых файлов. Предусмотрено несколько входных файлов.
Файл, содержащий список остановок, представляет собой обычное перечисление:
<Остановка 1>
<Остановка 2>
<Остановка N>
Аналогичный формат имеет файл, содержащий список маршрутов:
<Маршрут 1>
< Маршрут 2>
< Маршрут N>
Каждый маршрут сохраняется в отдельном текстовом файле. Формат:
<Название маршрута>
<Остановка 1>
<Остановка 2>
<Остановка N>
2.4 Интерфейс пользователя
Интерфейс программы показан на рисунке 2.1.
Рисунок 2.1 -- Интерфейс пользователя
Программа выполнена с использованием MDI-интерфейса. Интерфейс содержит главную форму и три дочерних формы. На главной форме расположено меню. Элементы управления, расположенные на остальных формах, перечислены в таблицах 2.1-2.3.
Таблица 2.1 -- Элементы пользовательского интерфейса формы для поиска маршрутов
Название |
Тип |
Назначение |
|
ComboBoxFrom |
TComboBox |
Выпадающий список для выбора начальной остановки маршрута |
|
ComboBoxTo |
TComboBox |
Выпадающий список для выбора конечной остановки маршрута |
|
CheckBox1 |
TCheckBox |
Признак поиска маршрутов с пересадками |
|
MemoRoute |
TMemo |
Поле для вывода результатов поиска |
|
Label1, Label2, Label3 |
TLabel |
Текстовые метки |
|
ButtonFindRoute |
TButton |
Кнопка, запускающая процесс поиска маршрутов |
Таблица 2.2 -- Элементы пользовательского интерфейса формы для редактирования списка маршрутов
Название |
Тип |
Назначение |
|
LabelRouteTitle |
TLabel |
Текстовая метка |
|
MemoRoute |
TMemo |
Список остановок маршрута |
|
ButtonSave |
TButton |
Кнопка «Сохранить» |
|
ComboBoxRoutes |
TRadioGroup |
Выбор маршрута |
Таблица 2.3 -- Элементы пользовательского интерфейса формы для редактирования списка остановок
Название |
Тип |
Назначение |
|
MemoStop |
TMemo |
Список остановок |
|
ButtonSave |
TButton |
Кнопка «Сохранить» |
|
Label1 |
TLabel |
Текстовая метка |
3. Структура программы
3.1 Описание модулей программы
Проект приложения содержит следующие модули.
Модуль UnitCollection.pas содержит описание классов для работы с коллекцией и элементом коллекции.
Модуль UnitRoute.pas содержит описание классов для работы с коллекцией маршрутов и маршрутом.
Модуль UnitStop.pas содержит описание классов для работы с коллекцией остановок и остановкой.
Модуль UnitTown.pas содержит описание основного класса программы.
Модули MainUnit.pas, ChildUnit.pas, UnitStopFrom.pas и UnitTownForm.pas содержат функции для организации пользовательского интерфейса программы. MainUnit.pas - содержит функции главной формы, остальные три модуля содержат функции дочерних модулей.
3.2 Описание функций программы
В приложении реализован набор функций для работы с автобусными маршрутами. Программа позволяет:
-редактировать список остановок;
-редактировать список автобусных маршрутов;
-искать автобусные маршруты, позволяющие добраться от остановки A до остановки B. Можно также искать маршруты поездок с пересадками.
4. Тестирование программы
4.1 Тестирование программы
Проверим работоспособность программы на нескольких различных наборах исходных данных.
На рисунке 4.1 показан процесс редактирования списка остановок. Редактирование происходит средствами стандартного многострочного поля ввода.
Рисунок 4.1 -- Редактирование
На рисунке 4.2 показан процесс редактирования списка маршрутов.
Рисунок 4.2 -- Редактирование
Протестируем поиск маршрутов (рисунок 4.3).
Рисунок 4.3 -- Поиск
В выпадающем списке можно просмотреть информацию по каждому предложенному маршруту (рисунок 4.4).
Рисунок 4.4 -- Поиск
4.2 Обработка ошибок
В программе обрабатывается ошибочная ситуация при редактировании автобусного маршрута. В том случае, если в маршрут включается остановка, отсутствующая в списке остановок, выдается сообщение для пользователя.
Заключение
В процессе работы над курсовой работой были изучены принципы объектно-ориентированного программирования и основы разработки приложений в среде Delphi 7.
Было разработано приложение для поиска автобусных маршрутов.
Для реализации задачи были спроектированы и реализованы собственные классы. Входные данные для программы можно задать двумя способами - ручной ввод и ввод из файла.
Приложение имеет графический интерфейс.
Список использованных источников
1. Архангельский А. Приемы программирования в Delphi на основе VCL / А. Архангельский. -- Москва. : Бином-Пресс, 2009. -- 944 с.
2. Климов Л.М. Delphi 7. Основы программирования. Решение типовых задач. Самоучитель: Л. М. Климова -- Санкт-Петербург, КУДИЦ-Образ, 2006 г.- 480 с.
3. Желонкин А. Основы программирования в интегрированной среде DELPHI: А. Желонкин -- Москва, Бином. Лаборатория знаний, 2004 г.- 240 с.
4. Культин Н. Основы программирования в Delphi XE/ Н. Культин. -- СПб. : БХВ-Петербург, 2011. -- 416 с.
5. Осипов Д. Delphi XE2 / Д. Осипов. -- Санкт-Петербург : БХВ-Петербург, 2012. -- 869 с.
6. Понамарев В. Самоучитель Delphi 7 Studio: Вячеслав Понамарев -- Москва, БХВ-Петербург, 2003 г.- 504 с.
7. Фаронов В.В. Программирование баз данных в Delphi 7: Учебный курс. - СПб.: Питер, 2004 - 464 с.
Приложение
Исходный код
UnitCollection.pas
unit UnitCollection;
interface
type TCollectionElement=class
protected function EqualTo(X:TCollectionElement):boolean; virtual; abstract;
end;
type TCollection = class
private
protected
Data:array of TObject;
F:TextFile;
public
function Add(E:TCollectionElement):integer; overload;
function Add(E:TObject):integer; overload;
procedure Delete(index:integer);
function Find(E:TCollectionElement):integer; virtual;
procedure LoadFromFile(FileName:string);virtual; abstract;
procedure SaveToFile(FileName:string);virtual; abstract;
function ToString():string;virtual; abstract;
public
function Count:integer;
function Element(index:integer):TObject;
procedure Clear; virtual;
end;
implementation
{ TCollection }
function TCollection.Add(E:TCollectionElement):integer;
begin
Result := Find(E);
if Result>=0 then Exit; //Одинаковых элементов быть не должно
SetLength(Data,Length(Data)+1);
Result := High(Data);
Data[Result] := E;
end;
function TCollection.Add(E:TObject):integer;
begin
SetLength(Data,Length(Data)+1);
Result := High(Data);
Data[Result] := E;
end;
procedure TCollection.Clear;
begin
SetLength(Data,0);
end;
function TCollection.Count: integer;
begin
Result := Length(Data);
end;
procedure TCollection.Delete(index: integer);
var i:integer;
begin
for I := index to High(Data) - 1 do Data[i] := Data[i+1];
SetLength(Data,Length(Data)-1);
end;
function TCollection.Element(index: integer): TObject;
begin
Result := Data[index];
end;
function TCollection.Find(E:TCollectionElement):integer;
var i:integer;
begin
Result := -1;
for I := 0 to High(Data) do
if (Data[i] as TCollectionElement).EqualTo(E) then begin Result := i; Exit; end;
end;
end.
UnitRoute.pas
unit UnitRoute;
interface
uses UnitCollection;
type TRouteElement = class(TCollectionElement)
StopTitle:string; //Название остановки
function EqualTo(X:TCollectionElement):boolean; override;
end;
type TRoute = class(TCollection)
Title:string; //Название маршрута
Delimiter:string; //Разделитель при выводе
constructor Create();
procedure LoadFromFile(FileName:string);override;
procedure SaveToFile(FileName:string);override;
function ToString():string; override;
end;
implementation
{ TRoute }
constructor TRoute.Create;
begin
Delimiter := #13#10;
end;
procedure TRoute.LoadFromFile(FileName: string);
var RE:TRouteElement;
begin
AssignFile(F,FileName); Reset(F);
ReadLn(F,Title); //Первая строка - название маршрута
while not EOF(F) do begin
RE := TRouteElement.Create();
Readln(F,RE.StopTitle);
Add(RE);
end;
CloseFile(F);
end;
procedure TRoute.SaveToFile(FileName: string);
var i:integer;
begin
AssignFile(F,FileName); Rewrite(F);
WriteLn(F,Title);
for I := 0 to High(Data) do with TRouteElement(Data[i]) do
WriteLn(F,StopTitle);
CloseFile(F);
end;
function TRoute.ToString: string;
var i:integer;
begin
Result:='';
for I := 0 to High(Data) do with TRouteElement(Data[i]) do
Result := Result+ StopTitle + Delimiter;
end;
{ TRouteElement }
function TRouteElement.EqualTo(X: TCollectionElement): boolean;
begin
Result := (X as TRouteElement).StopTitle = StopTitle;
end;
end.
UnitStop.pas
unit UnitStop;
interface
uses UnitCollection;
type TOneStop=class(TCollectionElement)
Title:string;
// x,y:integer;
// procedure Paint(); virtual; abstract;
function EqualTo(X:TCollectionElement):boolean; override;
end;
type TStop=class (TCollection)
public
procedure LoadFromFile(FileName:string);override;
procedure SaveToFile(FileName:string);override;
end;
implementation
{ TStop }
procedure TStop.LoadFromFile(FileName: string);
var Stop:TOneStop;
begin
AssignFile(F,FileName); Reset(F);
while not EOF(F) do begin
Stop := TOneStop.Create();
Readln(F,Stop.Title);
Add(Stop);
end;
CloseFile(F);
end;
procedure TStop.SaveToFile(FileName: string);
var i:integer;
begin
AssignFile(F,FileName); Rewrite(F);
for I := 0 to High(Data) do with TOneStop(Data[i]) do
WriteLn(F,Title);
CloseFile(F);
end;
{ TOneStop }
function TOneStop.EqualTo(X: TCollectionElement): boolean;
begin
Result := (X as TOneStop).Title = Title;
end;
end.
UnitTown.pas
unit UnitTown;
interface
uses UnitCollection,UnitStop,UnitRoute;
type TTown = class(TCollection)
private
function FindDirect(A, B: string): TRoute;
public
Stops:TStop; //Список остановок (Один на весь город)
constructor Create();
procedure LoadFromFile(FileName:string);override;
//Основная функция - найти маршрут из пунка А в пункт В
//Direct - требование только "прямого" маршрута
function FindPath(A:string; B:string; Direct:boolean):TRoute;
procedure SaveToFile(FileName:string);
function ToString():string;
end;
var Pathes:array of array of integer; //Полученные пути (список)
implementation
type TRegisterProc = procedure();
var M:array of array of boolean; //Матрица смежности транспортного графа
var V:array of boolean; //Вершины графв
var Path:array of integer; //Текущий путь
{ TTown }
constructor TTown.Create;
begin
Stops := TStop.Create;
end;
procedure TTown.LoadFromFile(FileName: string);
var R:TRoute;
VAR S:string;
begin
AssignFile(F,FileName); Reset(F);
while not EOF(F) do begin
ReadLn(F,S);
R := TRoute.Create();
R.LoadFromFile(S+'.txt');
Add(R);
end;
CloseFile(F);
end;
procedure TTown.SaveToFile(FileName: string);
begin
//Не применимо
end;
function TTown.ToString: string;
begin
//Слабо применимо
end;
procedure RegisterPath();
var i:integer;
begin
//Зарегистрировать путь в списке найденных путей
SetLength(Pathes,Length(Pathes)+1);
SetLength(Pathes[High(Pathes)],Length(Path));
for I := 0 to High(Path) do
Pathes[High(Pathes)][i] := Path[i];
end;
function TTown.FindDirect(A,B:string):TRoute;
var R:TRoute;
REA,REB,RE:TRouteelement;
I:Integer;
K1,K2:integer;
Found:boolean;
ST:TOneStop;
begin
//Простым перебором маршрутов выяснить, есть ли прямой
//Если есть - сформировать маршрут, начинающийся в A и заканчивающийся в B
REA := TRouteElement.Create; REA.StopTitle := A;
REB := TRouteElement.Create; REB.StopTitle := B;
Found := False;
Result := TRoute.Create;
for I := 0 to Count - 1 do begin
R := Element(I) as TRoute;
K1 := R.Find(REA);
K2 := R.Find(REB);
if (K1>=0) and (K2>=0) then begin
Found := True;
break;
end;
end;
if not Found then Exit;
//Заполнить Result элементами маршрута от A до B
if K1>K2 then begin I:=K1; K1:=K2; K2:=I; end;
//Заодно заполнить путь
SetLength(Pathes,0,0);
SetLength(Path,K2-K1+1);
ST := TOneStop.Create;
for I := K1 to K2 do begin
RE := TRouteElement.Create;
RE.StopTitle := (R.Element(I) as TRouteElement).StopTitle;
ST.Title := RE.StopTitle;
Path[I-K1] := Stops.Find(ST);
Result.Add(RE);
end;
RegisterPath;
end;
procedure FindPathR(V1,V2:integer; Level:integer; RegisterPath: TRegisterProc);
//Рекурсивный поиск пути в графе
var i:integer;
begin
//Если длина пути первышена, то поиск окончен. Неудачно.
if Level<=0 then Exit;
//Если V1 = V2 то поиск окончен удачно
if V1 = V2 then
if assigned(RegisterPath) then begin
SetLength(Path,Length(Path)+1);
Path[High(Path)] := V2; //Отметить
RegisterPath;
SetLength(Path,Length(Path)-1);
Exit;
end;
//Для всех вершин, смежных с V1, попробовать найти путь
for i := 0 to High(M) do
if M[V1][i] then begin
SetLength(Path,Length(Path)+1);
Path[High(Path)] := V1; //Отметить
FindPathR(i,V2,Level-1,RegisterPath);
SetLength(Path,Length(Path)-1);
end;
end;
function TTown.FindPath(A, B: string; Direct: boolean):TRoute;
var eA,eB:TOneStop;
var iA,iB:integer; //Номера остановок
var route,i,j,N:integer;
R : TRoute;
K1,K2:integer;
Stop:TOneStop;
RE : TRouteElement;
begin
if Direct then begin Result := FindDirect(A,B); Exit; end;
//Составить матрицу смежности взвешенного графа транспортной сети
//Для этого
//Сначала создать и очистить матрицу
N := Stops.Count;
SetLength(V,N);
SetLength(M,N,N);
for i := 0 to N - 1 do
for j := 0 to N - 1 do
M[i][j] := false;
//Перебрать все маршруты
Stop := TOneStop.Create;
for route := 0 to Count-1 do begin
R := Element(route) as TRoute;
//В каждом маршруте соседние остановки объявить связанными
for i := 0 to R.Count - 1-1 do begin
Stop.Title := (R.Element(i) as TRouteElement).StopTitle;
K1 := Stops.Find(Stop);
Stop.Title := (R.Element(i+1) as TRouteElement).StopTitle;
K2 := Stops.Find(Stop);
if K2<0 then continue;
M[K1][K2] := true; //Граф считается ненаправленным
M[K2][K1] := true;
end;
end;
//Найти путь в нем
//Для этого
//Очистить список вершин
for i := 0 to N - 1 do V[i] := false;
Stop.Title := A;
K1 := Stops.Find(Stop);
Stop.Title := B;
K2 := Stops.Find(Stop);
SetLength(Pathes,0,0);
FindPathR(K1,K2,Stops.Count,RegisterPath);
Result := TRoute.Create;
//И самый первый путь туда записать
for I := 0 to High(Pathes[0]) do
begin
RE := TRouteElement.Create;
RE.StopTitle := (Stops.Element(Pathes[0][i]) as TOneStop).Title;
Result.Add(RE);
end;
end;
end.
Размещено на Allbest.ru
Подобные документы
Методология и технология разработки программного продукта. Решение задачи поиска кратчайших путей между всеми парами пунктов назначения, используя алгоритм Флойда. Разработка интерфейса программы, с использованием среды Delphi Borland Developer Studio.
курсовая работа [2,0 M], добавлен 26.07.2014Особенности реализации главных элементов разрабатываемой программы (цифровые элементы) с помощью объектно-ориентированного подхода. Применение принципа инкапсуляции для защиты данных. Конструирование классов, описание и тестирование программного продукта.
курсовая работа [2,3 M], добавлен 10.05.2015Описание разработки программного продукта с использованием объектно-ориентированного языка программирования Delphi. Принципы рейтинговой оценки знаний Костанайского социально–технического университета. Описание внешнего вида программы, обработка событий.
дипломная работа [2,4 M], добавлен 03.07.2015Исследование принципов объектно-ориентированного программирования на базе языка программирования С++. Разработка программного комплекса для ведения учёта памятников города. Описание процессов сортировки, поиска, формирования статистики по памятникам.
курсовая работа [782,4 K], добавлен 26.05.2014Общая характеристика объектно-ориентированного подхода в программировании, его основные свойства и принципы. Разработка программы для автоматизация деятельности кафе на основе объектно-ориентированного подхода, проектирования и реализации схемы данных.
курсовая работа [1,2 M], добавлен 22.01.2012Анализ предметной области "Конкурс поэтов" на основе объектно-ориентированного подхода. Разработка оконного приложения и описание информационной модели предметной области. Описание разработанных процедур С++ и результатов тестирования приложения.
курсовая работа [355,9 K], добавлен 18.06.2013Жизненный цикл программного продукта. Современные среды разработки приложений. Защита информации в базах данных. Особенности разработки приложения с помощью среды Delphi 7. Проверка программного модуля на предмет соответствия стандартам кодирования.
отчет по практике [589,0 K], добавлен 18.05.2017Системы визуального объектно-ориентированного программирования. Среда разработки Delphi. Microsoft Access как система управления базами данных реляционного типа. Структурированный язык запросов SQL. Программирование базы данных Библиотечного фонда.
курсовая работа [2,5 M], добавлен 08.01.2012Особенности и преимущества языка C#. Алгоритмы поиска маршрутов в графе. Разработка вычислительной системы транспортной логистики на языке C#. Выбор среды разработки, визуализация транспортной сети. Задание условий поиска и пример работы алгоритма.
дипломная работа [457,1 K], добавлен 24.06.2015Разработка приложения для работы с базой данных с использованием объектно-ориентированного и визуального программирования. Обзор языка элементов языка программирования Delphi. Проектирование базы данных автозаправки. Клиентская система приложения.
курсовая работа [2,3 M], добавлен 31.01.2016