Проверить программы онлайн · файлы остаются в браузере
10 класс, углублённый уровень. Занятие четвёртое: выбор между ветками, сложные условия и цикл, у которого число повторений заранее неизвестно.
Проверка.bat из общей папки: она запускает программу на семи
наборах данных. Интернет не нужен.
Шесть типов задач, по две на каждый. Считать в уме или на бумаге: запустив программу, вы узнаете ответ, но не научитесь. Ответ — ровно то, что появится на экране; если программа печатает несколько строк, перечисли их через пробел. Последний тип — задание 13 ЕГЭ: там кода нет вовсе, исполнителя ведут вручную.
Ветки проверяются сверху вниз, и выполняется первая подошедшая; остальные даже не вычисляются. Отсюда правило: узкое условие ставят раньше широкого. Поменяй две первые ветки местами — и «больше ста» не напечатается никогда, ведь всё, что больше 100, больше и 10.
Несколько отдельных if подряд — совсем другая конструкция:
там проверяется каждый, и сработать может сразу несколько. Это не ошибка сама
по себе, но путать их с лестницей — ошибка обычная.
| Операция | Истинна, когда | Приоритет |
|---|---|---|
not A | A ложно | 1 — раньше всех |
A and B | истинны обе | 2 |
A or B | истинна хотя бы одна | 3 — позже всех |
Короткое замыкание. and не смотрит на правую часть, если
левая ложна; or — если левая истинна. Поэтому защитную проверку
(«знаменатель не ноль», «список не пуст») ставят первой.
Закон де Моргана. not (A and B) — то же, что
not A or not B, а not (A or B) — то же, что
not A and not B. Проще запомнить словами: «неверно, что оба» значит
«хотя бы один — нет».
if x = 5 — это присваивание, Python
сразу скажет SyntaxError. А if x == 1 or 2 ошибкой не считается и
потому опаснее: or вернёт число 2, которое истинно, и условие
сработает всегда. Правильно: if x == 1 or x == 2.
for берут, когда число шагов известно заранее («перебрать все
делители от 1 до n»). while — когда его считает сама задача: «пока
число больше 1», «пока не накопили нужную сумму». Два следствия, из которых
растут почти все ошибки в этой теме:
| Приём | Как выглядит | Где встретится |
|---|---|---|
| счётчик | k = k + 1 в теле | сколько шагов до цели |
| накопитель | s = s + n % 10 | сумма цифр числа |
| перебор цифр | while n > 0: … n = n // 10 | задание 25 ЕГЭ |
| максимум | if d > m: m = d внутри цикла | наибольшая цифра, элемент |
break прекращает весь цикл — так выходят, найдя нужное.
continue бросает текущий проход и возвращается к проверке условия —
так пропускают ненужные значения. В связке while True: … break
условие выхода оказывается в середине тела; это законный приём, а не костыль.
На экране число. Команда A («Прибавь 1») увеличивает его на единицу.
Команда B («Поменяй местами») меняет местами цифры десятков и единиц,
но применяется только к числу, у которого цифра десятков меньше цифры
единиц. Программа — последовательность команд, траектория — все промежуточные
результаты. Для команд A, B, A и числа 13
траектория такая: 14, 41, 42.
Это ветвление внутри цикла в чистом виде: на каждом шаге сначала решаем,
применима ли команда, и только потом выполняем. Обе цифры достаются знакомой
арифметикой — n % 10 даёт единицы, n // 10 % 10 —
десятки. На экзамене спросят, сколько существует программ с нужным
результатом; сегодня учимся выполнять одну — руками и машиной.
zadanie1.py, zadanie2.py, zadanie3.py.input(). Пиши input(),
а не input("Введите год: ") — вывод читает машина.Программа читает год и номер месяца (два целых числа, каждое со своей строки) и печатает, сколько в этом месяце дней, а второй строкой — високосный ли год. Напомним правило: год високосный, если делится на 4 и не делится на 100, а также если делится на 400.
2024 2
Дней: 29 Високосный: да
Проверяется: лестница , сложное
условие с
и
, вложенное ветвление.
Високосность удобно посчитать один раз в отдельную переменную:
— и дальше
пользоваться ею. Месяцы делятся на три случая: февраль, короткие (4, 6, 9, 11)
и остальные. Проверка на короткий месяц — это одно длинное «или»:
.
Ловушка, ради которой это задание. Правило «делится на 4» — только его первая треть. 1900 год делится на 4, но это век, не кратный 400, и високосным он не был; 2000 — был. Оболочка подаст 1900, 2000, 2100 и 1600: программа, которая проверяет одну делимость на 4, провалится на первом же наборе.
Тот самый исполнитель из задания 13 ЕГЭ. Программа читает начальное число
(от 10 до 300), затем количество команд и сами команды — каждую с новой
строки, буквой или
. Команды выполняются по
порядку; неприменимая команда пропускается — она ничего не делает, а
исполнитель переходит к следующей. Печатай три строки: траекторию (числа
после каждой выполненной команды через пробел), итоговое число и
количество пропущенных команд.
55 3 B A B
Траектория: 56 65 Результат: 65 Пропущено: 1
Проверяется: цикл с условием, ветвление внутри цикла,
цифры числа через и
. Заготовка к заданию 13 ЕГЭ.
Команды читаются по одной — ровно так же, как в прошлый раз читались
километры: , а дальше в цикле
. Считай проходы сам:
,
, в конце тела
.
Цифры: — единицы,
— десятки.
Условие применимости строгое: десятки меньше единиц, при равных
цифрах команда не выполняется. Меняются только два младших разряда, старшие
остаются на месте: 104 превращается в 140, а не в 401. Собрать новое число
можно так:
.
Траекторию не печатай по ходу — в IDLE она перемешается с вводом
команд. Копи её в строке: перед циклом , после каждой
выполненной команды
, а после цикла одной
командой
. Число к строке само не
приклеится — нужен
. Разбери на бумаге пример из ЕГЭ:
число 13 и команды
,
,
дают
14, 41, 42.
Вклад раз в год вырастает на процентов, копейки
отбрасываются: за год прибавляется
рублей.
Программа читает три целых числа — сумму вклада, процент и цель — и печатает,
через сколько лет сумма станет не меньше цели, а второй строкой —
какой она к этому моменту будет. Если цель достигнута уже сейчас, ответ —
ноль лет.
1000 20 2000
Лет: 4 Сумма: 2073
Проверяется: со счётчиком, условие выхода,
проверка условия перед первым проходом.
Схема обычная: , внутри начисляем
проценты и увеличиваем счётчик лет. Обрати внимание: проценты считаются от
текущей суммы, а не от начальной, — иначе вклад будет расти слишком
медленно.
Ловушка, ради которой это задание. Оболочка подаст набор, где цель
уже достигнута: 20000 рублей при цели 19999. Верный ответ — ,
и обычный
даёт его сам собой, потому что проверяет условие
до первого прохода. А вот
с проверкой в конце
насчитает лишний год.
zadanie1.py … zadanie3.py лежат в твоей
папке, отладочные print из них убраны.Проверка.bat.Оболочка показывает, на каких данных программа ошиблась и что должна была вывести. Это подсказка: исправляй и проверяй снова, попыток сколько угодно.
В лестнице if / elif / else выполняется первая подошедшая ветка, остальные не проверяются. Узкое условие ставят раньше широкого: если сначала написать x > 10, то ветка x > 100 недостижима. Несколько отдельных if — другая конструкция: там сработает каждый подошедший. Ветка может не печатать, а менять переменную. Вложенный else относится к ближайшему if — по отступу.
| операция | истинна, когда | приоритет |
|---|---|---|
| not A | A ложно | 1 — раньше всех |
| A and B | истинны обе | 2 |
| A or B | истинна хотя бы одна | 3 — позже всех |
x > 0 or x < −5 and x % 2 == 0 читается как x > 0 or (x < −5 and x % 2 == 0). Двойное неравенство пишется как в математике: 1 < x < 10. Короткое замыкание: and не смотрит правую часть при ложной левой, or — при истинной; поэтому защитную проверку (x != 0) ставят первой. Де Морган: not (A and B) = not A or not B; not (A or B) = not A and not B.
Две ошибки: if x = 5 — присваивание вместо сравнения (SyntaxError); if x == 1 or 2 — синтаксис верный, а смысл нет: or вернёт 2, условие истинно всегда. Правильно: x == 1 or x == 2.
while проверяет условие ПЕРЕД каждым проходом, поэтому тело может не выполниться ни разу. Переменную двигает сам программист — иначе вечный цикл (в IDLE прерывается Ctrl+C). for берут, когда число шагов известно заранее, while — когда его определяет сама задача.
| приём | как выглядит |
|---|---|
| счётчик | k = k + 1 в теле цикла |
| накопитель | s = s + n % 10 |
| перебор цифр | while n > 0: … n = n // 10 |
| максимум | if d > m: m = d внутри цикла |
break прекращает весь цикл, continue — только текущий проход. После выхода переменная хранит уже НЕподошедшее значение: while i * i < 50 закончится при i = 8.
. Одной делимости на 4
мало: 1900 и 2100 — обычные годы, 1600 и 2000 — високосные. В феврале 29
дней, если год високосный, иначе 28; по 30 дней в апреле, июне, сентябре и
ноябре, в остальных месяцах 31.
Команда A прибавляет 1. Команда B меняет местами цифры десятков и единиц и применима, только если десятки строго меньше единиц; меняются лишь два младших разряда: 104 → 140. Цифры: n % 10 — единицы, n // 10 % 10 — десятки. Для команд A, B, A и числа 13 траектория 14, 41, 42. Неприменимая команда пропускается, а не останавливает программу.
Материалы подготовлены с использованием технологий искусственного интеллекта.