Система поддержки планирования автобусного движения в районе

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    58,78 Кб
  • Опубликовано:
    2013-02-05
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Система поддержки планирования автобусного движения в районе

Федеральное государственное автономное

образовательное учреждение

высшего профессионального образования

"СИБИРСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ"

Институт Космических и Инормационных технологий

институт

Вычислительной техники

КУРСОВАЯ РАБОТА

Система поддержки планирования автобусного движения в районе



Студент Мартыненко Е.О.







Красноярск 2013

Содержание

 

Вариант

Введение

Словесное описание алгоритма

Инструкция к программе

Заключение

Приложение

Список источников

Вариант

В районе имеется несколько автовокзалов, у каждого из которых есть ряд посадочных площадок. Между автовокзалами курсируют рейсовые автобусы, для каждого рейса фиксируется станция отправления и назначения, посадочная площадка, с которой происходит отправление, а также время посадки в автобус и время в пути. Система поддержки планирования автобусного движения должна обеспечивать возможность добавлять/удалять новые рейсы, вносить изменения в уже имеющиеся рейсы и выдавать полезную справочную информацию (например, для указанного автовокзала определять все рейсы, отправляющиеся с заданной посадочной площадки и т.д.).

Реферат

 

Общие сведения: тема работы: 29. Система поддержки планирования автобусного движения в районе., количество страниц: ____, количество приложений: 1, использованных источников: 3, перечень ключевых слов: автобусный рейс.

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

приложение планирование автобусное движение

Введение


В современную информационную эпоху перед обществом ставиться задача систематизации получаемой информации, для её более удобного хранения и использования. Информационные системы созданы для того чтобы решить эту задачу.

Под понятием "информационная система" следует понимать совокупность баз данных, систем управления базами данных и специализированных прикладных программ, предназначенная для автоматизации целенаправленной деятельности конечных пользователей, обеспечивающая возможность получения, модификации и хранения информации. [1]

Современные крупные предприятия и организации вынуждены работать с большими объёмами информации, поэтому использование информационных систем для них является актуальным. Благодаря информационным системам (далее ИС) экономиться значительное количество ресурсов за счёт того что:

·        ИС автоматизирует применение математических методов к решению управленческих задач;

·        ИС по крайней мере частично освобождает сотрудников от рутинного труда;

·        ИС минимизирует вероятность появления ошибки в ходе передачи либо обработки информации;

·        ИС снижает объем документов на бумаге;

·        ИС совершенствует документооборот;

·        ИС снижает затраты на производство товаров и услуг. [2]

Несмотря на очевидные достоинства, ИС обладает и недостатками. Переход к ИС не дал резкого повышения производительности труда персонала, но увеличились накладные расходы. Кроме того, к работнику предприятия стали предъявлять более высокие требования, такие как знание ПК, конкретных прикладных программ и СУБД, а также способность постоянно повышать свою квалификацию. Также имеет место и сугубо человеческий фактор - нежелание работников менять привычный стиль работы, осваивать новые технологии.

Эти недостатки дают направление дальнейшему развитию ИС в сторону улучшения пользовательского интерфейса, улучшения алгоритмов обработки и структур хранения данных.

Эскизная схема алгоритма

Список функций и структур

Структуры, функции

Описание

struct str { CString Login, Password; };

Структура для хранения данных о логине и пароле. Строки для логина и пароля

struct lst { CString departure, destination; int routeNum, hour, minute; };

Структура запроса Администратора Строки для хранения названий пункта назначения и пункта отправления Номер маршрута Время в пути (в минутах и секундах)

struct rts { CString station; int arTime, lvTime, rNum; };

Структура маршрута автобуса Название станции Время прибытия Время отправления Номер маршрута

struct shift { CString driver, kond, begs, ends; int rNum; };

Структура смен автобуса Инициалы водителя Инициалы кондуктора Время начала смены Время окончания смены Номер маршрута

struct lst_char { char departure [256], destination [256]; int routeNum, hour, minute; };

Аналог структуры для запроса Администратора, с массивами типа char для названий пунктов отправления и прибытия, требуеся для корректной записи в двоичный файл и корректного считывания из двоичного файла

struct rts_char { char station [256]; int arTime, lvTime, rNum; };

Аналог структуры маршрута автобуса, С массивами типа char для названия станции, требуеся для корректной записи в двоичный файл и корректного считывания из двоичного файла

struct shift_char { char driver [256], kond [256], begs [256], ends [256]; int rNum; };

Аналог структуры смен автобуса, С масиивами типа char для инициалов водителя и кондуктора и времени начала и окончания смены, требуеся для корректной записи в двоичный файл и корректного считывания из двоичного файла

lst_char converting (lst str);

Функция, приводящая структуру типа lst к структуре типа lst_char

rts_char converting (rts str);

Перегрузка предыдущей функции, приводящая структуру типа rts к структуре типа rts_char

shift_char converting (shift str);

Перегрузка предыдущей функции, приводящая структуру типа shift к структуре типа shift_char

void quickSort (vector<rts> &vec, int low, int high);

