Основные алгоритмические конструкции
Алгоритм — это точная последовательность действий, приводящая к результату. В этой теме рассматриваются три основные конструкции: последовательное выполнение команд, выбор одного из вариантов и многократное повторение действий.
Что такое алгоритмическая конструкция
Алгоритмическая конструкция — это тип организации команд в алгоритме. Любая программа или блок-схема может состоять из трёх базовых конструкций либо их комбинации: линейной, разветвляющейся и циклической. Чтобы правильно решить задачу, сначала определяют, какие команды выполняются всегда, где происходит проверка условия и какие действия повторяются.
Линейный алгоритм — алгоритм, в котором команды выполняются последовательно, одна за другой, без пропусков и повторений.
Ветвление — конструкция, в которой дальнейшие действия зависят от истинности условия. В зависимости от результата проверки выполняется одна из ветвей.
Цикл — конструкция, в которой одна или несколько команд выполняются многократно.
Конструкции можно записывать текстом, псевдокодом, программой или блок-схемой. Для экзамена важно не только узнать конструкцию по внешнему виду, но и проследить изменение значений переменных.
Линейный алгоритм
В линейном алгоритме каждая команда выполняется ровно в тот момент, когда до неё доходит управление. Если команда присваивания записана как \(x := x + 3\), это означает: к текущему значению \(x\) прибавляют 3 и результат снова записывают в \(x\). Правая часть вычисляется до изменения переменной.
При решении линейных алгоритмов удобно составлять таблицу состояний переменных: после каждой команды записывают значения всех важных переменных. Это особенно полезно, если переменная используется и справа, и слева в одном присваивании.
1a := 4 2b := 3*a - 2 3a := a + b 4output(a)
Нельзя считать присваивание равенством, которое нужно преобразовывать как обычное математическое уравнение. Запись \(x:=x+1\) не противоречива: новое значение \(x\) на единицу больше старого.
Ветвление: проверка условия
Ветвление начинается с логического условия, например \(x>0\), \(a=b\) или \(n\bmod 2=0\). Условие имеет значение «истина» или «ложь». В полной форме выполняется одна ветвь при истинном условии, а другая — при ложном. В неполной форме действия указаны только для одного результата, обычно для истинного.
Операция \(\bmod\) обозначает остаток от деления. Например, \(17\bmod5=2\), а проверка \(n\bmod2=0\) определяет, является ли число \(n\) чётным. При нескольких условиях учитывают скобки и порядок логических операций: сначала выполняется отрицание, затем «И», затем «ИЛИ», если порядок не задан скобками.
Какое значение выведет алгоритм: \(x:=5\); если \(x>3\), то \(x:=2x\), иначе \(x:=x-1\)?
В заданиях часто требуется определить результат программы, количество выполненных команд или значение переменной после ветвления. Сначала вычислите условие, затем зачеркните невыполняемую ветвь и продолжайте разбор только по выбранному пути.
Если условие содержит неизвестную переменную, сначала найдите её значение по предыдущим командам. Нельзя выбирать ветвь «на глаз», сравнивая исходные данные вместо изменённых.
Циклы и тело цикла
Циклический алгоритм содержит повторение. Повторяемая последовательность команд называется телом цикла. Число повторений определяется условием или диапазоном изменения счётчика.
В цикле с параметром заранее известен набор значений счётчика. Например, при \(i\) от 1 до 5 тело обычно выполняется пять раз: для \(i=1,2,3,4,5\). В цикле с предусловием условие проверяется перед телом, поэтому тело может не выполниться ни разу. В цикле с постусловием тело выполняется хотя бы один раз, так как проверка происходит после него.
| Вид цикла | Когда проверяется условие | Минимальное число выполнений тела |
|---|---|---|
| С параметром | Значения счётчика задаются заранее | Зависит от диапазона |
| С предусловием | До выполнения тела | 0 |
| С постусловием | После выполнения тела | 1 |
Эта формула описывает накопление суммы: на каждом шаге к текущему значению \(S\) прибавляется очередной элемент \(a_i\). Перед началом накопления обычно записывают \(S:=0\). Для произведения начальное значение, как правило, равно 1.
Чтобы цикл завершился, его условие должно когда-нибудь стать ложным. В цикле со счётчиком переменная должна изменяться в направлении, которое приближает её к границе диапазона или к условию остановки.
Разобранный пример: сумма и условие в цикле
Рассмотрим алгоритм. Нужно определить значение переменной \(s\) после выполнения команд.
1s := 0 2for i := 1 to 5 do 3 if i mod 2 = 0 then 4 s := s + i 5 else 6 s := s + 2*i 7output(s)
Цикл проходит значения \(i\) от 1 до 5. На каждом шаге выбирается ветвь для чётного или нечётного \(i\).
Такой разбор можно оформить в таблице состояний. В строках указывают номер шага, значение \(i\), выбранную ветвь и новое значение \(s\).
| i | Проверка | Добавка | s после шага |
|---|---|---|---|
| 1 | нечётное | 2 | 2 |
| 2 | чётное | 2 | 4 |
| 3 | нечётное | 6 | 10 |
| 4 | чётное | 4 | 14 |
| 5 | нечётное | 10 | 24 |
Как решать задания на исполнение алгоритма
В задачах экзамена встречаются программы, блок-схемы и словесные описания. Их смысл одинаков, но запись может скрывать порядок действий. Для проверки используйте формальное исполнение алгоритма: выполняйте команды буквально, не добавляя действий, которых нет в тексте.
- Определите исходные значения переменных и условие окончания.
- Разделите команды на последовательные, условные и повторяющиеся.
- Для каждого шага запишите значения переменных в трассировке алгоритма.
- Перед выполнением ветви вычислите условие и выберите только нужный путь.
- В цикле отдельно посчитайте первое, промежуточное и последнее повторение.
- Проверьте, сколько раз выполнилось тело и какое значение получилось после последней команды.
Для доказательства правильности циклического решения используют инвариант цикла — утверждение, сохраняющее истинность после каждого повторения. В обычных экзаменационных задачах достаточно практической таблицы, но понимание инварианта помогает не потерять начальное значение суммы или счётчика.
Чаще всего путают старое и новое значение переменной, считают границу цикла невключённой, выполняют обе ветви вместо одной, забывают, что цикл с предусловием может не запуститься, или принимают остаток от деления за частное.
Линейная конструкция выполняет команды по порядку; ветвление выбирает путь; цикл повторяет тело. Сначала определяется структура алгоритма, затем выполняется пошаговый расчёт.
Как описывать алгоритм и проверять себя
Алгоритм можно представить несколькими способами: текстом, программным кодом, псевдокодом или схемой. О способах описания алгоритма полезно помнить при чтении нестандартной записи. Если условные обозначения схемы непонятны, сначала восстановите последовательность действий словами, а затем составьте таблицу значений.
График функции в таких задачах обычно не требуется. Важнее точность вычислений и понимание границ: входит ли конечное значение счётчика, проверяется ли условие до тела или после него, меняется ли переменная на каждом шаге.
Проверь себя
Главное
- Три базовые конструкции — последовательность, ветвление и цикл — могут объединяться в одном алгоритме.
- При присваивании сначала вычисляется правая часть, затем изменяется левая переменная.
- В ветвлении выполняется только одна выбранная ветвь; выбор делают после вычисления условия.
- В цикле нужно контролировать начальное значение, границы, изменение счётчика и число повторений тела.
- Для надёжного решения используйте пошаговую трассировку и таблицу состояний переменных.