Почему когда я ввожу положительные и отрицательные число, программа пишет, что нет отрицательных чисел либо положительных. Помогите пожалуйста это исправить

Приложения:

BobbyFresnel: Косвенная причина Вашей ошибки в том, что Вы не выполнили рекомендацию (предупрежденние) компилятора PascalABC.NET по поводу того, что параметр цикла нужно описываеть в его заголовке, т.е. не выносить в описание var i: integer, а писать for var i := ...
BobbyFresnel: Тогда компилятор указал бы Вам место и причину ошибки: переменная i не определена в операторе if a[i] > 0. А сейчас у Вас цикла нет, пременная i определена за пределами цикла for и ее значение в PascalABC.NET равно последнему в цикле, т.е. n. Поэтому Ваша программа работает с a[n], в Ващем примере n = 6, проверяется if a[6] > 0, a[6] у Вас -3, программа идет по ветке else фэ6
BobbyFresnel: По ветке else a[6] < 0, k остается равным нулю... ну дальше по тексту.
BobbyFresnel: На самом деле, не нужно писать в PascalABC.NET старые коды ТурбоПаскаль образца 1983 года. Не потому, что компилятор как-то по-другому их обрабатывает, просто с тех пор программирование "подросло" и технологии научились быть к пользователю более дружественными.
BobbyFresnel: Появились рекомендации, как упростить поиск ошибок. Один из приемов - описывать в заголовке цикла собственную переменную посредством var - она будет локальна в этом цикле. Второй - не выносить описание var за пределы основного блока программы begin ... end. Переменные описывать посредством var там, где они нужны в первый раз.
BobbyFresnel: begin
var n := ReadInteger('Введите число элементов:');
var a := ReadArrInteger('Введите массив:', n);
var (s, c, k, h) := (1.0, 0.0, 0, 0);
for var i := 0 to n - 1 do
if a[i] > 0 then
begin
s *= Sin(a[i]);
k += 1
end
else if a[i] < 0 then
begin
c += Cos(a[i]);
h += 1
end;
if k > 0 then
Writeln(...)
else
Writeln(...);
if h > 0 then
Writeln(...)
else
Writeln(...);
end.
BobbyFresnel: Примерно так может выглядеть современное решение задачи

Ответы

Ответ дал: Ziorar
1

Для цикла ввода элементов массива не указаны начало и конец (begin - end).

Из за этого, в процессе ввода элементов не выполняются их проверки и не считаются суммы и произведения.

Получается, проверки выполняются только один раз- после завершения цикла ввода элементов, и какое число было последним (положительное или отрицательное)- для него и посчитается синус либо косинус.


BobbyFresnel: Это не так. В цикле ввода выполняется только один оператор Read, поэтому в блоке begin ... end нет нужды. Ошибка тут в другом.
BobbyFresnel: Собственено, я все написал в комментарии к вопросу
Вас заинтересует