
Заключение
Результатом данной курсовой работы, является программа, которая полностью решает поставленные задачи и достигает главную цель – реализацию «информационной системы движения автобусных рейсов».
По результатам выполнения программы следует отметить её стабильность, даже при долгом доступе к отдельным функциям и многочисленным изменениям данных. Программа поддерживает безопасность и сохранность данных содержащихся в файлах. При некорректном выходе из программы, вся информация в файлах не пострадает. Все функции и методы, которые были предложены в варианте курсовой работы, полностью реализованы. Результаты работы программы корректны и не вызывают вопросов. Преимуществом в реализации именно тех методов, что были использованы в работе, является их дальнейшая расширяемость и удобство. Данные методы пригодятся для построения не только задач, указанных в варианте.
Недостатками этой программы является использование большого числа окон, что приводят к излишним затратам по памяти. Также в базе данных отсутствует сохранённая информация об остановках, из-за чего Оператор вынужден в ручную вводить их названия. Нет надёжной системы аутентификации пользователей, что делает программу крайне уязвимой. Стоит отметить, что программа была написана с использованием библиотек 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");
if(f!=NULL)
{
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;
int j = high;
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;
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;
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);
}
}
Блок-схемы: