ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 20.11.2019
Просмотров: 9480
Скачиваний: 184
В
качестве
примера
,
демонстрирующего
особенности
использования
команд
передачи
управления
для
организации
требуемого
типа
вычислительного
процесса
,
рассмотрим
программу
на
языке
Ассемблера
.
Пример
2.1 (
вариант
1).
Реализовать
на
языке
Ассемблера
подпрограмму
поиска
минимального
элемента
массива
а
(n).
На
рис
. 2.2
приведен
пример
неудачной
реализации
этой
подпрограммы
.
Стрелками
показаны
передачи
управления
.
Даже
с
комментариями
и
стрелками
понять
хорошо
известный
алгоритм
достаточно
сложно
.
После
того
,
как
в
60-
х
годах
XX
в
.
было
доказано
,
что
любой
сколь
угодно
сложный
алгоритм
можно
представить
с
использованием
трех
основных
управляющих
конструкций
,
в
языках
программирования
высокого
уровня
появились
управляющие
операторы
для
реализации
соответствующих
конструкций
.
Эти
три
конструкции
принято
считать
базовыми
.
К
ним
относят
конструкции
:
•
следование
-
обозначает
последовательное
выполнение
действий
(
рис
. 2.3,
а
);
•
ветвление
-
соответствует
выбору
одного
из
двух
вариантов
действий
(
рис
. 2.3,
б
);
цикл
-
пока
-
определяет
повторение
действий
,
пока
не
будет
нарушено
некоторое
условие
,
выполнение
которого
проверяется
в
начале
цикла
(
рис
. 2.3,
б
).

Помимо
базовых
,
процедурные
языки
программирования
высокого
уровня
обычно
используют
еще
три
конструкции
,
которые
можно
составить
из
базовых
:
•
выбор
-
обозначает
выбор
одного
варианта
из
нескольких
в
зависимости
от
значения
некоторой
величины
(
рис
. 2.4,
а
);
•
цикл
-do
-
обозначает
повторение
некоторых
действий
до
выполнения
заданного
условия
,
проверка
которого
осуществляется
после
выполнения
действий
в
цикле
(
рис
. 2.4,
б
);
•
цикл
с
заданным
числом
повторений
(
счетный
цикл
) -
обозначает
повторение
некоторых
действий
указанное
количество
раз
(
рис
. 2.4,
в
).
Любая
из
дополнительных
конструкций
легко
реализуется
через
базовые
.
Перечисленные
шесть
конструкций
были
положены
в
основу
структурного
программирования
.
Перечисленные
шесть
конструкций
были
положены
в
основу
структурного
программирования
.
Примечание
.
Слово
«
структурное
»
в
данном
названии
подчеркиваем
тот
факт
,
что
при
программировании
использованы
только
перечисленные
конструкции
(
структуры
).
Отсюда
и
понятие
«
программирование
без
go to».
Программы
,
написанные
с
использованием
только
структурных
операторов
передачи
управления
,
называют
структурными
,
чтобы
подчеркнуть
их
отличие
от
программ
,
при
проектировании
или
реализации
которых
использовались
низкоуровневые
способы
передачи
управления
.
Несмотря
на
то
,
что
Ассемблер
не
предусматривает
соответствующих
конструкций
,
«
структурно
»
можно
программировать
и
на
нем
.
Вернемся
к
примеру
2.1.
Пример
2.1 (
вариант
2).
Поскольку
реализуемый
цикл
по
типу
«
счетный
»
с
количеством
повторений
п
-1,
используем
соответствующую
команду
Ассемблера
.
Уберем
и
усложняющий
понимание
возврат
на
метку
less,
заменив
его
дубликатом
команды
сохранения
текущего
максимального
элемента
.
Полученный
в
результате
«
структурированный
»
вариант
программы
поиска
максимального
элемента
массива
приведен
на
рис
. 2.5.
Единственный
возврат
реализует
циклический
процесс
,
а
передача
управления
на
следующие
команды
-
ветвление
.
Представление
алгоритма
программы
в
виде
схемы
с
точки
зрения
структурного
программирования
имеет
два
недостатка
:
•
предполагает
слишком
низкий
уровень
детализации
,
что
часто
скрывает
суть
сложных
алгоритмов
;
•
позволяет
использовать
неструктурные
способы
передачи
управления
,
причем
часто
на
схеме
алгоритма
они
выглядят
проще
,
чем
эквивалентные
структурные
.
Классическим
примером
последнего
является
организация
поискового
цикла
с
использованием
неструктурной
передачи
управления
(
рис
. 2.6,
а
)
и
эквивалентный
структурный
вариант
(
рис
. 2.6,
б
).
Кроме
схем
,
для
описания
алгоритмов
можно
использовать
псевдокоды
, Flow-
формы
и
диаграммы
Насси
-
Шнейдермана
.
Все
перечисленные
нотации
с
одной
стороны
базируются
на
тех
же
основных
структурах
,
что
и
структурное
программирование
,
а
с
другой
-
допускают
разные
уровни
детализации
.
Псевдокоды
.
Псевдокод
-
формализованное
текстовое
описание
алгоритма
(
текстовая
нотация
).
В
литературе
были
предложены
несколько
вариантов
псевдокодов
.
Один
из
них
приведен
в
табл
. 2.4.

