Получил ожидаемое логическое значение LongInt pascal

Я получаю эту ошибку в моем алгоритме сортировки вставками:

insertionsort.lpr(19,17) Ошибка: несовместимые типы: получено "логическое значение", ожидалось "LongInt"

Вот строка 19 моего кода

 while j > 0 and A[j]>key do            

Я пробовал гуглить по всему Интернету, но не смог найти никаких синтаксических ошибок или чего-то еще.

Вот полный код, если поможет:

program instert;
uses crt;
const
  N = 5;
var
   i:integer;
   j:integer;
   key:integer;
   A : Array[1..N] of Integer;


procedure insertionsort;
  begin
  for i := 2 to N  do
    begin
    key := A[1];
    j:= i - 1;
        while j > 0 and A[j]>key do
        begin
          A[j+1] := A[j] ;
          j := j-1;
        end;
    A[j+1] := key ;
   end;
 end;

begin
  A[1]:= 9;
  A[2]:= 6;
  A[3]:= 7;
  A[4]:= 1;
  A[5]:= 2;
  insertionsort;
end.

Я также получаю ту же ошибку в алгоритме пузырьковой сортировки, который я сделал. Вот строка ошибки

bubblesort.lpr(26,14) Ошибка: несовместимые типы: получено "логическое значение", ожидалось "LongInt"

Вот строка 26 моего алгоритма:

 until flag = false or N = 1 ;   

Вот полный код:

program bubblesort;
uses crt;

var
  flag:boolean;
  count:integer;
  temp:integer;
  N:integer;
  A : Array[1..N] of Integer;

procedure bubblesort ;
begin
  Repeat
    flag:=false;
    for count:=1 to (N-1)  do
    begin
    if A[count] > A[count + 1] then
       begin
       temp := A[count];
       A[count] := A[count + 1];
       A[count] := temp;
       flag := true;
       end;
    end;
    N := N - 1;
  until flag = false or N = 1 ;
end;

begin
  A[1]:= 9;
  A[2]:= 6;
  A[3]:= 7;
  A[4]:= 1;
  A[5]:= 2;
  N := 5;
  bubblesort;
end.

person user3730626    schedule 24.01.2015    source источник
comment
Это вопрос приоритета. > имеет более низкий приоритет, чем and, поэтому используйте круглые скобки: while (j > 0) and (A[j]>key) do. Точно так же вам нужно until (flag = false) or (N = 1) ; (или просто until not flag or (N = 1) ;)   -  person lurker    schedule 24.01.2015
comment
См., например, Приоритет операторов Pascal — TutorialsPoint   -  person lurker    schedule 24.01.2015
comment
@lurker спасибо за это, теперь программы работают   -  person user3730626    schedule 24.01.2015
comment
@lurker Кто-то почти так же плох, как и я, что касается ответов в комментариях;)   -  person CodesInChaos    schedule 24.01.2015
comment
@CodesInChaos да, это патология, от которой я страдаю. ;)   -  person lurker    schedule 24.01.2015
comment
@lurker: хочешь написать это как ответ? Это настоящая ловушка, особенно если вы говорите с другого языка.   -  person Jongware    schedule 24.01.2015
comment
@Jongware, я могу сделать это позже сегодня. У меня есть доступ к смартфону только в течение нескольких часов, и здесь сложно дать полный ответ.   -  person lurker    schedule 24.01.2015


Ответы (1)


В Паскале логические операторы and и or имеют более высокий приоритет, чем операторы сравнения >, = и т. д. Итак, в выражении:

while j > 0 and A[j] > key do

Учитывая, что and имеет более высокий приоритет, Паскаль видит это как:

while (j > (0 and A[j])) > key do

0 and A[j] вычисляются как побитовые and (поскольку аргументы являются целыми числами), в результате чего получается целое число. Затем сравнение j > (0 and A[j]) оценивается как логический результат, оставляя проверку того, что с > key, то есть boolean > longint. Затем вы получаете ошибку, что для арифметического сравнения ожидается longint вместо boolean.

Способ исправить это заключается в скобках:

while (j > 0) and (A[j] > key) do ...

Та же проблема относится и к этому утверждению:

until flag = false or N = 1 ;

что приводит к ошибке, потому что or имеет более высокий приоритет, чем =. Таким образом, вы можете заключить в скобки:

until (flag = false) or (N = 1);

Или, более канонично для логических значений:

until not flag or (N = 1);    // NOTE: 'not' is higher precedence than 'or'

Если вы сомневаетесь в приоритете операторов, хорошей идеей будет заключение в скобки, поскольку оно устраняет сомнения в том, в каком порядке будут выполняться операции.

person lurker    schedule 25.01.2015