- •СОДЕРЖАНИЕ
- •Раздел 1. ОБЩИЕ СВЕДЕНИЯ О ПРОГРАММНОМ ОБЕСПЕЧЕНИИ
- •1.1. Принцип программного управления
- •1.2. Автоматическое выполнение команд программы
- •1.3. Этапы постановки и решения задачи на компьютере
- •1.4. Назначение и классификация языков программирования
- •1.4.1. Машинно-ориентированные языки
- •1.4.2. Машинно-независимые языки
- •1.5. Структура программного обеспечения
- •1.5.1. Системы программирования
- •1.5.2. Операционные системы
- •Раздел 2. ОСНОВЫ АЛГОРИТМИЗАЦИИ
- •2.1. Алгоритм и его свойства
- •2.2. Способы описания алгоритмов
- •2.2.1. Словесное описание
- •2.2.2. Графическое описание
- •2.2.3. Запись на алгоритмическом языке
- •2.3. Разновидности структур алгоритмов
- •2.3.1. Линейный вычислительный процесс
- •2.3.2. Разветвляющийся вычислительный процесс
- •2.3.3. Циклический вычислительный процесс
- •Раздел 3. СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ
- •3.1. Теория структурного программирования
- •3.2. Реализация структурного проектирования в современных языках программирования
- •3.3. Преобразование неструктурированных программ в структурированные
- •3.3.2. Метод введения переменной состояния
- •3.3.3. Метод булевого признака
- •3.4. Способы графического представления структурированных схем алгоритмов
- •3.4.1. Метод Дамке
- •3.4.2. Схемы Насси-Шнейдермана
- •Раздел 4. АЛГОРИТМИЧЕСКИЙ ЯЗЫК ПРОГРАММИРОВАНИЯ ПАСКАЛЬ
- •4.1. Общая характеристика языка Паскаль
- •4.2. Алфавит языка Паскаль
- •4.3. Основные понятия языка
- •4.3.1. Идентификаторы
- •4.3.2. Комментарии
- •4.4. Структура простейшей программы
- •4.5. Способы описания синтаксиса
- •4.5.2. Синтаксические диаграммы
- •Раздел 5. ОСНОВНЫЕ ТИПЫ ДАННЫХ
- •5.1. Классификация данных
- •5.2. Стандартные скалярные типы данных
- •5.2.1. Целочисленные типы
- •Формат
- •5.2.2. Вещественные типы
- •Функция
- •5.2.3. Символьный тип (тип Char)
- •5.2.4. Логический тип (тип Boolean)
- •Функция
- •5.3. Выражения
- •5.4. Оператор присваивания
- •Раздел 6. СТРУКТУРА ПРОГРАММЫ
- •6.1. Программный модуль
- •6.2. Раздел меток
- •6.3. Раздел констант
- •6.4. Раздел типов
- •6.5. Раздел переменных
- •6.6. Раздел операторов
- •Раздел 7. ОПЕРАТОРЫ
- •7.1. Составной оператор
- •7.2. Программирование линейных и разветвляющихся структур алгоритмов
- •7.2.1. Оператор перехода Goto
- •7.2.2. Условный оператор If
- •7.2.3. Оператор варианта (выбора) Case
- •7.2.4. Пустой оператор
- •7.3. Программирование циклических структур алгоритмов
- •7.3.1. Оператор цикла с параметром (оператор For)
- •7.3.2. Оператор цикла с постусловием
- •7.3.3. Оператор цикла с предусловием
- •7.3.4. Операторы Continue и Leave
- •Раздел 8. СТРУКТУРИРОВАНИЕ И ОФОРМЛЕНИЕ ПРОГРАММ
- •Раздел 9. ОПИСАННЫЕ СКАЛЯРНЫЕ ТИПЫ
- •9.1. Перечислимый скалярный тип
- •9.2. Тип диапазон
- •10.1. Массивы
- •10.1.1. Задание массивов
- •10.1.2. Действия над элементами массивов
- •10.1.3. Действия над массивами
- •10.1.4. Типизованные константы типа массив
- •10.2. Строковые данные
- •10.2.1. Строковые константы
- •10.2.2. Строковые переменные
- •10.2.3. Встроенные функции, определенные над данными типа String
- •ЛИТЕРАТУРА
R
Z
9
Рисунок 3.11 − Схема алгоритма после третьего шага преобразования Бома-Джакопини
Таким образом, с помощью четырех шагов преобразования доказано, что полученная в результате применения метода дублирования кодов схема алгоритма (см. рисунок 3.8) является структурированной.
Достоинством метода дублирования кодов является то, что его удобно использовать при нисходящем проектировании программ. Исходную задачу укрупненно можно представить в виде одного функционального блока, а затем ее постепенно разукрупнять через промежуточные схемы алгоритма к результирующей структурированной схеме. В применении к рассмотренному алгоритму рассмотрите схемы алгоритма (см. рисунок 3.9 – рисунок 3.11), соответствующие четырем шагам преобразования, в обратном порядке.
Недостатки метода дублирования кодов:
1)неприменимость к программам с циклами;
2)дополнительные затраты памяти для хранения дублируемых модулей. Поэтому метод используется, если дублируемые модули содержат
незначительное число операторов. Если модули велики, то вместо дублирования кодов необходимо использовать вызываемые подпрограммы с формальными параметрами.
3.3.2.Метод введения переменной состояния
Данный метод был впервые предложен Ашкрофтом и Манной.
57
Рассмотрим |
применение |
данного |
метода |
на |
примере |
неструктурированной программы, алгоритм которой схематично представляет |
|||||
рисунок 3.12. |
|
|
|
|
|
Данная схема не является структурированной, так как из цикла, |
|||||
состоящего из блоков 1 и 3, существует два выхода. Таким образом, нарушено |
|||||
условие «один вход – один выход», которому должны удовлетворять |
|||||
структурированные схемы. |
|
|
|
|
|
|
|
1 |
|
|
|
|
2 |
|
3 |
|
|
|
|
|
|
|
|
|
|
|
5 |
|
|
|
4 |
|
|
|
|
|
|
0 |
|
|
|
Рисунок 3.12 – Исходная схема неструктурированного алгоритма |
Процесс преобразования программы в структурированную состоит из следующей последовательности шагов.
1) Каждому блоку неструктурированной схемы приписывается номер. Обычно первому блоку присваивается 1, последнему – 0.
58
2)В программу вводится дополнительная переменная целого типа
(например, J), называемая переменной состояния.
3)Функциональные блоки исходной схемы заменяются блоками, выполняющими помимо основных функций преобразование переменной J: переменной J присваивается значение, равное номеру блока-приёмника в исходной схеме.
4)Аналогично преобразуются логические блоки. При этом, если в логическом блоке условие истинно, то это соответствует одному значению J, если ложно – другому.
5)Исходная схема перестраивается к виду, предложенному АшкрофтомМанной (рисунок 3.13).
На данной схеме блоки 1а – nа являются аналогами соответствующих блоков исходной схемы и, помимо этого, присваивают значение переменной J.
В результате преобразований Ашкрофта-Манны исходная неструктурированная схема рассматриваемого примера (см. рисунок 3.12) принимает структурированный вид, который представляет рисунок 3.14.
При выполнении алгоритма, реализованного по методу АшкрофтаМанны, переменная состояния J устанавливается в начальное значение, равное номеру первого блока непреобразованной схемы (как правило, это единица). Затем осуществляется последовательный опрос переменной J, начиная с нуля и заканчивая максимальным номером блока исходной схемы (в нашем примере он равен пяти). Выполняется тот блок исходной схемы, номер которого соответствует текущему значению J. Помимо этого в J заносится значение, равное номеру того блока исходной схемы, который должен выполняться за текущим блоком. Когда значение J станет равно нулю, выполняется последний блок непреобразованной схемы (блок с номером ноль) и осуществляется выход из алгоритма.
Полученная по методу Ашкрофта-Манны схема алгоритма является структурированной. Для доказательства этого достаточно последовательно преобразовать данную схему к одному функциональному блоку.
Шаг 1 преобразования.
Конструкции 1а, 3а и 4а представляют собой конструкции If-Then-Else с одним входом и одним выходом, конструкции 2а, 5а являются конструкциями следования (см. рисунок 3.14). Следовательно, они могут быть преобразованы к соответствующим функциональным блокам.
Данный шаг преобразований и все последующие шаги поясняет рисунок
3.15.
Следующие шаги преобразований необходимо проводить снизу вверх схемы (см. рисунок 3.15).
Шаг 2 преобразования.
Символ “Решение” с проверкой условия J = 5 и блок 5а представляют собой конструкцию If-Then-else (с одной ветвью) с одним входом и одним
59
выходом. Поэтому данный символ «решение» и блок 5а могут быть заменены |
||
функциональным блоком I (см. рисунок 3.15). |
||
J := 1 |
|
|
J=0 |
да |
0 |
|
||
нет |
|
|
J=1 |
да |
1a |
|
||
нет |
|
|
J=2 |
да |
2a |
|
||
нет |
|
|
J=n |
да |
na |
|
||
Рисунок 3.13 – Обобщенный вид схемы алгоритма, |
||
|
предложенный Ашкрофтом-Манной |
Вторая ветвь данного символа «Решение» может быть использована для повышения надежности программы и на данном рисунке не показана (данная ветвь обеспечивает возможность контроля непопадания значений J в диапазон
0 – n, где n – максимальный номер блока в исходной схеме).
По сути, без проверки условия J = 5 в алгоритме можно обойтись, перейдя на выполнение блока 5а по ветви «нет» проверки условия J = 4.
60
J := 1 |
|
|
|
J=0 |
да |
0 |
|
|
|
||
нет |
|
1а |
|
|
|
J := 2 |
|
|
да |
|
|
J=1 |
1 |
|
|
|
|
||
нет |
|
|
J := 3 |
|
|
2а |
|
J=2 |
да |
2 |
J := 4 |
|
|||
нет |
|
3а |
|
|
|
J := 1 |
|
|
|
|
|
J=3 |
да |
3 |
|
|
|
||
нет |
|
|
J := 5 |
|
|
|
|
|
|
4а |
J := 2 |
|
|
|
|
J=4 |
да |
4 |
|
|
|
||
нет |
|
|
J := 0 |
J=5 |
да |
5а |
J := 0 |
|
5 |
||
Рисунок 3.14 – Структурированная форма исходной схемы |
61
VII
J=1
VI
J=0 |
0 |
|
V
J=1 |
1а |
IV
J=2 |
2а |
III
J=3 |
3а |
II
J=4 |
4а |
I
J=5 |
5а |
Рисунок 3.15 – Шаги преобразований Бома-Джакопини для структурированной схемы
62
Шаг 3 преобразования.
Символ “Решение” с проверкой условия J = 4 и блоки I и 4а представляют собой конструкцию If-Then-Еlse с одним входом и одним выходом. Поэтому они заменяются функциональным блоком II (см. рисунок
3.15).
Шаг 4 преобразования.
Символ “Решение” с проверкой условия J = 3 и блоки II и 3а представляют собой конструкцию If-Then-Else с одним входом и одним выходом. Поэтому они заменяются функциональным блоком III (см. рисунок
3.15).
Шаг 5 преобразования.
Символ “решение” с проверкой условия J = 2 и блоки III и 2а представляют собой конструкцию If-Then-Else с одним входом и одним выходом. Поэтому они заменяются функциональным блоком IV (см. рисунок
3.15).
Шаг 6 преобразования.
Символ “решение” с проверкой условия J = 1 и блоки IV и 1а представляют собой конструкцию If-Then-Else с одним входом и одним выходом. Поэтому они заменяются функциональным блоком V (см. рисунок
3.15).
Шаг 7 преобразования.
Символ “решение” с проверкой условия J = 0 и блок V представляют собой конструкцию обобщенного цикла с одним входом и одним выходом. Поэтому они заменяются функциональным блоком VI (см. рисунок 3.15).
Шаг 8 преобразования.
Функциональный блок начальной установки J = 1, блок VI и блок 0 представляют собой конструкцию следования с одним входом и одним выходом. Поэтому они заменяются функциональным блоком VII (см. рисунок
3.15).
Таким образом, за восемь шагов преобразований Бома-Джакопини исходная схема, построенная по методу Ашкрофта-Манны, преобразована в один функциональный блок с одним входом и одним выходом. Это подтверждает, что она является структурированной.
Достоинства метода введения переменной состояния:
1)процесс преобразования программы отличается наглядностью и чёткостью;
2)любому блоку исходной схемы соответствует определённое состояние программы, что помогает выполнять тестирование и отладку программы;
63