Transpozycja macierzy - zadanie.

0

Możecie mnie naprowadzić jak powinno wyglądać prawidłowe rozwiązanie tego zadania? Poniżej dodałem moje dwa rozwiązania, ale nie wiem który wybrać i czy w ogóle jest dobrze napisany.

Napisz program, w którym zdefiniowaną tablicę dwuwymiarową o rozmiarach 10x10 wypełniamy w zakresie NxN losowymi liczbami całkowitymi z przedziału (-10,10). Program ma dokonać transpozycji macierzy (tablicy), tworząc na jej podstawie nową macierz. Obie macierze mają zostać wyświetlone na ekranie.

 program 1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  t: array [1..10,1..10] of integer;
  i,j,n:integer;
begin
  writeln('Podaj N:');
  readln(n);
  for i := 1 to 10 do
  begin
    for j := 1 to 10 do
      begin
        if (n >= i) and (n >= j) then t[i,j] := random(19)-9
        else t[i,j]:=0;
        write(t[i,j]:4);
      end;
      writeln;
  end;
  readln;
end.
program 2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  t array [1..10,1..10] of integer;
  i,j,ninteger;
begin
  writeln('Podaj N');
  readln(n);
  for i = 1 to n do
  begin
    for j = 1 to n do
      begin
        t[i,j] = random(19)-9;
        write(t[i,j]4);
      end;
      writeln;
  end;
  writeln;
  for i = 1 to n do
  begin
    for j = 1 to n do
      begin
        write(t[j,i]4);
      end;
      writeln;
  end;
  readln;
end. 
0
  1. Zacznij numerować tablice jak programista od 0, wygoda jest pozorna, w większości przypadków wręcz ta wygoda zamienia się w udrękę.
  2. Żaden z nich nie spełnia zadania, bowiem napisano: - "Obie macierze ..."
0

Nie wiem dlaczego, ale w tym drugim programie skopiowało mi bez dwukropków. Czyli ten program też jest zły? Wyświetlam obie macierze, pierwotną i po zmianie wierszy i kolumn.

 
program zad;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  t:array [1..10,1..10] of integer;
  i,j,n:integer;
begin
  writeln('Podaj N');
  readln(n);
  for i := 1 to n do
  begin
    for j := 1 to n do
      begin
        t[i,j] := random(19)-9;
        write(t[i,j]:4);
      end;
      writeln;
  end;
  writeln;
  for i := 1 to n do
  begin
    for j := 1 to n do
      begin
        write(t[j,i]:4);
      end;
      writeln;
  end;
  readln;
end.
0
morodis napisał(a):

Wyświetlam obie macierze ...
Nie, wyświetlasz jedną macierz w sposób normalny oraz transponowany. Nie masz dwóch macierzy.

0

Czyli jak powinny być wyświetlone definitywnie w programie, bo już nie wiem co mam zmienić ;/

program zad;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
var
  t:array [1..10,1..10] of integer;
  i,j,n:integer;
begin
  writeln('Podaj N');
  readln(n);
  for i := 1 to 10 do
  begin
    for j := 1 to 10 do
      begin
        if (n >= i) and (n >= j) then t[i,j] := random(19)-9
        else t[i,j]:=0;
        write(t[i,j]:4);   
      end;
      writeln;
  end;
  writeln;
  for i := 1 to 10 do
  begin
    for j := 1 to 10 do
      begin
        write(t[i,j]:4);
      end;
      writeln;
  end;
  readln;
end. 
0

Przenieś kod dotyczący wyświetlania macierzy do osobnych procedur i podawaj macierz w parametrze; No i pozbądź się zbędnych bloków Begin End - tych, które grupują tylko jedną instrukcję/konstrukcję.

1

Program ma dokonać transpozycji macierzy (tablicy), tworząc na jej podstawie nową macierz. Obie macierze mają zostać wyświetlone na ekranie

Program musi zawierać dwie macierze, a Twój program zawiera tylko jedną macierz.

0

Czyli teraz nie są wyświetlone obie macierze? To mam to samo zrobić dla kolejnej zmiennej n? Nie wiem czy dla większych NxN mam dawać wartość 0?

 program zad;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  t:array [1..10,1..10] of integer;
  i,j,n:integer;
begin
  writeln('Podaj N');
  readln(n);
  for i := 1 to 10 do
  begin
    for j := 1 to 10 do
      begin
        if (n >= i) and (n >= j) then t[i,j] := random(19)-9
        else t[i,j]:=0;
        write(t[i,j]:4);
      end;
      writeln;
  end;
  writeln;
  for i := 1 to 10 do
  begin
    for j := 1 to 10 do
      begin
        write(t[j,i]:4);
      end;
      writeln;
  end;
  readln;
end.
0

O jakich obu macierzach Ty piszesz? Masz w programie tylko jedną macierz o nazwie t.
Zapisz się na kurs czytania ze zrozumieniem. @_13th_Dragon dwukrotnie, ja jednokrotnie, pisaliśmy, że brakuje Ci drugiej macierz. A Ty nadal jej nie masz.

0

Czyli teraz jest dobrze? Mam dwie macierze oraz program dokonał transpozycji macierzy dla każdej z nich oraz usunąłem żeby dla n> pisał 0 w tablicy.

 program zad;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  t:array [1..10,1..10] of integer;
  t2:array [1..10,1..10] of integer;
  i,j,n:integer;