Функция быстрой сортировки вектора структур rts. Вектор сортируется по полю структуры station.

void quickSort (vector<lst> &vec, int low, int high)

Перегрузка функции quicksort, сортирующая вектор структур lst по ключу routeNum.

bool binary_search (vector<rts> &vec, int rn, int beg, int end);

Функция двоичного поиска в векторе структур rts. Данные ищутся по ключу rNum. Если такие данные имеются в векторе, функция возвращает истину.

void synch (vector<lst> &vec, vector<rts> &vec1, vector<shift> &vec2);


Словесное описание алгоритма


Аутентификация пользователя производиться сравнением введённых строк логина и пароля со строками, вшитыми в программу. Также имеется возможность использовать программу на правах гостя, для этого надо нажать на соответствующую кнопку во время аутентификации. Информация о логине и пароле пользователя хранится в структуре с соответствующими полями. Всего пользователя три: администратор, оператор и гость. В функции администратора входит создание, редактирование и удаление запросов на создание маршрутов движения автобусов. Оператор занимается непосредственно созданием и управлением маршрутов, а также созданием и управлением рабочих смен для этих маршрутов. Гость является единственным пользователем, которому не доступны функции редактирования данных маршрутов. Он может просматривать информацию о движении автобусов и об остановках, через которые проходят маршруты, а также о времени прибытия и отправления автобусов на эти остановки.

Все данные, связанные с запросами, маршрутами и рабочими сменами хранятся в двоичных файлах "Запросы. bin", "Смены. bin" и "Маршруты. bin". Работа с файлами осуществляется через библиотеку stdio. h. Для чтения/записи используются стандартные функции fread и fwrite.

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

Для отображения окон используются классы, унаследованные от класса CDialog. При этом методы OnInitDialog для начальной инициализации переменных класса и OnClose для описания процесса закрытия окон, были переопределены для окон Администратора, Оператора, Гостя, а также для окон редактирования информации о маршрутах и сменах.

После аутентификации, в зависимости от введённых логина и пароля, вызывается метод DoModal окна Администратор, Оператор или Гость для модального отображения соответствующего окна.

Если пользователем является Администратор, вызывается метод окна Администратора DoModal, после чего в методе OnInitDialog производится чтение запросов из файла "Запросы. bin" в вектор функцией fread. Также в методе OnInitDialog производится инициализация элемента управления класса List Control для вывода информации из вектора запросов в виде таблицы. Затем в выведенном окне выводятся List Control с данными запросов, а также три элемента управления Button для добавления, редактирования и удаления запросов.

При нажатии кнопки "Добавить" вызывается метод DoModal класса, унаследованного от класса CDialog для отображения окна с элентами управления Edit Control, чтобы иметь возможность вводить данные для запроса. После ввода данных в поля и нажатия кнопки "OK" данные сохраняются в новую структуру запроса, а затем эта структура вставляется в конец вектора методом push_back, после чего следует удаление предыдущих элементов List Control и вставка информации из уже обновлённого вектора запросов.

При нажатии кнопки "Редактировать" и если при этом не был выбран ни один элемент List Control, функцией MessageBox выводится окно-сообщение с просьбой выбрать элемент для редактирования. Если элемент был выбран, то номер строки используется как индекс вектора и по этому номеру находится нужная структура в векторе. После чего вызывается метод DoModal класса, унаследованного от класса CDialog для отображения окна с элементами управления Edit Control, в которых уже будет находится информация найденной структуры. После того как информация была отредактирована и нажата кнопка "OK", редактируемая структура в векторе находится при помощи итератора и удаляется методом erase, а на её место вставляется структура с новыми данными методом insert. Затем следует удаление предыдущих элементов List Control и вставка информации из уже обновлённого вектора запросов.

При нажатии кнопки "Удалить" и если при этом не был выбран ни один элемент List Control, функцией MessageBox выводится окно-сообщение с просьбой выбрать элемент для редактирования. Если элемент был выбран, то номер строки используется как индекс вектора и по этому номеру находится нужная структура в векторе. После чего функцией MessageBox вызывается окно подтверждения удаления и кнопками "Да" и "Нет". При нажатии "Нет" окно просто закрывается, при нажатии "Да" структура удаляется из вектора методом erase. Затем следует удаление предыдущих элементов List Control и вставка информации из уже обновлённого вектора запросов.

При нажатии кнопки закрыть в правом верхнем углу окна вызывается метод OnClose, в котором из файлов "Маршруты. bin" и "Смены. bin" считываются данные в соответствующие вектора, после чего функцией synch производится синхронизация данных в этих векторах с данными вектора запросов. Если в векторах есть данные для маршрутов, которых нет в векторе запросов, то эти данные удаляются. Затем данные векторов записываются в соответствующие бинарные файлы, после чего окно закрывается стандартным методом OnClose.

Если при авторизации пользователя были введены логин и пароль Оператора, то вызывается метод окна Оператора DoModal, после чего в методе OnInitDialog производится чтение запросов из файла "Запросы. bin" в вектор функцией fread. Также в методе OnInitDialog производится инициализация элемента управления класса List Control для вывода информации из вектора запросов в виде таблицы. Затем в выведенном окне выводятся List Control с данными запросов, а также два элемента управления Button для работы с маршрутами и рабочими сменами.

