Разработка программы 'Электронный справочник маршрутов движения общественного транспорта по городу'
Кафедра
ПОВТиАС
Пояснительная
записка к курсовой работе
по
дисциплине: «Программирование»
на
тему: Разработка программы “Электронный справочник маршрутов движения
общественного транспорта по городу”
Аннотация
электронный
справочник транспорт
Пояснительная записка содержит описание
программы, которая является электронным справочником маршрутов движения
общественного транспорта по городу (автобусов и троллейбусов). Программа
предназначена для определения номера автобуса или троллейбуса, необходимого для
прибытия на станцию назначения, а также для выяснения необходимости пересадок.
Текст программы приведен на языке C++.
Ключевые слова: программирование, С++, функции,
графический режим, маршрут.
Содержание
Введение
. Постановка задачи
.1 Анализ задачи
.2 Формальная постановка задачи
.3 Алгоритм программы
.4 Проектирование интерфейса
. Программирование задачи
. Тестирования программы
Заключение
Литература
Приложение
Введение
Программирование
<#"701707.files/image001.gif"> вызвано тем, что количество станций
равно 25-ти, т.е. нельзя ввести номер несуществующей станции.
. по той же причине.
Результирующие (выходные) данные
Результатом выполнения программы является вывод
сообщения - инфор0мации о том, на каком транспорте можно добраться до остановки
назначения (№ автобуса и/или троллейбуса), а также информации о пересадке, если
прямого маршрута не найдено (в графическом режиме через функцию outtextxy();).
После ввода исходных данных нужный маршрут будет выделен другим цветом.
.3 Алгоритм программы
Рис.1. Блок-схема функции main()
Рис.5. Блок-схема функции void
zast(void);
Рис.2. Блок-схема функции void linii(void);
Рис.3. Блок-схема функции
void marshrut(int a,int b,int c);
Рис.4. Блок-схема функции
void soobsh(int a, int b,int c);
1.4 Проектирование интерфейса
Сценарий диалога
Общая схема диалога:
· Сцена 1 (ввод номера станции отправления).
· Сцена 2 (ввод номера станции
назначения).
· Вывод результата. Если не найден
прямой маршрут, то Сцена 3, иначе Сцена 4.
Описание сцен диалога:
Описание сцены 1 приведено в табл. 1.
Таблица 1
Алгоритм
ведения диалога
|
Сообщения
пользователя и его реакция
|
Вывод
запроса
|
Введите
номер станции, на которой находитесь
|
Ввод
y1
|
???
<Enter>
|
Если
y1 не
входит в диапазон 1..25, то осуществляется возват к выводу запроса
|
|
Описание сцены 2 приведено в табл. 2.
Таблица 2
Алгоритм
ведения диалогаСообщения пользователя и его реакция
|
|
Вывод
запроса
|
Введите
номер станции назначения
|
Ввод
y2
|
???
<Enter>
|
Если
y2 не
входит в диапазон 1..25, то осуществляется возврат к выводу запроса
|
|
Описание сцены 3 приведено в табл. 3.
Таблица 3
Алгоритм
ведения диалога
|
Сообщения
пользователя и его реакция
|
Выделение
нужного маршрута другим цветом и вывод сообщения
|
Вам
необходимо сесть на автобус номер ??? и на станции номер ??? пересесть на
троллейбус номер ???
|
Описание сцены 4 приведено в табл. 4.
Таблица 4
Алгоритм
ведения диалога
|
Сообщения
пользователя и его реакция
|
Вам
необходимо сесть на автобус номер ??? пересадок не требуется
|
2. Программирование задачи
В программе были использованы функции,
хранящиеся в заголовочных файлах. Список заголовочных файлов из стандартной
библиотеки C++, используемых в
программе (в описании приведены функции, использующиеся в данной программе):
§ iostream.h
- в ней реализована поддержка для файлового ввода/вывода данных встроенных
типов. Операции ввода/вывода выполняются с помощью классов istream (потоковый
ввод) и ostream (потоковый вывод). Третий класс, iostream, является производным
от них и поддерживает двунаправленный ввод/вывод.
· cin;
· cout
.
Вывод осуществляется, как правило, с помощью
перегруженного оператора сдвига влево (<<), а ввод - с помощью оператора
сдвига вправо (>>).
§ iomanip.h
- заголовочный файл стандартной библиотеки С++, который содержит манипуляторы
ввода/вывода информации. Сами они не позволяют читать или записывать данные,
манипуляторы лишь воздействуют на способ интерпретации данных при чтении и
записи.
· setw();
· setiosflags()
.
§ stdlib.h
- заголовочный файл стандартной библиотеки языка С, который содержит в себе
функции, занимающиеся выделением памяти, контроль процесса выполнения
программы, преобразования типов и другие.
· itoa()
.
§ conio.h
- объявляет несколько библиотечных функций для работы с «консольным
вводом/выводом» программы, создает текстовый интерфейс пользователя.
· clrscr();
· getch()
;
· textcolor()
;
· gotoxy().
§ graphics.h
- заголовочный файл стандартной библиотеки C++,
который содержит прототипы функций, управляющие экраном в графическом режиме.
· initgraph()
;
· setcolor()
;
· outtextxy()
;
· setfillstyle()
;
· line()
;
· pieslice();
· bar()
;
· closegraph()
.
Далее рассмотрим подробнее созданные функции:
1. main()
- главная функция. В ней запрашиваются исходные данные
и инициализируется графический режим.
В функции объявлены переменные int
y1,y2,k1,k2.
y1, y2
- исходные данные, которые необходимо ввести пользователю; k1,
k2 - вычисляются
индексы станций.
Для того, чтобы экран работал в графическом
режиме, необходимо использовать специальные средства инициализации графики.
{ int
y1,y2,k1,k2;
zast(); //вызов
функции void
zast()
l:int
DRIVER=DETECT,MODE;
/*позволяет без изменения переносить программы на компьютеры с другими
видеоадаптерами*/
initgraph(&DRIVER,&MODE,"");
/*инициализация графического режима, где &DRIVER
- номер типа драйвера, который поддерживает графический режим, &MODE
-номер типа графического режима, 3-ий параметр задает файл драйвера и путь к
нему*/
linii();
setcolor(15);
// изменение цвета прорисовки
if(y1<=25&&y1>=1)
//если первое число задано правильно, программа выводит информацию до того
момента, когда надо вводить второе число
{outtextxy(1,1,"Введите
номер станции, на которой находитесь");
gotoxy(1,2);
cout<<y1;
goto
h;} //переход к
запросу номера станции назначения
outtextxy(1,1,"Введите
номер станции, на которой находитесь");
gotoxy(1,2);
//перевод курсора в начало второй строки
cin>>y1;
if(y1<1
|| y1>25)
//ограничение на исходные данные: если пользователь введет номер несуществующей
станции отправления, то программа запросит ввод номера снова
{clrscr();//очистка
экрана от неправильно введенных данных
goto
l;} //возврат к
запросу номера станции отправления
h:outtextxy(1,35,"Введите
номер станции назначения");
gotoxy(1,4);
cin>>y2;
if(y2<1
|| y2>25)
//ограничение на исходные данные: если пользователь введет номер несуществующей
станции назначения, то программа запросит ввод номера снова
{clrscr();
//очистка экрана от неправильно введенных данных
goto
l;} //возврат к
запросу номера станции отправления
for(i=0;i<5;i++)(j=0;j<5;j++)
{ if(A[i][j]==y1)
{k1=j;}(A[i][j]==y2){k2=i;}
} //цикл для нахождения станций отправления и
назначения
…
closegraph();//возврат
в текстовый режим
return 0;
}
2. void
zast(void);
Функция выводит на экран заставку, которая
содержит информацию об авторе программы, название программы, а также инструкцию
для пользователя.
{ textcolor(15);
/*функция управления цветом символов*/
clrscr(); /*
«активизирует» текущий цвет
cout<<setw(50)<<setiosflags(ios::right)<<"ЭЛЕКТРОННЫЙ
СПРАВОЧНИК\n";
/*cout
- объект класса ostream, соответствующий стандартному выводу
setw(int
n) - установка
ширины поля в значение n
setiosflags(ios::right)
- вывод с выравниванием справа*/
…
}
3. void
linii(void);
Функция отображает маршруты транспорта, их
номера, а также условное обозначение станций и их нумерация. Перед тем, как
вызвать данную функцию, нам необходимо перейти в графический режим. Переход
осуществляется в главной функции main().
В функции объявлена переменная int
k (номер
транспорта) и массив char
A[5],
предназначенный для вывода в графическом режиме номеров автобусов и
троллейбусов. Перевод данных из k
в A[5] осуществляется c
помощью функции itoa();
{setcolor(7);
setfillstyle(1,7);
/*устанавливает шаблон и цвет заполнения*/
line(90,100,320,100);
//линия маршрута 1-го троллейбуса
…
line(100,85,100,315);
//линия маршрута 1-го автобуса
…
char A[5];k=1;(int i=0;i<5;i++)(int
j=0;j<5;j++)
{pieslice(100+i*50,100+j*50,0,360,2);
/* рисует и закрашивает сектор круга с центром в точке (100+i*50,100+j*50)
и радиусом 2. Сектор рисуется от угла 0 до угла 360*/
itoa(k,A,10);
/*Функция itoa преобразует символы числа k
в символьную строку, заканчивающуюся NULL-символом, и запоминает результат в A.
10 определяет основание системы счисления для k*/
outtextxy(105+j*50,90+i*50,A);
/* функция отображает текст строки в указанной области*/
k++; }=1;
setcolor(2);(i=0;i<5;i++){ itoa(k,A,10);(105+i*50,50,A);
k++;} //для вывода
номеров автобусов
k=1; setcolor(9);(i=0;i<5;i++){
itoa(k,A,10);(55,90+i*50,A);
k++;} //для вывода
номеров троллейбусов
setcolor(2);
setfillstyle(1,2);
bar(1,355,10,360);
/*рисует прямоугольник и закрашивает его текущим цветом*/
…
4. void
marshrut(int a,int b,int c);
Функция для выделения нужного пользователю
маршрута. В списке формальных параметров указаны 3 переменные int
a, int
b и int
c. Переменная a
содержит номер станции отправления, b
- номер станции назначения и c
- номер станции пересадки. В теле функции объявлены переменные целого типа x1,
y1, x2,
y2, x3,
y3, предназначенные
для запоминания индексов станций отправления (x1,
y1), назначения (x2,
y2) и пересадки (x3,
y3).
{ int
x1,y1,x2,y2,x3,y3;(i=0;i<5;i++)(j=0;j<5;j++){
if(A[i][j]==a)
x1=i,y1=j;}
//цикл для запоминания индексов станции отправления
for(i=0;i<5;i++)
for(j=0;j<5;j++){
if(A[i][j]==b)
x2=i,y2=j;}
//цикл для запоминания индексов станции назначения
for(i=0;i<5;i++)
for(j=0;j<5;j++){
if(A[i][j]==c)
x3=i,y3=j;}
//цикл для запоминания индексов станции пересадки
setcolor(4);
line(100+y1*50,100+x1*50,100+y3*50,100+x3*50);
//линия окрашивает маршрут от станции отправления до станции пересадки
line(100+y3*50,100+x3*50,100+y2*50,100+x2*50);}
//линия окрашивает маршрут от станции пересадки до станции назначения
5. void
soobsh(int a, int b, int c);
Данная функция предназначена непосредственно для
вывода необходимой для пользователя информации. Объявлены переменные int
k1,k2,k3,k4.
Это индексы станций отправления (k1,k2)
и назначения (k3,k4).
{char
M[5]; //в массив
заносится значение с
int k1,k2,k3,k4;(14);(i=0;i<5;i++)(j=0;j<5;j++){if
(A[i][j]==a){k1=i;k2=j;}(A[i][j]==b){k3=i;k4=j;}}1++;k2++;k3++;k4++;
//увеличиваем каждую переменную на 1, т.к. номера автобусов и троллейбусов
начинаются с “1”
switch(k2)
//выбираем на автобус с каким номером сесть
{
case 1:{outtextxy(200,355,"Вам
необходимо сесть на автобус номер1");break;}
… }
if(k1==k3||k2==k4){outtextxy(250,365,"пересадок
не требуется");} //в том случае если маршрут прямой, без пересадок
else{ switch(k3)
//иначе выбираем на какой троллейбус нужно пересесть
{
case 1:{outtextxy(200,365,"и
на станции номер");
itoa(c,M,10);outtextxy(350,365,M);(370,365,"пересесть
на троллейбус номер 1");break;}
… }}
}
Полный текст программы будет приведен в
приложении.
3. Тестирование программы
Рис.6. Заставка
Рис.7. Запрос ввода номера станции отправления
Рис.8. Запрос ввода номера станции назначения
Рис.9. Выделение маршрута красным цветом и вывод
информации о необходимом транспорте и пересадке
Рис.10. Выделение маршрута красным цветом и
вывод информации о необходимом транспорте и пересадке
Рис.11. В случае, если маршрут прямой и пересадки
не требуется
Рис.12. В случае, если маршрут прямой и
пересадки не требуется
Заключение
В данной курсовой работе было рассмотрено
решение задачи по созданию электронного справочника маршрутов движения общественного
транспорта по городу. Был проведен исчерпывающий анализ самой задачи,
рассмотрен интерфейс программы, рассмотрены необходимые алгоритмы, а также
приведены результаты тестирования программы.
На этапе постановки задачи было принято решение
о графическом отображении маршрута, о том, какие функции использовать и о
создании новых функций. Проведена формальная постановка задачи: информация о
входных данных, выходных данных и ограничении на входные данные. Ограничение
подразумевает «защиту от дурака», т.е. если пользователем будут введены
неправильные данные, программа запросит их снова. Был описан сценарий диалога с
пользователем. Описание сцен приведено в таблицах 1, 2, 3, 4.
В программировании задачи были подробно
рассмотрены все функции, используемые в программе, а также возникшие в ходе
составления кода трудности. На этапе тестирования были приведены результаты
всех возможных путей программы. Все пункты задачи выполнены.
Пути усовершенствования программы:
. программа выдает информацию только о том,
на какой автобус сесть и на каком троллейбусе осуществляется пересадка. Т.е.
первым всегда показан вертикальный маршрут, и затем, если требуется пересадка -
горизонтальный. Чтобы усовершенствовать программу, необходимо добавить другой
алгоритм для реализации маршрута;
. для того, чтобы более наглядно показать
пользователю станции отправления, назначения и пересадки, можно разработать
алгоритм для окрашивания каждой станции определенным цветом после ввода
исходных данных.
1. Страуструп
Б. Программирование: принципы и практика использования C++, исправленное
издание - М.: Вильямс
<http://ru.wikipedia.org/w/index.php?title=%D0%92%D0%B8%D0%BB%D1%8C%D1%8F%D0%BC%D1%81_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>,
2011. - 1248 с.
. Шилдт
<http://ru.wikipedia.org/wiki/%D0%A8%D0%B8%D0%BB%D0%B4%D1%82,_%D0%93%D0%B5%D1%80%D0%B1%D0%B5%D1%80%D1%82>
Г. Полный справочник по C++ - 4-е изд. - М.: Вильямс
<http://ru.wikipedia.org/w/index.php?title=%D0%92%D0%B8%D0%BB%D1%8C%D1%8F%D0%BC%D1%81_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>,
2011. - 800 с.
. <http://ru.wikipedia.org/wiki/Программирование>
. <http://www.codenet.ru/progr/cpp/spr.php>
. Методические
указания для выполнения лабораторных работ по дисциплине «Программирование»
. Конспект
лекций по дисциплине «Программирование»
Приложение
#include<iostream.h>
#include<iomanip.h>
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>[5][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
,18,19,20,21,22,23,24,25},i,j;soobsh(int
a,int b,int c);zast(void);linii(void);marshrut(int a,int b,int c);()
{ int y1,y2,k1,k2;();:int
DRIVER=DETECT,MODE;(&DRIVER,&MODE,"");();(15);(y1<=25&&y1>=1)
{outtextxy(1,1,"Введите
номер станции, на которой находитесь");
gotoxy(1,2);<<y1;h;}(1,1,"Введите
номер станции, на которой находитесь");
gotoxy(1,2);>>y1;(y1<1 ||
y1>25)
{clrscr();
goto
l;}
h:outtextxy(1,35,"Введите
номер станции назначения");
gotoxy(1,4);>>y2;(y2<1 ||
y2>25)
{clrscr();l;}(i=0;i<5;i++)(j=0;j<5;j++)
{ if(A[i][j]==y1)
{k1=j;}(A[i][j]==y2){k2=i;}
}();per=A[k2][k1];(y1,y2,per);(y1,y2,per);();();0;
}linii()
{setcolor(7);(1,7);(90,100,320,100);(90,150,320,150);(90,200,320,200);(90,250,320,250);(90,300,320,300);(100,85,100,315);(150,85,150,315);(200,85,200,315);(250,85,250,315);(300,85,300,315);A[5];k=1;(int
i=0;i<5;i++)(int j=0;j<5;j++)
{pieslice(100+i*50,100+j*50,0,360,2);(k,A,10);(105+j*50,90+i*50,A);k++;
}=1; setcolor(2);(i=0;i<5;i++){ itoa(k,A,10);(105+i*50,50,A);++;}=1; setcolor(9);(i=0;i<5;i++){
itoa(k,A,10);(55,90+i*50,A);++;}(2);(1,2);(1,355,10,360);(15);(15,355,"номера
автобусов");(9);(1,9);(1,365,10,370);(15);(15,365,"номера
тро
ллейбусов");
}marshrut(int a,int b,int c)
{ int
x1,y1,x2,y2,x3,y3;(i=0;i<5;i++)(j=0;j<5;j++){ if(A[i][j]==a)
x1=i,y1=j;}(i=0;i<5;i++)(j=0;j<5;j++){ if(A[i][j]==b)
x2=i,y2=j;}(i=0;i<5;i++)(j=0;j<5;j++){ if(A[i][j]==c)
x3=i,y3=j;}(4);(100+y1*50,100+x1*50,100+y3*50,100+x3*50);(100+y3*50,100+x3*50,100+y2*50,100+x2*50);}soobsh(int
a, int b,int c)
{char
M[5];k1,k2,k3,k4;(14);(i=0;i<5;i++)(j=0;j<5;j++){if
(A[i][j]==a){k1=i;k2=j;}(A[i][j]==b){k3=i;k4=j;}}++;k2++;k3++;k4++;(k2)
{
case 1:{outtextxy(200,355,"Вам
необходимо сесть на автобус номер1");break;}
case 2:{outtextxy(200,355,"Вам
необходимо сесть на автобус номер 2");break;}
case 3:{outtextxy(200,355,"Вам
необходимо сесть на автобус номер 3");break;}
case 4:{outtextxy(200,355,"Вам
необходимо сесть на автобус номер 4");break;}
case 5:{outtextxy(200,355,"Вам
необходимо сесть на автобус номер 5");break;}
}
if(k1==k3||k2==k4){outtextxy(250,365,"пересадок
не требуется");}
else{ switch(k3)
{case
1:{outtextxy(200,365,"и на
станции номер");
itoa(c,M,10);outtextxy(350,365,M);(370,365,"пересесть
на троллейбус номер 1");break;}
case 2:{outtextxy(200,365,"
и на станции номер ");
itoa(c,M,10);outtextxy(350,365,M);(370,365,"пересесть
на троллейбус номер 2");break;}
case 3:{outtextxy(200,365,"
и на станции номер ");
itoa(c,M,10);outtextxy(350,365,M);(370,365,"пересесть
на троллейбус номер 3");break;}
case 4:{outtextxy(200,365,"
и на станции номер ");
itoa(c,M,10);outtextxy(350,365,M);(370,365,"пересесть
на троллейбус номер 4");break;}
case 5:{outtextxy(200,365,"
и на станции номер ");
itoa(c,M,10);outtextxy(350,365,M);(370,365,"пересесть
на троллейбус номер 5");break;}
} }}zast(void)
{
textcolor(15);clrscr();<<setw(50)<<setiosflags(ios::right)<<"ЭЛЕКТРОННЫЙ
СПРАВОЧНИК\n";<<setw(65)<<"МАРШРУТОВ
ДВИЖЕНИЯ ОБЩЕСТВЕННОГО ТРАНСПОРТА ПО ГОРОДУ\n\n";
cout<<"\tАвтор:
ст-ка гр. У-125 ФКТВТиЭ Магомедова З.Б.\n\n";
cout<<"\tПрограмма
для курсовой работы по дисциплине \"Программирование\"\n\n";
cout<<"\n\tДля
того, чтобы выяснить, транспорт с каким номером Вам нужен и \nинформацию
о пересадке, необходимо ввести номер станции, на которой Вы \nнаходитесь
в данный момент и номер станции назначения.";
cout<<"\n\nДля
перехода к окну маршрутов нажмите любую клавишу.\n";
getch();}