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

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

    Бейсик Python
    DIM N, DIGIT, SUM AS LONG
    INPUT N
    SUM = 0
    WHILE N > 0
       DIGIT = N MOD 10
       IF DIGIT < 7 THEN
          SUM = SUM + 1
       END IF
       N = N 10
    WEND
    PRINT DIGIT
    N = int(input())
    sum = 0
    while N > 0:
       digit = N % 10
       if digit < 7:
          sum = sum + 1
       N = N // 10
    print(digit)
    Алгоритмический язык Паскаль
    алг
    нач
       цел N, digit, sum
       ввод N
       sum := 0
       нц пока N > 0
          digit := mod(N,10)
          если digit < 7 то
             sum := sum + 1
          все
          N := div(N,10)
       кц
       вывод digit
    кон

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

    Си
    #include <stdio.h>
    int main()
    {
       int N, digit, sum;
       scanf("%d", &N);
       sum = 0;
       while (N > 0)
       {
          digit = N % 10;
          if (digit < 7)
             sum = sum + 1;
          N = N / 10;
         }
       printf("%d",digit);
       return 0;
    }

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

    Источник: демоверсия ФИПИ по информатике и ИКТ 2016-го года.

    В решении задания есть видеоразбор
  • Решение:

    Первым делом смотрим в условие задания, а именно, как должна работать программа без ошибок. Программа должна выводить сумму цифр числа, меньших 7. Выполним задания последовательно.

    1. Что выведет программа при вводе числа 456.

    Рассмотрим алгоритм.

       readln(N);
       sum := 0;
       while N > 0 do
       begin
          digit := N mod 10;
          if digit < 7 then
             sum := sum + 1;
          N := N div 10;
       end;
       writeln(digit)

    Первая строка — N = 456

    Вторая строка — sum = 0

    Начало цикла

    1-я итерация:

    • digit := 456 mod 10 = 6
    • 6 < 7 — условие выполняется, следовательно sum := sum + 1 = 0 + 1 = 1
    • N := N div 10 = 456 div 10 = 45

    2-я итерация:

    • digit := 45 mod 10 = 5
    • 5 < 7 — условие выполняется, следовательно sum := sum + 1 = 1 + 1 = 2
    • N := N div 10 = 45 div 10 = 4

    3-я итерация:

    • digit := 4 mod 10 = 4
    • 4 < 7 — условие выполняется, следовательно sum := sum + 1 = 2 + 1 = 3
    • N := N div 10 = 4 div 10 = 0

    цикл завершен.

    writeln(digit) — digit в последней итерации равна 4, то есть выводится 4.

    Ответ: 4

     

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

    Пожалуй, самая сложная часть задания. Сначала давайте определим, что вообще выводит неверно написанная программа. Как мы видим, выводится значение digit. В цикле операция digit := N mod 10; выполняется каждый повтор цикла, в последнем повторе переменная digit равна первому (старшему) разряду числа. Проще говоря, мы ввели 456 — программа вывела 4, введём 389 — программа выведет 3.

    Требовалось написать программу, которая выводит сумму цифр числа, меньших 7, то есть мы должны подобрать такое трёхзначное число, чтобы старший разряд этого числа был равен сумме цифр числа, которые меньше 7. Примером может быть, к примеру, число 936 — сумма разрядов, меньших 7 равна 9-ти, на экран выводится старший разряд, то есть 9.

    Ответ: 936

     

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

    Ошибка 1. Каждый повтор цикла при выполнении условия к переменной sum прибавляется единица. Программа должна искать сумму разрядов, а не их количество, то есть к переменной sum должна прибавляться переменная digit. Значит строку

             sum := sum + 1;

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

             sum := sum + digit;

    Ошибка 2. Программа выводит значение переменной digit, должна же выводить значение переменной sum. Заменим строку

       writeln(digit)

    на

       writeln(sum)

    Ответ: sum := sum + 1; -> sum := sum + digit; и writeln(digit) -> writeln(sum)

     

    Видеоразбор задания:

Поделиться:
 
Комментарии (2)
Виталий Александров # 12 июня 2016 в 10:25 0
Хочу задать вопрос по второму пункту задания. Любое трехзначное число в котором старший разряд равен сумме двух младших подойдет? Например, 734, 211, 523.
Jessica Jones # 12 июня 2016 в 18:00 +1
Мне кажется, что подходят только числа, которые начинаются с 7,8,9 (т.к. в последних твоих двух примерах сумма цифр, меньших 7, будет 2+1+1=4 и 5+2+3=10 соответственно, т.е не будут подходить по заданию).
Подходят числа: 963,936,954,945, 862,826,853,835,844, 761,716,752,725,743,734.
Перевести число из в Результат: 510 = 1012