Почему транспонированная матрица не выполняется? (Свободный Паскаль)

Я делаю программу, для которой мне нужна подпрограмма, которая вычисляет транспонированную матрицу любой одной матрицы. Я не понимаю, какая часть кода неверна. Скомпилируйте, но верните ту же матрицу без каких-либо изменений:

procedure Traspuesta (var tablero : TipoTablero);
var i,j:Integer;
    aux:TipoCelda;
begin 
  for i:=1 to MAXTablero do
    for j:=1 to MAXTablero do
    begin
      if (i<>j) then
      begin 
        aux:=tablero[i,j];
        tablero[i,j]:=tablero[j,i];
        tablero[j,i]:=aux;
     end;
   end;     
end;

0
задан 17.11.2016, 15:25
2 ответа

замени

for j:=1 to MAXTablero do

из-за

for j:=1 to MAXTablero-i+1 do

так как с твоим вычислением ты получаешь transpuesta transpuesta ((M^T) ^T) а именно, тот же массив

2
ответ дан 24.11.2019, 12:35

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

Раньше, важно замечать, что pascal у него нет действительно способа объявлять динамический массив более чем одного размера, хотя ты действительно можешь объявлять переменную типа array of array of. Я основываюсь на этом ответе Андреаса Реджбранд в StackOverflow на Английском языке, чтобы строить динамический массив 2 размеров.

Чтобы тестировать программу, тот же самый строит массив целых чисел 2x4, transpone и печатает ее. Хотя пример сделан с целыми числами, идея функционировала бы с любым типом информации. В самом деле, в delphi или другой паскаль с опорой для Generics, было бы возможно писать характерный класс, который осуществлял бы алгоритм и мог instanciarse потом с элементами любого типа информации.

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

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  T2DIntArray = array of array of Integer;


procedure ArrSetLength(var Arr: T2DIntArray; X, Y: Integer);
var
  I: Integer;
begin
  SetLength(Arr, X);
  for I := Low(Arr) to High(Arr) do
    SetLength(Arr[I], Y);
end;

procedure PrintArray(const Arr: T2DIntArray);
var
  I, J: Integer;
begin
  Writeln;
  for I := Low(Arr) to High(Arr) do
  begin
    for J := Low(Arr[I]) to High(Arr[I]) do
      Write(Arr[I][J]:4);
    Writeln;
  end;
end;

procedure Transponer(const Arr: T2DIntArray; var ArrT: T2DIntArray);
var
  I, J: Integer;
  Temp: Integer;
begin
  ArrSetLength(ArrT, Length(Arr[0]), Length(Arr));
  for I := Low(Arr) to High(Arr) do
    for J := 0 to High(Arr[I]) do
    begin
      ArrT[J, I] := Arr[I, J];
    end;
end;

var
  X, XT: T2DIntArray;
begin
  try
    ArrSetLength(X, 2, 4);
    X[0][0] := 1;
    X[0][1] := 2;
    X[0][2] := 3;
    X[0][3] := 4;
    X[1][0] := 5;
    X[1][1] := 6;
    X[1][2] := 7;
    X[1][3] := 8;
    PrintArray(X);
    Transponer(X, XT);
    Writeln;
    PrintArray(XT);
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Произведенный вывод этот:

   1   2   3   4
   5   6   7   8


   1   5
   2   6
   3   7
   4   8

Редактирование: Совместимый FreePascal

Только что я понимаю, что код, удвоенный в моем первоначальном ответе не составляет с free-паскалем, только с Дельфи. Здесь оставила версия, что, если он составляет с free-паскалем:

program Project1;
uses
  SysUtils;

type
  TIntArray = array of Integer;
  T2DIntArray = array of TIntArray;

procedure ArrSetLength(var Arr: T2DIntArray; X, Y: Integer);
var
  I: Integer;
begin
  SetLength(Arr, X);
  for I := Low(Arr) to High(Arr) do
    SetLength(Arr[I], Y);
end;

procedure PrintArray(const Arr: T2DIntArray);
var
  I, J: Integer;
begin
  Writeln;
  for I := Low(Arr) to High(Arr) do
  begin
    for J := Low(Arr[I]) to High(Arr[I]) do
      Write(Arr[I][J]:4);
    Writeln;
  end;
end;

procedure Transponer(const Arr: T2DIntArray; var ArrT: T2DIntArray);
var
  I, J: Integer;
  Temp: Integer;
begin
  ArrSetLength(ArrT, Length(Arr[0]), Length(Arr));
  for I := Low(Arr) to High(Arr) do
    for J := 0 to High(Arr[I]) do
    begin
      ArrT[J, I] := Arr[I, J];
    end;
end;

var
  X, XT: T2DIntArray;
begin
    ArrSetLength(X, 2, 4);
    X[0][0] := 1;
    X[0][1] := 2;
    X[0][2] := 3;
    X[0][3] := 4;
    X[1][0] := 5;
    X[1][1] := 6;
    X[1][2] := 7;
    X[1][3] := 8;
    PrintArray(X);
    Transponer(X, XT);
    Writeln;
    PrintArray(XT);
    Readln;
end.

Ты можешь давать ему взгляд выполнению в ideone

Приветствие.

1
ответ дан 24.11.2019, 12:35