Решение: Поиск ошибок в программе
На обработку поступает натуральное число, не превышающее $10^9$. Нужно написать программу, которая выводит на экран минимальную чётную цифру числа. Если в числе нет чётных цифр, требуется вывести на экран «NO». Программист написал программу неправильно.
Последовательно выполните следующие действия:
1. Напишите, что выведет эта программа при вводе числа 231.
2. Приведите пример такого трёхзначного числа, при вводе которого программа выдаёт верный ответ.
3. Найдите все ошибки в этой программе. Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки выпишите ошибочную строку и приведите её правильный вариант. Достаточно указать ошибки и способ их исправления для одного языка программирования. Требуется найти ошибки в имеющейся программе, а не написать другую программу, использующую иной алгоритм.
1N = int(input()) 2minDigit = N % 10 3while N > 0: 4 digit = N % 10 5 if digit % 2 == 0: 6 if digit < minDigit: 7 minDigit = digit 8 N = N // 10 9if minDigit == 0: 10 print("NO") 11else: 12 print(minDigit)
Решение по шагам
6 шаговПри вводе 231 начальное значение minDigit равно последней цифре числа: 1. Затем программа рассматривает цифры 1, 3 и 2. Только цифра 2 является чётной, поэтому minDigit становится равным 2.
$$231 \to 1,\ 3,\ 2$$После завершения цикла значение minDigit равно 2, поэтому программа выводит число 2.
$$2$$Пример трёхзначного числа, для которого программа выдаёт верный ответ: 246. Чётные цифры этого числа — 2, 4 и 6, минимальная из них равна 2, и программа также выводит 2.
$$\min(2,4,6)=2$$Первая ошибка находится в строке инициализации minDigit. Если последняя цифра нечётная, начальное значение может помешать корректному поиску минимума. Кроме того, при отсутствии чётных цифр программа может вывести нечётную цифру.
$$minDigit = 10$$Вторая ошибка находится в условии проверки отсутствия чётных цифр. Значение 0 является чётной цифрой, поэтому проверять minDigit == 0 нельзя: в этом случае программа ошибочно выводит NO. После инициализации значением 10 именно 10 будет означать, что чётная цифра не встретилась.
$$if\ minDigit == 10:$$Исправленный фрагмент программы содержит строки minDigit = 10 и if minDigit == 10:. Тогда цифра 0 сохраняется как найденный минимум и корректно выводится, а при отсутствии чётных цифр выводится NO.
$$0\ \text{— найденная цифра},\quad 10\ \text{— признак отсутствия чётных цифр}$$1) 2. 2) Например, 246. 3) Ошибки: minDigit = N % 10 заменить на minDigit = 10; if minDigit == 0: заменить на if minDigit == 10:.
Этот ответ получен в разборе, но не сверен с официальным ключом из банка — проверьте выкладки, прежде чем заучивать результат.
Где здесь ошибаются
Считать, что строка minDigit = N % 10 всегда корректно задаёт начальный минимум.
Предлагать заменить проверку minDigit == 0 на проверку отсутствия цифр, хотя 0 является чётной цифрой.
Указывать только одну ошибку вместо двух.
Приводить полностью новую программу вместо исправления отдельных строк.