2. Наименьшие значения A, при которых программа выведет верный ответ, равны 2 и 3.
3. В программе допущена типичная для начинающих программистов ошибка «смещения кадра»: значение переменной K, необходимое при первом выполнении цикла, присваивается до начала цикла, а значение для следующего оборота цикла вычисляется в конце предыдущего оборота. В результате, при завершении цикла K имеет значение больше, чем нужно. Вторая ошибка – неверный шаг изменения K. «Идеальная» программа решения этой задачи должна выглядеть так (приведён пример на языке Бейсик):
DIM A,S,K AS INTEGER
INPUT A
S = 0
K = −1
WHILE S <= A
K = K + 2
S = S + K*(K+1)
WEND
PRINT K
END
Но по условиям задания менять местами строки нельзя, их можно только исправлять. Поэтому, кроме исправления шага, приходится корректировать значение K при выводе. Пример исправления для языка Паскаль:
Первая ошибка:
k := k+1;
Исправленная строка:
k := k+2
Вторая ошибка:
writeln(k)
Исправленная строка:
writeln(k-2)
В программах на других языках ошибочные строки и их исправления аналогичны.
Незначительной опиской, не влияющей на оценку, следует считать отсутствие знаков и служебных слов после содержательной части исправления.
begin var d:=ReadlnString('Вас приветствует программа, которая может делить '+'два числа с остатком. Напишите свое имя'); Writeln('Здравствуйте, ',d,'!');
repeat Writeln('Как нужно написать ответ?',#13#10,'1 вариант. 5: 3 = 1(ост.2)',#13#10,'2 вариант. 5 = 3*1 + 2',#13#10,'0 - завершить работу'); var c:char; Repeat c:=ReadlnChar('Введите 0, 1 или 2:'); case c of '0': exit; '1','2':break; end; until False; var a,b:BigInteger; if not BigInteger.TryParse(ReadlnString('Введите целочисленное делимое:'),a) then begin Writeln('Вы ввели неверное значение. Работа завершена'); Exit end; if not BigInteger.TryParse(ReadlnString('Введите целочисленный делитель:'),b) then begin Writeln('Вы ввели неверное значение. Работа завершена'); Exit end; if integer(b)=0 then {приведение к типу Integer. Менее абстрактно, чем BigInteger} begin writeln('Вы ввели неверное значение.'); exit end; if c='1' then WritelnFormat('{0}:{1}={2}(ост.{3})',a,b,a div b,a mod b) else WritelnFormat('{0}={1}*{2}+{3}',a,b,a div b,a mod b); var f:char; Repeat f:=ReadlnChar('Если вы хотите завершить работу, введите "0", если продолжить - любую букву.'); case f of '0': exit; else break; end; until False; until False end.
1. При вводе числа 15 программа выведет число 4.
2. Наименьшие значения A, при которых программа выведет верный ответ, равны 2 и 3.
3. В программе допущена типичная для начинающих программистов ошибка «смещения кадра»: значение переменной K, необходимое при первом выполнении цикла, присваивается до начала цикла, а значение для следующего оборота цикла вычисляется в конце предыдущего оборота. В результате, при завершении цикла K имеет значение больше, чем нужно. Вторая ошибка – неверный шаг изменения K. «Идеальная» программа решения этой задачи должна выглядеть так (приведён пример на языке Бейсик):
DIM A,S,K AS INTEGER
INPUT A
S = 0
K = −1
WHILE S <= A
K = K + 2
S = S + K*(K+1)
WEND
PRINT K
END
Но по условиям задания менять местами строки нельзя, их можно только исправлять. Поэтому, кроме исправления шага, приходится корректировать значение K при выводе. Пример исправления для языка Паскаль:
Первая ошибка:
k := k+1;
Исправленная строка:
k := k+2
Вторая ошибка:
writeln(k)
Исправленная строка:
writeln(k-2)
В программах на других языках ошибочные строки и их исправления аналогичны.
Незначительной опиской, не влияющей на оценку, следует считать отсутствие знаков и служебных слов после содержательной части исправления.
begin
var d:=ReadlnString('Вас приветствует программа, которая может делить '+'два числа с остатком. Напишите свое имя');
Writeln('Здравствуйте, ',d,'!');
repeat
Writeln('Как нужно написать ответ?',#13#10,'1 вариант. 5: 3 = 1(ост.2)',#13#10,'2 вариант. 5 = 3*1 + 2',#13#10,'0 - завершить работу');
var c:char;
Repeat
c:=ReadlnChar('Введите 0, 1 или 2:');
case c of
'0': exit;
'1','2':break;
end;
until False;
var a,b:BigInteger;
if not BigInteger.TryParse(ReadlnString('Введите целочисленное делимое:'),a) then
begin
Writeln('Вы ввели неверное значение. Работа завершена');
Exit
end;
if not BigInteger.TryParse(ReadlnString('Введите целочисленный делитель:'),b) then
begin
Writeln('Вы ввели неверное значение. Работа завершена');
Exit
end;
if integer(b)=0 then
{приведение к типу Integer. Менее абстрактно, чем BigInteger}
begin
writeln('Вы ввели неверное значение.');
exit
end;
if c='1' then WritelnFormat('{0}:{1}={2}(ост.{3})',a,b,a div b,a mod b)
else
WritelnFormat('{0}={1}*{2}+{3}',a,b,a div b,a mod b);
var f:char;
Repeat
f:=ReadlnChar('Если вы хотите завершить работу, введите "0", если продолжить - любую букву.');
case f of
'0': exit;
else break;
end;
until False;
until False
end.