На обработку поступает последовательность из четырёх целых чисел. Нужно написать программу, которая выводит на экран количество положительных чисел последовательности и их сумму. Если положительных чисел нет, требуется вывести на экран «NO». Известно, что вводимые числа по абсолютной величине не превышают 100. Краб был слишком увлечен поеданием песка и написал программу с ошибками. Ниже эта программа для Вашего удобства приведена на трех языках программирования.
\[\begin{array}{|l|l|l|} \hline \text{C++}&\text{Python}&\text{Pascal}\\ \hline \#include<iostream>&count=0&var\;count,\;sum,\; x,\; i: \; integer;\\ using \; namespace \; std;&sum=0&begin\\ int \; main()\;\{&for \; i \; in \; range \; (1, \; 5):&\quad count:=0;\\ \quad int \; count=0, \; sum=0, \; x, \; i;&\quad x=x(input())&\quad sum:=0;\\ \quad for \; (i=1;\;i<=4;\;i++) \; \{ &\quad if \; x<0:&\quad for\;i:=1\;to\;4\;do\\ \quad \quad cin >> x;&\quad \quad count=count+1&\quad begin\\ \quad \quad if \; (x<0) \; \{&\quad \quad sum=sum+count&\quad \quad readln(x);\\ \quad \quad \quad count++;&if\;count==0:&\quad \quad if\;(x<0)\; then \; begin\\ \quad \quad \quad sum=sum+count; \; \} &\quad print\text{('NO')}&\quad \quad \quad count:=count+1;\\ \quad \quad \}&else:&\quad \quad \quad sum:=sum+count;\\ \quad if \; (count==0)&\quad print(count)&\quad \quad end;\\ \quad \quad cout<<\text{"NO"\ };&\quad print(sum)&\quad end;\\ \quad else&&\quad if \; (count=0)\; then\\ \quad \quad cout<<count<<endl<<sum;&&\quad \quad write\text{('NO')}\\ \quad return \; 0;&&\quad else\\ \quad \} &&\quad begin\\ &&\quad \quad writeln(count);\\ &&\quad \quad writeln(sum);\\ &&\quad end;\\ &&\quad end.\\ \hline \end{array}\]
Выполните следующие задания:
1. Напишите, что выведет эта программа при вводе последовательности 0, 2, 1, -1.
2. Приведите пример такой последовательности, содержащей хотя бы одно положительное число, что, несмотря на ошибки, программа печатает правильный ответ.
3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
2) укажите, как исправить ошибку, т.е. приведите правильный вариант строки.
Достаточно указать ошибки и способ их исправления для одного языка программирования. Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.
1. Запоминаем начальные значения переменных \(count\) и \(sum\). Заходим в цикл, подставляем \(x=0\). Так как 0 не меньше 0, программа не зайдет в цикл.
Далее подставляем \(x=2\). Так как 2 не меньше 0, программа не зайдет в цикл.
Подставляем \(x=1\). Так как 1 не меньше 0, программа не зайдет в цикл.
Подставляем \(x=-1\). Так как \(-1<0\), увеличиваем значение переменной \(count\) и добавляем его к значению \(sum\).
Далее идет проверка значения переменной \(count\), поскольку у нас \(count=1\), программа выведет значение \(count\) и \(sum\) на экран:
1
1
2. По условию необходимо найти сумму положительных чисел последовательности. Программа с ошибками ищет количество отрицательных чисел, поэтому, чтобы получить верное значение переменной \(count\), необходимо сравнять количество положительных и отицательных чисел. Тогда возьмем два положительных и два отрицательных числа. Программа Краба находит не просто сумму отрицательных чисел, а сумму \(count\) после нахождения каждого отрицательного числа в последовательности. Значит, при нахождении первого отрицательного числа \(sum\) станет равна 1, а после нахождения второго отрицательного \(sum\) будет равна 3. Таким образом получаем, что последовательность может иметь вид -1, -1, 1, 2, где вместо первых двух элементов можно поставить любые отрицательные числа.
3. В первую очередь необходимо заметить, что по условию задачи требуется находить положительные числа, а программа, написанная Крабом, находит отрицательные числа. То есть ошибка находится в строчке с первым оператором “if”.
Исправим на языке C++:
Ошибочная строка: if (\(x<0\)) {
Исправленная строка: if (\(x>0\)) {
Исправим на языке Python:
Ошибочная строка: if \(x<0:\)
Исправленная строка: if \(x>0:\)
Исправим на языке Pascal:
Ошибочная строка: if (\(x<0\)) then begin
Исправленная строка: if (\(x>0\)) then begin
Еще одной ошибкой в программе является вычисление перменной \(sum\). Мы должны суммировать именно значения самих положительных \(x\), а не их количество.
Исправим на языке C++:
Ошибочная строка: \(sum=sum+count\);
Исправленная строка: \(sum=sum+x\);
Исправим на языке Python:
Ошибочная строка: \(sum=sum+count\)
Исправленная строка: \(sum=sum+x\)
Исправим на языке Pascal:
Ошибочная строка: \(sum:=sum+count;\)
Исправленная строка: \(sum:=sum+x;\)
Ответ: См. решение