Тема 6

Программирование алгоритмов на языке программирования Python

Что проверяют по спецификации:

Алгоритм, его свойства и блок-схемыПеременные, типы данных, ввод и выводАрифметические операции, приоритет и преобразование типовВетвление: if, elif, else; логические операцииЦикл while и обработка цифр числаЦикл for, функция range, break, continue, elseТиповые алгоритмы, вложенные циклы и трассировкаСписки (одномерные массивы) и двумерные списки (матрицы)

Суть за минуту

Это главная тема ЕНТ по информатике: почти в каждом варианте есть задания «что выведет программа», «сколько раз выполнится цикл», «какое значение примет переменная». Тема начинается с понятия алгоритма, его свойств и блок-схем, а затем переходит к языку Python 3: переменные и типы данных, ввод и вывод, арифметика с операциями //, % и **, условия if/elif/else, циклы while и for с range, break и continue. Отдельный блок — типовые алгоритмы: счётчик, сумматор, поиск максимума и минимума, разбор числа на цифры. Завершают тему списки (одномерные массивы) и двумерные списки (матрицы). Главный навык — аккуратная трассировка: выполнять программу «в уме» строка за строкой, записывая значения переменных в таблицу.

Объясняем просто

Программа — это рецепт для очень послушного, но совсем не догадливого повара: он делает ровно то, что написано, строго по шагам, и ничего не додумывает.

Переменная — подписанная коробка

x = 5 — положили в коробку с надписью x число 5. x = x + 1 — достали 5, прибавили 1, положили обратно 6. Старое значение при этом пропадает.

Условие — развилка на дороге

if спрашивает «да или нет?». Если да — идём по одной ветке, если нет — по ветке else. Выполняется только одна ветка.

Цикл — «повтори N раз»

for i in range(5) — повтори 5 раз, i пробегает 0, 1, 2, 3, 4. while — «повторяй, пока условие верно», как «мешай, пока сахар не растворится».

Список — ряд пронумерованных шкафчиков

В a = [7, 2, 9] шкафчики пронумерованы с нуля: a[0] = 7, a[1] = 2, a[2] = 9. Номер с конца: a[-1] = 9.

Главные формулы

