Учебная работа. Реферат: Нахождение пути от одного населённого пункта к другому

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (5 оценок, среднее: 4,80 из 5)
Загрузка...
Контрольные рефераты

Учебная работа. Реферат: Нахождение пути от одного населённого пункта к другому

Цель работы:


Введение

В истинное время промышленность производства компов и программного обеспечения для их является одной из более принципиальных сфер экономики продвинутых стран. Раз в год в мире продаются 10-ки миллионов компов. Лишь в США

В чем все-таки предпосылки такового быстрого роста промышленности индивидуальных компов и их сравнительная выгодность для почти всех деловых применений?

* Простота использования, богатая при помощи диалогового метода взаимодействия с компом.

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

Использованная в отчёте программка может употребляться для решения задач, связанных с проложением маршрута дороги хоть какого типа.

Определение достижимости населённых пт.

1.1 анализ требований.

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

Решение поставленной задачки осуществляется последующим способом:

Cтроится граф, верхушки которого — населённые пункты, а ребра — дороги меж ними.

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

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

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

средства решения задачки: употребляются средства логического программирования языка Turbo Pascal 7.0.

1.2 Проектирование.

Для реализации поставленной задачки программка обязана делать последующие функции:

* Ввод данных юзером с клавиатуры — вводятся наименования населённых пт и дороги, соединяющие их;

* Вывод данных — вывод на экран перечня населённых пт и дорог, соединяющий их.

* Запись в файл — запись в файл, имя которого показывает юзер в диалоговом режиме, наименования населённых пт и имеющихся дорог меж ними в виде текстовой инфы;

* Считывание файла с диска, с именованием, которое показывает юзер в диалоговом режиме

* Вывод результата — юзер задаёт исходный и конечный населённый пункт, меж которыми нужно проложить путь, на дисплее возникает маршрут, или сообщение: «маршрут не найден».

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

Все процедуры, применяемые данной программкой, находятся в unit-модуле ph.tpu и предусмотрены для использования главный программкой, которая находится в файле Path.pas.

Основная программка производит вывод меню на экран, опрос клавиатуры и вызов процедуры, соответственной нажатой клавише.

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

Для реализации вывода данных на экран употребляется процедура OutputData, которая производит чтение в цикле массива городов и вывод его на экран, также массива дорог, соединяющие эти городка и выводит из на экран.

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

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

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

Для поиска маршрута употребляется рекурсивная процедура findnext, которой при её вызове передаются последующие характеристики:

a(vec) — вектор, любому городку соответствует номер в маршруте либо ноль, если городка нет в маршруте;

tv(integer) — город, последующий в маршруте;

nv(integer) — город, в который нужно добраться;

lv(integer) — количество пройденных городов.

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

1.3 Кодирование

Короткая многофункциональная спецификация.

Процедура InputData

Предназначение: Производит ввод начальных данных юзером с клавиатуры.

Входные данные: нет.

Выходные данные: нет.

Не вызывает никаких процедур.

Вызывается из главный программки.

Процедура OutputData

Предназначение: Производит вывод данных на экран.

Входные данные: нет.

Выходные данные: нет.

Не вызывает никаких процедур.

Вызывается из главный программки.

Процедура Load

Предназначение: Производит запрос имени, чтение файла данных с сиим именованием в массив городов и в массив дорог.

Входные данные: нет.

Выходные данные: нет.

Не вызывает никаких процедур.

Вызывается из главный программки.

Процедура Save

Предназначение: Производит запрос имени, запись в файл данных с сиим именованием массива городов и в массива дорог.

Входные данные: нет.

Выходные данные: нет.

Не вызывает никаких процедур.

Вызывается из главный программки.

Процедура FindPath

Предназначение: Производит поиск пути меж городками.

Входные данные: нет.

Выходные данные: нет.

Вызывает findnext.

Вызывается из главный программки.

Процедура FindNext

Предназначение: Производит поиск маршрута.

Входные данные:

a(vec) — вектор, любому городку соответствует номер в

маршруте либо ноль, если городка нет в маршруте;

tv(integer) — город, последующий в маршруте;

nv(integer) — город, в который нужно добраться;

lv(integer) — количество пройденных городов.

Выходные данные: нет.

Вызывает findnext.

Вызывается из FindPath.

Основная программка

Производит оформление экрана, вывод и обработку меню, опрос клавиатуры, вызов процедуры, соответственной избранному пт меню.

1.4 Тестирование

Разработанное программное средство было протестировано способом многофункционального тестирования.

Введённые в программку данные проявили, что результаты работы совпадают с вычисленными вручную.

Программки разработки.

программка Path

program path;

uses crt,ph;

var

t:town; {Данные о городках}

nt:integer; {Число городов}

r:road; {Данные о дорогах}

nr:integer; {Число дорог}

sl:integer; {Избранный пункт меню}

c:char; {Нажатый знак}

i:integer; {Счетчик}

fv:vec; {Вектор пройденных городов}

nfv:integer; {Количество городов}

Const

KItems = 6; {Количество пт меню}

mas: array[1..KItems] of string =

{Инициализация пт меню}

(‘¦ Ввод данных ¦’,

‘¦ Вывод данных ¦’,

‘¦ Запись в файл ¦’,

‘¦ Считывание файла ¦’,

‘¦ Вывод результата ¦’,

‘L—— Выход ——-‘);

{Основная программка}

begin

sl:=1;

{Городов и дорог нет}

nt:=0;

nr:=0;

repeat

textattr:=7; {Главный цвет меню}

clrscr;

for i:=1 to KItems do begin

gotoxy (25,i+3);

write (mas[i]); {Вывод пт меню}

end;

textattr:= 77; {Цвет активного пт}

gotoxy (25,sl+3);

write (mas[sl]); {Вывод активного пт}

c:=readkey; {Ввод знака с клавиатуры}

textattr:=7;

case c of {Найти код нажатой клавиши}

#13: case sl of {Кнопка Enter}

1: InputData;

2: OutputData;

3: Save;

4: Load;

5: FindPath;

end;

#0: begin {Анализ многофункциональных кнопок}

c:=readkey;

case c of

#80: if sl<KItems then sl:=sl+1 else sl:=1;

#72: if sl>1 then sl:=sl-1 else sl:=KItems;

end

end

end;