При нажатии кнопки "Маршруты" и если при этом не был выделен какой-либо элемент таблицы, функцией MessageBox выводится окно-сообщение с просьбой выбрать элемент для редактирования. Если элемент был выбран, то создаётся объект класса Route, унаследованный от класса CDialog. У класса Route переопределены функции OnInitDialog и OnClose. При вызове метода DoModal класса в функции OnInitDialog производится считывание всех остановок из файла "Маршруты. bin" в общий вектор остановок, после чего происходит копирование структур, соответствующих выбранному маршруту, в другой вектор, и дальнейшая работа будет производится с ним, соответствующие данные в общем векторе при этом стираются, чтобы избежать наличия различных данных для одного маршрута. Также в методе OnInitDialog производится инициализация элемента управления класса List Control для вывода информации из вектора остановок маршрута в виде таблицы. Затем в выведенном окне выводятся List Control с данными остановок маршрута, а также три элемента управления Button для добавления, редактирования и удаления остановок.

При нажатии кнопки "Добавить" вызывается метод DoModal класса, унаследованного от класса CDialog для отображения окна с элементами управления Edit Control, чтобы иметь возможность вводить данные для остановки. После ввода данных в поля и нажатия кнопки "OK" данные сохраняются в новую структуру маршрута, а затем эта структура вставляется в конец вектора методом push_back, после чего следует удаление предыдущих элементов List Control и вставка информации из уже обновлённого вектора маршрута.

При нажатии кнопки "Редактировать" и если при этом не был выбран ни один элемент List Control, функцией MessageBox выводится окно-сообщение с просьбой выбрать элемент для редактирования. Если элемент был выбран, то номер строки используется как индекс вектора и по этому номеру находится нужная структура в векторе. После чего вызывается метод DoModal класса, унаследованного от класса CDialog для отображения окна с элементами управления Edit Control, в которых уже будет находится информация найденной структуры. После того как информация была отредактирована и нажата кнопка "OK", редактируемая структура в векторе находится при помощи итератора и удаляется методом erase, а на её место вставляется структура с новыми данными методом insert. Затем следует удаление предыдущих элементов List Control и вставка информации из уже обновлённого вектора маршрута.

При нажатии кнопки "Удалить" и если при этом не был выбран ни один элемент List Control, функцией MessageBox выводится окно-сообщение с просьбой выбрать элемент для удаления. Если элемент был выбран, то номер строки используется как индекс вектора и по этому номеру находится нужная структура в векторе. После чего функцией MessageBox вызывается окно подтверждения удаления и кнопками "Да" и "Нет". При нажатии "Нет" окно просто закрывается, при нажатии "Да" структура удаляется из вектора методом erase. Затем следует удаление предыдущих элементов List Control и вставка информации из уже обновлённого вектора маршрута.

При нажатии кнопки закрыть в правом верхнем углу окна вызывается метод OnClose, где данные вектора остановок маршрута по очереди копируются в общий вектор остановок методом push_back. Затем все элементы вектора остановок маршрута удаляются, а данные общего вектора остановок записываются в бинарный файл "Маршруты. bin", после чего окно закрывается стандартным методом OnClose.

При нажатии кнопки "Смены" и если при этом не был выделен какой-либо элемент таблицы, функцией MessageBox выводится окно-сообщение с просьбой выбрать элемент для редактирования. Если элемент был выбран, то создаётся объект класса Shift, унаследованный от класса CDialog. У класса Shift переопределены функции OnInitDialog и OnClose. При вызове метода DoModal класса в функции OnInitDialog производится считывание всех смен из файла "Смены. bin" в общий вектор смен, после чего происходит копирование структур, соответствующих выбранному маршруту, в другой вектор, и дальнейшая работа будет производится с ним, соответствующие данные в общем векторе при этом стираются, чтобы избежать наличия различных данных для одного маршрута. Также в методе OnInitDialog производится инициализация элемента управления класса List Control для вывода информации из вектора смен маршрута в виде таблицы. Затем в выведенном окне выводятся List Control с данными смен маршрута, а также три элемента управления Button для добавления, редактирования и удаления смен.

При нажатии кнопки "Добавить" вызывается метод DoModal класса, унаследованного от класса CDialog для отображения окна с элементами управления Edit Control, чтобы иметь возможность вводить данные для рабочей смены. После ввода данных в поля и нажатия кнопки "OK" данные сохраняются в новую структуру смены, а затем эта структура вставляется в конец вектора методом push_back, после чего следует удаление предыдущих элементов List Control и вставка информации из уже обновлённого вектора смен.

