Przekazanie tablicy jako parametru funkcji.

0

Witam.

Mam do napisania program składający się z 2 funkcji lub procedur,z których jedna wypełnia losowo tablice tworząc macierz kwadratową,a druga kotrzystając z poprzedniej dodaje do siebie sumę dwóch tak utworzonych macierzy i zwraca wynik.

Funkcja wypełniająca macierz była prosta do napisania,jednak mam problem z drugą,otóż jak przekazać tablicę wyrzuconą przez poprzednią funkce do tej dodającej?Znalazłem kilka podobnych tematów,jednak nie dotyczących pascala i nie potrafie tego zaimplementować.Czy znajdzie się ktoś kto wyjaśnił by mi to zagadnienie?

0

Link

0

A te macierze masz statycznego czy dynamicznego rozmiaru? Mógłbyś podać to co już napisałeś - nie trzeba by wszystkiego od początku omawiać... Według mnie użyte powinny być macierze o rozmiarze dynamicznym, więc przykład deklaracji typu takiej tablicy:

type
  TMyArray = array of Integer;

Teraz jej wypełnianie randomowymi liczbami; Możesz do tego celu wykorzystać funkcję, albo procedurę:

function FillArray(): TMyArray;
begin
  SetLength(Result, {rozmiar});
  // wypełnienie losowymi liczbami
end;

procedure FillArray(out AArray: TMyArray);
begin
  SetLength(AArray, {rozmiar});
  // wypełnienie losowymi liczbami
end;

Obie służą do tego samego - różni je jedynie sposób wywołania; W drugiej wersji (w procedurze) użyłem modyfikatora Out, dlatego że zadaniem procedury ma być wpisanie danych do tablicy, a nie ich odczyt; Poniżej przykład wywołania powyższych (wybierz sobie jeden sposób):

var
  LArray: TMyArray;
begin
  LArray := FillArray(); // użycie funkcji
  FillArray(LArray);     // użycie procedury

Funkcja wypełniająca macierz była prosta do napisania,jednak mam problem z drugą,otóż jak przekazać tablicę wyrzuconą przez poprzednią funkce do tej dodającej?

Jeżeli dana funkcja lub procedura ma sumować dwie macierze to znów masz kilka rozwiązań; Albo napisz sobie funkcję, która przyjmuje w parametrach dwie macierze do sumowania, a w rezultacie zwraca macierz wynikową:

function SumArrays(const AFirst, ASecond: TMyArray): TMyArray;

albo napisz sobie procedurę, która w parametrach przyjmie dwie wejściowe macierze do sumowania, a w trzecim parametrze zwróci macierz wynikową:

procedure SumArrays(const AFirst, ASecond: TMyArray; out ADest: TMyArray);

Wybierz co chcesz; W razie czego możesz skorzystać z dwuwymiarowej macierzy dynamicznej (a właściwie to dynamicznej tablicy dynamicznych tablic), jeśli wolisz w ten sposób:

type
  TMyArray = array of array of Integer;
0

Napisałem coś takiego,o ile wszystko się kompiluje,pierwsza funkcja działa to wynikiem dodawania jest macierz z niezrozumiałymi dla mnie liczbami.Najgorsze jest to,że nie widzę tu nigdzie błędu,może ktoś pomoże?Dodaję załącznik z efektem działania

program project1;
 
type
  tab = array[1..3,1..3] of integer;
 
var
 
  tab1,tab2:tab;
  i,j:integer;
 
function createAndFill(i,j:integer):tab;
 
    var
 
    lol:array[0..3,0..3]of integer;
 
  begin
 
    for i:=0 to 3 do
        begin
          for j:=0 to 3 do
              begin
               lol[i,j]:=random(500);
              end;
        end;
 
    for i:=0 to 3 do
        begin
          for j:=0 to 3 do
              begin
                write(lol[i,j],' ');
              end;
              writeln
        end;
  end;
 
function add(tab1,tab2:tab):tab;
 
var
       wow:array[0..3,0..3]of integer;
 
  begin
 
    for i:=0 to 3 do
        begin
          for j:=0 to 3 do
              begin
               wow[i,j]:=tab1[i,j]+tab2[i,j];
              end;
        end;
 
    for i:=0 to 3 do
        begin
          for j:=0 to 3 do
              begin
                write(wow[i,j],' ');
              end;
              writeln
        end;
  end;
 
 
 
 