until ((c=#13) and (sl=6) or (c=#27));

textattr:=7;

clrscr;

end.

Модуль ph

unit ph;

interface

uses crt;

type

town= array [1..20] of string; {Данные о городках}

road= array [1..200] of record {Данные о дорогах}

a:integer;

b:integer;

end;

vec=array [1..20] of integer; {Данные о пройденных городках}

var

t:town; {Данные о городках}

nt:integer; {Число городов}

r:road; {Данные о дорогах}

nr:integer; {Число дорог}

fv:vec; {Вектор пройденных городов}

nfv:integer; {Количество городов}

procedure InputData;

procedure OutputData;

procedure Save;

procedure Load;

procedure findnext(a:vec; tv:integer; nv:integer; lv:integer);

procedure FindPath;

implementation

{
Ввод
данных
}

procedure InputData;

var

i:integer; {Счетчик}

n:integer; {Избранный исходный город}

sl:integer; {Избранный город}

c:char; {Нажатый знак}

begin

{Считывание данных о городках}

clrscr;

nt:=1;

writeln(‘Введите заглавие городка (Пустая строчка — окончить: ‘);

repeat

write(‘ >’);

readln(t[nt]);

nt:=nt+1;

until (t[nt-1]=»);

nt:=nt-2;

{Проверка, вводились ли городка}

if (nt>0) then begin

{Да, ввод дорог}

nr:=0;

n:=0;

sl:=1;

repeat

textattr:=7;

clrscr;

for i:=1 to nt do begin

gotoxy (25,i+3);

write (t[i]); {Вывод городов}

end;

textattr := 77; {Цвет активного городка}

gotoxy (25,sl+3);

write (t[sl]); {Вывод активного городка}

if (n<>0) then begin

textattr:=66; {Цвет отмеченного городка}

gotoxy (25,n+3);

write (t[n]); {Вывод отмеченного городка}

end;

textattr:=7;

gotoxy(1,20);

write(‘Дороги: ‘);

for i:=1 to nr do write(‘ {‘,r[i].a,’,’,r[i].b,’}’);

c:=readkey; {Ввод знака с клавиатуры}

case c of

#13: begin {Нажат ENTER}

{Или помечается исходный город}

if n=0 then n:=sl else

{Или происходит попытка добавить дорогу}

if (n=sl) then n:=0 else begin

nr:=nr+1;

if (n>sl) then begin

i:=n;

n:=sl;

sl:=i;

end;

{Проверяется, нет ли таковой?}

for i:=1 to nr-1 do

if ((r[i].a=n)and(r[i].b=sl)) then n:=0;

{Если нет — добавляется}

if n<>0 then begin

r[nr].a:=n;

r[nr].b:=sl;

end else nr:=nr-1;

n:=0;

sl:=1;

end;

end;

#0: begin {Анализ многофункциональных кнопок}

c:=readkey;

case c of

#80: if sl<nt then sl:=sl+1 else sl:=1;

#72: if sl>1 then sl:=sl-1 else sl:=nt;

end

end

end;

until (c=#27);

end;

end;

{
Вывод
данных
}

procedure OutputData;

var

i:integer; {Счетчик}

begin

{Вывод перечня городов}

clrscr;

writeln(‘ Городка: ‘);

for i:=1 to nt do begin

gotoxy (10,i);

write (t[i]); {Вывод городов}

end;

{Вывод перечня дорог}

gotoxy(1,20);

write(‘ Дороги: ‘);

for i:=1 to nr do write(‘ {‘,r[i].a,’,’,r[i].b,’}’);

gotoxy(2,24);

write(‘ ESC- Выход’);

{Ожидание ESC}

repeat until readkey=#27;

end;

{ Запись данных в файл}

procedure Save;

var

f:TEXT; {Файл}

name:string; {Название файла}

n:integer; {Счетчик}

begin

clrscr;

writeln(‘ Запись данных ‘);

write(‘ Введите имя файла: ‘);

readln(name);

assign(f,name);

rewrite(f);

writeln(f,nt);

for n:=1 to nt do writeln(f,t[n]);

writeln(f,nr);

for n:=1 to nr do writeln(f,r[n].a,’ ‘,r[n].b);

close(f);

end;

{Чтение из файла}

procedure Load;

var

f:TEXT; {Файл}

name:string; {Название файла}

n:integer; {Счетчик}

begin

clrscr;

writeln(‘ Чтение данных ‘);

write(‘ Введите имя файла: ‘);

readln(name);

assign(f,name);

reset(f);

readln(f,nt);

for n:=1 to nt do readln(f,t[n]);

readln(f,nr);

for n:=1 to nr do readln(f,r[n].a,r[n].b);

close(f);

end;

{Рекурсивная процедура поиска маршрута.

Входные характеристики:

a:vec — Вектор, любому городку соответствует номер в маршруте

либо ноль, если городка нет в маршруте

tv:integer — город, последующий в маршруте

nv:integer — Город, в который нужно добраться

lv:integer — количество пройденных городов}

procedure findnext(a:vec;tv:integer;nv:integer;lv:integer);

var

i:integer; {Счетчик}

begin

a[tv]:=lv; {Устанавливается в векторе

флаг, что город tv пройден}

if (tv=nv) then begin

{Если достигнут нужный город}

if ((lv+1)<nfv)or(nfv=0) then begin

{Если найден 1-ый или наиболее маленький маршрут — он становится отысканным}

nfv:=lv+1;

fv:=a;

end;

end else begin

{По другому — просмотр всех городов, в которые можно добраться из данного}

for i:=1 to nr do

{Если город еще не учитывался — пуск для него той же самой функции}

if ((r[i].a=tv)and(a[r[i].b]=0)) then findnext(a,r[i].b,nv,lv+1);

{Просмотр, но для дорог, где текущий город учитывался как 2-ой}

for i:=1 to nr do

{Если город еще не учитывался — пуск для него той же самой функции}

if ((r[i].b=tv)and(a[r[i].a]=0)) then findnext(a,r[i].a,nv,lv+1);

end;

end;

{
Нахождение
пути
}

procedure FindPath;

var

i:integer; {Счетчик}

j:integer; {Счетчик}

n:integer; {Начальный город}

sl:integer; {Избираемый город}

c:char; {Считанный с клавиатуры знак}

v:vec; {Вектор для начала рекурсии}

begin

{Вначале 1-ый город не избран}

n:=0;

sl:=1;

nfv:=0; {Маршрут не найден}

{Цикл запроса городов и вывода результатов}

repeat

textattr:=7;

clrscr;

{Вывод поясняющей надписи}

gotoxy(2,20);

if (n=0) then write(‘ Изберите исходный пункт’)

else writeln(‘ Изберите конечный пункт ‘);

{Вывод перечня городов}

for i:=1 to nt do begin

gotoxy (25,i+3);

write (t[i]);

end;

textattr:= 77;

gotoxy (25,sl+3);

write (t[sl]);

if (n<>0) then begin

textattr:=66;

gotoxy (25,n+3);

write (t[n]); {Вывод отмеченного городка}

end;

textattr:=7;

{Вывод отысканного маршрута или надписи о его отсутствии}

gotoxy(60,1);

if (nfv>0) then begin

write(‘ Отысканный маршрут: ‘);

for j:=1 to nfv do

for i:=1 to nt do if fv[i]=j then begin

gotoxy(60,j+2);

write(t[i]);

end;

end else write(‘ Маршрут не найден ‘);

c:=readkey; {Ввод знака с клавиатуры}

case c of

#13: begin

{Или фиксируется исходный город}

if n=0 then n:=sl else begin

{Или убирается неверно избранный город}

if (n=sl) then n:=0 else begin

{Или происходит поиск новейшего маршрута}

nfv:=0; {Маршрута нет}

for i:=1 to 20 do v[i]:=0; {Ни 1-го пройденного

городка}

findnext(v,n,sl,1);{Вызывается 1-ый раз рекурсивная

процедура}

end;

n:=0;

sl:=1;

end;

end;

#0: begin {Анализ многофункциональных кнопок}

c:=readkey;

case c of

#80: if sl<nt then sl:=sl+1 else sl:=1;

#72: if sl>1 then sl:=sl-1 else sl:=nt;

end

end

end;

until (c=#27);

end;

end.

Результаты выполнения программки.

¦ Ввод данных ¦

¦ Вывод данных ¦

¦ Запись в файл ¦

¦ Считывание файла ¦

¦ Вывод результата ¦

+—— Выход ——+

Ввод данных:

Введите заглавие городка (Пустая строчка — окончить):

>город 1

>Город 2

>Город 3

>Город 4

>Город 5

>

Дороги: {1,3} {3,4} {2,5} {1,4} {2,4} {2,3}

Вывод результата:

Отысканный маршрут: город 1 Город 1

Город 3 Город 2

Город 2 Город 3

город 5 Город 4

Город 5

Перечень применяемых источников

1. Белецкий Я. Турбо Паскаль с графикой для индивидуальных компов /перевод с польского Д. И. Юренкова. — М. :Машиностроение, 1991.

2. Сергиевский М. В., Шалашов А. В. Турбо Паскаль 7.0; язык, среда программирования. — М: Машиностроение, 1994.

3. Справочник по процедурам и функциям Borland Pascal With Objects 7.0. — Киев: Диалектика, 1993.

]]>