Проверить программы онлайн · файлы остаются в браузере
10 класс, углублённый уровень. Занятие седьмое: как написать цикл, чтобы он был верным, и как записать, что он делает.
Проверка.bat из общей папки: она запускает программу на девяти
наборах данных, а если в программе есть шапка с примером — запускает и пример.
Интернет не нужен.
Шесть типов задач, по одной на каждый. Считать в уме или на бумаге: главный инструмент сегодня — таблица витков, где одна строка — одна проверка условия цикла. Где ответ — номер фразы или строки, пиши только число.
| проверка условия | n | s | s + сумма цифр n |
|---|---|---|---|
| до цикла | 5372 | 0 | 0 + 17 = 17 |
| после 1-го витка | 537 | 2 | 2 + 15 = 17 |
| после 2-го | 53 | 9 | 9 + 8 = 17 |
| после 3-го | 5 | 12 | 12 + 5 = 17 |
| на выходе | 0 | 17 | 17 + 0 = 17 |
Переменные меняются на каждом витке, а последний столбец — нет. Фразу «s плюс сумма цифр n равно сумме цифр исходного числа» называют инвариантом цикла: она верна перед каждой проверкой условия — до первого витка, после каждого и на выходе. Строк в таблице на одну больше, чем витков.
На выходе известны две вещи: условие ложно (n == 0) и фраза верна
(s + сумма цифр n = 17). Подставляем n = 0 — получаем
s = 17. Программу не надо гонять виток за витком, чтобы понять, что
она считает: хватает фразы и условия выхода.
Фраза диктует все три места цикла:
s = 0;n % 10 — прибавили её к s;n == 0, значит, крутимся while n > 0.Проверять фразу надо на границе: до первого витка, на выходе и там, где условие срабатывает впритык — N точная степень двойки, два равных максимума, самое маленькое допустимое число.
Полезный комментарий говорит, что верно, а не что делает строка. Самая
ценная строка документации цикла — его инвариант, одной строкой перед
while.
Что подать, что получить и пример. Карточка задания в этом практикуме устроена ровно так же. Пример ценнее слов: его можно проверить запуском. Оболочка так и делает — берёт вход из примера, запускает программу и сверяет с обещанным выводом. Документация обязана быть правдой.
Приглашение input("Введите число: ") — документация для человека,
который сидит за программой. Когда вывод читает машина (оболочка, ЕГЭ), текста в
input() быть не должно. Чужую документацию читают через
help(): в IDLE наберите help(abs) или
help(round) — это шапки, которые написали авторы Python.
zadanie1.py, zadanie2.py, zadanie3.py.input(). Пиши input(),
а не input("Введите число: ") — вывод читает машина.# Ввод:, # Вывод:, # Пример:)
в заданиях 1–2 по желанию, в задании 3 обязательна. Если шапка есть, пример
в ней проверяется запуском.Программа читает натуральное число (от 1 до 1000000000) и
печатает наибольшую степень двойки, не больше
: показатель
и само число
.
Фраза цикла: и
.
20
Степень: 4 Число: 16
Проверяется: начальные значения из фразы, условие выхода на
границе — против
.
Начало: при каких и
фраза верна для любого
? Шаг: удвоить
и прибавить единицу к
— фраза «p = 2 ** k» сохранится. Выход: удваивать можно, пока
удвоенное ещё не больше
.
Ловушки, ради которых это задание. Оболочка подаст 1 (ни одного витка,
ответ 0 и 1), 1024 (точная степень: с вместо
ответ на шаг меньше) и 1023. Условие
даст лишний виток: на выходе
больше
— фраза сломалась.
Программа читает количество чисел (от 1 до 20), затем
целых чисел от −1000 до 1000, каждое со своей строки. Печатает
наименьшее, наибольшее и номер первого из наибольших (нумерация с 1).
Списков не нужно: числа читаются и сравниваются по одному.
Фраза цикла: и
— наименьшее и
наибольшее из уже прочитанных,
— номер первого наибольшего.
5 4 9 1 9 2
Наименьшее: 1 Наибольшее: 9 Номер наибольшего: 2
Проверяется: старт накопителя, который делает фразу верной с самого начала; строгое сравнение для первого максимума.
До цикла прочитай первое число: из одного прочитанного оно само и
наименьшее, и наибольшее, и его номер 1 — фраза верна. Дальше
— читаем очередное число и сравниваем.
Ловушки, ради которых это задание. Старт врёт,
когда все числа положительные,
— когда все отрицательные:
оболочка подаст и то и другое. И подаст два равных наибольших: сравнение
перезапишет номер, а нужен номер первого.
Программа читает два натуральных числа и
(от 1
до 1000), каждое со своей строки. Пока числа не равны, из большего вычитает
меньшее. Печатает наибольший общий делитель (он получится, когда числа
сравняются) и сколько было вычитаний.
Фраза цикла: НОД(a, b) не меняется — он всё время равен НОД исходных чисел.
12 18
НОД: 6 Вычитаний: 2
Документация обязательна. В начале программы — шапка из трёх строк, перед циклом — фраза-инвариант:
В примере слева от — входные числа через пробел, справа —
числа, которые напечатает программа. Придумай свой пример, не из условия:
оболочка запустит программу на нём и сверит.
Проверяется: цикл с условием, счётчик шагов — и документация, которая проверяется запуском.
Цикл , внутри ветвление: если
,
то
, иначе
. Счётчик вычитаний
стартует с нуля. На выходе
, а фраза говорит, что НОД(a, b)
тот же, что у исходных, — и НОД двух равных чисел равен им самим. Это и есть
ответ.
Ловушки, ради которых это задание. Равные числа на входе: ни одного
вычитания. Остаток от деления () даёт тот же НОД быстрее, но число
шагов другое — задание именно про вычитание. И пример в шапке: посчитай его
таблицей по виткам, прежде чем писать.
zadanie1.py … zadanie3.py лежат в твоей
папке, отладочные print из них убраны.Проверка.bat.Оболочка показывает, на каких данных программа ошиблась и что должна была вывести, а если соврала шапка — что она обещала и что вышло на деле. Исправляй и проверяй снова, попыток сколько угодно.
Одна строка — одна проверка условия цикла: до цикла, после каждого витка и на выходе. Строк на одну больше, чем витков. В последней строке условие ложно.
Фраза о переменных, верная в каждой строке таблицы. Сумма цифр: s + сумма цифр n = сумма цифр исходного. Степень двойки: p = 2 ** k и p ≤ N. НОД вычитанием: НОД(a, b) не меняется. На выходе фраза верна, а условие ложно — вместе они дают ответ без запуска.
Начало — значения, при которых фраза верна до первого витка (s = 0, p = 1 и k = 0, mn = первое прочитанное). Шаг — сдвиг к цели, после которого фраза снова верна. Выход — условие, при котором фраза превращается в ответ.
Старт накопителя чужим числом (m = 0). Граница выхода: < против <=, на выходе проверить, что фраза ещё верна. Равный максимум: >= перезаписывает номер первого. Проверять на границе: самый маленький вход, точная степень, два равных числа.
Говорит, что верно, а не пересказывает строку. Главный комментарий цикла — инвариант одной строкой перед while.
# Ввод: что подаётся; # Вывод: что печатается; # Пример: вход -> вывод. Пример проверяется запуском: не сошлось — врёт программа или шапка. Приглашение в input() — для человека, машине оно мешает. Чужая документация — help(abs), help(round).
Материалы подготовлены с использованием технологий искусственного интеллекта.