При нажатии кнопки "Редактировать" и если при этом не был выбран ни один элемент List Control, функцией MessageBox выводится окно-сообщение с просьбой выбрать элемент для редактирования. Если элемент был выбран, то номер строки используется как индекс вектора и по этому номеру находится нужная структура в векторе. После чего вызывается метод DoModal класса, унаследованного от класса CDialog для отображения окна с элементами управления Edit Control, в которых уже будет находится информация найденной структуры. После того как информация была отредактирована и нажата кнопка "OK", редактируемая структура в векторе находится при помощи итератора и удаляется методом erase, а на её место вставляется структура с новыми данными методом insert. Затем следует удаление предыдущих элементов List Control и вставка информации из уже обновлённого вектора смен.

При нажатии кнопки "Удалить" и если при этом не был выбран ни один элемент List Control, функцией MessageBox выводится окно-сообщение с просьбой выбрать элемент для удаления. Если элемент был выбран, то номер строки используется как индекс вектора и по этому номеру находится нужная структура в векторе. После чего функцией MessageBox вызывается окно подтверждения удаления и кнопками "Да" и "Нет". При нажатии "Нет" окно просто закрывается, при нажатии "Да" структура удаляется из вектора методом erase. Затем следует удаление предыдущих элементов List Control и вставка информации из уже обновлённого вектора смен.

При нажатии кнопки закрыть в правом верхнем углу окна вызывается метод OnClose, где данные вектора смен по очереди копируются в общий вектор смен методом push_back. Затем все элементы вектора смен удаляются, а данные общего вектора смен записываются в бинарный файл "Смены. bin", после чего окно закрывается стандартным методом OnClose.

Если при авторизации была нажата кнопкам "Гость", то создаётся объект класса User, унаследованного от класса CDialog, затем вызывается метод этого класса DoModal, после чего в методе OnInitDialog производится чтение запросов из файла "Запросы. bin" в вектор функцией fread. Также в методе OnInitDialog производится инициализация элемента управления класса List Control для вывода информации из вектора запросов в виде таблицы. Затем в выведенном окне выводятся List Control с данными запросов, а также два элемента управления Button для работы с переключения между информацией по маршрутам и остановкам. При переключении данные о маршрутах или остановках отображаются в одном и том же List Control. Для определения режима List Control используется переменная-флаг. Также создаются и выводятся элементы управления edit control и кнопка поиск для поиска информации по ключевым словам. При этом поиск будет производится либо по маршрутам, либо по остановкам, в зависимости от того, какую информацию в данный момент отображает List Control. Также создаётся и выводится кнопка "Подробнее" для отображения всех остановок для выбраного маршрута или же для отображения всех маршрутов, проходящих через выбраную остановку.

При нажатии кнопки "Остановки", в том случае, если положение флага соответствует режиму "Маршруты", из List Control удаляются все столбцы, а затем вставляется столбец "Остановка". Если предыдущий режим был "Остановки", то столбцы не меняются. Далее происходит считывание маршрутов из файла "Маршруты. bin" в вектор маршрутов, и если размер вектора не равен 0, то вектор сортируется функцией бысторй сортировки quickSort. Затем одинаковые элементы удаляются из вектора. Это нужно для того чтобы в List Control не отображались две одинаковые остановки. После этого происходит вставка элементов вектора в List Control.

При нажатии кнопки "Маршруты", в том случае, если положение флага соответствует режиму "Остановки", из List Control удаляются все столбцы, а затем вставляется столбцы "№ маршруты", "Пункты отправления" и "Пункт назначения". Если предыдущий режим был "Маршруты", то столбцы не меняются. Далее происходит считывание запросов из файла "Запросы. bin" в вектор запросов. После этого происходит вставка элементов вектора в List Control.

При нажатии кнопки "Подробнее", если элемент List Control не был выбран, функцией MessageBox выводится сообщение "Выберите данные". Если элемент был выбран, то создаётся объект класса UsRote унаследованного от класса CDialog и вызывается метод этого класса DoModal. Единственным элементом управления этого класса является List Control. В функции OnInitDialog этого класса присходит считывание данных из файла "Маршруты. bin" и, в зависимости от положения флага, в List Control вставляются столбцы либо таблицы остановок для выбранного маршрута, либо таблицы маршрутов для выбранной остановки.

При нажатии кнопки "Поиск", функцией UpdateData считывается значение из элемента управления Edit Control. Затем, в зависимости от текущего положение флага, происходит чтение либо файла "Запросы. bin", либо чтение файла "Маршруты. bin", причём при чтении данные сравниваются со значением, введённым в Edit Control, и если значения совпадают, данные записываются в вектор. В результате получаем вектор, размерность которого равна 1. Затем происходит вставка данных в таблицу List Control.

При нажатии кнопки закрыть в правом верхнем углу экрана происходит простое закрытие окна.

Инструкция к программе


При первом запуске программы требуется сделать запросы на создание маршрутов. Для этого надо зайти в программу под учётной записью Администратора. Введите логин: "Админ" и пароль "Админ". Добавьте несколько запросов и выйдите из программы. Добавленные данные сохранятся автоматически. Теперь зайдите под учётной записью Оператора (логин: Оператор и пароль: Оператор) и добавьте несколько остановок и рабочих смен к маршрутам. После этого гостю станут доступны для просмотра введённые данные. Их по прежнему можно будет редактировать, заходя под учётной записью Администратора или Оператора.