a=b⋅(a // b)+a % ba = b \cdot (a\,//\,b) + a\,\%\,b
Связь целой части и остатка. В Python остаток всегда имеет знак делителя: −17 // 5=−4-17\,//\,5=-4, −17 % 5=3-17\,\%\,5=3, ведь 5⋅(−4)+3=−175\cdot(-4)+3=-17.
N=⌈b−ak⌉N=\left\lceil \dfrac{b-a}{k} \right\rceil
Сколько чисел даёт range(a, b, k) при k>0k>0 и b>ab>a (иначе 0). Например, range(3, 20, 4): ⌈17/4⌉=5\lceil 17/4 \rceil = 5 чисел (3, 7, 11, 15, 19). Для k<0k<0: N=⌈(a−b)/∣k∣⌉N=\lceil (a-b)/|k| \rceil при a>ba>b.
d=n % 10,n=n // 10d = n\,\%\,10,\quad n = n\,//\,10
Последняя цифра числа и «отрезание» последней цифры. Повторяя это в цикле while n > 0, перебираем все цифры справа налево.
r=r⋅10+dr = r\cdot 10 + d
Приписать цифру d справа к числу r — так строится число, записанное наоборот (реверс).
N=N1⋅N2N = N_{1}\cdot N_{2}
Если внешний цикл выполняется N1N_1 раз, а внутренний (независимый от внешнего) — N2N_2 раз, тело внутреннего выполнится N1⋅N2N_1\cdot N_2 раз.
a[−k]=a[len(a)−k]a[-k]=a[\text{len}(a)-k]
Отрицательный индекс отсчитывается с конца: a[-1] — последний элемент. В матрице n×n главная диагональ: i=ji=j, побочная: i+j=n−1i+j=n-1.

Понятия и термины

Алгоритм
Конечная последовательность точных команд исполнителю, приводящая от исходных данных к результату.
Блок-схема
Набор специальных фигур, на котором процесс, система или алгоритм представлены в графическом виде (овал — начало/конец, параллелограмм — ввод/вывод, прямоугольник — действие, ромб — условие).
Переменная
Ячейка памяти, которая имеет два атрибута: имя и значение.
Тип данных
Множество допустимых значений и операций над ними: int — целые, float — вещественные, str — строки, bool — логические (True/False).
Условный оператор
Важнейшая структура программы, обеспечивающая выполнение одного действия из нескольких последовательностей действий в зависимости от условий (в Python: if, elif, else).
Цикл
Фрагмент программы для многократного выполнения какого-либо кода при условии, что условие является истинным.
while (пока)
Оператор цикла с предусловием: условие проверяется перед каждым повторением, и тело выполняется, пока оно истинно.
Массив (список)
Совокупность переменных, содержащих данные одного типа, объединённых общим именем; доступ к элементу — по индексу. В Python массив реализуется списком list.
Индекс
Номер элемента в списке или строке; в Python нумерация начинается с 0, отрицательные индексы считаются с конца.
Трассировка
Пошаговое выполнение алгоритма вручную с записью значений всех переменных в таблицу после каждой команды.

Разбор темы

Алгоритм, его свойства и блок-схемы 5–8 класс

Алгоритм — это конечная последовательность точных команд, выполнение которых приводит к результату. Исполнитель (человек, робот, компьютер) выполняет команды формально, не задумываясь об их смысле.

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

Способы записи алгоритма: словесный (на естественном языке), графический (блок-схема), на псевдокоде, на языке программирования (программа).

Фигуры блок-схемы: овал (скруглённый прямоугольник) — «Начало» и «Конец»; параллелограмм — ввод и вывод данных; прямоугольник — действие (вычисление, присваивание); ромб — проверка условия, из него выходят две стрелки «да» и «нет»; шестиугольник — заголовок цикла с параметром (цикл for); прямоугольник с двойными боковыми линиями — вызов подпрограммы.

Базовые алгоритмические структуры: линейная (следование) — команды выполняются одна за другой; ветвление — выбор одного из путей по условию (в блок-схеме ромб, пути потом сходятся); цикл — повторение действий (в блок-схеме стрелка возвращается назад к условию). Любой алгоритм строится из этих трёх структур.

Переменные, типы данных, ввод и вывод 6 класс

Переменная создаётся присваиванием: x = 5. Знак = означает «положить значение справа в переменную слева», а не равенство. Запись x = x + 1 увеличивает x на 1 (кратко: x += 1). Имена: латинские буквы, цифры и _, не начинаются с цифры, регистр важен (A и a — разные переменные), нельзя использовать служебные слова (if, for, while...).

Основные типы: int — целые числа (5, -12, 0), float — вещественные (3.14, 2.0, 1e3), str — строки в кавычках ('hi', "5"), bool — логические True и False. Узнать тип: type(x). Python сам определяет тип по значению (динамическая типизация).

Множественное присваивание: a, b = 3, 7. Обмен значений без третьей переменной: a, b = b, a. Классический способ с третьей переменной: t = a; a = b; b = t.

Ввод: input() всегда возвращает строку. Поэтому для чисел: n = int(input()), x = float(input()). Несколько чисел в одной строке: a, b = map(int, input().split()).

Вывод: print(a, b, c) печатает значения через пробел и переходит на новую строку. Параметр sep задаёт разделитель между значениями, end — что печатается в конце (по умолчанию перенос строки '\n').

print(1, 2, 3, sep='-')        # 1-2-3
print('a', end='')
print('b')                     # ab
print(5, 6, sep='', end='!')   # 56!

print() без аргументов выводит пустую строку. f-строки: print(f'x = {x}') подставляет значение переменной в текст.

Арифметические операции, приоритет и преобразование типов 6–7 класс

Операции: +, -, *; / — обычное деление, результат всегда float (6 / 2 = 3.0); // — целочисленное деление (округление вниз, к меньшему числу); % — остаток от деления; ** — возведение в степень.

Примеры: 17 // 5 = 3, 17 % 5 = 2, 2 ** 10 = 1024. С отрицательными числами // округляет вниз: -17 // 5 = -4 (а не -3!), -17 % 5 = 3 (остаток имеет знак делителя). 7.5 // 2 = 3.0 — если один операнд float, результат тоже float.

Приоритет (от высшего к низшему): скобки () → ** → унарный минус -x → *, /, //, % → +, - → сравнения <, >, ==, !=, <=, >= → not → and → or. Операции одного приоритета выполняются слева направо, кроме **, которая выполняется справа налево: 2 ** 3 ** 2 = 2 ** 9 = 512. Также -2 ** 2 = -4, потому что степень старше минуса.

Пример расчёта: 2 + 3 * 4 ** 2 // 5 → сначала 4 ** 2 = 16, затем слева направо 3 * 16 = 48, 48 // 5 = 9, и наконец 2 + 9 = 11.

Преобразование типов: int('12') = 12; int(3.99) = 3 и int(-3.99) = -3 — дробная часть просто отбрасывается (к нулю); float('2.5') = 2.5; str(7) = '7'; round(3.5) = 4, но round(2.5) = 2 (Python округляет «половинки» к чётному). bool(0), bool(''), bool([]) — False, любое ненулевое число и непустая строка (даже '0') — True.

Строки тоже «складываются» и «умножаются»: '2' + '3' = '23' (склейка), 'ab' * 3 = 'ababab'. Но '2' + 3 — ошибка TypeError: строку и число складывать нельзя.

Полезные встроенные функции: abs(x) — модуль, max(a, b, c) и min(...), round(x, 2) — округление до 2 знаков, len(s) — длина. Модуль math: import math, math.sqrt(16) = 4.0, math.ceil(2.1) = 3, math.floor(2.9) = 2.

Ветвление: if, elif, else; логические операции 7 класс

Структура: после if условие: ставится двоеточие, тело пишется с отступом в 4 пробела. Ветка elif (иначе если) проверяется, только если все предыдущие условия ложны; else выполняется, если ложны все. Из всей цепочки выполняется ровно одна ветка (или ни одной, если нет else).

if score >= 90:
    grade = 5
elif score >= 75:
    grade = 4
elif score >= 50:
    grade = 3
else:
    grade = 2

Порядок elif важен: при score = 95 сработает первая ветка, хотя 95 >= 75 тоже верно. Если бы проверки шли от меньшего к большему (сначала >= 50), все хорошие оценки ошибочно стали бы тройками.

Операции сравнения: == (равно; одиночное = — это присваивание!), != (не равно), <, >, <=, >=. Python разрешает цепочки: 0 < x < 10 означает 0 < x and x < 10.

Логические операции: and (И) — истина, только если истинны оба условия; or (ИЛИ) — истина, если истинно хотя бы одно; not (НЕ) — меняет значение на противоположное. Приоритет: not, затем and, затем or. Пример: x % 2 == 0 and x > 10 — x чётное и больше 10. Проверка на делимость: n % k == 0.

Вложенные условия — if внутри if; принадлежность к ветке определяется отступом. Составные условия часто заменяют вложенность: if a > b and a > c: вместо двух вложенных if.

Тернарная запись: m = a if a > b else b — короткое ветвление в одну строку.

Цикл while и обработка цифр числа 8 класс

while условие: — цикл с предусловием: условие проверяется перед каждой итерацией; если оно сразу ложно, тело не выполнится ни разу. Внутри тела что-то обязательно должно менять условие, иначе цикл станет бесконечным.

n = 4728
s = 0
while n > 0:
    s += n % 10   # прибавили последнюю цифру
    n //= 10      # отбросили её
print(s)          # 21

Стандартные задачи на цифры: количество цифр (k += 1 в каждой итерации), сумма цифр (s += n % 10), произведение цифр (p *= n % 10, начальное p = 1), максимальная цифра, число наоборот (r = r * 10 + n % 10), количество чётных цифр (if n % 10 % 2 == 0: k += 1).

Важно: цикл «портит» n (в конце n = 0), поэтому если исходное число нужно потом, сохраните копию: m = n. Для n = 0 цикл while n > 0 не выполнится ни разу — количество цифр получится 0, а не 1.

while удобен, когда число повторений заранее неизвестно: «пока сумма меньше 100», «пока не введут 0», алгоритм Евклида: while a != b: if a > b: a -= b else: b -= a (или быстрее while b: a, b = b, a % b), получаем НОД.

Перевод числа в двоичную систему тоже делается через while: while n > 0: s = str(n % 2) + s; n //= 2.

Цикл for, функция range, break, continue, else 8 класс

for i in range(...) — цикл с параметром: переменная i по очереди принимает значения из диапазона. Формы range: range(n) — 0, 1, ..., n-1 (n чисел); range(a, b) — от a до b-1; range(a, b, k) — от a с шагом k, не доходя до b.

Правая граница никогда не входит: range(1, 5) → 1, 2, 3, 4. Отрицательный шаг — счёт назад: range(10, 0, -3) → 10, 7, 4, 1. Пустые диапазоны: range(5, 1) (шаг +1, а нужно идти вниз) и range(1, 5, -1) — цикл не выполнится ни разу.

for перебирает не только числа, но и элементы строки или списка: for ch in 'abc': — ch = 'a', 'b', 'c'; for x in [3, 8, 1]: — x = 3, 8, 1. После окончания цикла переменная i хранит последнее значение (для range(5) это 4).

break — немедленно прерывает весь цикл. continue — пропускает остаток текущей итерации и переходит к следующей. Обе действуют только на самый внутренний цикл, в котором находятся.

else у цикла выполняется, если цикл закончился «естественно», без break. Классика — проверка на простоту:

n = 29
for d in range(2, n):
    if n % d == 0:
        print('составное')
        break
else:
    print('простое')

Бесконечный цикл с выходом по break: while True: ... if условие: break — удобен, когда проверка нужна в середине тела.

Типовые алгоритмы, вложенные циклы и трассировка 8–9 класс

Счётчик: перед циклом k = 0, внутри if условие: k += 1. Сумматор (накопитель): s = 0, внутри s += x. Произведение: начальное значение p = 1 (не 0, иначе всё время будет 0!). Факториал: f = 1; for i in range(1, n + 1): f *= i.

Поиск максимума: за начальное значение берём первый элемент mx = a[0] (не 0 — вдруг все числа отрицательные), затем if x > mx: mx = x. Для минимума — знак <. Индекс максимума: храним imax, сравниваем a[i] > a[imax]. Строгое > даёт первый максимум, нестрогое >= — последний.

Вложенные циклы: внутренний цикл полностью проходит при каждой итерации внешнего. for i in range(3): for j in range(4): — тело выполнится 3 · 4 = 12 раз. Если внутренний зависит от внешнего (for j in range(i, 4)), считайте по строкам: при i = 0, 1, 2, 3 будет 4 + 3 + 2 + 1 = 10 повторений.

for i in range(1, 4):
    for j in range(1, 4):
        print(i * j, end=' ')
    print()     # перенос строки после каждой строки таблицы

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

Пример трассировки s = 0; for i in range(1, 6, 2): s += i * i: i = 1 → s = 1; i = 3 → s = 10; i = 5 → s = 35. Ответ 35.

Ошибки бывают синтаксические (забыто двоеточие, неверный отступ — программа не запустится), ошибки выполнения (деление на ноль ZeroDivisionError, выход за границы списка IndexError, неверный тип TypeError) и логические (программа работает, но ответ неверный — их ищут трассировкой и тестированием).

Списки (одномерные массивы) и двумерные списки (матрицы) 9 класс

Список — упорядоченный набор элементов: a = [5, 3, 8, 1]. Индексы с нуля: a[0] = 5, a[3] = 1, a[-1] = 1 (последний), a[-2] = 8. len(a) = 4, допустимые индексы 0..3; обращение к a[4] — ошибка IndexError. Элемент можно изменить: a[1] = 10.

Срезы a[start:stop:step] — как range: stop не входит. a[1:3] → элементы с индексами 1 и 2; a[:2] — первые два; a[2:] — с индекса 2 до конца; a[::2] — через один; a[::-1] — список наоборот. Срез создаёт новый список и никогда не вызывает IndexError.

Методы: a.append(x) — добавить в конец; a.insert(i, x) — вставить x на позицию i (остальные сдвигаются вправо); a.pop() — удалить и вернуть последний, a.pop(i) — элемент с индексом i; a.remove(x) — удалить первое вхождение значения x; a.index(x) — индекс первого x; a.count(x) — сколько раз встречается x; a.sort() — сортировка по возрастанию (reverse=True — по убыванию), a.reverse() — разворот. Функции: len(a), sum(a), max(a), min(a), sorted(a) (новый отсортированный список), проверка x in a.

Создание: [0] * 5 → [0, 0, 0, 0, 0]; list(range(1, 6)) → [1, 2, 3, 4, 5]; ввод: a = list(map(int, input().split())). Генератор списка (list comprehension): [i * i for i in range(1, 6)] → [1, 4, 9, 16, 25]; с условием: [x for x in a if x > 0] — только положительные.

Перебор по индексам for i in range(len(a)): нужен, когда важна позиция или нужно менять элементы; перебор по значениям for x in a: — когда нужны только значения. Обмен двух элементов: a[i], a[j] = a[j], a[i].

Двумерный список — список списков: m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]. m[i][j] — элемент в строке i и столбце j: m[1][2] = 6. Число строк len(m), столбцов len(m[0]). Обход — двумя вложенными циклами по i и j.

