2. Элементарные алгоритмические структуры
Последовательная алгоритмическая структура
Всякий алгоритм имеет структуру. В программировании особое значение имеют три структуры алгоритма: последовательная, выбора и повторения.
Последовательной называется такая структура алгоритма, при которой его отдельные части (операторы) выполняются поочередно одна за другой. В качестве примера рассмотрим алгоритм заварки чая.
Начало
Вскипятить воду.
Ополоснуть чайник кипятком.
Положить туда чай.
Залить чайник кипятком.
Конец.
Очевидно, что результат выполнения алгоритма зависит от порядка следования его частей. Изменение этого порядка может плачевно сказаться на качестве чая.
В Паскале последовательный алгоритм реализован в виде составного оператора
Begin оператор; оператор; … оператор End
в Си составной оператор выглядит так:
{оператор оператор … оператор}
Алгоритмическая структура выбора
Хотя последовательная структура самая простая, а потому и самая привлекательная, далеко не все алгоритмы можно записать в виде простой последовательности операций. Пусть необходимо из двух чисел, A и B, выбрать большее и поместить его значение в переменную M. Алгоритм такого выбора можно записать так:
если A > B , то M = A , иначе M = B.
При выполнении алгоритма сначала вычисляется условие. Если условие истинно, выполняется оператор после слова "то", если условие ложно — оператор после слова "иначе".
Большинство языков программирования имеют специальную конструкцию для реализации алгоритма выбора — условный оператор. Например, в языке Си выбор числа будет выглядеть так:
if (A > B) M = A; else M = B;
в Паскале так:
if A > B then M := A else M := B.
Алгоритмическая структура повторения
Повторение определенных действий является необходимой частью большинства программ. Рассмотрим алгоритм утоления голода конфетами.
Пока хочется есть повторять съесть одну конфету.
Смысл этой алгоритмической структуры в том, что сначала проверяется условие и, если оно истинно, выполняется оператор, следующий за ключевым словом повторять. Затем снова проверяется условие и так далее, пока очередная проверка не установит, что условие ложно. На этом алгоритм заканчивается.
Для реализации повторений в алгоритмических языках служат операторы цикла.
В Паскале:
while хочется есть do
съесть одну конфету.
В Си:
while (хочется есть)
съесть одну конфету;
Комбинация структур
Три рассмотренные структуры служат своего рода контейнерами для размещения операторов, причем в качестве операторов могут выступать как элементарные операторы языка, так и алгоритмические структуры.
Покажем пример алгоритма, который вводит числа с клавиатуры и складывает их, пока не будет введено число 0. Накопленная сумма выводится на экран.
Начало
Занести в переменную сумму S число 0;
Ввести с клавиатуры число X;
Пока Х не равно 0 повторять
Начало
Добавить к сумме S значение Х;
Ввести с клавиатуры число X;
Конец;
Сумму S вывести на экран дисплея;
Алгоритм в целом является последовательностью, третий оператор последовательности — повторение, а в это повторение вложена еще одна последовательность. Все прочее в записи алгоритма следует отнести к элементарным операторам алгоритмического языка, в данном случае русского.
Отступы при записи алгоритма помогают понять, что куда вложено.
Операторные скобки начало и конец записывают одну под другой, чтобы легко было сопоставить открывающую скобку закрывающей.
Пошаговая детализация алгоритма
Теоретически доказано, что трех алгоритмических структур: последовательности, выбора и повторения достаточно, чтобы записать любой алгоритм, который способна выполнить ЭВМ. При этом каждый внутренний оператор любой структуры может быть элементарным оператором или одной из алгоритмических структур. Все это поможет нам ответить на мучительный вопрос, встающий перед каждым начинающим программистом: “С чего начать разработку алгоритма?”.
Во-первых, выбрать подходящую структуру для будущего алгоритма (последовательность, выбор или повторение).
Во-вторых, заняться внутренними операторами выбранной структуры так, как если бы они были самостоятельными алгоритмами, т.е. выбрать структуру, заняться внутренними операторами и т.д.
Углублять разработку следует до тех пор, пока внутренние операторы не окажутся элементарными операторами алгоритмического языка. Изложенный метод называется пошаговой детализацией алгоритма или разработкой алгоритма сверху вниз.
Разработка алгоритма вычисления Sin X
Перейдем от теории к практике и рассмотрим примеры разработки алгоритмов.
Задача. Ввести X и подсчитать значение функции Sin X по формуле
Решение.
Как правило, на верхнем уровне детализации алгоритм имеет вид последовательности операторов.
Начало
Ввести X;
Подсчитать сумму SinX;
Вывести сумму SinX на экран.
Конец
Первый и третий пункты алгоритма просты, а второй нуждается в детализации. Чтобы посчитать какую-то сумму, вначале очищают переменную, предназначенную для хранения суммы, а потом, при помощи конструкции повторения, накапливают в ней слагаемые. В данной задаче накопление слагаемых будем продолжать, пока очередное слагаемое не
станет достаточно маленьким, т.е. не перестанет заметно изменять сумму (можно математически доказать, что при любом X, начиная с некоторого слагаемого, они будут монотонно убывать).
Начало
Очистить переменную SinX = 0;
Получить первое слагаемое Piece = X;
Пока Piece > 0.0001 повторять
Начало
Прибавить очередное слагаемое к сумме SinX = SinX + Piece;
Вычислить следующее слагаемое Piece;
Конец
Конец
Остается уточнить, каким образом можно вычислить следующее слагаемое. Если присмотреться к формуле в условии задачи, то можно увидеть, что каждое следующее слагаемое получается из предыдущего путем умножения его на (-X*X) и деления на (i-1)*i, где i — число, стоящее под знаком факториала в знаменателе слагаемого. Для краткости назовем его номером слагаемого, хотя тогда слагаемые будут нумероваться только нечетными числами. С учетом такой нумерации слагаемых уточним последний алгоритм.
Начало
Очистить переменную SinX = 0;
Получить первое слагаемое Piece = X;
Установить номер первого слагаемого i = 1;
Пока Piece > 0.0001 повторять
Начало
Прибавить очередное слагаемое к сумме SinX = SinX+Piece;
Определить номер следующего слагаемого i = i+2;
Вычислить следующее слагаемое
Piece = Piece * ( - X * X) / (( i - 1) * i);
Конец
Конец
Окончательно алгоритм примет следующий вид:
Начало
Ввести X;
Очистить переменную SinX = 0;
Получить первое слагаемое Piece = X;
Установить номер первого слагаемого i = 1;
Пока Piece > 0.0001 повторять
Начало
Прибавить очередное слагаемое к сумме SinX = SinX+Piece;
Определить номер следующего слагаемого i = i+2;
Вычислить следующее слагаемое Piece = Piece * (-X*X) / ((i-1)*i);
Конец
Вывести сумму SinX на экран;
Конец.
0 комментариев