Трассировка: прокрути алгоритм руками

Трассировка алгоритма: таблица трассировки, ручное исполнение линейных программ, ветвлений и циклов, разбор частых ошибок и чек-лист для задач «что выведет программа».

«Что выведет программа?» — самый частый вопрос в задачах ОГЭ и ЕГЭ по алгоритмам. Компьютера на экзамене нет, поэтому исполнителем придётся поработать тебе. Умение вручную прокрутить алгоритм шаг за шагом называется трассировкой, и это, пожалуй, главный практический навык всего раздела.

Таблица трассировки

Держать значения переменных в голове — верный способ ошибиться. Вместо этого рисуют таблицу трассировки: столбцы — переменные (плюс столбец «вывод»), строки — шаги алгоритма. Выполняешь шаг — записываешь новые значения.

Правила простые:

  • выполняй команды строго по порядку, не «угадывая» наперёд;
  • после каждого присваивания обновляй ячейку таблицы;
  • в ромбе честно вычисляй условие и записывай: да или нет;
  • каждый виток цикла — отдельная строка таблицы.

Пример первый: разминка

Протрассируем короткий алгоритм:

a = 5
b = 2
a = a + b
b = a - b
print(a)
print(b)
ШагabВывод
a = 55
b = 252
a = a + b72
b = a - b75
print(a)757
print(b)755

Ключевой момент — шаг 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 (без пятёрки!). Заполняем таблицу по виткам:

Витокii * is после шага
1111
2245
33914
441630

Ответ: 30. Сверь свой ход рассуждений с живой схемой:

s = 0
for i in range(1, 5):
    s = s + i * i
print(s)

Самые частые ошибки в трассировке циклов: лишний или пропущенный виток из-за границ range и невнимательность к тому, выполняется ли print внутри цикла или после него. Смотри на отступы!

Пример четвёртый: проверь себя

А теперь — самостоятельно. Возьми листок, нарисуй таблицу с колонками «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 и последнему витку.
Проверьте себя
1. Что такое трассировка алгоритма?
AЗапуск программы на компьютере
BРучное исполнение алгоритма шаг за шагом
CПеревод схемы в код
DПоиск ошибок компилятором
2. В шаге b = a - b при a = 7, b = 2 какое значение a берётся?
AИсходное a = 5
BТекущее a = 7
CСреднее
DНоль
3. Зачем нужна таблица трассировки?
AЧтобы не держать значения в голове и не ошибиться
BЭто требование ГОСТа
CЧтобы программа работала быстрее
DБез неё схема не нарисуется
4. Сколько строк-витков даст for i in range(1, 5)?
A5
B4
C3
D6
5. Алгоритм: x = 1; while x < 20: x = x * 2. Что выведется?
A16
B20
C32
D10
Поддержать проект