begin
  writeln('Podaj N');
  readln(n);
  for i := 1 to n do
  begin
    for j := 1 to n do
      begin
        t[i,j] := random(19)-9;
        write(t[i,j]:4);
      end;
      writeln;
  end;
  writeln;
  for i := 1 to n do
  begin
    for j := 1 to n do
        write(t[j,i]:4);
      writeln;
  end;
   writeln;
    for i := 1 to n do
  begin
    for j := 1 to n do
      begin
        t2[i,j] := random(19)-9;
        write(t2[i,j]:4);
      end;
      writeln;
  end;
  writeln;
  for i := 1 to n do
  begin
    for j := 1 to n do
      begin
        write(t2[j,i]:4);
      end;
      writeln;
  end;
  readln;
end. 
0

Nie, teraz owszem masz dwie macierze ale druga nie jest transpozycją pierwszej.

0

Ty zupełnie nie rozumiesz treści zadania. Macierz t2 ma powstać przez transponowanie macierzy t.

0

Teraz mam dwie macierze(obie wyświetliłem na ekranie), a druga jest transpozycja pierwsze, zgadza się?

 program zad;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  t:array [1..10,1..10] of integer;
  t2:array [1..10,1..10] of integer;
  i,j,n:integer;
begin
  writeln('Podaj N');
  readln(n);
  for i := 1 to n do
  begin
    for j := 1 to n do
      begin
        t[i,j] := random(19)-9;
        t2[i,j] := t[i,j];
        write(t[i,j]:4);
      end;
      writeln;
  end;
  writeln;
    for i := 1 to n do
  begin
    for j := 1 to n do
      begin
        write(t2[j,i]:4);
      end;
      writeln;
  end;
  readln;
end.
0

Nie zgadza się, macierz t2 jest identyczna z macierzą t, a ma być jej transpozycją.

0

Przypisałem jej transpozycje t2[i,j] := t[j,i], jeśli nadal jest źle to proszę o poprawienie błędu.

 
 program zad;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  t:array [1..10,1..10] of integer;
  t2:array [1..10,1..10] of integer;
  i,j,n:integer;
begin
  writeln('Podaj N');
  readln(n);
  for i := 1 to n do
  begin
    for j := 1 to n do
      begin
        t[i,j] := random(19)-9;
        t2[i,j] := t[j,i];
        write(t[i,j]:4);
      end;
      writeln;
  end;
  writeln;
    for i := 1 to n do
  begin
    for j := 1 to n do
      begin
        write(t2[i,j]:4);
      end;
      writeln;
  end;
  readln;
end.
0

Teraz nie ma wyraźnej sprzeczności z zadaniem. Teraz nie działa poprawnie, czytaj http://4programmers.net/Forum/1212002

Podziel to na funkcje:

  1. randomMat
  2. showMat
  3. transpositionMat
    oraz zamień nazwy na sensowne i będzie dobre rozwiązanie.
0

Napisz program, w którym zdefiniowaną tablicę dwuwymiarową o rozmiarach 10x10 wypełniamy w zakresie NxN losowymi liczbami całkowitymi z przedziału (-10,10). Program ma dokonać transpozycji macierzy (tablicy), tworząc na jej podstawie nową macierz

Sporo zależy o prowadzącego, może uznać to rozwiązanie, ale może je odrzucić. Sformułowanie zadania oznacza, że masz wpierw stworzyć całą tablicę t, a potem na jej podstawie stworzyć tablicę transponowaną t2. Twój program tworzy tablice t i t2 równocześnie.

3

przecież ten kod jest błędny...

for i := 1 to n do
  begin
    for j := 1 to n do
      begin
        t[i,j] := random(19)-9;
        t2[i,j] := t[j,i];
        write(t[i,j]:4);
      end;
      writeln;
  end;

Dla i := 1, j := 1 i n := 5;

t[1,1] := random(19)-9; // random(19)-9;
t2[1,1] := t[1,1]; // random(19)-9;

Dla i := 1, j := 2 i n := 5;

t[1,2] := random(19)-9;
t2[1,2] := t[2,1]; // ??? prawdopodobnie 0; 

Dla i := 1, j := 3 i n := 5;

t[1,3] := random(19)-9;
t2[1,3] := t[3,1]; // ??? prawdopodobnie 0; 

Dla i := 1, j := 4 i n := 5;

t[1,4] := random(19)-9;
t2[1,4] := t[4,1]; // ??? prawdopodobnie 0; 

Dla i := 1, j := 5 i n := 5;

t[1,5] := random(19)-9;
t2[1,5] := t[5,1]; // ??? prawdopodobnie 0; 

Dla i := 2, j := 1 i n := 5;

t[2,1] := random(19)-9;
t2[2,1] := t[1,2]; // random(19)-9; z poprzedniego obiegu...
0

Poprawiłem poprzedni program. Teraz już nie pokazuje wartości 0 jak to miało miejsce w poprzednim oraz nie tworzy **tab **i **tab2 **równocześnie.

  program zad;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  tab:array [1..10,1..10] of integer;
  tab2:array [1..10,1..10] of integer;
  i,j,n:integer;
begin
  writeln('Podaj N');
  readln(n);
  for i := 1 to n do begin
    for j := 1 to n do begin
        tab[i,j] := random(19)-9;
        write(tab[i,j]:4);
      end;
      writeln;
  end;
  writeln;
  for i := 1 to n do begin
    for j := 1 to n do begin
        tab2[i,j]:=tab[j,i];
        write(tab2[i,j]:4);
      end;
      writeln;
  end;
  readln;
end.

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