Задание 6: что выведет программа — трассировка кода
Учимся «прокручивать» код в голове и точно предсказывать вывод — это задание №6.
Трассировка — это пошаговое выполнение программы с записью значений всех переменных после каждого шага.
Что проверяет задание 6
Дают короткую программу (на школьном алгоязыке или Python) с присваиваниями, циклом и/или условием. Спрашивают, что она выведет, либо при каком вводе вывод будет таким-то. Ключевой навык — аккуратно вести таблицу трассировки, не теряя ни одного шага.
Линейный код
Начнём с простого — последовательность присваиваний:
a = 5
b = 3
a = a + b # a стало 8
b = a - b # b стало 5
print(a, b)
Вывод:
8 5
Главное — помнить, что = это не равенство, а присваивание: сначала вычисляется правая часть со старыми значениями, потом результат записывается в левую переменную.
Таблица трассировки для цикла
Самый частый сюжет — цикл, накапливающий сумму или произведение. Ведём таблицу: строка на каждый виток, столбцы — переменные.
s = 0
n = 1
while n <= 5:
s = s + n
n = n + 1
print(s)
Вывод:
15
Распишем по шагам, как это делается на черновике:
| n | 1 | 2 | 3 | 4 | 5 | 6 (выход) |
| s после шага | 1 | 3 | 6 | 10 | 15 | 15 |
Когда n становится 6, условие n ≤ 5 ложно — цикл завершается, и печатается накопленная сумма 15 (это 1+2+3+4+5).
Цикл с условием внутри
Сложнее, когда внутри цикла есть if. Тогда в таблицу добавляют столбец «выполнилось ли условие».
count = 0
for x in [4, 7, 10, 3, 12, 5]:
if x % 2 == 0: # только чётные
count = count + 1
print("Чётных чисел:", count)
Вывод:
Чётных чисел: 3
Чётные здесь — 4, 10, 12, их три. Каждый раз проверяем условие и увеличиваем счётчик только при истине.
Вложенные циклы
Если цикл внутри цикла, внутренний прокручивается полностью на каждый шаг внешнего. Считайте общее число «срабатываний» как произведение.
total = 0
for i in range(1, 4): # i = 1, 2, 3
for j in range(1, 4): # j = 1, 2, 3
total = total + 1
print("Итераций:", total)
Вывод:
Итераций: 9
Внешний цикл — 3 шага, на каждом внутренний делает 3 шага, итого 3·3 = 9.
Цикл с накоплением произведения
Не всегда копят сумму — иногда произведение (например, считают факториал). Важное отличие: переменную-«копилку» для произведения начинают с 1, а не с 0 (иначе всё умножится на ноль и обнулится).
p = 1
k = 1
while k <= 4:
p = p * k
k = k + 1
print(p)
Вывод:
24
Здесь считается 1·2·3·4 = 24. Если бы мы начали p = 0, ответ был бы 0 — типичная ловушка. Запомните: сумма стартует с 0, произведение — с 1.
Разбор «экзаменационного» примера
Соберём вместе цикл и условие — именно так выглядит реальное задание 6. Что выведет программа?
s = 0
n = 0
for x in [3, 8, 15, 6, 21, 4]:
if x % 3 == 0: # кратно 3
s = s + x
n = n + 1
print(s, n)
Вывод:
45 4
Проследим по таблице, отмечая, сработало ли условие x % 3 == 0:
| x | 3 | 8 | 15 | 6 | 21 | 4 |
| кратно 3? | да | нет | да | да | да | нет |
| s | 3 | 3 | 18 | 24 | 45 | 45 |
| n | 1 | 1 | 2 | 3 | 4 | 4 |
Кратные 3 — это 3, 15, 6, 21: их сумма 45 и количество 4. Числа 8 и 4 условие не прошли, поэтому копилки на них не менялись. Такая таблица — самый надёжный способ не ошибиться: каждое число обрабатываем по очереди и фиксируем состояние всех переменных.
Типичные ошибки
- Считают
=равенством и «решают уравнение» вместо присваивания. - Ошибаются на единицу в границах цикла (
≤против<). - Забывают про последний/первый виток цикла.
- В
ifвнутри цикла применяют действие ко всем элементам, а не только к подходящим. - Начинают копилку произведения с 0 — и получают 0.
Итог
- Ведите таблицу трассировки: строка на виток, столбцы — переменные.
=— присваивание: правая часть считается по старым значениям.- Следите за границами цикла и условиями внутри него.
- Вложенные циклы перемножают число итераций.