Контрольные тренировочные задания
(решения)
Часть 2
Задание 24
Решение примера 1
На обработку поступает положительное целое число, не превышающее 109. Нужно написать программу, которая выводит на экран сумму цифр этого числа, меньших 7. Если в числе нет цифр, меньших 7, требуется на экран вывести 0. Программист написал программу неправильно. Ниже эта программа для Вашего удобства приведена на пяти языках программирования.
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 456.
2. Приведите пример такого трёхзначного числа, при вводе которого программа выдаёт верный ответ.
3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
2) укажите, как исправить ошибку, т.е. приведите правильный вариант строки.
Достаточно указать ошибки и способ их исправления для одного языка программирования.
Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.
Решение.
Первым делом смотрим в условие задания, а именно, как должна работать программа без ошибок. Программа должна выводить сумму цифр числа, меньших 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 задание 24