Диаграмма Насси — Шнейдермана
Диаграмма Насси — Шнейдермана (англ. Nassi–Shneiderman diagram) — это тип диаграммы для отображения проектов программ в рамках метода структурного программирования. Она была разработана в 1972–1973 годах Айзеком Насси и Беном Шнейдерманом и формализована в стандарте DIN 66261.
Поскольку диаграммы Насси — Шнейдермана отображают программные структуры и управляющие структуры, их также называют структурограммами.
Использование
В структурном программировании общую задачу, которую предполагается решить данным алгоритмом, поэтапно разбивают на всё более мелкие подзадачи, — до тех пор, пока не останутся только элементарные базовые структуры: последовательности и управляющие структуры. Эти элементы могут быть наглядно представленны с помощью диаграммы Насси — Шнейдермана. Такой подход соответствует принципу процедурной декомпозиции, когда сначала разрабатывается общая концепция, которая далее уточняется посредством детального раскрытия её структур.
Бём и Якопини ещё в 1966 году доказали, что любой произвольный алгоритм можно выразить без использования безусловных переходов (GOTO). Для диаграмм Насси — Шнейдермана сопоставление управляющих структур современных языков программирования тривиально; для блок-схем это может быть гораздо сложнее.
Символы по Насси — Шнейдерману
Большинство приведённых ниже структурных блоков[1] могут быть вложены друг в друга. Составленная из разных структурных блоков структурограмма всегда имеет прямоугольную форму, её ширина соответствует самой широкой из вложенных структур.
|
Каждая инструкция записывается в прямоугольный структурный блок. Блоки выполняются последовательно сверху вниз. Пустые структурные блоки допустимы только внутри ветвлений. Альтернативные термины: последовательность, блок команд, линейное выполнение. |
Альтернативные термины: ветвление, альтернатива, выбор.
|
Если условие истинно, выполняется блок инструкций 1 ( Альтернативные термины: условная обработка, простое ветвление. |
|
Если условие истинно, выполняется блок инструкций 1; если ложно — блок инструкций 2 ( Альтернативные термины: двойной выбор, альтернативное ветвление. |
|
Следует очередное условие. Вложенность допускается в случае отрицательного результата также. |
|
Структура повторения с заведомо определённым числом проходов ( Альтернативные термины: цикл с управляющей переменной. |
|
Такой вид цикла встречается, например, в PL/I и ALGOL, где используется две условия. Альтернативные термины: цикл с проверкой условия, проверяемый цикл. |
|
Цикл с предварительной проверкой условия ( Условие выполняется до тех пор, пока выражение истинно. Если ложно — выход из цикла. Тело цикла (блок 1) выполняется только если и пока условие истинно. Такая схема также используется для счётных циклов (когда число проходов известно заранее). Альтернативные термины: цикл с предусловием, проверяемый цикл, цикл с головой. | |
|
Цикл с проверкой условия после выполнения тела ( Тело цикла (блок 1) выполняется минимум один раз, даже если условие изначально ложно. Альтернативные термины: цикл с постусловием, цикл с хвостом, неотрицаемый цикл. |
|
Структура повторения, которую можно прервать только специальной инструкцией ( Инструкция запуска: Прерывание: Альтернативные термины: бесконечный цикл, цикл без проверки условия. |
|
Выход ( Альтернативные термины: инструкция прерывания, выход. |
|
Символ вызова подпрограммы, процедуры, функции или метода. После выполнения происходит возврат к следующему структурному блоку. Символ не стандартизирован. |
|
Символ для параллельного выполнения нескольких блоков. |
Правила заполнения
Структурограммы не должны содержать синтаксис конкретных языков программирования. Формировать их нужно языконезависимо — так, чтобы логика была понятна и могла быть реализована на любом языке программирования.
Так как изначально структурограммы были предназначены для процедурных языков программирования, в них отражалась только процедура, но не объявление переменных и констант (простые структурограммы). Поэтому по виду схемы не очевидно, к каким типам относятся переменные. В расширённых структурограммах объявления переменных и констант размещают в первом структурном блоке.
Каждая инструкция размещается в отдельном структурном блоке (см. символы по DIN 66261). Даже несколько схожих инструкций не должны объединяться в один блок.
Каждая инструкция должна состоять, как минимум, из одной операции присваивания (например, переменная ← переменная × другая переменная). Присваивание изображается стрелкой влево. В более старых схемах (например, по аналогии с Паскаль) символ присваивания представлялся как «:=». Слева от символа присваивания всегда стоит целевая переменная, справа — значение.
У каждой схемы обязательно должен быть заголовок (имя), чтобы можно было обращаться к ней по событию или вызову (под)программы.
Практическое значение
В современной разработке программного обеспечения диаграммы Насси — Шнейдермана используются довольно редко. Преимущественно применяются расширенные блок-схемы (или диаграммы активности UML).
В преподавании информатики на второй ступени средней школы структурограммы применяют для обучения построению логики программ. Построение схем по условиям типовых задач, которые автоматизируют повторяющиеся действия, входит в экзамены по информатике во многих школах до сих пор.
В среде разработки EasyCODE программный поток определяется непосредственно по схемам Насси — Шнейдермана.
Диаграммы Насси — Шнейдермана могут также использоваться в технической документации[2].
Язык программирования Scratch визуально представляет конструкции программ в виде структурограмм.
Примеры диаграмм
В приведённом примере показан евклидов алгоритм для вычисления наибольшего общего делителя двух целых чисел.
| В виде диаграммы Насси — Шнейдермана … | … и на Python: |
|---|---|
def GCD(a, b):
while a > 0 and b > 0:
if a > b:
a -= b
else:
b -= a
if b == 0:
return a
else:
return b
|
В виде диаграммы Насси — Шнейдермана …
… и реализация на VBA:
Option Explicit
Private Sub btnZensur_Click()
Dim intZensur As Integer, strZensur As String
intZensur = InputBox("Введите оценку (число).")
Select Case intZensur
Case 1: strZensur = "отлично"
Case 2: strZensur = "хорошо"
Case 3: strZensur = "удовлетворительно"
Case 4: strZensur = "достаточно"
Case 5: strZensur = "неудовлетворительно"
Case 6: strZensur = "очень плохо"
Case Else: strZensur = "неверно"
End Select
MsgBox "Ваша оценка словами: " & strZensur
End Sub
Свободные редакторы структурограмм
- Struktog. — редактор структурограмм, разработан кафедрой дидактики информатики ТУ Дрездена (DDI)[3]
- sbide — Javascript-редактор структурограмм с генерацией кода на C и симулятором визуализации программы[4]
- Structorizer — открытый редактор структурограмм для Windows/Linux/Mac[5]
- Struktograf[6]
- Struktogrammer[7]
- редактор структурограмм (whiledo)[8]
- Hamster-Struktogrammeditor (HaSE) — дополнение к Hamster-Simulator для модели «Java-Hamster»[9].
Примечания
Литература
- Weiss, Edmond H. Visualizing a Procedure with Nassi-Schneiderman Charts. Journal of Technical Writing and Communication, т. 20, № 3 (1990): 237–254.
Ссылки
- Литература в Немецкой национальной библиотеке
- DIN 66261: Символы для структурограмм по Насси — Шнейдерману. Университет прикладных наук Билефельд. Дата обращения: 14 июня 2024. Архивировано 28 сентября 2007 года.
- Создание структурограмм — сайт с обучающими видео по работе с редактором Struktogrammer
- Struktogramme.pdf — чтение, понимание и разработка структурограмм














