ДИАГРАММЫ НАССИ-ШНЕЙДЕРМАНА




Диаграмма Насси — Шнейдермана - это графический способ представления структурированных алгоритмов и программ, разработанный в 1972 году американскими аспирантами Беном Шнейдерманом и Айзеком Насси.

Поскольку в структурном программировании не используется безусловный переход, то Бен Шнейдерман решил, что для записи структурированных алгоритмов не нужны используемые в блок-схемах стрелки. Придумав разные способы изображения основных структур управления (последовательностей, ветвлений и циклов), он затем вместе с Айзеком Насси подробно проработал свою идею. Вместе они написали статью «Техника блок-схем для структурного программирования», которая была опубликована в научном журнале «SIGPLAN Notices» в августе 1973 года.

Диаграммы Насси — Шнейдермана получили широкое распространение в некоторых странах, особенно в Германии, где для них даже был разработан официальный стандарт Немецким институтом по стандартизации: DIN 66261.

Диаграммы Насси — Шнейдермана имеют ряд преимуществ перед блок-схемами при разработке структурированных алгоритмов и программ:

 

1 Запись является более компактной (в первую очередь за счёт отсутствия стрелок между элементами).

2 Изобразив алгоритм или программу в виде диаграммы Насси — Шнейдермана, можно быть гарантировано уверенным в том, что принципы структурного программирования соблюдены (при использовании блок-схем можно случайно получить неструктурированный алгоритм, если быть невнимательным).

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

 

Описание алгоритма Дейкстры в диаграмме Насси-Шнейдермана представлено в приложении Б стр. 25

 

 

ПРОГРАММНАЯ РЕАЛИЗАЦИЯ

5.1 Описание структуры программы

 

Программа выводит минимальный путь между двумя указанными вершинами в графе и его длину.

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

Результатом программы является вывод на экран вершин, через которые проходит минимальный путь, а также вывод длины маршрута. Если пути между заданными точками не существует – выводится соответствующее сообщение.

Алгоритм использует три массива из N (= числу вершин сети) чисел каждый. Первый массив A содержит метки с двумя значения: 0 (вершина еще не рассмотрена) и 1 (вершина уже рассмотрена); второй массив B содержит расстояния - текущие кратчайшие рас- стояния от до соответствующей вершины; третий массив с содержит номера вершин - k-й элемент С[k] есть номер предпоследней вершины на текущем кратчайшем пути из Vi в Vk. Матрица расстояний D[i,k] задает длины дуге D[i,k]; если такой дуги нет, то D[i,k] присваивается большое число Б, равное "машинной бесконечности".


5.2 Описание использованных программных средств

Таблица 5.2.1–Описание переменных

Переменная Тип Описание
n int Количество точек (вершин) грифа
i,j int Счётчики
k int Номер кратчайшего пути и наименьшей длины пути
start int Номер начальной точки (вершины)
finish int Номер конечной точки (вершины)
A[i] boolean Массив, i-й элемент которого имеет значение false, когда i-й путь и расстояние временные, и принимает значение true, когда i-й путь и расстояние становятся постоянными
D[i,j] int Массив i-j элемент которого содержит расстояние между i-й и j-й точками (вершинами) Замечание: 1. D[i][i]=0 2. D[i,j]=D[j,i]
C[i] int Массив,который содержит номера вершин
path[80][11] char Массив строк, который содержит пути Замечание: После прохождения обработки по алгоритму Дейкстры p-й элемент массива содержит кратчайший путь.

 


ИНСТРУКЦИЯ ПОЛЬЗОВАТЕЛЯ

 

При запуске программы на экране появится окно с инструкциями. Выполняйте эти инструкции, а именно:

1. Введите номер начальной вершины.

2. Введите номер конечной вершины. На экран выводится матрица смежности, прочтенная из текстового файла

3. Чтоб завершить работу программы после получения результата нажмите Enter.

ЗАКЛЮЧЕНИЕ

 

Таким образом, в процессе создания данного проекта разработана программа, реализующая алгоритм Дейкстры в Turbo Pascal. Её недостатком является примитивный пользовательский интерфейс. Это связано с тем, что программа работает в консольном режиме, не добавляющем к сложности языка сложность программного оконного интерфейса

Также были углублены знания, полученные в процессе выполнения лабораторных работ по предмету «Программирование».


ЛИТЕРАТУРА

1. Е. А. Зуев. Программирование на языке Turbo Pascal 6.0, 7.0, М.:Веста,Радио и связь, 1993, — С.376

 

2. Кассера В. Ф. Turbo Pascal 7.0, Диасофт, 2003

 

3. Эллиот Б. Коффман. Turbo Pascal = Turbo Pascal Web Update — М.: Вильямс, 2005. — С. 896.

 

4. Моргун Александр Николаевич. Справочник по Turbo Pascal для студентов — М.: Диалектика, 2006. — С. 608

 

5. Нэйл Рубенкинг. Turbo Pascal для Windows = Turbo Pascal for Windows. Techniques and Utilites — М.: Мир, 1993. — С. 535.

 

6. Фаронов В. В. Turbo Pascal. Наиболее полное руководство. BHV-Санкт-Петербург, 2007

 


Приложение А

Текст программы

Program Alg_dejkstr;

Uses Crt;

Const MaxSize=8;

n=8;

Infinity=1000;

Var D: array [1..MaxSize, 1..MaxSize] of integer;

A: array [1..MaxSize] of boolean;

B,C: array [1..MaxSize] of integer;

Start, Finish, k, i: integer;

 

Procedure Init;

Var f: text;

i, j: integer;

Begin

Assign(f, 'INPUT.MTR');

Reset(f);

For i:=1 to n do

Begin

For j:=1 to n do

Read(f, D[i,j])

End;

For i:=1 to n do

begin

For j:=1 to n do

write(d[i,j]);

writeln

end;

Write('начальная вершина: '); Readln(Start);

For i:=1 to n do

Begin

A[i]:=False;

B[i]:=D[Start, i];

C[i]:=Start

End;

C[Start]:=0;

A[Start]:=True

End;

 

Function Possible: Boolean;

Var i: integer;

Begin

Possible:=True;

For i:=1 to n do If not A[i] then Exit;

Possible:=False

End;

 

Function Min: Integer;

Var i, minvalue, currentmin: integer;

Begin

Minvalue:=Infinity;

For i:=1 to n do

If not A[i] then

If B[i]<minvalue then

Begin

currentmin:=i;

minvalue:=B[i]

End;

min:=currentmin

End;

 

 

Begin

ClrScr;

Init;

While Possible do

Begin

k:=min;

A[k]:=True;

For i:=1 to n do

If B[i]>B[k]+D[i, k] then

Begin

B[i]:=B[k]+D[i, k];

C[i]:=k

End

End;

Write('конечная вершина: '); Readln(Finish);

Write(Finish);

Finish:=C[Finish];

While Finish<>0 do

Begin

Write('<-', Finish);

Finish:=C[Finish];

End;

ReadKey

End.

 

Массив расстояний, прочитанный из текстового файла имеет вид:

0 23 12 1000 1000 1000 1000 1000

23 0 25 1000 22 1000 1000 35

12 25 0 18 1000 1000 1000 1000

1000 1000 18 0 1000 20 1000 1000

1000 22 1000 1000 0 23 14 1000

1000 1000 1000 20 2 3 0 24 1000

1000 1000 1000 1000 14 24 0 16

1000 35 1000 1000 1000 1000 16 0

 


Приложение Б

 

Приложение В



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-06-26 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: