1)
#include <iostream>
using namespace std;
int main()
{
int g, k, n=64;
for (g=0; g<=n; g++)
{
for (k=0; k<=n/2; k++)
{
if (2*g + 4*k == n)
{
printf ("Gycu - %d. \nKpoluk - %d.\n\n", g, k);
}
}
}
return 0;
}
2)#include <iostream>
using namespace std;
long double fact(int N)
{
if(N < 0)
return N;
if (N == 0)
return 1;
else
return N * fact(N - 1);
}
int main()
{
int N, M;
setlocale(0,"");
cout << "N=";
cin >> N;
cout<<"M=";
cin>>M;
cout<<"N!-M!=" << fact(N)-fact(M) << endl << endl;
return 0;
}
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)
В программах на других языках ошибочные строки и их исправления аналогичны.
Незначительной опиской, не влияющей на оценку, следует считать отсутствие знаков и служебных слов после содержательной части исправления.