Общий алгоритм программы:

. Аутентификация

. Работа с программой

. Завершение работы с сохранением её результатов

Алгоритм работы Администратора:

. Аутентификация

. Добавление, редактирование или удаления запросов

. Завершение работы с сохранением её результатов

Алгоритм работы Оператора:

. Аутентификация

. Выбор запроса

. Добавление, редактирование или удаление маршрутов и смен для выбранного запроса

. Завершение работы с сохранением её результатов

Алгоритм работы Гостя:

. Вход в программу

. Просмотр имеющихся маршрутов и связанных с ними остановок

. Просмотр имеющихся остановок и связанных с ними маршрутов

. Поиск маршрутов или остановок по файлам

. Выход из программы

Полный алгоритм работы с программой:

Шаги Операции

. Вводим логин и пароль в соответствии с полями и переходим к шагу 2.

. Проверяем введённые данные на соответствие имеющимся. Если данные соответствуют записи Администратора, на шаг 3, если Оператора, на шаг 16, если была нажата кнопка "Гость", на шаг 29, иначе шаг 1.

. Считываем данные запросов из файла "Запросы. bin" в вектор струтур. Выводим окно с таблицей запросов, хранящихся в этом векторе, и кнопки для операций добавления, редактирования и удаления запросов. Если администратор нажал кнопку "Добавить", переходим к шагу 4, если кнопку "Редактировать", к шагу 8, если кнопку "Удалить", к шагу 12, если кнопку "Закрыть" в верхнем правом углу окна, к шагу 15.

. Выводим окно с полями для ввода информации запроса: пункт отправления, пункт назначения, номер маршрута, время в пути. Если администратор нажал кнопку "ОК", переходим к шагу 5, если кнопку "Отмена" или кнопку "Закрыть" в верхнем правом углу окна, к шагу 3.

. Если данные не были введены или были введены не полностью, выводим сообщение с текстом "Введите значения!" и переходим к шагу 4, иначе к шагу 6.

. Если номер маршрута введённых данных совпал с номером маршрута каких-либо данных в векторе структур, выводим сообщение с текстом "Такие данные уже существуют" и переходим к шагу 3, иначе к шагу 7.

. Добавляем введённые данные в конец вектора структур и обновляем таблицу запросов. Переходим к шагу 3.

. Проверяем, выделена ли какая-либо строка в таблице запросов. Если да, то переходим к шагу 9, если нет, то выводим сообщение "Выберите данные для редактирования" и переходим к шагу 3.

. Находим в векторе структуру по индексу, соответствующему номеру строки в таблице и выводим окно добавления запроса с полями, заполненными данными из этой структуры. Переходим к шагу 10.

. Если администратор нажал кнопку "ОК" переходим к шагу 11, если кнопку "Отмена" или кнопку "Закрыть" в верхнем правом углу окна, к шагу 3.

. Если был изменён номер маршрута и такой номер уже существует в векторе структур, то выводим сообщение с текстом "Такие данные уже существуют" и переходим к шагу 3, иначе заменяем старую структуру новой, обновляем таблицу запросов и переходим к шагу 3.

. Если строка таблицы запросов не была выделена, выводим сообщение "Выберите данные для удаления" и переходим к шагу 3, иначе к шагу 13.

. Выводим сообщение "Вы действительно хотите удалить этот маршрут" и кнопки "Да" и "Нет". Если администратор нажал кнопку "Да", переходим к шагу 14, иначе к шагу 3.

. Находим в векторе структуру по индексу, соответствующему номеру выделенной строки в таблице, удаляем её из вектора и обновляем таблицу запросов. Переходим к шагу 3.

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

. Считываем данные запросов из файла "Запросы. bin" в вектор струтур. Выводим окно с таблицей запросов, хранящихся в этом векторе и кнопки "Маршруты" и "Смены". Если оператор нажал кнопку "Маршруты", переходим к шагу 17, если кнопку "Смены", к шагу %%, если кнопку "Закрыть" в верхнем правом углу окна, к шагу 15.

. Если строка таблицы запросов не была выделена, выводим сообщение "Выберите данные для редактирования" и переходим к шагу 16, иначе к шагу 18.

. Считываем данные запросов из файла "Маршруты. bin" в вектор структур. Выводим окно с таблицей маршрутов из вектора и кнопками "Добавить", "Редактировать" и "Удалить", а также с общей информацией о выбранном запросе. Если оператор нажал кнопку "Добавить", переходим к шагу 19, если кнопку "Редактировать", к шагу 21, если кнопку "Удалить", к шагу 25, если кнопку "Закрыть" в верхнем правом углу окна, к шагу 28.

. Выводим окно "Добавление остановки" с полями: название остановки, время прибытия, время отправления. Если оператор нажал кнопку "ОК", переходим к шагу 20, если кнопку "Отмена" или кнопку "Закрыть" в верхнем правом углу окна, к шагу 18.

. Сохраняем новые данные в отдельную структуру, добавляем эту структуру в конец вектора структур. Обновляем таблицу маршрутов. Переходим к шагу 18.

