На обработку поступает положительное целое число, не превышающее 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)
Хочу задать вопрос по второму пункту задания. Любое трехзначное число в котором старший разряд равен сумме двух младших подойдет? Например, 734, 211, 523.
Мне кажется, что подходят только числа, которые начинаются с 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.