Нахождение пути от одного населённого пункта к другомуРефераты >> Программирование и компьютеры >> Нахождение пути от одного населённого пункта к другому
Не вызывает никаких процедур.
Вызывается из основной программы.
Процедура 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 - Количество пройденных городов}