. Проверяем, выделена ли какая-либо строка в таблице маршрутов. Если да, то переходим к шагу 22, если нет, то выводим сообщение "Выберите данные для редактирования" и переходим к шагу 18.

. Если администратор нажал кнопку "ОК" переходим к шагу 24, если кнопку "Отмена" или кнопку "Закрыть" в верхнем правом углу окна, к шагу 18.

. Заменяем старую структуру новой и обновляем таблицу маршрутов. Переходим к шагу 18.

. Если строка таблицы маршрутов не была выделена, выводим сообщение "Выберите данные для удаления" и переходим к шагу 18, иначе к шагу 26.

. Выводим сообщение "Вы действительно хотите удалить эту остановку" и кнопки "Да" и "Нет". Если администратор нажал кнопку "Да", переходим к шагу 27, иначе к шагу 18.

. Находим в векторе структуру по индексу, соответствующему номеру выделенной строки в таблице, удаляем её из вектора и обновляем таблицу маршрутов. Переходим к шагу 18.

. Перезаписываем файлы данными, хранящимися в векторе. Выходим из программы.

. Считываем данные запросов из файла "Запросы. bin" в вектор структур. Выводим окно с таблицей запросов из вектора и кнопками "Маршруты", "Остановки" и "Подробнее", а также поле для ввода данных для поиска и кнопку "Поиск". Если гость нажал кнопку "Маршруты", переходим к шагу 30, если кнопку "Остановки", к шагу 31, если кнопку "Подробнее", к шагу 32, если кнопку "Закрыть" в верхнем правом углу окна, к шагу 37, если гость ввёл данные в поле и нажал кнопку поиск, переходим к шагу 35.

. Считываем данные запросов из файла "Запросы. bin" в вектор структур. Выводим таблицу запросов из вектора.

. Считываем данные маршрутов из файла "Маршруты. bin" в вектор структур. Выводим таблицу маршрутов из вектора.

. Если строка таблицы маршрутов или таблицы запросов не была выделена, выводим сообщение "Выберите данные!" и переходим к шагу 29, иначе к шагу 33.

. Если была выбрана строка таблицы запросов, выводим таблицу остановок, через которые проходит выделенный маршрут, если была выбрана строка таблицы маршрутов, выводим все маршруты, проходящие через эту остановку. Переходим к шагу 34.

. Если была нажата кнопка "Закрыть" в правом вернем углу экрана, переходим к шагу 29.

. Если была выведена таблица запросов, выполняем последовательный поиск по вектору структур запросов, если была выведена таблица маршрутов, выполняем последовательный поиск по вектору структур маршрутов. Находим результат и переходим к шагу 36.

. Если искали в векторе структур запросов, выводим результат в таблицу запросов, иначе выводим результат в таблицу маршрутов. Переходим к шагу 29.

. Выходим из программы.

Заключение


Результатом данной курсовой работы, является программа, которая полностью решает поставленные задачи и достигает главную цель - реализацию "информационной системы движения автобусных рейсов".

По результатам выполнения программы следует отметить её стабильность, даже при долгом доступе к отдельным функциям и многочисленным изменениям данных. Программа поддерживает безопасность и сохранность данных содержащихся в файлах. При некорректном выходе из программы, вся информация в файлах не пострадает. Все функции и методы, которые были предложены в варианте курсовой работы, полностью реализованы. Результаты работы программы корректны и не вызывают вопросов. Преимуществом в реализации именно тех методов, что были использованы в работе, является их дальнейшая расширяемость и удобство. Данные методы пригодятся для построения не только задач, указанных в варианте.

Недостатками этой программы является использование большого числа окон, что приводят к излишним затратам по памяти. Также в базе данных отсутствует сохранённая информация об остановках, из-за чего Оператор вынужден в ручную вводить их названия. Нет надёжной системы аутентификации пользователей, что делает программу крайне уязвимой. Стоит отметить, что программа была написана с использованием библиотек MFC, что лишает её кроссплатформенности.

Приложение

Фрагменты кода программы

         Обработчик события нажатия кнопки «Вход» во время аутентификации пользователя:

void CMainDlg::OnBnClickedEnter()

{

       str users[2];

       users[0].Login="Админ";

       users[0].Password="Админ";

       users[1].Login="Оператор";

       users[1].Password="Оператор";

       UpdateData(1);

       int c=compare(Login,Password,users);//Определение пользователя

       Admin dlg1;

       Operator dlg2;

       switch(c)

       {

       case 0:

             EndDialog(IDOK);

             if(dlg1.DoModal() == -1)

                    MessageBox(L"Отказ в доступе",L"Ошибка",MB_OK|MB_ICONERROR);

             break;

       case 1:

             EndDialog(IDOK);

             if(dlg2.DoModal() == -1)

                    MessageBox(L"Отказ в доступе",L"Ошибка",MB_OK|MB_ICONERROR);

             break;

       default:

             MessageBox(L"Неправильный логин или пароль",L"Ошибка",MB_OK|MB_ICONERROR);

       }

       Login="";

       Password="";

       UpdateData(0);

}