begin
  i:=0;
  j:=0;
 
   tab1:=createAndFill(i,j);
   writeln();
   tab2:=createAndFill(i,j);
   writeln();
   add(tab1,tab2);
 
 
 
 
  readln();
 
end.
0

trochę pomieszanie z poplątaniem , raz macierz ma rozmiar [0..3] raz [1.3]
problem masz w tym że nie wiadomo co zwraca funkcja "createAndFill", a dokładnie to może zwrócić cokolwiek przypadkowego w tym również macierz wypełnioną zerami .
Zabrakło

result:=...???
0

Oh przepraszam ten fragment [1..3] miał być [0..3] - zwykła literówka

Teraz wszystko działa dziękuję bardzo.Mam tylko jedno pytanie,bo próbowałem zadeklarować result jako nazwa_tablicy[i,j] i wywalało błąd.Dopiero jak zapisałem samo nazwa_tablicy to program zadziałał poprawnie.To znaczy,że jeżeli deklaruje własny typ tablicowy to przy operowaniu na jego zmiennej nie mogę już operować na jego indeksach np [i,j]?

0
program Project2;
{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  tab = array [1 .. 3, 1 .. 3] of integer;

var

  res, tab1, tab2: tab;

procedure displaytab(atab: tab);
var
  i: integer;
  j: integer;
begin
  for i := low(atab) to high(atab) do
  begin
    for j := low(atab[i]) to high(atab[i]) do
    begin
      write(atab[i, j], ' ');
    end;
    writeln
  end;
end;

function createAndFill: tab;

var

  i: integer;
  j: integer;
  lol: tab;
begin

  for i := low(lol) to high(lol) do
  begin
    for j := low(lol[i]) to high(lol[i]) do
    begin
      lol[i, j] := random(500);
    end;
  end;
  result := lol;
end;

function add(tab1, tab2: tab): tab;

var
  wow: tab;
  i: integer;
  j: integer;

begin

  for i := low(tab1) to high(tab1) do
  begin
    for j := low(tab1[j]) to high(tab1[j]) do
    begin
      wow[i, j] := tab1[i, j] + tab2[i, j];
    end;
  end;

  result := wow;
end;

begin
  tab1 := createAndFill;
  displaytab(tab1);
  writeln('');
  tab2 := createAndFill;
  displaytab(tab2);
  writeln('');
  res := add(tab1, tab2);
  displaytab(res);
  readln;

end.
0

"result" musi być typu "tab"
BTW, oddzielaj logikę funkcji i procedur od wizualizacji wyników . Funkcje generujące treść macierzy albo wykonujące na nich operacje (tutaj dodawanie) powinny być odpowiedzialne tylko za to do czego służą i za nic więcej , a sama wizualizacja wyników ("writeln") to już wyższa warstwa aplikacji

0

Tych pętli do wyświetlania w docelowym programi w ogóle nie będzie,służyły mi one tylko jako podgląd tego,co się dzieje w programie.Dziękuję za cenne uwagi;)

0

po małej optymalizacji i usunięciu niepotrzebnych zmiennych "lol" i "wow" tak mogło by to wyglądać:

program Project2;
{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  tab = array [1 .. 3, 1 .. 3] of integer;

var
  res, tab1, tab2: tab;

procedure displaytab(atab: tab);
var
  i: integer;
  j: integer;
begin
  for i := low(atab) to high(atab) do
  begin
    for j := low(atab[i]) to high(atab[i]) do
    begin
      write(atab[i, j], ' ');
    end;
    writeln
  end;
end;

function createAndFill: tab;
var
  i: integer;
  j: integer;
begin
  for i := low(result) to high(result) do
  begin
    for j := low(result[i]) to high(result[i]) do
    begin
      result[i, j] := random(500);
    end;
  end;
end;

function add(tab1, tab2: tab): tab;
var
  i: integer;
  j: integer;
begin
  for i := low(result) to high(result) do
  begin
    for j := low(result[i]) to high(result[i]) do
    begin
      result[i, j] := tab1[i, j] + tab2[i, j];
    end;
  end;
end;

begin
  tab1 := createAndFill;
  displaytab(tab1);
  writeln('');
  tab2 := createAndFill;
  displaytab(tab2);
  writeln('');
  res := add(tab1, tab2);
  displaytab(res);
  readln;

end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1