Требовалось написать программу, при выполнении которой с клавиатуры считывается натуральное число x, не превосходящее 1000, и выводится количество единиц в двоичной записи этого числа. Программист торопился и написал программу неправильно. (Ниже для Вашего удобства программа представлена на пяти языках программирования.)
| Бейсик | Python |
|---|---|
INPUT x cnt = 0 WHILE x > 0 cnt = cnt + 1 x = x MOD 2 WEND PRINT cnt END
| x = int(input()) cnt = 0 while x > 0: cnt = cnt+1 x = x % 2 print(cnt)
|
| Паскаль | Алгоритмический язык |
var x,cnt: integer; begin readln(x); cnt := 0; while x > 0 do begin cnt:=cnt + 1; x := x mod 2 end; writeln(cnt) end.
| алг нач цел x, cnt ввод x cnt := 0 нц пока x > 0 cnt := cnt+1 x := mod(x, 2) кц вывод cnt кон |
| Си++ | |
#include <iostream> using namespace std; int main() { int x,cnt; cin >> x; cnt = 0; while (x > 0) { cnt = cnt + 1; x = x % 2; } cout « cnt « endl; }
| |
Последовательно выполните следующее:
1. Напишите, что выведет эта программа при вводе числа 6.
2. Приведите пример такого числа x, что, несмотря на ошибки, программа печатает правильный ответ.
3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
2) укажите, как исправить ошибку, т. е. приведите правильный вариант строки.
Достаточно указать ошибки и способ их исправления для одного языка программирования. Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.
Решение использует запись программы на Паскале. Допускается использование программы на четырех других языках.
1. Программа выведет число 1.
2. Замечание для проверяющего: Программа напечатает правильный ответ при x, равном натуральной степени двойки. Т. е. при x= 2; 4; 8; 16; 32; 64; 128; 512. Любое из этих значений является правильным ответом на п.2.
3. Первая ошибка. Неверный подсчет количества цифр. Программа считает все значащие цифры, а не только единицы.
Строка с ошибкой:
cnt:=cnt + 1;
Возможный вариант исправления:
cnt:=cnt + x mod 2;
4. Вторая ошибка. Неверная обработка числа x в цикле. Строка с ошибкой:
x := x mod 2;
Возможный вариант исправления:
x := x div 2;

