Проверить программы онлайн · файлы остаются в браузере
10 класс, углублённый уровень. Занятие второе: как программа выполняется на самом деле и что делать, когда она выполняется не так, как задумано.
Проверка.bat из общей папки: она запускает программу на семи
наборах данных. Интернет не нужен.
Процессор не понимает ни print, ни while. Он
понимает только машинный код — числа. Значит, между вашим текстом и
процессором обязательно кто-то стоит. Кто именно — зависит от языка.
| Компилятор | Интерпретатор | |
|---|---|---|
| Когда переводит | всю программу заранее, до запуска | по ходу дела, строку за строкой |
| Что получается | готовый файл (.exe) |
ничего не остаётся, результат сразу |
| Скорость работы | выше | ниже |
| Когда видно ошибку | до запуска, все сразу | когда до неё дошло выполнение |
| Языки | C, C++, Pascal | Python, JavaScript |
У Python дорога чуть длиннее и хитрее. Текст программы переводится не в
команды процессора, а в промежуточный байт-код — и уже его выполняет
виртуальная машина. Байт-код Python складывает в папку
__pycache__ рядом с программой, чтобы в следующий раз не
переводить заново.
IDLE, в которой вы работаете, — это интегрированная среда разработки (IDE). «Интегрированная» значит, что всё нужное собрано в одном окне:
Взрослые среды (PyCharm, VS Code, Visual Studio) устроены так же, только у них ещё есть подсказки по коду, работа с git и профилировщик — инструмент, который меряет, на что программа тратит время.
Главный навык отладки не требует ни отладчика, ни компьютера: трассировочная таблица. По строкам — шаги цикла, по столбцам — переменные. Заполняя её, вы выполняете программу вместо процессора и почти всегда именно в этот момент видите ошибку.
Четыре задачи, при каждом открытии новые. Считать на бумаге или в уме: запустив программу, вы узнаете ответ, но не научитесь. Задачу можно поправить и отправить снова сколько угодно раз; если тип дался не с первого захода, кнопка «Добавить задачи» даст по нему ещё одну — с другими числами.
Ошибки бывают двух разных видов, и лечатся они по-разному.
| Вид | Как выглядит | Чем ловится |
|---|---|---|
| Программа не запускается | красный текст, SyntaxError, ValueError |
читать последнюю строку сообщения — там сказано что и где |
| Программа работает, но врёт | ошибок нет, ответ неправильный | трассировка, отладочный вывод, отладчик |
Самый дешёвый инструмент, и часто самый быстрый. Берёте лист, выписываете переменные в столбцы и проходите цикл руками. Если программа не помещается в голову — она не поместится и в таблицу; значит, надо разбивать на куски.
printВставьте print туда, где хотите увидеть, что происходит:
Правило одно: такие строки убирают перед сдачей. Оболочка сравнивает вывод с эталонным, и забытая отладочная строка — это уже другой ответ.
Отладчик ошибку не находит и не исправляет. Он показывает, что происходит на самом деле: значения переменных и путь, по которому пошла программа. Вывод делаете вы.
>>>).[DEBUG ON].Set Breakpoint, строка станет жёлтой. Теперь Go домчит
программу до неё и остановится перед этой строкой. Незаменимо в
цикле: не нужно жать Step по сто раз.
Программа работает и не заканчивается — значит, цикл не может выйти. Порядок такой:
KeyboardInterrupt и покажет
строку, на которой её прервали, — это строка внутри вечного цикла.То же самое покажет и отладчик: точка останова на первой строке тела, потом Go несколько раз подряд — и видно, что в Locals ничего не движется.
В общей папке лежат broken1.py, broken2.py,
broken3.py. В каждой описано, что программа должна делать, и в
каждой ровно одна ошибка. Открой в IDLE, найди, почини.
zadanie1.py,
zadanie2.py, zadanie3.py —
File → Save As…. Файлы в
общей папке править нельзя: они нужны всему классу.
Общей папки дома нет, поэтому вот сами программы. Скопируй нужную в
IDLE (File → New File),
сохрани под именем zadanieN.py и чини. Проверить починку
оболочкой получится только в кабинете — дома сверяйся с примерами из
условий ниже и трассировочной таблицей.
# Задание 1. Пробег за смену.
#
# Что программа ДОЛЖНА делать:
# читает число n — сколько поездок было за смену,
# потом n чисел — километры каждой поездки,
# печатает: Всего: <сумма> км
#
# Пример: вход 3, 12, 5, 20 -> Всего: 37 км
#
# Программа работает, но считает неправильно. Найди ошибку и исправь.
# Сохрани исправленную программу в свою папку как zadanie1.py
n = int(input())
for i in range(n):
total = 0
km = int(input())
total = total + km
print(f"Всего: {total} км")
# Задание 2. Самый короткий заказ.
#
# Что программа ДОЛЖНА делать:
# читает число n — сколько было заказов,
# потом n чисел — расстояние каждого заказа в километрах,
# печатает: Минимум: <самое маленькое из них> км
#
# Пример: вход 3, 12, 5, 20 -> Минимум: 5 км
#
# Программа запускается и что-то печатает, но ответ всегда один и тот же.
# Найди ошибку и исправь.
# Сохрани исправленную программу в свою папку как zadanie2.py
n = int(input())
mn = 0
for i in range(n):
km = int(input())
if km < mn:
mn = km
print(f"Минимум: {mn} км")
# Задание 3. Сколько заказов увезёт курьер.
#
# Что программа ДОЛЖНА делать:
# читает вес одного заказа в килограммах,
# потом грузоподъёмность машины в килограммах,
# печатает: Заказов: <сколько таких заказов влезет в машину>
#
# Пример: вход 7, 30 -> Заказов: 4 (четыре по 7 кг это 28, пятый не влезет)
#
# ВНИМАНИЕ: эта программа зависает — работает и не заканчивается.
# Останови её (Ctrl+C в окне IDLE), найди причину и исправь.
# Сохрани исправленную программу в свою папку как zadanie3.py
weight = int(input())
limit = int(input())
count = 0
free = limit
while free >= weight:
count = count + 1
print(f"Заказов: {count}")
Программа читает число поездок, потом расстояние каждой поездки, и печатает суммарный пробег.
3 12 5 20
Всего: 37 км
Симптом: ответ меньше правды. Похоже на последнюю введённую поездку.
Заполни трассировочную таблицу на трёх поездках: столбцы
,
,
. На каждом шаге
смотри, чему равен
в начале шага.
Вопрос, который решает задачу: сколько раз должно выполниться обнуление накопителя? Один раз за всю программу — или один раз на каждую поездку?
Программа читает число заказов, потом расстояние до каждого, и печатает наименьшее.
3 12 5 20
Минимум: 5 км
Симптом: ответ всегда один и тот же, какие числа ни вводи.
Условие сравнивает прочитанное расстояние с
тем, что уже лежит в
. Посмотри в отладчике, чему равно
перед первым сравнением, и спроси себя: может ли
расстояние оказаться меньше?
И сразу про ловушку. Взять вместо нуля «заведомо большое» число (100, 1000) — не решение, а такая же ошибка: заказ может оказаться дальше. Начинать надо с первого прочитанного расстояния — тогда выдумывать ничего не приходится.
Программа читает вес одного заказа и грузоподъёмность машины и печатает, сколько целых заказов помещается.
7 30
Заказов: 4
Симптом: программа зависает. Останови её Ctrl+C в окне Shell.
Условие цикла — . Найди в теле цикла
строку, которая меняет
. Не нашёл — вот и ответ: цикл
никогда не закончится, потому что менять условию нечего.
Когда починишь, проверь ещё одну вещь: что будет, если груз влезает
ровно впритык — скажем, вес 5 и грузоподъёмность 20. Ответ должен
быть 4, а не 3. Отсюда видно, в условии или
.
zadanie1.py … zadanie3.py лежат в твоей
папке, отладочные print из них убраны.Проверка.bat.Оболочка показывает, на каких данных программа ошиблась и что должна была вывести. Это подсказка: исправляй и проверяй снова, попыток сколько угодно. Зависшую программу она не ждёт — так и пишет, что та не завершилась.
| компилятор | интерпретатор | |
|---|---|---|
| когда переводит | всю заранее, до запуска | по ходу, строка за строкой |
| что остаётся | готовый файл (.exe) | ничего, результат сразу |
| когда видно ошибку | до запуска, все сразу | когда до неё дошло выполнение |
| языки | C, C++, Pascal | Python, JavaScript |
У Python дорога длиннее: текст переводится в байт-код (папка
), а выполняет его виртуальная машина.
Байт-код одинаков везде, машины написаны под каждую систему — поэтому
программа переезжает с Windows на Linux без единой правки. Плата —
скорость. Так же устроены Java (JVM) и C# (.NET).
| не запускается | красный текст, SyntaxError, ValueError — читать последнюю строку сообщения: там что и где |
|---|---|
| работает, но врёт | ошибок нет, ответ неправильный — трассировка, отладочный вывод, отладчик |
Точка останова: правой кнопкой по строке → Set Breakpoint, строка станет жёлтой. Go домчит до неё и остановится. В цикле незаменима — не нужно жать Step по сто раз.
Ctrl+C в окне Shell: Python напечатает KeyboardInterrupt и покажет строку, на которой прервали, — она внутри вечного цикла. Дальше смотреть переменную из условия цикла: меняется ли она внутри? Не меняется — условие останется истинным навсегда.
Материалы подготовлены с использованием технологий искусственного интеллекта.