Диаграмма Насси — Шнейдермана


Диаграмма Насси — Шнейдермана (англ. Nassi–Shneiderman diagram) — это тип диаграммы для отображения проектов программ в рамках метода структурного программирования. Она была разработана в 1972–1973 годах Айзеком Насси и Беном Шнейдерманом и формализована в стандарте DIN 66261.

Поскольку диаграммы Насси — Шнейдермана отображают программные структуры и управляющие структуры, их также называют структурограммами.

Использование

В структурном программировании общую задачу, которую предполагается решить данным алгоритмом, поэтапно разбивают на всё более мелкие подзадачи, — до тех пор, пока не останутся только элементарные базовые структуры: последовательности и управляющие структуры. Эти элементы могут быть наглядно представленны с помощью диаграммы Насси — Шнейдермана. Такой подход соответствует принципу процедурной декомпозиции, когда сначала разрабатывается общая концепция, которая далее уточняется посредством детального раскрытия её структур.

Бём и Якопини ещё в 1966 году доказали, что любой произвольный алгоритм можно выразить без использования безусловных переходов (GOTO). Для диаграмм Насси — Шнейдермана сопоставление управляющих структур современных языков программирования тривиально; для блок-схем это может быть гораздо сложнее.

Символы по Насси — Шнейдерману

Большинство приведённых ниже структурных блоков[1] могут быть вложены друг в друга. Составленная из разных структурных блоков структурограмма всегда имеет прямоугольную форму, её ширина соответствует самой широкой из вложенных структур.

Символ процесса

Последовательность

Каждая инструкция записывается в прямоугольный структурный блок. Блоки выполняются последовательно сверху вниз. Пустые структурные блоки допустимы только внутри ветвлений.

Альтернативные термины: последовательность, блок команд, линейное выполнение.

Символ условия

Альтернативные термины: ветвление, альтернатива, выбор.

Одна возможная ветвь

Условный выбор

Если условие истинно, выполняется блок инструкций 1 (if). Блок может содержать одну или несколько инструкций. Если условие ложно — выполнение переходит к выходу (снизу), без выполнения инструкций.

Альтернативные термины: условная обработка, простое ветвление.

Две возможные ветви

Двойной выбор

Если условие истинно, выполняется блок инструкций 1; если ложно — блок инструкций 2 (if then else). Блоки могут включать одну или несколько инструкций. После выполнения выбранного блока — выход снизу.

Альтернативные термины: двойной выбор, альтернативное ветвление.

Пример вложенности

Множественный выбор

Следует очередное условие. Вложенность допускается в случае отрицательного результата также.

Оператор выбора (Case)

NassiShneiderman-case.svg

Значение «Переменная» может проверяться на совпадение (Switch Case, как в Java), либо на принадлежность диапазону (больше/меньше для чисел). Выполняется соответствующий блок для совпавшего случая (switch, select). Любое ветвление по выбору можно выразить при необходимости с помощью вложенных условных операторов — например, если в программном языке нет прямой конструкции выбора.

Альтернативные термины: множественная альтернатива, выбор, case, select.

Циклы

Символ итерации

Цикл с управляющей переменной

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

Альтернативные термины: цикл с управляющей переменной.

Символ Begin-End

Цикл с двумя условиями

Такой вид цикла встречается, например, в PL/I и ALGOL, где используется две условия.

Альтернативные термины: цикл с проверкой условия, проверяемый цикл.

Особый случай: End=true

Цикл с предусловием

Цикл с предварительной проверкой условия (while).

Условие выполняется до тех пор, пока выражение истинно. Если ложно — выход из цикла.

Тело цикла (блок 1) выполняется только если и пока условие истинно. Такая схема также используется для счётных циклов (когда число проходов известно заранее).

Альтернативные термины: цикл с предусловием, проверяемый цикл, цикл с головой.

Особый случай: Begin=true

Цикл с постусловием

Цикл с проверкой условия после выполнения тела (loop).

Тело цикла (блок 1) выполняется минимум один раз, даже если условие изначально ложно.

Альтернативные термины: цикл с постусловием, цикл с хвостом, неотрицаемый цикл.

Особый случай: Begin=End=true

Бесконечный цикл

Структура повторения, которую можно прервать только специальной инструкцией (break). Нет проверки условия.

Инструкция запуска: while(true)

Прерывание: break

Альтернативные термины: бесконечный цикл, цикл без проверки условия.

Break

Выход (break)

Выход (break; также exit) обозначает завершение части программы. Его не следует путать с безусловным переходом (goto), использование которого структурограммы призваны исключать.

Альтернативные термины: инструкция прерывания, выход.

Вызов блока

Вызов подпрограммы

Символ вызова подпрограммы, процедуры, функции или метода. После выполнения происходит возврат к следующему структурному блоку. Символ не стандартизирован.

Символ параллельного выполнения

Параллельное выполнение

Символ для параллельного выполнения нескольких блоков.

Правила заполнения

Общие требования

Структурограммы не должны содержать синтаксис конкретных языков программирования. Формировать их нужно языконезависимо — так, чтобы логика была понятна и могла быть реализована на любом языке программирования.

Область объявления

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

Эксклюзивность

Каждая инструкция размещается в отдельном структурном блоке (см. символы по 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.

Ссылки