“В МИР ИНФОРМАТИКИ” № 68
Семинар. Диаграммы Насси - Шнейдермана
Н.М. Тимофеева,
г. Обнинск Калужской обл.
Вы, конечно, знаете о графическом
способе записи алгоритма решения задачи — в виде
блок-схемы. Менее известен второй способ такого
представления алгоритма — диаграмма Насси –
Шнейдермана (ее также называют “диаграммой
Нэсси – Шнейдермана”, “N – S-диаграммой” или
“структурограммой”).
В своей статье “Краткая история
структурных блок-схем (диаграмм Насси –
Шнейдермана)” [1] один из авторов диаграммы Бен
Шнейдерман пишет: “Пленительная история и
эволюция структурных блок-схем (обычно
называемых диаграммами Насси – Шнейдермана, или
структурограммами) восходит к 1972 году”. Далее он
рассказывает, что впервые подумал о создании
своих способов записи алгоритмов во время
посещения лекции по структурному
программированию, когда еще учился в
магистратуре. Ему пришло в голову, что если
оператор GOTO1 не должен использоваться, то
так же не нужны и соединительные линии в старых
блок-схемах. Пятнадцать минут вычерчивания
привели к первым идеям по оформлению следования,
ветвления и циклов. Вместе с аспирантом Исааком
Насси, в то время более глубоко знавшим принципы
структурного программирования, они написали
статью “Технологии блок-схем для структурного
программирования” [2], в которой описали свои
идеи и представили новый вид графической записи
алгоритмов. Статья была опубликована в августе
1973 года.
С тех пор N – S-диаграммы широко
используются в ряде стран. Например, в Германии
их применение при документировании программ
обусловлено требованиями государственного
стандарта этой страны.
Очевидные преимущества N – S-диаграмм
заключаются в:
— наглядности;
— отсутствии соединительных линий со
стрелками, что помогает избежать случайных
ошибок;
— компактности, т.к. даже относительно
длинный алгоритм на языке N–S-диаграмм несложно
разместить на одной странице;
— простоте использования.
Диаграммы Насси – Шнейдермана
строятся с использованием шести элементарных
“строительных блоков”.
1. Блок действия
Как известно, алгоритм состоит из
последовательности действий. Блок действия
используется для представления отдельного
действия алгоритма:
Два действия представляют собой два
блока, следующих один за другим:
2. Блоки с разветвлением
Блок с разветвлением используется,
когда в алгоритме возможны два варианта
действий, а выбор того или иного варианта
действия зависит от некоторого условия:
Такая алгоритмическая конструкция
(ветвление) представляется двумя смежными
блоками действий; действие слева выполняется,
если условие верно, действие справа — если
условие неверно. Например:
Возможно также неполное ветвление, при
котором некоторое действие выполняется не
всегда, а только при определенном условии:
3. Блок множественного выбора
Блок множественного выбора
используется, когда существует несколько
вариантов возможных действий, выбор которых
зависит от значения некоторого выражения2:
Например, в задаче выбора разных видов
обуви для разных видов спорта:
4. Блок цикла с предусловием
Блок цикла с предусловием
используется тогда, когда должна быть
многократно выполнена некоторая
последовательность действий, причем перед
каждым выполнением проверяется некоторое
условие:
Действия, которые повторяются (так
называемое “тело цикла”), представлены
самостоятельным блоком внутри блока цикла с
предусловием. Например, для задачи: “Накачать
спущенную велосипедную шину”:
Так как условие проверяется перед
выполнением тела цикла, возможно, действия не
будут выполнены ни разу (если условие ложно в
самом начале, вы немедленно выходите из цикла).
Цикл с заданным количеством
повторений тела цикла (в языках программирования
его называют “цикл с параметром” или “цикл со
счетчиком” [3]) — это тоже цикл с предусловием.
Действия повторяются определенное количество
раз и отсчитываются перед каждым
выполнением. Например, разбить в миску шесть яиц:
Подсчет действий происходит в начале.
Так, если бы вы считали вслух, вы бы сказали
“один” перед тем, как разбить первое яйцо.
5. Блок цикла с постусловием
Блок цикла с постусловием
используется, когда в алгоритме действия должны
повторяться до наступления определенного
условия (условие проверяется после выполнения
действий):
Например, в задаче приготовления теста
для блинов:
Действия в цикле с постусловием всегда
выполняются хотя бы один раз, потому что проверка
осуществляется в конце цикла. Так, при
приготовлении теста для блинов немного молока
будет добавлено и размешано до того, как будет
проверена консистенция теста.
6. Блок подпрограммы
Блок подпрограммы используется в
случаях, когда некоторый процесс в алгоритме
слишком большой, чтобы изображать его на
диаграмме, или когда какие-то блоки действий
используются несколько раз в разных местах одной
и той же диаграммы. Например, для задачи стрижки
газона около дома диаграмма алгоритма ее решения
может быть оформлена так:
Диаграмма, иллюстрирующая действия в
подпрограмме, оформляется отдельно.
Подпрограмма “Очистить
травосборник”
Перечисленные блоки могут
произвольным образом вкладываться один в другой.
Проиллюстрируем сказанное на примере задачи:
“Найти наименьшее число в следующей
последовательности чисел: 51 25 35 79 13 26 65”.
Рассматривая приведенную
последовательность чисел, вы можете увидеть, что
13 — наименьшее число в ней, но как вы это
определили? Можете ли вы вывести общее правило
для определения наименьшего числа в любой
последовательности чисел? Есть хорошее
упражнение, которое вы можете выполнить с
товарищем, чтобы разобраться с этой задачей.
Напишите каждое число на карточке или
маленьком кусочке бумаги. Выкладывайте карточки
на стол перед вашим товарищем по одной и не
забывайте забирать карточку перед тем, как
выложите перед ним следующую, т.е. всякий раз ваш
товарищ видит только одну карточку.
В конце попросите вашего товарища
назвать наименьшее число. Затем сделайте это с
любой другой последовательностью чисел.
Обсудите с вашим товарищем, что он думал о каждой
выложенной карте.
Разработку алгоритма решения задачи и
соответствующей диаграммы будем проводить
методом, известным под названием
“Проектирование сверху вниз”, или “Пошаговая
детализация”. Идея метода очень проста — делим
всю задачу на маленькие части и затем
рассматриваем каждую часть и детализируем
(уточняем) ее до отдельных элементарных действий,
которые можно выполнить.
Так как вам придется делать много
изменений в ходе работы, стоит вооружиться
карандашом, линейкой и ластиком.
Итак, начнем.
1. Нулевой шаг детализации
2. Первый шаг детализации
Как вы нашли наименьшее число? Вы
просмотрели всю последовательность,
рассматривая каждое число и проверяя, не
наименьшее ли оно. Это повторяющееся действие —
значит, должен быть цикл. Какой? Так как
количество повторений известно, то может быть
применен цикл с параметром, в N – S-диаграммах
являющийся, как указывалось выше, циклом с
предусловием:
3. Второй шаг детализации
Так что же делать, чтобы понять, какое
наименьшее? Детализируем внутренний блок на
последней диаграмме. Вот что мы делаем, сравнивая
каждое число с наименьшим, найденным до сих пор:
если следующее число меньше, оно становится
наименьшим, в противном случае старое остается
наименьшим3.
4. Третий шаг детализации
Но как вы получили первое наименьшее
число? Простейший способ сделать это — принять
за наименьшее число первое число в
последовательности чисел:
Проверим работу этого алгоритма на
примере последовательности чисел: 51 25 35 79 13 26.
1. Установить в качестве наименьшего
первое число последовательности (51).
2. Конец последовательности? — Нет.
3. Следующее число — 25.
4. 25 < 51? — Да.
5. Устанавливаем в качестве
наименьшего число 25.
6. Конец последовательности? — Нет.
7. Следующее число — 35.
8. 35 < 25? — Нет.
9. Конец последовательности? — Нет.
10. Следующее число — 79.
11. 79 < 25? — Нет.
12. Конец последовательности? — Нет.
13. Следующее число — 13.
14. 13 < 25? — Да.
15. Устанавливаем в качестве
наименьшего число 13.
16. Конец последовательности? — Нет.
17. Следующее число — 26.
18. 26 < 13? — Нет.
19. Конец последовательности? Да.
Таким образом, наименьшее число в
последовательности равно 13.
Задание для самостоятельной работы
Разработайте диаграммы Насси –
Шнейдермана для алгоритмов решения следующих
задач.
1. Определить, является ли число А
делителем числа В.
2. Даны три целых числа. Определить,
сколько из них четных.
Примечание. Циклы не использовать.
3. В чемпионате по футболу команде за
выигрыш дается 3 очка, за проигрыш — 0, за ничью —
1. Известно количество очков, полученных командой
за игру. Определить словесный результат игры
(выигрыш, проигрыш или ничья).
Примечание. Три блока ветвления не
использовать.
4. Мастям игральных карт условно
присвоены следующие порядковые номера: масти
“пики” — 1, масти “трефы” — 2, масти “бубны” —
3, масти “червы” — 4. По заданному номеру масти m
(1 m 4) определить название
соответствующей масти.
Примечание. Блоки ветвления не
использовать.
5. Найти сумму 10 заданных целых чисел.
6. Даны n целых чисел. Определить,
сколько из них четных.
7. Известен рост каждого из 20 учеников
класса. Рост мальчиков условно задан
отрицательными числами. Определить средний рост
мальчиков и средний рост девочек.
8. Дано целое число. Если оно
положительное, то вычислить средний рост девочек
(см. задачу 7), в противном случае вычислить
средний рост мальчиков.
9. В задаче 7 выяснить, верно ли, что
средний рост мальчиков превышает средний рост
девочек более чем на 10 см.
Литература
1. Ben Shneiderman. A short history of structured flowcharts
(Nassi-Shneiderman Diagrams). / Draft, May 27, 2003.
2. Nassi I., Shneiderman B. Flowchart Techniques for
Structured Programming. / SIGPLAN Notices 8, 8 (August, 1973).
3. Школа программирования:
тематический выпуск газеты “В мир информатики”.
/ “Информатика”, 2005, № 11.
От редакции. Разработанные
диаграммы, пожалуйста, присылайте в редакцию.
Фамилии всех приславших будут опубликованы, а
лучшие ответы мы поощрим.
1 Оператор, использовавшийся в
первых языках программирования высокого уровня,
при выполнении которого управление передавалось
в другое место программы, отмеченное так
называемой “меткой”. — Ред.
2 Фрагмент “Иначе” и
соответствующий ему фрагмент “Действие n + 1”
в блоке может отсутствовать. — Ред.
3 Т.е. здесь может быть применен
неполный вариант блока ветвления (см. выше). —
Ред.
|