Обработчик события нажатия кнопки «Гость» во время аутентификации пользователя:

void CMainDlg::OnBtnUser()

{

       EndDialog(IDC_BUTTON_USER);

       User dlg;

       if(dlg.DoModal() == -1)

                    MessageBox(L"Отказ в доступе",L"Ошибка",MB_OK|MB_ICONERROR);

}

Функция инициализация окна «Администратор»

OOL Admin::OnInitDialog()

{

       CDialog::OnInitDialog();

       //Вставка столбцов а таблицу

       LCtrl.InsertColumn(0,L"№ маршрута",LVCFMT_LEFT,80);

       LCtrl.InsertColumn(1,L"Пункт отправления",LVCFMT_LEFT,120);

       LCtrl.InsertColumn(2,L"Пункт назначения",LVCFMT_LEFT,120);

       LCtrl.InsertColumn(3,L"Минуты",LVCFMT_LEFT,70);

       LCtrl.InsertColumn(4,L"Секунды",LVCFMT_LEFT,70);

       FILE *f;

       fopen_s(&f,"Запросы.bin","rb");

       {

             lst_char req;

             lst rq;

             while(feof(f) != fread(&req,sizeof(req),1,f))

             {

                    rq.departure = req.departure;

                    rq.destination = req.destination;

                    rq.hour = req.hour;

                    rq.minute = req.minute;

                    rq.routeNum = req.routeNum;

                    vec.push_back(rq);

             }

             fclose(f);

             insert(vec);//Заполнение таблицы

             return TRUE;

       }

       else

       {

             MessageBox(L"Ошибка при подключении к файлу", L"Ошибка", MB_OK | MB_ICONERROR);

             return TRUE;

       }

       SetIcon(m_hIcon, TRUE);   

       SetIcon(m_hIcon, FALSE);

}

Функция закрытия окна «Администратор» и созранения данных запросов

void Admin::OnClose()

{

       FILE *f,*g,*h;

       vector<rts> r;

       vector<shift> sh;

       fopen_s(&g,"Маршруты.bin","rb");

       fopen_s(&h,"Смены.bin","rb");

       if(g == NULL)

       {

             MessageBox(L"Ошибка открытия файла Маршруты. Изменения не были сохранены.", L"Ошибка!", MB_OK | MB_ICONERROR);

             CDialog::OnCancel();

       }

       if(h == NULL)

       {

             MessageBox(L"Ошибка открытия файла Смены. Изменения не были сохранены.", L"Ошибка!", MB_OK | MB_ICONERROR);

             CDialog::OnCancel();

       }

       rts_char rc;

       rts rt;

       while(feof(g) != fread(&rc,sizeof(rc),1,g))

       {

             rt.arTime = rc.arTime;

             rt.lvTime = rc.lvTime;

             rt.rNum = rc.rNum;

             rt.station = rc.station;

             r.push_back(rt);

       }

       fclose(g);

       shift_char sch;

       shift sf;

       while(feof(h) != fread(&sch,sizeof(sch),1,h))

       {

             sf.begs = sch.begs;

             sf.driver = sch.driver;

             sf.ends = sch.ends;

             sf.kond = sch.kond;

             sf.rNum = sch.rNum;

             sh.push_back(sf);

       }

       fclose(h);

       synch(vec,r,sh);//Синхронизация данных с запросами администратора

       fopen_s(&f,"Запросы.bin","wb");

       fopen_s(&g,"Маршруты.bin","wb");

       fopen_s(&h,"Смены.bin","wb");

       if(f == NULL || g == NULL || h == NULL)

             MessageBox(L"Ошибка открытия файла! Изменения не сохранены!", L"Ошибка!", MB_OK | MB_ICONERROR);

             CDialog::OnCancel();

       }

       for(int i=0;i<vec.size();i++)

       {

             lst_char ch = converting(vec[i]);

             fwrite(&ch,sizeof(lst_char),1,f);

       }

       for(int i=0;i<r.size();i++)

       {

             rts_char ch = converting(r[i]);

             fwrite(&ch,sizeof(ch),1,g);

       }

       for(int i=0;i<sh.size();i++)

       {

             shift_char ch = converting(sh[i]);

             fwrite(&ch,sizeof(ch),1,h);

       }

      

       fclose(f);

       fclose(g);

       fclose(h);

       CDialog::OnCancel();

}

Функция синхронизации с данными запросов

void synch(vector<lst> &vec, vector<rts> &vec1, vector<shift> &vec2)

{

       quickSort(vec,0,vec.size()-1);

       vector<rts>::iterator it1;

       for(int i = 0;i < vec1.size();i++)

       {

             if(!binary_search(vec,vec1[i].rNum,0,vec.size()-1))

             {

                    it1 = vec1.begin()+i;

                    vec1.erase(it1);

                    i--;

             }

       }

       vector<shift>::iterator it2;

       for(int i = 0;i < vec2.size();i++)

       {

             if(!binary_search(vec,vec2[i].rNum,0,vec.size()-1))

             {

                    it2 = vec2.begin()+i;

                    vec2.erase(it2);

                    i--;

             }

       }

}

