
Словесное описание алгоритма
Аутентификация пользователя производиться стравнением введённых строк логина и пароля со строками, вшитыми в программу. Также имеется возможность использовать программу на правах гостя, для этого надо нажать на соответствующую кнопку во время аутентификации. Информация о логине и пароле пользователя хранится в структуре с соответсвующеми полями. Всего пользователя три: администратор, оператор и гость. В функции администратора входит создание, редактирование и удаление запросов на создание маршрутов движения автобусов. Оператор занимается непосредственно созданием и управлением маршрутов, а также созданием и управлением рабочих смен для этих маршрутов. Гость является единственным пользователем, которому не доступны функции редактирования данных маршрутов. Он может просматривать информацию о движении автобусов и об остановках, через которые проходят маршруты, а также о времени прибытия и отправления автобусов на эти остановки.
Все данные, связанные с запросами, маршрутами и рабочими сменами хранятся в двоичных файлах «Запросы.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.
При нажатии кнопки закрыть в правом верхнем углу экрана происхожит простое закрытие окна.