for i in range(len(m)):
    for j in range(len(m[0])):
        print(m[i][j], end=' ')
    print()

В квадратной матрице n×n: главная диагональ — элементы m[i][i] (i == j), побочная — m[i][n-1-i] (i + j == n - 1); выше главной диагонали i < j, ниже — i > j. Сумма строки i: sum(m[i]); сумма столбца j: sum(m[i][j] for i in range(n)). Правильное создание матрицы нулей: [[0] * m for i in range(n)]; запись [[0] * m] * n создаёт n ссылок на одну и ту же строку, и изменение одного элемента меняет весь столбец.

Примеры задач с решением

Задача 1Что выведет программа?
print(2 + 3 * 4 ** 2 // 5 - 7 % 3)
print(-17 // 5, -17 % 5)
  1. Первая строка, по приоритету: сначала степень 4 ** 2 = 16.
  2. Затем *, //, % слева направо: 3 * 16 = 48, 48 // 5 = 9 (9 · 5 = 45, остаток 3 отбрасываем), 7 % 3 = 1.
  3. Наконец сложение и вычитание: 2 + 9 − 1 = 10.
  4. Вторая строка: −17 / 5 = −3,4; // округляет вниз, к меньшему числу, то есть к −4.
  5. Остаток: −17 − 5 · (−4) = −17 + 20 = 3. Проверка: 5 · (−4) + 3 = −17.
Ответ 10, затем -4 3
Задача 2Выполните трассировку и определите, что выведет программа:
n = 4728
s = 0
r = 0
while n > 0:
    d = n % 10
    s = s + d
    r = r * 10 + d
    n = n // 10
print(s, r)
  1. Начало: n = 4728, s = 0, r = 0. Условие n > 0 истинно.
  2. Итерация 1: d = 8, s = 8, r = 0 · 10 + 8 = 8, n = 472.
  3. Итерация 2: d = 2, s = 10, r = 8 · 10 + 2 = 82, n = 47.
  4. Итерация 3: d = 7, s = 17, r = 827, n = 4.
  5. Итерация 4: d = 4, s = 21, r = 8274, n = 0.
  6. Проверка условия: 0 > 0 ложно — выход из цикла. Цикл выполнился 4 раза (по числу цифр). s — сумма цифр, r — число наоборот.
Ответ 21 8274
Задача 3Сколько раз выполнится тело цикла и что выведет программа?
s = 0
for i in range(10, 0, -3):
    s = s + i
print(s, i)
  1. Шаг отрицательный, значит идём вниз от 10, не доходя до 0: 10, 7, 4, 1 (следующее было бы −2, а оно уже за границей 0).
  2. Количество итераций по формуле: ⌈(10 − 0) / 3⌉ = ⌈3,33⌉ = 4.
  3. Трассировка: i = 10 → s = 10; i = 7 → s = 17; i = 4 → s = 21; i = 1 → s = 22.
  4. После цикла i хранит последнее значение — 1.
Ответ 4 раза; вывод: 22 1
Задача 4Что выведет программа?
a = 8
b = 3
if a % b == 0 or a > 10:
    print(1)
elif not (a < b) and b % 2 == 1:
    print(2)
else:
    print(3)
  1. Первое условие: 8 % 3 = 2, значит a % b == 0 — False; a > 10 — False. False or False = False, ветка if пропускается.
  2. Условие elif: a < b → 8 < 3 → False, not False = True; b % 2 == 1 → 3 % 2 = 1 → True.
  3. True and True = True — выполняется ветка elif, печатается 2. Ветка else уже не проверяется.
Ответ 2
Задача 5Что выведет программа?
a = [4, 7, 1, 9]
a.append(a[1] + a[2])
a.insert(0, a.pop())
a.remove(7)
print(a[1:3], a[-1], len(a))
  1. a[1] + a[2] = 7 + 1 = 8, append добавляет в конец: [4, 7, 1, 9, 8].
  2. a.pop() удаляет и возвращает последний элемент 8: список [4, 7, 1, 9]; затем insert(0, 8) ставит 8 в начало: [8, 4, 7, 1, 9].
  3. remove(7) удаляет значение 7 (не индекс!): [8, 4, 1, 9].
  4. a[1:3] — индексы 1 и 2: [4, 1]; a[-1] = 9; длина 4.
Ответ [4, 1] 9 4
Задача 6Что выведет программа?
k = 0
for i in range(1, 4):
    for j in range(i, 4):
        k = k + i * j
print(k)
  1. Внутренний цикл зависит от i, поэтому трассируем по строкам внешнего цикла.
  2. i = 1: j = 1, 2, 3 → прибавляем 1 + 2 + 3 = 6, k = 6.
  3. i = 2: j = 2, 3 → прибавляем 4 + 6 = 10, k = 16.
  4. i = 3: j = 3 → прибавляем 9, k = 25.
  5. Всего тело выполнилось 3 + 2 + 1 = 6 раз.
Ответ 25

Сложные задачи: шаг за шагом

Задача 1Что выведет программа?
x = 0
y = 1
while y < 50:
    x = x + 1
    y = y * 2 + x
print(x, y)

Идея: Число итераций заранее неизвестно — строим таблицу трассировки и проверяем условие перед каждой итерацией. Важно: y вычисляется уже с новым x.

  1. Таблица трассировки
    Старт: x = 0, y = 1; 1 < 50 — входим.
    Итерация 1: x = 1, y = 1 · 2 + 1 = 3.
    Итерация 2: x = 2, y = 3 · 2 + 2 = 8.
    Итерация 3: x = 3, y = 8 · 2 + 3 = 19.
    Итерация 4: x = 4, y = 19 · 2 + 4 = 42; 42 < 50 — ещё раз.
    Итерация 5: x = 5, y = 42 · 2 + 5 = 89.
  2. Выход
    Проверка 89 < 50 ложна, цикл заканчивается. Значения после цикла печатаются один раз.
Ответ 5 89
Задача 2Что выведет программа?
s = 0
for i in range(1, 20, 2):
    if i % 3 == 0:
        continue
    if s > 20:
        break
    s = s + i
print(i, s)

Идея: continue пропускает только текущее значение i, break завершает весь цикл; проверка s > 20 стоит до прибавления.

  1. Значения i
    range(1, 20, 2) даёт нечётные 1, 3, 5, ..., 19.
  2. Трассировка
    i = 1: не кратно 3, s = 0 ≤ 20 → s = 1.
    i = 3: кратно 3 → continue.
    i = 5: s = 6. i = 7: s = 13.
    i = 9: кратно 3 → continue.
    i = 11: s = 13 ≤ 20 → s = 24.
    i = 13: не кратно 3, но s = 24 > 20 → break. Прибавление не произошло.
  3. Вывод
    После break переменная i осталась равной 13, s = 24.
Ответ 13 24
Задача 3Что выведет программа?
m = [[i * 3 + j for j in range(3)] for i in range(3)]
s = 0
for i in range(3):
    for j in range(3):
        if i > j:
            s = s + m[i][j]
print(s, m[2][::-1])

Идея: Сначала строим матрицу по генератору, затем отбираем элементы ниже главной диагонали (i > j).

  1. Строим матрицу
    Элемент m[i][j] = 3i + j. Строка 0: [0, 1, 2], строка 1: [3, 4, 5], строка 2: [6, 7, 8].
  2. Элементы ниже главной диагонали
    Условие i > j выполняется для (1,0), (2,0), (2,1): это m[1][0] = 3, m[2][0] = 6, m[2][1] = 7.
    s = 3 + 6 + 7 = 16.
  3. Срез строки
    m[2] = [6, 7, 8], срез [::-1] разворачивает её: [8, 7, 6].
Ответ 16 [8, 7, 6]

Частые ловушки на ЕНТ

  • / всегда даёт float: 6 / 2 = 3.0, а не 3. Целое частное — только //.
  • С отрицательными числами // округляет вниз: -7 // 2 = -4, -7 % 2 = 1. А int(-3.5) = -3 — отбрасывание к нулю. Не путайте.
  • Правая граница range и среза не входит: range(1, 5) — 1..4, a[1:3] — два элемента. range(5, 1) без отрицательного шага пуст.
  • input() возвращает строку: без int() получится '2' + '3' = '23'. Также 2 ** 3 ** 2 = 512 (степень справа налево), -2 ** 2 = -4.
  • a.remove(x) удаляет по значению, a.pop(i) — по индексу. Индексы начинаются с 0, последний элемент — a[len(a) - 1] или a[-1]; a[len(a)] — ошибка.

Запомнить

// — вниз, % — знак делителя, range и срезы без правой границы, индексы с нуля, input — строка; сомневаешься — делай трассировочную таблицу.

Проверь себя

1. Что выведет программа?
print(17 // 5, 17 % 5, 2 ** 4)
  1. 3 2 16
  2. 3.4 2 16
  3. 3 2 8
  4. 2 3 16
Показать ответ

3 2 16 17 // 5 = 3 (целая часть), 17 % 5 = 2 (остаток), 2 ** 4 = 16.

2. Что выведет программа?
print(-7 // 2, -7 % 2)
  1. -3 -1
  2. -4 1
  3. -3 1
  4. -4 -1
Показать ответ

-4 1 −3,5 округляется вниз до −4; остаток −7 − 2 · (−4) = 1.

3. Что выведет программа?
s = 0
for i in range(2, 11, 3):
    s += i
print(s)
  1. 26
  2. 18
  3. 15
  4. 10
Показать ответ

15 i = 2, 5, 8 (11 не входит): 2 + 5 + 8 = 15.

4. Что выведет программа?
a = [3, 8, 1, 6, 4]
print(a[1:4], a[-2])
  1. [3, 8, 1] 4
  2. [8, 1, 6, 4] 6
  3. [8, 1] 6
  4. [8, 1, 6] 6
Показать ответ

[8, 1, 6] 6 Срез [1:4] — индексы 1, 2, 3: [8, 1, 6]; a[-2] — предпоследний элемент 6.

5. Что выведет программа?
print(1, 2, 3, sep='-', end='!')
print(4)
  1. 1 2 3!4
  2. 1-2-3!4
  3. 1-2-3-!4
  4. 1-2-3! и 4 на новой строке
Показать ответ

1-2-3!4 sep='-' ставит дефис между значениями, end='!' заменяет перенос строки, поэтому 4 печатается в той же строке.

6. Что выведет программа?
n = 2024
s = 0
while n > 0:
    s += n % 10
    n //= 10
print(s)
  1. 8
  2. 4202
  3. 2024
  4. 4
Показать ответ

8 Цикл складывает цифры: 4 + 2 + 0 + 2 = 8.

Связанные темы

Узнай свой уровень: бесплатная диагностика ЕНТ