Функция двоичного поиска в векторе

bool binary_search(vector<lst> &vec, int rn, int beg, int end)

{

       if(vec[beg].routeNum == rn || vec[end].routeNum == rn)

             return true;

      

       int n = end - beg;

       if(n == 1)

             return false;

       int mid = beg + (n/2);

       if(vec[mid].routeNum== rn)

             return true;

       if(vec[mid].routeNum > rn)

             binary_search(vec,rn,beg,mid);

       else

             binary_search(vec,rn,mid,end);

}

Функция быстрой сортировки

void quickSort(vector<rts> &vec, int low, int high)

{

       int i = low;


   rts x = vec[(low+high)/2];

   do

       {

             while(vec[i].station < x.station) ++i;

             while(vec[j].station > x.station) --j;

       if(i <= j)

             {

           swap(vec[i],vec[j]);

           i++; j--;

       }

   }

       while(i < j);

   if(low < j) quickSort(vec, low, j);

   if(i < high) quickSort(vec, i, high);

}

Функция редактирования таблицы маршрутов

void Routes::OnClickedBtnEdit()

{

       AddStand as;

       int n = LCtrlStand.GetSelectedCount();

       if(n == 0)

       {

             MessageBox(L"Выберите данные для редактирования!", L"Сообщение", MB_OK | MB_ICONINFORMATION);

             return;

       }

       POSITION pos = LCtrlStand.GetFirstSelectedItemPosition();

       if(pos)

       {

             int nIndex = LCtrlStand.GetNextSelectedItem(pos);

             as.arTime = vec2[nIndex].arTime;

             as.lvTime = vec2[nIndex].lvTime;

             as.stand = vec2[nIndex].station;

             if(as.DoModal() == IDOK)

             {

                    LCtrlStand.DeleteAllItems();

                    rts rt;

                   

                    rt.arTime = as.arTime;

                    rt.lvTime = as.lvTime;

                    rt.station = as.stand;

                    rt.rNum = Rn;

                    vector<rts>::iterator it;

                    it = vec2.begin() + nIndex;

                    it = vec2.erase(it);

                    vec2.insert(it,rt);

                    insert(vec2);

             }

       }

}

Обработчик события нажатия кнопки «Маршруты» пользователя «Гость».

void User::OnClickedBtnUsRt()

{

       LCtrlUs.DeleteAllItems();

       sch = L"";

       UpdateData(FALSE);

       if(fl == 1)

       {

             LCtrlUs.DeleteColumn(0);

             LCtrlUs.InsertColumn(0,L"№ маршрута",LVCFMT_LEFT,80);

             LCtrlUs.InsertColumn(1,L"Пункт отправления",LVCFMT_LEFT,120);

             LCtrlUs.InsertColumn(2,L"Пункт назначения",LVCFMT_LEFT,120);

             fl=0; //Флаг показывает, что была создана таблица маршрутов

       }

       FILE *f;

       fopen_s(&f,"Запросы.bin","rb");

       vecUs1.clear();

       if(f!=NULL)

       {

             lst_char req;

             lst rq;

             {

                    rq.departure = req.departure;

                    rq.destination = req.destination;

                    rq.hour = req.hour;

                    rq.minute = req.minute;

                    rq.routeNum = req.routeNum;

                    vecUs1.push_back(rq);

             }

             fclose(f);

            

             insert(vecUs1);

       }

}

Обработчик события нажатия кнопки «Остановки» пользователя «Гость».

void User::OnClickedBtnUsSt()

{

       LCtrlUs.DeleteAllItems();

       sch = L"";

       UpdateData(FALSE);

       if(fl == 0)

       {

             LCtrlUs.DeleteColumn(0);

             LCtrlUs.DeleteColumn(0);

             LCtrlUs.DeleteColumn(0);

             LCtrlUs.InsertColumn(0,L"Остановка",LVCFMT_LEFT,100);

             fl=1;

       }

       FILE *f;

       fopen_s(&f,"Маршруты.bin","rb");

       vecUs2.clear();

       if(f!=NULL)

       {

             rts_char rou;

             rts rt;

             while(feof(f) != fread(&rou,sizeof(rou),1,f))

             {

                    rt.arTime = rou.arTime;

                    rt.lvTime = rou.lvTime;

                    rt.rNum = rou.rNum;

                    rt.station = rou.station;

                    vecUs2.push_back(rt);

             }

             fclose(f);

             quickSort(vecUs2,0,vecUs2.size()-1);

            

             vector<rts>::iterator it;

             for(int i=0;i<vecUs2.size()-1;i++)

             {

                    if(vecUs2[i].station == vecUs2[i+1].station)

                    {

                           it = vecUs2.begin() + i;

                           vecUs2.erase(it);

                           i--;

                    }

             }

             insert(vecUs2);

Блок-схемы:




Список источников


1. Е.Л. Шуремов "Информационные системы управления предприятиями", изданного М.: Изд-во "Бухгалтерский учет”, 2006.

2. http://www.umpro.ru/index. php? page_id=17&art_id_1=261&group_id_4=72

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!