Задание 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

Распишем по шагам, как это делается на черновике:

n123456 (выход)
s после шага136101515

Когда 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:

x38156214
кратно 3?данетдададанет
s3318244545
n112344

Кратные 3 — это 3, 15, 6, 21: их сумма 45 и количество 4. Числа 8 и 4 условие не прошли, поэтому копилки на них не менялись. Такая таблица — самый надёжный способ не ошибиться: каждое число обрабатываем по очереди и фиксируем состояние всех переменных.

Типичные ошибки

  • Считают = равенством и «решают уравнение» вместо присваивания.
  • Ошибаются на единицу в границах цикла ( против <).
  • Забывают про последний/первый виток цикла.
  • В if внутри цикла применяют действие ко всем элементам, а не только к подходящим.
  • Начинают копилку произведения с 0 — и получают 0.

Итог

  • Ведите таблицу трассировки: строка на виток, столбцы — переменные.
  • = — присваивание: правая часть считается по старым значениям.
  • Следите за границами цикла и условиями внутри него.
  • Вложенные циклы перемножают число итераций.
Проверьте себя
1. Что означает строка a = a + 1?
AПроверку равенства a и a+1
BУвеличение значения a на 1
CОшибку, так не бывает
DСравнение переменных
2. Сколько раз выполнится тело цикла «while n <= 4» при n от 1 с шагом 1?
A3 раза
B4 раза
C5 раз
DБесконечно
3. Сколько итераций сделают вложенные циклы for i in range(2) и for j in range(3)?
A5
B6
C2
D3
4. Зачем при трассировке вести таблицу значений переменных?
AЧтобы было красиво
BЧтобы не потерять шаги и не ошибиться в значениях
CЭто требование оболочки
DЧтобы ускорить программу
Поддержать проект