Tablica jednowymiarowa. Przekazywanie indeksu do funkcji poprzez parametr.

0

Witam. Próbowałem w Free Pascalu IDE utworzyć procedurę, która:

  • wypełnia losowymi liczbami dwie tablice
    Co mnie cieszy chyba dobrze zrobiłem.
 writeln('Tablica pierwsza: ');
randomize;
for i:=1 to 10 do
begin
t[i]:=Random(101);
writeln(t[i]);
end;
writeln('Tablica druga: ');
for i:=1 to 10 do
begin
t1[i]:=Random(101);
writeln(t[i]);
end; 
  • Funkcja, która ma zliczać dwie poprzednie tablice i zapisywać w trzeciej. I niestety tu się zaczynają schodki.
 function nazwa(t[i]:tablica; t1[i]:tablica1; var t2[i]:tablica);
begin
t2[i]:=t[i]+t1[i];
end; 

Kompilator wywala błąd przy t[i]:tablica; chciał : a ma [. Czy będzie poprawne jak zwyczajnie przez parametry przekaże tablice + tablice 1.Dodam element 1 z tablicy + element 1 z tablicy 1 i zapisze je w elemencie 1 na tablicy 2 i przejdę do następnego ? Tablica i tablica1 jeden będzie poprzez wartość przekazana a tablica2 poprzez zmienną. Czy takie rozwiązanie jest prawidłowe ?

  • oraz prezentowanie wyników, które wydaje mi się poprawne
for i:=1 to 10 do
begin
nazwa(t[i],t1[i],t2[i]);
Writeln('Wynik z dodawnie elementu ',i,' z tablicy pierwszej plus element ',i,' wynosi: ',t2[i]);
end;

A to nie pocięty kod na kawałki.

 
function nazwa(t[i]:tablica; t1[i]:tablica1; var t2[i]:tablica);
begin
t2[i]:=t[i]+t1[i];
end;
procedure szoste_zadanie;
type tablica=array[1.. 10] of integer;
tablica1=array[1 .. 10] of integer;
tablica2=array[1 .. 10] of integer;
var t:tablica; t1:tablica1; t2:tablica2; i:integer;
begin
writeln('Wypelnianie losowymi liczbami: ');
writeln('Tablica pierwsza: ');
randomize;
for i:=1 to 10 do
begin
t[i]:=Random(101);
writeln(t[i]);
end;
writeln('Tablica druga: ');
for i:=1 to 10 do
begin
t1[i]:=Random(101);
writeln(t[i]);
end;
Writeln('Suma elementu [n] z tablicy pierwszej plus element [z] z tablicy drugiej wynosi: ');
for i:=1 to 10 do
begin
nazwa(t[i],t1[i],t2[i]);
Writeln('Wynik z dodawnie elementu ',i,' z tablicy pierwszej plus element ',i,' wynosi: ',t2[i]);
end;
end;
0

Jak chcesz do funkcji przekazywać indeksy to przekazuj indeksy a nie tablice.

function nazwa(i:Integer);
0

Sumowanie tablic rozwiązałbym w taki sposób. Nie będę się rozpisywał, przeanalizuj sobie kod.

const
  Rozmiar = 10;  // Zmieniasz rozmiar tablic tylko w jednym miejscu
type
  Tablica = array[1..Rozmiar] of Integer;
var
  t1, t2, tSuma: Tablica;  // Wszystkie tablice tego samego typu

// Sumowanie przy pomocy funkcji
function SumaTablic(t1, t2: Tablica): Tablica;
var i: Integer;
begin
  for i:= 1 to Rozmiar do SumaTablic[i]:= t1[i] + t2[i];
end;
// Wywołanie funkcji
tSuma:= SumaTablic(t1, t2);

// Sumowanie przy pomocy procedury
procedure SumaTablic(t1, t2: Tablica; var Suma: Tablica);
var i: Integer;
begin
  for i:= 1 to Rozmiar do Suma[i]:= t1[i] + t2[i];
end;
// Wywołanie procedury
SumaTablic(t1, t2, tSuma);

Na koniec uwaga. Duże struktury danych (np. tablice) powinno się w zasadzie przekazywać do procedur i funkcji przez zmienne, nawet gdy nie dokonuje się ich modyfikacji. W przypadku przekazywania ich przez wartość zostają tworzone ich lokalne kopie na stosie procesora, co powoduje dodatkowe zużycie zasobów. W tym konkretnym przypadku nie ma to aż tak wielkiego znaczenia, bo tablice nie są duże, ale warto o tym pamiętać.

0

Dziękuje za pomoc. Znalazłem jeszcze inny sposób na rozwiązanie tego problemu. W wcześniejszej wersji programu tablice deklarowałem w procedurze. Zmieniłem to i zamieściłem je na początku programu i tylko tablice przekazałem jako parametry.
Temat do zamknięcia.

0
function SumaTablic(t1, t2: Tablica): Tablica;

powinno być raczej

function SumaTablic(const t1, t2: Tablica): Tablica;

będzie szybciej - unikasz kopiowania wszystkich danych na stos.

powinno się w zasadzie przekazywać do procedur i funkcji przez zmienne, nawet gdy nie dokonuje się ich modyfikacji.
Od tego jest właśnie const.

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