Błąd przy dodawaniu macierzy

0

Cześć, mam problem z procedurą (dod) odpowiedzialna za dodawanie i wypisywanie (wypisz2) dodanych do siebie macierzy. Jeśli by mnie mógł ktoś naprostować, wskazać gdzie popełniam ten banalny błąd będę bardzo wdzięczny.

program zadanie;
uses crt;

var
    a,b:integer;


tab1:array[1..3,1..3] of byte;
tab2:array[1..3,1..3] of byte;
dodawanie:array[1..3,1..3] of byte;
i,j,k,l,m,n:byte;


procedure losuj;
var i,j:byte;
begin
     for i:=1 to 3 do
      begin
       for j:=1 to 3 do
       tab1[i][j]:=random(10);
      end;
end;

procedure wypisz;
var
  i,j:byte;
begin
  for i:=1 to 3 do
    begin
    for j:=1 to 3 do
      begin
      write(tab1[i][j],' ');
      end;
    writeln;
    end;
end;

procedure losuj2;
  var k,l:byte;
  begin
  for k:=1 to 3 do
    begin
      for l:=1 to 3 do
      tab2[k][l]:=random(10);
    end;
  end;

procedure wypisz1;
  var k,l:byte;
  begin
   for k:=1 to 3 do
   begin
     for l:=1 to 3 do
        begin
          write(tab2[k][l],' ');
        end;
        writeln;
   end;
  end;

procedure dod;
  var m,n:byte;
  begin
    for m:=1 to 3 do
    begin
         for n:=1 to 3 do
         dodawanie[m][n]:=tab1[i][j]+tab2[k][l];
    end;
  end;

procedure wypisz2;
  var m,n:integer;
  begin
      for m:=1 to 3 do
      begin
           for n:=1 to 3 do
           begin
           write(dodawanie[m][n],'  ');
           end;
           writeln;
      end;
  end;

begin
        clrscr;
        randomize;
        writeln('Pierwsza macierz: ');
        
        writeln;
        losuj;
        wypisz;

        writeln;
        writeln;

        writeln('druga macierz: ');

        writeln;
        losuj2;
        wypisz1;

        writeln;
        writeln;

        dod;
        wypisz2;
        
readln();
end.
1
  1. Nie korzystaj ze zmiennych globalnych.
  2. Jaki problem masz konkretnie?
  3. Jakie wartości mają zmienne i, j, k oraz l wykorzystywane w procedurze dod?
  4. Żyjemy w XXI wieku, erze terabajtowych dysków twardych za grosze - naprawdę nic się nie stanie, jeśli zamiast dod procedurę nazwiesz czytelniej, na przykład dodawanieMacierzy.
1

@gehen55 - najpierw pozbądź się wszystkich zmiennych globalnych, bo to właśnie przez ich używanie masz problemy; I sformatuj tej kod porządnie, bo napisany jest niedbale:

  • popraw wcięcia,
  • popraw wszystkie identyfikatory, bo kompletnie nic nie mówią o swoim przeznaczeniu,
  • użyj stylu PascalCase dla wszystkich identyfikatorów,
  • usuń zbędne begin i end, bo nie wszędzie są potrzebne, a tylko wydłużają kod i zmniejszają jego czytelność,
  • macierze przekazuj w parametrach procedur i funkcji;
0
program zadanie;
uses crt;

var
Tab1:array[1..3,1..3] of byte;
Tab2:array[1..3,1..3] of byte;
Dodawanie:array[1..3,1..3] of byte;

procedure Losuj_pierwsza_macierz;
var i,j:byte;

begin
        for i:=1 to 3 do
        for j:=1 to 3 do
        Tab1[i][j]:=random(10);
end;

procedure Wypisz_pierwsza_macierz;
var i,j:byte;

begin
    for i:=1 to 3 do
    begin
         for j:=1 to 3 do
         Write(Tab1[i][j],' ');
         Writeln;
    end;
end;

procedure Losuj_druga_macierz;
var k,l:byte;

 begin
  for k:=1 to 3 do
    begin
      for l:=1 to 3 do
      Tab2[k][l]:=random(10);
    end;
 end;

procedure Wypisz_druga_macierz;
var k,l:byte;

 begin
   for k:=1 to 3 do
    begin
       for l:=1 to 3 do
       write(tab2[k][l],' ');
       writeln;
    end;
 end;

procedure Dodawanie_macierzy;
var m,n,i,j,k,l:byte;

 begin
     for m:=1 to 3 do
      for n:=1 to 3 do
      dodawanie[m][n]:=tab1[i][j]+tab2[k][l];
 end;

procedure Wypisz_dodane_macierze;
var m,n:integer;

 begin
     for m:=1 to 3 do
       begin
           for n:=1 to 3 do
           write(dodawanie[m][n],' ');
           writeln;
       end;
 end;

begin
        Clrscr;
        Randomize;
        Writeln('Pierwsza macierz: ');

        Losuj_pierwsza_macierz;
        Wypisz_pierwsza_macierz;
        Writeln;

        Writeln('Druga macierz: ');

        Writeln;
        Losuj_druga_macierz;
        Wypisz_druga_macierz;

        Writeln;

        Dodawanie_macierzy;
        Wypisz_dodane_macierze;

readln();
end.
0
procedure Dodawanie_macierzy;
var m,n,i,j,k,l:byte;
 
 begin
     for m:=1 to 3 do
      for n:=1 to 3 do
      dodawanie[m][n]:=tab1[i][j]+tab2[k][l];
 end;

Używasz w pętli lokalnych zmiennych i, j, k i l, choć nie nadałeś im wartości; Poza tym sugerowałem Ci wcześniej, abyś macierze przekazywał w parametrach - nadal tego nie robisz;

Może spróbuj w ten sposób - wywal cały ten kod i pisz go od początku po kawałku, te kawałki wrzucaj tutaj, a my będziemy sprawdzać te kawałki i je poprawiać, ewentualnie sugerować konieczne zmiany.

0

problem identyczny jak ten z postu Przekazanie tablicy jako parametru funkcji.

program Project2;
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
type
  tab = array [1 .. 3, 1 .. 3] of byte;
 
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(10);
    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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.