Помогите, пожалуйста, исправить ошибку на Pascal

Задание: Описать функцию, возвращающую количество перемен знака в вещественном векторе длины 20. Использовать эту функцию для нахождения всех номеров строк с максимальным числом перемен знака в заданных вещественных матрицах А и B размерностью 10х20 и 20х20 соответственно.

Мой код-решение:

program SignChanges;

const
  arr_size = 20;
  
type
  arr = array[1..arr_size] of Real;
  
// Функция, возвращающая количество перемен знака в вещественном векторе
function countSignChanges(a: arr): Integer;
var
  i, count: Integer;
begin
  count := 0;
  for i := 1 to arr_size - 1 do
  begin
    if ((a[i] > 0) and (a[i + 1] < 0)) or ((a[i] < 0) and (a[i + 1] > 0)) then
      count:= count + 1;
  end;
  Result := count;
end;

var
  A: array[1..10, 1..20] of Real;
  B: array[1..20, 1..20] of Real;
  i, j, maxChanges, changes: Integer;

begin
  // Инициализируем матрицы А и B с помощью циклов
  for i := 1 to 10 do
    for j := 1 to 20 do
      A[i, j] := i * j; // пример инициализации элементов матрицы А

  for i := 1 to 20 do
    for j := 1 to 20 do
      B[i, j] := i * j; // пример инициализации элементов матрицы B

  // Выводим матрицы на экран
  WriteLn('Матрица А:');
  for i := 1 to 10 do
  begin
    for j := 1 to 20 do
      Write(A[i, j]:5:2, ' ');
    WriteLn;
  end;

  WriteLn;

  WriteLn('Матрица B:');
  for i := 1 to 20 do
  begin
    for j := 1 to 20 do
      Write(B[i, j]:5:2, ' ');
    WriteLn;
  end;

  // Находим все номера строк с максимальным числом перемен знака
  maxChanges := 0;
  for i := 1 to 10 do
  begin
    changes := countSignChanges(A[i]);
    if changes > maxChanges then
    begin
      maxChanges := changes;
      WriteLn('Строка ', i, ', в матрице A максимальное кол-во смен знака: ', maxChanges);
    end;
  end;

  for i := 1 to 20 do
  begin
    changes := countSignChanges(B[i]);
    if changes > maxChanges then
    begin
      maxChanges := changes;
      WriteLn('Строка ', i, ', в матрице B максимальное кол-во смен знака: ', maxChanges);
    end;
  end;
end.

Выдаёт ошибку: "Program1.pas(62) : Нельзя преобразовать тип real к array [1..20] of real". Надеюсь, что больше ошибок нет. Помогите, пожалуйста, ее исправить!


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

Автор решения: RAlex
// PascalАВС.NЕТ 3.8.3
function countSignChanges(a: array of real) :=
  a.PairWise.Count(\(x, y) -> x * y < 0);

begin
  var a := new real[10, 20];
  var b := new real[20, 20];
  for var i := 0 to a.RowCount - 1 do
    for var j := 0 to a.ColCount - 1 do
      a[i, j] := Round(Random(-9.0, 9.0), 1);
  a.Println(5,1);
  var c := a.Rows.Select(row -> countSignChanges(row)).ToArray;
  var mx := c.Max;
  Print('Максимальное количество перемен знака в строках:');
  c.Numerate.Where(\(i, v) -> v = mx).Select(\(i, v) -> i).Println; 
  Writeln;
  for var i := 0 to b.RowCount - 1 do
    for var j := 0 to b.ColCount - 1 do
      b[i, j] := Round(Random(-9.0, 9.0), 1);
  b.Println(5,1);
  c := b.Rows.Select(row -> countSignChanges(row)).ToArray;
  mx := c.Max;
  Print('Максимальное количество перемен знака в строках:');
  c.Numerate.Where(\(i, v) -> v = mx).Select(\(i, v) -> i).Print
end.
→ Ссылка