Задача 24
На обработку поступает натуральное число, не превышающее 109. Нужно написать программу, которая выводит на экран минимальную чётную цифру этого числа. Если в числе нет чётных цифр, требуется на экран вывести «NO». Программист написал программу неправильно. Ниже эта программа для Вашего удобства приведена на нескольких языках программирования.
Последовательно выполните следующее:
1. Напишите, что выведет эта программа при вводе числа 231.
2. Приведите пример такого трёхзначного числа, при вводе которого приведённая программа, несмотря на ошибки, выдаёт верный ответ.
3. Найдите допущенные программистом ошибки и исправьте их. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.
Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
2) укажите, как исправить ошибку, т.е. приведите правильный вариант строки. Известно, что в тексте программы можно исправить ровно две строки так, чтобы она стала работать правильно.
Достаточно указать ошибки и способ их исправления для одного языка программирования.
Обратите внимание на то, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения.
Выполним программу для заданного числа 231, записывая записывая ход выполнения программы в таблицу:
N | minDigit | Условие | digit | Вывод | |
readln(N); | 231 | ||||
minDigit:=N mod 10; | 1 | ||||
while N > 0 | да | ||||
digit:=N mod 10; | 1 | ||||
if digit mod 2 = 0 then | нет | ||||
N:=N div 10 | 23 | ||||
while N > 0 | да | ||||
digit:=N mod 10; | 3 | ||||
if digit mod 2 = 0 then | нет | ||||
N:=N div 10 | 2 | ||||
while N > 0 | да | ||||
digit:=N mod 10; | 2 | ||||
if digit mod 2 = 0 then | да | ||||
if digit < minDigit then | нет | ||||
N:=N div 10 | 0 | ||||
while N > 0 | нет | ||||
if minDigit = 0 then | нет | ||||
writeln(minDigit) | 1 |
Ответ на первый вопрос:
При вводе числа 231, программа выведет число 1.
При ручной прокрутке мы увидели неправильную инициализацию переменной:
minDigit:= N mod 10;
Вместе с тем, неверно производится проверка отсутствия четных чисел:
if minDigit = 0 then
Соответственно, программа будет выдавать верный ответ, если вводимое число не содержит 0 (хотя 0 - четное число!), содержит хотябы одну четную цифру и наименьшая четная цифра числа не больше младшей (крайней правой) цифры числа или стоит последней.
Ответ на второй вопрос:
Программа выведет правильный ответ при вводе числа 128.
Неверные строки мы уже выявили, теперь необходимо определиться как их исправить.
Напомню, что рассматриваем мы четные цифры десятичного числа: 0, 2, 4, 6, 8. Именно среди этих цифр, присудствующих в исходном числе, программа выбирает минимальное значение.
В качестве первоначального максимума принято назначаеть предыдущее значение перед самым возможным малым числом (в зависимости от контекста задачи). А в качестве минимума — напротив, следующее после самого большого возможного числа.
В нашем случае максимально возможное четное число - 8, такмим образом переменная minDigit может быть инициализованная с любым значением большим 8.
Теперь разберемся с проверкой отсутствия четных цифр в числе. В данном случае логика проверки такова: если значение переменной minDigit осталось неизменным, это означает, что четные цыфры в числе отсутствуют и необходимо вывести "NO", в противном случае вывести значение пременной minDigit.
Ответ на третий вопрос:
В программе есть две ошибки.
Первая ошибка. Строка с ошибкой:
minDigit := N mod 10;
Верное исправление:
minDigit := 9;
Примечание: Вместо 9 может быть использовано любое число, болше 8.
Вторая ошибка. Строка с ошибкой:
if minDigit = 0 then
Ворное исправление:
if minDigit = 9 then
Примечание: Вместо 10 может быть другое число, большее 8, которое было положено в minDigit при исправлении первой ошибки, или проверка, что minDigit > 8.
Ответ на это задание должен быть записан следующим образом:
1. Программа выведет число 1.
2. Программа выведет правильный ответ для числа 128.
3. В программе есть две ошибки.
Первая ошибка. Строка с ошибкой:
minDigit := N mod 10;
Верное исправление:
minDigit := 9;
Вторая ошибка. Строка с ошибкой:
if minDigit = 0 then
Ворное исправление:
if minDigit = 9 then
Обратите внимание на то, что в ответе ниче лишнего писать не нужно. Ответ должен быть представлен так, как это это представлено выше.
Также стоит отметить, что название и версия языка программирования указывается только в том случае, если программа представлена на языке, отличном от предложенных в задании (Бейсик, Python, Алгоритмический язык, Паскаль, С++).
Подробная информация о четности нуля вы найдете здесь.