Описать
с
помощью
псевдокодов
неструктурный
алгоритм
невозможно
.
Использование
псевдокодов
изначально
ориентирует
проектировщика
только
на
структурные
способы
передачи
управления
,
а
потому
требует
более
тщательного
анализа
разрабатываемого
алгоритма
.
В
отличие
от
схем
алгоритмов
,
псевдокоды
не
ограничивают
степень
детализации
проектируемых
операций
.
Они
позволяют
соизмерять
степень
детализации
действия
с
уровнем
абстракции
,
на
котором
это
действие
рассматривают
,
и
хорошо
согласуются
с
основным
методом
структурного
программирования
-
методом
пошаговой
детализации
.
В
качестве
примера
посмотрим
,
как
будет
выглядеть
на
псевдокоде
описание
алгоритма
поискового
цикла
,
представленного
на
рис
. 2.6:
i: =1
Цикл
-
пока
i
≥
< n
и
A[i]
≠
у
i: =i+l
Все
-
цикл
Если
I
≥
n
то
Вывести
«
Элемент
найден
»
иначе
Вывести
«
Элемент
не
найден
»
Все
-
если
Flow-
формы
.
Flow-
формы
представляют
собой
графическую
нотацию
описания
структурных
алгоритмов
,
которая
иллюстрирует
вложенность
структур
.
Каждый
символ
Flow-
формы
соответствует
управляющей
структуре
и
изображается
в
виде
прямоугольника
.
Для
демонстрации
вложенности
структур
символ
Flow-
формы
может
быть
вписан
в
соответствующую
область
прямоугольника
любого
другого
символа
.
В
прямоугольниках
символов
содержится
текст
на
естественном
языке
или
в
математической
нотации
.
Размер
прямоугольника
определяется
длиной
вписанного
в
него
текста
и
размерами
вложенных
прямоугольников
.
Символы
Flow-
форм
,

соответствующие
основным
и
дополнительным
управляющим
конструкциям
,
приведены
на
рис
.
2.7.
На
рис
. 2.8
представлено
описание
рассмотренного
ранее
поискового
цикла
с
использованием
Flow-
формы
.
Хорошо
видны
вложенность
и
следование
конструкций
,
изображенных
прямоугольниками
.
Диаграммы
Насси
-
Шнейдермана
.
Диаграммы
Насси
-
Шнейдермана
являются
развитием
Flow-
форм
.
Основное
их
отличие
от
Flow-
форм
заключается
в
том
,
что
область
обозначения
условий
и
вариантов
ветвления
изображают
в
виде
треугольников
(
рис
. 2.9).
Такое
обозначение
обеспечивает
большую
наглядность
представления
алгоритма
.
Также
,
как
при
использовании
псевдокодов
,
описать
неструктурный
алгоритм
,
применяя
Flow-
формы
или
диаграммы
Насси
-
Шнейдермана
,
невозможно
(
для
неструктурных
передач
управления
в
этих
нотациях
просто
отсутствуют
условные
обозначения
).
В
то
же
время
,
являясь
графическими
,
эти
нотации
лучше
отображают
вложенность
конструкций
,
чем
псевдокоды
.
Общим
недостатком
Flow-
форм
и
диаграмм
Насси
-
Шнейдермана
является
сложность
построения
изображений
символов
,
что
усложняет
практическое
применение
этих
нотаций
для
описания
больших
алгоритмов
.