Декомпозиция алгоритма

Под декомпозицией алгоритма понимают разложение его o6щeй алгоритмической схемы на вспомогательные алгоритмы (процедуры и функции) и головной алгоритм. Напомним, такая задача ставится перед студентом при выполнении курсовой или контрольной работы. Одним из условий, которое должно быть обязательно выполнено, является наличие в работе хотя бы одной процедуры или функции (кроме того, работа должна содержать текст описания всех процедур и головного алгоритма).

Метод, при помощи которого обычно выполняется декомпозиция, достаточно прост. Сначала вычленяют основные этапы предстоящей работы. Наиболее сложные этапы оформляет в процедуры или функции верхнего уровня. Затем, если необходимо, такие этапы делят на этапы более низкого уровня. Наиболее сложные из них также оформляют процедурами или функциями и т.д. Следуя методу "от сложного к простому", в конечном итоге достигают решения поставленной задачи.

Приведем пример декомпозиции для решения задачи сортировки массива. Эта задача была решена ранее в разд. 11.2.4 (рис. 11.7) без использования вспомогательных алгоритмов.

Решение задачи декомпозиции состоит из трех основных этапов: 1) ввода данных, 2) сортировки массива и 3) вывода отсортированного массива. Первый и третий этапы вследствие их простоты не нуждаются в дальнейшей декомпозиции, поэтому выполняются в головном алгоритме. Второй этап представляет достаточно сложный и самостоятельный фрагмент вычислений, поэтому его целесообразно выделить в отдельную процедуру, которой можно дать имя Sort.

Этап сортировки, в свои очередь, состоит из двух этапов: 1) установления необходимости сортировки и (N–1) – кратного прохода по массиву и 2) нахождения наименьшего элемента во фрагменте массива и перестановки этого элемента с начальным элементом фрагмента. Поскольку последний этап многократно повторяется при выполнении первого этапа, то его можно оформить в отдельную процедуру. Этой процедуре можно дать имя Tra (от английского transposition – перестановка).

Блок-схемы головного алгоритма, процедуры Sort и процедуры Тrа показаны на рис. 11.11-11.13 соответственно.

Рис. 11.11. Головной алгоритм Рис. 11.12. Процедура Sort

Рис. 11.13. Процедура Tra

 

Дадим краткое, описание взаимодействия этих алгоритмов в ходе решения задачи сортировки.

Выполнение начинается с головного алгоритма (рис. 11.11). В блоке 2 вводятся исходные данные, затем в блоке 3 выполняется сортировка массива. В блоке 4 отсортированный массив выводится, и алгоритм заканчивает работу.

Сортировка массива в блоке 3 головного алгоритма выполняется обращением к процедуре Sort, показанной на рис. 11.12. Переменные A и N являются фактическими параметрами, Переменные А и N, которые использованы в блок-схеме алгоритма Sort, является формальными параметрами.

При обращении к процедуре Sort на вход подаются параметры A и N. В результате в теле процедуры производится замена формального параметра R на фактический параметр A, аналогично формальный K заменяется на фактический N.

Далее в блоке 2 проверяется необходимость сортировки массива R. Затем, если такая необходимость будет установлена, в цикле 3-4 будет выполняется сортировка массива. При всяком значении счетчика цикла в его теле производится нахождение наименьшего элемента фрагмента и его перестановка с начальным элементом этого фрагмента. Эти операции выполняются отдельно с помощью процедуры Tra. Как видно из рис. 11.13, на вход процедуры Tra нужно подать имя массива (A), количество элементов (N) и номер элемента (i), которым начинается фрагмент. В теле процедуры в блоках 2-5 отыскивается наименьший элемент фрагмента (v) и его номер (k). Затем в блоке 6 выполняется вышеназванная перестановка элементов.

Таким образом, весь процесс управляется головным алгоритмом, который выполняет сортировку посредством обращения к вспомогательному алгоритму – процедуре Sort.

Тот, реализуя решение своей задачи, в своя очередь несколько раз вымывает еще более простой вспомогательный алгоритм процедуру Tra. В результате такого взаимодействия достигается решение задачи в целом.

В заключение приведем пример алгоритма-функции. Она похожа на процедуру, но в отличие от последней должна в теле алгоритма еще содержать команду присваивания результата имени функции, т.к. результат после вычислений сохранится в переменной, представленной именем функции.

Рассмотрим задачу вычисления факториала числа N! = 1.2.3...N. Результатом будет одно число, поэтому лучше алгоритм оформить в виде функции.

Ее блок-схема показана на рис. 11.14. Переменная К используется для накопления произведения и, поскольку 0! = 1 и1! = 1, то в блоке 2 ей сразу присваивается значение 1. Далее, если N>1, то в цикле, образованном блоками 4-5, накапливается искомое произведение и помещается в переменную К. В блоке 6 имя Fact функции получает значение вычисленного произведения из ячейки К. Для процедур действия, размещенного в блоке 6, не может быть, а для функций оно должно быть обязательно, поскольку иначе значение функции на выходе окажется неопределенным.

Рис. 11.14. Функция Fact

 

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

При этом оно может входить в состав выражений. В качестве фактических параметров могут быть использованы как переменные, константы, так и целые выражения. Важно только, чтобы фактический параметр был совместим по типу с формальным, который содержится в заголовке описания алгоритма.

Пример использования функции Fact показан на рис. 11.15. В операторе присваивания используется обращение к функции для N = 6. После передачи этого значения в алгоритм рис. 16 и вычислений внутри него результат будет сначала присвоен имени функции, т. е. переменной Fact, а затем в операторе присваивания - переменной L.

Рис. 11.15. Обращение к функции Fact

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: