Трассировка: прокрути алгоритм руками
Трассировка алгоритма: таблица трассировки, ручное исполнение линейных программ, ветвлений и циклов, разбор частых ошибок и чек-лист для задач «что выведет программа».
«Что выведет программа?» — самый частый вопрос в задачах ОГЭ и ЕГЭ по алгоритмам. Компьютера на экзамене нет, поэтому исполнителем придётся поработать тебе. Умение вручную прокрутить алгоритм шаг за шагом называется трассировкой, и это, пожалуй, главный практический навык всего раздела.
Таблица трассировки
Держать значения переменных в голове — верный способ ошибиться. Вместо этого рисуют таблицу трассировки: столбцы — переменные (плюс столбец «вывод»), строки — шаги алгоритма. Выполняешь шаг — записываешь новые значения.
Правила простые:
- выполняй команды строго по порядку, не «угадывая» наперёд;
- после каждого присваивания обновляй ячейку таблицы;
- в ромбе честно вычисляй условие и записывай: да или нет;
- каждый виток цикла — отдельная строка таблицы.
Пример первый: разминка
Протрассируем короткий алгоритм:
a = 5
b = 2
a = a + b
b = a - b
print(a)
print(b)
| Шаг | a | b | Вывод |
|---|---|---|---|
| a = 5 | 5 | — | |
| b = 2 | 5 | 2 | |
| a = a + b | 7 | 2 | |
| b = a - b | 7 | 5 | |
| print(a) | 7 | 5 | 7 |
| print(b) | 7 | 5 | 5 |
Ключевой момент — шаг b = a - b: переменная a уже равна 7, а не 5! Берём всегда текущие значения. Теперь проверь себя на живой схеме — шагай по ней и сравнивай панель переменных со своей таблицей:
a = 5
b = 2
a = a + b
b = a - b
print(a)
print(b)
Пример второй: трассировка ветвления
В алгоритмах с ромбом важно честно вычислять условие и идти только по выбранной ветке. Что выведет этот алгоритм при a = 8?
a = 8
if a % 2 == 0:
a = a // 2
else:
a = a + 1
print(a)
Условие 8 % 2 == 0 истинно (8 чётное), значит срабатывает ветка «да»: a = 8 // 2 = 4. Ветка else не выполняется вовсе. Ответ: 4. А при a = 7 условие ложно — сработает a = 7 + 1 = 8. Один и тот же алгоритм, два разных пути.
Пример третий: трассировка цикла
С циклами таблица особенно полезна: одна строка на каждый виток. Что выведет этот алгоритм?
s = 0
for i in range(1, 5):
s = s + i * i
print(s)
Вспоминаем: range(1, 5) — это 1, 2, 3, 4 (без пятёрки!). Заполняем таблицу по виткам:
| Виток | i | i * i | s после шага |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 2 | 4 | 5 |
| 3 | 3 | 9 | 14 |
| 4 | 4 | 16 | 30 |
Ответ: 30. Сверь свой ход рассуждений с живой схемой:
s = 0
for i in range(1, 5):
s = s + i * i
print(s)
Самые частые ошибки в трассировке циклов: лишний или пропущенный виток из-за границ
rangeи невнимательность к тому, выполняется ли
Пример четвёртый: проверь себя
А теперь — самостоятельно. Возьми листок, нарисуй таблицу с колонками «x» и «x < 20?» и протрассируй алгоритм до того, как запустишь схему:
x = 1
while x < 20:
x = x * 2
print(x)
Записал ответ? Теперь шагай по схеме и проверяй. Подвох здесь в последнем витке: при x = 16 условие 16 < 20 ещё истинно, поэтому цикл успевает удвоить x до 32 — и только потом проверка даёт «нет». Выводится 32, а не 16. Если твоя таблица это поймала — отлично, ты трассируешь правильно.
Частые ошибки трассировки
- Старое значение вместо нового. В
b = a - bучаствует уже обновлённоеa, а не исходное. - Промах по границе цикла.
range(1, 5)— это 1..4, а не 1..5. Лишний или потерянный виток — самая частая ошибка. - Путаница «внутри/после».
printс отступом печатает на каждом витке, без отступа — один раз после цикла. - Невнимательность к последнему витку. Условие проверяется в начале витка — цикл может «проскочить» лишний раз.
Чек-лист «что выведет программа»
- Выпиши все переменные и нарисуй таблицу.
- Иди по шагам сверху вниз, в цикле — виток за витком, ничего не пропуская.
- В условиях подставляй текущие значения и вычисляй честно, без интуиции.
- Отмечай, что именно и в какой момент печатается.
- В конце перепроверь граничные случаи: первый и последний виток цикла.
Что мы узнали
- Трассировка — ручное исполнение алгоритма шаг за шагом.
- Таблица трассировки хранит значения переменных после каждого шага и спасает от ошибок «в уме».
- В присваиваниях всегда участвуют текущие значения переменных, а не исходные.
- В ветвлении вычисляй условие честно и иди только по выбранной ветке.
- В циклах каждая итерация — отдельная строка таблицы; особое внимание границам
rangeи последнему витку.