Помогите, пожалуйста, исправить ошибку на 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.