Нельзя преобразовать тип real к integer с функцией синуса

Условие задачи: Определить количество тех членов последовательности Ak=SIN(K`2+C), K=1,2,….,10, которые удовлетворяют условию 0≤AK≤1/2.

   var
      K : array [1..10] of real;
      C : real;
      SUM : integer;
      a : real;
    begin
      for var i := 1 to 10 do
      begin
        read(K[i]);
        read(C);
        a := Sin((power(K[i],2))+C);
        if a >= 0 and a <= 0.5 then
          SUM += 1        
      end;
      writeln(SUM)
    end.

Не могу понять откуда берётся этот integer, который я нигде не объявляю. Что не так с этим кодом?


Ответы (2 шт):

Автор решения: beltz

Нужно просто добавить скобки в условии

if (a >= 0) and (a <= 0.5) then
→ Ссылка
Автор решения: Герман Борисов

Ошибка происходит при попытке вычислить выражение if'а a >= 0 and a <= 0.5

Порядок действий слева направо:

  1. >=
  2. and
  3. <=

После первого действия получаем результат типа Boolean

Дальше идёт попытка вычислить and между булевым результатом и a.

В pascal оператор and имеет два разных действия:

  • между двумя Boolean - логическое «И»
  • между целочисленными типами - побитовое «И».

Так как a - не Boolean, то идет попытка применить побитовое «И». Boolean легко преобразуется в Integer, а вот при попытке преобразовать a к Integer получаем ошибку из заголовка.

Решение - явно задать порядок действий правильной расстановкой скобок: (a >= 0) and (a <= 0.5)

→ Ссылка