1 курс (ЭЖД) |
ЛЕКЦИЯ 4 ПОНЯТИЕ АЛГОРИТМА И ЕГО СВОЙСТВА. БЛОК-СХЕМА АЛГОРИТМА |
2 семестр |
Наверняка можно утверждать, что многие знакомы с термином "алгоритм". Его применяют весьма широко и не только в области вычислительной техники и программирования. Также несомненно и то, что у многих сформировалось свое (пусть даже большей частью интуитивное) понимание смысла этого термина.
Термин "алгоритм" происходит от имени средневекового математика Абу Джафара ибн Мусы аль-Хорезми. Редакция последней части имени ученого в европейских странах привела к образованию термина "алгорифм" или "алгоритм". Европейцы, начавшие осваивать современную десятичную систему счисления в XII в., знакомились с трудами арабских ученых, и труд упомянутого выше жителя Хорезма, посвященный правилам счета в десятичной системе счисления, был широко известен. Поэтому и наполнение термина "алгоритм" было следующим: операции над числами.
Через века старое, прежнее понимание этого термина стало утрачиваться, и данный термин стали применять по отношению к одному-единственному алгоритму – алгоритму Евклида, предназначенному для отыскания наибольшего общего делителя пары целых чисел.
4.1. Определение алгоритма
Современное содержание понятия алгоритма можно определить следующим образом.
Алгоритм– точное описание, которое задает алгоритмический процесс, начинающийся с произвольного исходного данного (из некоторой совокупности возможных для данного алгоритма исходных данных) и направленный на получение полностью определенного этим исходным данным результата.
Алгоритмический процесс– процесс последовательного преобразования конструктивных объектов (слов, чисел, пар слов, пар чисел, предложений и т. п.), происходящий дискретными "шагами". Каждый шаг состоит в смене одного конструктивного объекта другим.
Поскольку алгоритмы могут применяться к весьма произвольным объектам (числам, буквам, словам, графам, логическим выражениям и т. д.), в определении алгоритма используется специальный термин – "конструктивный объект", объединяющий в себе все эти возможные случаи. Так, в описанном ниже алгоритме под конструктивными объектами можно понимать тройки чисел.
4.2. Свойства алгоритма
Любой алгоритм должен обладать следующими свойствами:
дискретность (это означает, что, алгоритм представляет собой конечную последовательность отдельных шагов, каждый из которых определяет законченное действие);
детерминированность (это означает, что, каждый шаг алгоритма должен быть понятен исполнителю и не должен быть истолкован неоднозначно);
массовость (это означает, что алгоритм должен предназначаться для реализации целого класса однотипных задач, а не для одной конкретной задачи);
результативность (это означает, что алгоритм должен приводить к одному и тому же результату при одних и тех же исходных данных, за исключением, когда алгоритм частично или полностью основан на действиях с псевдослучайными числами, и при том за конечное время).
Для задания алгоритма необходимо описать следующие его элементы:
набор объектов, составляющих совокупность возможных исходных данных, промежуточных и конечных результатов;
правило начала;
правило непосредственной переработки информации (описание последовательности действий);
правило окончания;
правило извлечения результатов.
Алгоритм всегда рассчитан на конкретного исполнителя. В нашем случае таким исполнителем является ЭВМ. Для обеспечения возможности реализации на ЭВМ алгоритм должен быть описан на языке, понятном компьютеру, то есть на языке программирования.
4.3. Основные способы описания алгоритмов
К основным способам описания алгоритмов можно отнести следующие:
словесно-формульный (пошаговый);
структурный или блок-схемный;
с помощью граф-схем;
с помощью сетей Петри.
Перед составлением программ чаще всего используются словесно-формульный и блок-схемный способы.
Пошаговый (словесно-формульный) способ. Алгоритм записывается в виде текста с формулами по пунктам (шагам), определяющим последовательность действий. Каждый из шагов представляет собой вполне определенное законченное действие.
Пример описания алгоритма. Решение квадратных уравнений. Словесно-формульным способом алгоритм решения этой задачи может быть записан в следующем виде:
Шаг 1. Ввести три числа a,b,c.
Шаг 2. Вычислить дискриминант
Шаг 3. Проверить условие: если d<0, то идти на шаг 8, иначе идти на шаг 4.
Шаг 4. Вычислить 1-й корень
Шаг 5. Вычислить 2-й корень
Шаг 6. Вывести два числа x1,x2.
Шаг 7. Идти на шаг 9.
Шаг 8. Вывести текст "Уравнение не имеет действительных корней".
Шаг 9. Конец.
Блок-схема– это ориентированный граф, вершины которого могут быть одного из трех типов, представленных на рис. 6.1.
Функциональная вершинаиспользуется для представления функцииf:X→Y.
Предикатная вершинаиспользуется для представления функции (или предиката)p:X→(T,F), то есть логического выражения, передающего управление по одной из двух возможных ветвей.
S1
S2
|
S1 S2 S1 |
S1 |
Композиция (следование) |
Выбор (ветвление) |
Итерация (цикл) |
|
|
|
Рис. 4.1 |
Объединяющая вершинапредставляет передачу управления от одной из двух входящих ветвей к одной выходящей ветви.
Структурная блок-схема– это блок-схема, которая может быть выражена как композиция из четырех элементарных блок-схем (рис. 4.1).
Любая программа для машины может быть представлена структурной блок-схемой.
Важной особенностью приведенных выше структур является то, что они имеют один вход и один выход.
Структурное программирование– процесс разработки алгоритмов с помощью структурных блок-схем.
В более широком плане структурное программирование допускает большее разнообразие структур управления, чем предложенные четыре. Причиной для расширения множества структур является требование удобства и естественности.
Программирование сверху вниз – это процесс пошагового разбиения алгоритма на все более мелкие части с целью получения таких элементов, для которых можно написать конкретные команды. Структурное программирование сверху вниз – это процесс программирования сверху вниз, ограниченный использованием структурных блок-схем.
Структурное программирование является одной из технологий программирования, получившей наибольшее распространение. В нем наибольшее внимание уделяется этапу проектирования программы, при выполнении которого рекомендуется придерживаться следующих основных принципов, называемых принципами структурного программирования:
принцип модульности;
принцип нисходящей разработки программы;
сквозной структурный контроль;
принцип простой структуры программы.
Эти принципы, предложенные американскими специалистами в конце ХХ века, остаются актуальными и в наше время, особенно при разработке больших и сложных программных комплексов.