Задание 2. Тип заданий 24: поиск ошибок.
  • Задание:

    На обработку поступает положительное целое число, не превышающее 109. Нужно написать программу, которая выводит на экран количество разрядов числа, имеющих четные значения. Программист написал программу неправильно. Ниже эта программа приведена на языке Pascal:

    Паскаль

    var N, digit, sum: longint;
    begin
       readln(N);
       sum := 1;
       while N > 0 do
       begin
          digit := N mod 10;
          if digit mod 2 = 0 then
             sum := sum + digit;
          N := N div 10;
       end;
       writeln(sum)
    end.

    Последовательно выполните следующее.
    1. Напишите, что выведет эта программа при вводе числа 128.
    2. Приведите пример такого трёхзначного числа, при вводе которого программа выдаёт верный ответ.
    3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
         1) выпишите строку, в которой сделана ошибка;
         2) укажите, как исправить ошибку, т.е. приведите правильный вариант строки.
    Достаточно указать ошибки и способ их исправления для одного языка программирования.
    Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.

  • Решение:

    Для решения таких заданий очень важно понимать, как должна выглядеть правильно написанная программа. Давайте разберёмся.

    В программу вводится число N. Далее проверяется каждый разряд числа, и если он кратен 2, то значение переменной sum должно увеличиваться на 1.

    Выполним задания последовательно.

    1. Напишите, что выведет эта программа при вводе числа 128.

    Переменная sum изначально равна 1. Рассмотрим каждый повтор цикла:

    1 повтор цикла:

    digit := n mod 10 = 128 mod 10 = 8

    условие digit mod 2 = 0 выполняется, к переменной sum прибавляется значение digit, то есть sum := 1 + 8 = 9

    N := N div 10 = 128 div 10 = 12

    2 повтор цикла:

    digit := n mod 10 = 12 mod 10 = 2

    условие digit mod 2 = 0 выполняется, к переменной sum прибавляется значение digit, то есть sum := 9+2 = 11

    N := N div 10 = 12 div 10 = 1

    3 повтор цикла:

    digit := n mod 10 = 1 mod 10 = 1

    условие digit mod 2 = 0 не выполняется

    N := N div 10 = 1 div 10 = 0

    Цикл завершен, на экран вывелось значение sum, то есть 11.

    Ответ: 11

    2. Приведите пример такого трёхзначного числа, при вводе которого программа выдаёт верный ответ.

    Разберемся, как на самом деле работает программа. Во-первых, переменная sum изначально равна 1, во-вторых, к sum прибавляются все четные цифры числа. То есть мы должны найти такое число, количество четных разрядов которого равно сумме четных разрядов +1. Казалось бы, задача невыполнимая, но не стоит забывать, что цифра 0 четна, и мы можем её использовать в числе.

    Нам нужно трёхзначное число, значит максимальный результат, который может быть выведен при его вводе — 3, то есть все разряды должны быть четные. Для этого отлично подходит число 200, так как 1+2+0+0 = 3, и число 200 содержит ровно три четных разряда.

    Ответ: 200

    3. Найдите все ошибки в этой программе.

    Так как мы ищем количество, то переменная sum изначально должна быть равна 0, а не 1. То есть строку

       sum := 1;

    нужно заменить на

       sum := 0;

    Так как мы ищем количество, то каждый раз, когда выполняется условие, переменная должна увеличиваться на 1, а не на разряд числа. То есть строку

       sum := sum + digit;

    нужно заменить на

       sum := sum + 1;

    Ответ:

    sum := 1; ===> sum := 0;

    sum := sum + digit; ===> sum := sum + 1;

Поделиться:
 
Комментарии (2)
Anastasiia Kuleshova # 27 апреля 2016 в 16:35 0
Здравствуйте!
Подскажите, ответом на второй вопрос может быть число 190?
Информатик БУ # 30 апреля 2016 в 18:33 +1
Да. Условие выполнится при digit=0, и прибавится 0, то есть sum останется равна 1 и будет выведена 1.
0 - четная цифра.
Перевести число из в Результат: 510 = 1012