СДАМ ГИА: РЕШУ ЕГЭ
Образовательный портал для подготовки к экзаменам
Информатика
≡ информатика
сайты - меню - вход - новости


Задания
Версия для печати и копирования в MS Word
Задание 24 № 8112

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

Напоминание: 0 делится на любое натуральное число.

 

 

БейсикPython

DIM N, DIGIT, MAXDIGIT AS LONG

INPUT N

MAXDIGIT = N MOD 10

WHILE N > 0

    DIGIT = N MOD 10

    IF DIGIT MOD 3 = 0 THEN

        IF DIGIT > MAXDIGIT THEN

            MAXDIGIT = DIGIT

        END IF

    END IF

    N = N \ 10

WEND

IF MAXDIGIT = 0 THEN

    PRINT "NO"

ELSE

    PRINT MAXDIGIT

END IF

N = int(input())

maxDigit = N % 10

while N > 0:

    digit = N % 10

    if digit % 3 == 0:

        if digit > maxDigit:

            maxDigit = digit

    N = N // 10

if maxDigit == 0:

    print("NO")

else:

    print(maxDigit)

ПаскальАлгоритмический язык

var N,digit,maxDigit: longint;

begin

    readln(N);

    maxDigit := N mod 10;

    while N > 0 do

    begin

        digit := N mod 10;

        if digit mod 3 = 0 then

            if digit > maxDigit then

                maxDigit := digit;

        N := N div 10;

    end;

    if maxDigit = 0 then

        writeln('NO')

    else

        writeln(maxDigit)

end.

алг

нач

    цел N, digit, maxDigit

    ввод N

    maxDigit := mod(N,10)

    нц пока N > 0

        digit := mod(N,10)

            если mod(digit, 3) = 0 то

            если digit > maxDigit то

                maxDigit := digit

            все

        все

        N := div(N,10)

    кц

    если maxDigit = 0 то

        вывод "NO"

    иначе

        вывод maxDigit

    все

кон

Си++

#include <iostream>

using namespace std;

int main()

{

    int N, digit, maxDigit;

    cin >> N;

    maxDigit = N % 10;

    while (N > 0)

    {

        digit = N % 10;

        if (digit % 3 == 0)

            if (digit > maxDigit)

                maxDigit = digit;

        N = N / 10;

    }

    if (maxDigit == 0)

        cout << "NO";

    else

        cout << maxDigit<< endl;

    return 0;

}

 

 

Последовательно выполните следующее.

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

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

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

1) выпишите строку, в которой сделана ошибка;

2) укажите, как исправить ошибку, т.е. приведите правильный вариант строки.

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

Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.

Решение.

1. В maxDigit изначально запишется 4. При работе программы будет найдена одна цифра, которая делится на 3 — это 3. Но так как она меньше 4, то ответ обновлён не будет и результатом работы программы будет 4.

2. 333. Изначально в maxDigit запишется 3. Чисел, делящихся на 3 и больших, чем 3, нет, поэтому ответ не обновится ни разу за время работы программы и результатом будет 3.

3.

 

Для языка Pascal:

 

Первая ошибка.

Неверная инициализация переменной maxDigit:

maxDigit := N mod 10;

Следует проинициализировать её числом, меньшим нуля, например, -1, что будет означать, что пока в числе не найдена цифра, которая делится на 3:

maxDigit := -1;

 

Вторая ошибка.

0 может быть ответом, поэтому ошибка в строчках:

if maxDigit = 0 then

writeln('NO')

И так как мы условились изначально проинициализировать maxDigit как -1, то именно это значение и стоит использовать для обнаружения отсутствия ответа:

if maxDigit = -1 then

writeln('NO')

 

 

Для языка C:

 

Первая ошибка.

Неверная инициализация переменной maxDigit:

maxDigit = N % 10;

Следует проинициализировать её числом, меньшим нуля, например, -1, что будет означать, что пока в числе не найдена цифра, которая делится на 3:

maxDigit = -1;

 

Вторая ошибка.

0 может быть ответом, поэтому ошибка в строчках:

if (maxDigit == 0)

cout << "NO";

И так как мы условились изначально проинициализировать maxDigit как -1, то именно это значение и стоит использовать для обнаружения отсутствия ответа:

if (maxDigit == -1)

cout << "NO";

Источник: ЕГЭ 05.05.2015. До­сроч­ная волна.