[Pascal] Mnożenie macierzy

Awatar użytkownika
Natasha
Użytkownik
Użytkownik
Posty: 986
Rejestracja: 9 lis 2008, o 15:08
Płeć: Kobieta
Podziękował: 97 razy
Pomógł: 167 razy

[Pascal] Mnożenie macierzy

Post autor: Natasha »

Mam problem z napisaniem programu do pomnożenia macierzy. Na początek wzięłam macierze 2x2 i 2x3, ale i tak nic mi nie wychodzi. Potrzebuje programu, który policzy iloczyn dowolnych macierzy (oczywiście jeśli da się to zrobić).
Mam tyle, ale to jest źle:

Kod: Zaznacz cały

program mnozeniemacierzy;
var
t:array[1..2,1..2] of real;
t1:array[1..2,1..2] of real;
t2:array[1..2,1..3] of real;
n,i,j:integer;
k,l,p,r:integer;

begin
begin
for i:=1 to 2 do
for j:=1 to 2 do
begin
writeln('podaj elementy macierzy A[',i,',',j,']: ');
readln(t[i,j]);
end;
begin
for k:=1 to 2 do
for l:=1 to 3 do
begin
writeln('podaj elementy macierzy B[',k,',',l,']: ');
readln(t[k,l]);
end;
begin
for p:=1 to 2 do
for r:=1 to 3 do
begin
t2[p,r]=t[p,j]*t1[k,r];
writeln('podaj elementy pomnozonej macierzy C[',p,',',r,']: ');
readln(t2[p,r]);
readln;
end;
end;
end;
end;
end.
Proszę o poprawienie, gdzie jest błąd, pewnie w tej pętli gdzieś się machnęłam, już chyba wszędzie wstawiałam begin i dalej nie pójdzie :P
Jak to zrobić dla dowolnych macierzy?
Awatar użytkownika
matthewmaster04
Użytkownik
Użytkownik
Posty: 63
Rejestracja: 17 sty 2010, o 18:34
Płeć: Mężczyzna
Lokalizacja: Internet
Podziękował: 4 razy
Pomógł: 9 razy

[Pascal] Mnożenie macierzy

Post autor: matthewmaster04 »

Kod: Zaznacz cały

program mnmacieryz;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const nmax=10;

type TTab2=array[1..nmax,1..nmax] of real;

var wA,kA,wB,kB:integer; A,B,C:TTab2;

//==============================================================================
//procedura wczytywania recznie maciery licze ze napiszesz sama:D

procedure wczytaj_przykladowe_macierze(var x:TTab2; w,k:integer);
var i,j:integer;
begin
  for i:=1 to w do
  begin
     for j:=1 to k do
     begin
     x[i][j]:=random(10);
     end;
  end;
end;

//==============================================================================

procedure wypisz_macierz(var x:TTab2; w,k:integer);
var i,j:integer;
begin
  for i:=1 to w do
  begin
     for j:=1 to k do
     begin
     write( x[i][j]:0:0,' ');
     end;
     writeln;
  end;

end;

//==============================================================================
//UWAGA!!! zeby mozna bylo mnozyc macierze, macierz A musi miec ilosc kolumn rowna z iloscia wierszy macierzy B//
procedure mnozenie_macierzy(var A,B,C:TTab2; wA,kB,kA:integer);
var i,j,k:integer;  suma:real;
begin
writeln;
writeln('A * B = C');
for i:=1 to  wA do
begin
  for k:=1 to  kB do
  begin
     suma:=0;
    for j:=1 to kA do  //w tym miejscu kA = wB//
     begin
     suma:=suma + A[i][j]*B[j][k];
     C[i][k]:=suma;
     end;

  end;

end;
end;
//==============================================================================
//=================================|PROGAM GLOWNY|============================
begin
 randomize();

write('Podaj ilosc wierszy macierzy A: '); readln(wA);
write('Podaj ilosc kolumn macierzy  A: '); readln(kA);
wczytaj_przykladowe_macierze(A,wA,kA);
write('Podaj ilosc wierszy macierzy B: '); readln(wB);
write('Podaj ilosc kolumn macierzy  B: '); readln(kB);
wczytaj_przykladowe_macierze(B,wB,kB);
writeln;

writeln('Macierz A:'); writeln;
wypisz_macierz(A,wA,kA); writeln;
writeln('Macierz B:'); writeln;
wypisz_macierz(B,wB,kB); writeln;

if kA = wB then
begin
mnozenie_macierzy(A,B,C,wA,kB,kA);
writeln; writeln('Macierz C:'); writeln;

wypisz_macierz(C,wA,kB); writeln;

end else writeln('Ilosc kolumna A i wierszy B nie jest taka sama, mnozenie nie mozliwe');
readln;
end.

Awatar użytkownika
Natasha
Użytkownik
Użytkownik
Posty: 986
Rejestracja: 9 lis 2008, o 15:08
Płeć: Kobieta
Podziękował: 97 razy
Pomógł: 167 razy

[Pascal] Mnożenie macierzy

Post autor: Natasha »

To ma być w dev-pascalu, nie w turbo pascalu...
Awatar użytkownika
matthewmaster04
Użytkownik
Użytkownik
Posty: 63
Rejestracja: 17 sty 2010, o 18:34
Płeć: Mężczyzna
Lokalizacja: Internet
Podziękował: 4 razy
Pomógł: 9 razy

[Pascal] Mnożenie macierzy

Post autor: matthewmaster04 »

sprawdzilem w dev dziala
Awatar użytkownika
Natasha
Użytkownik
Użytkownik
Posty: 986
Rejestracja: 9 lis 2008, o 15:08
Płeć: Kobieta
Podziękował: 97 razy
Pomógł: 167 razy

[Pascal] Mnożenie macierzy

Post autor: Natasha »

Nie wątpię, że dziala, tylko że nie znam różnych takich wyrażeń, jak {$APPTYPE CONSOLE}, uses, SysUtils; procedure itp więc w miarę możliwości proszę o przerobienie tego tak, aby działało i było "prościej" napisane.
Awatar użytkownika
matthewmaster04
Użytkownik
Użytkownik
Posty: 63
Rejestracja: 17 sty 2010, o 18:34
Płeć: Mężczyzna
Lokalizacja: Internet
Podziękował: 4 razy
Pomógł: 9 razy

[Pascal] Mnożenie macierzy

Post autor: matthewmaster04 »

Kod: Zaznacz cały

program mnmacierzy;

const nmax=10;

var wA,kA,wB,kB,i,j,k:integer;
    A,B,C,x:array[1..nmax,1..nmax] of real;
    suma:real;
//------------------------------------------------------------------------------

begin
randomize();

write('Podaj ilosc wierszy macierzy A: '); readln(wA);
write('Podaj ilosc kolumn macierzy  A: '); readln(kA);

//==============|wczytuje przykladowa macierz A|================================
begin
  for i:=1 to wA do
  begin
     for j:=1 to kA do
     begin
     A[i][j]:=random(10);
     end;
  end;
end;
//==============================================================================

write('Podaj ilosc wierszy macierzy B: '); readln(wB);
write('Podaj ilosc kolumn macierzy  B: '); readln(kB);

//==============|wczytuje przykladowa macierz B|================================
begin
  for i:=1 to wB do
  begin
     for j:=1 to kB do
     begin
     B[i][j]:=random(10);
     end;
  end;
end;
//==============================================================================

writeln;

writeln('Macierz A:'); writeln;

//==============|wypisuje przykladowa macierz A|================================
begin
  for i:=1 to wA do
  begin
     for j:=1 to kA do
     begin
     write( A[i][j]:0:0,' ');
     end;
     writeln;
  end;

end;
//==============================================================================

writeln('Macierz B:'); writeln;

//==============|wypisuje przykladowa macierz B|================================
begin
  for i:=1 to wB do
  begin
     for j:=1 to kB do
     begin
     write( B[i][j]:0:0,' ');
     end;
     writeln;
  end;

end;
//==============================================================================


if kA = wB then    //sprawdzam warunek konieczny mnozenia macierzy//
begin

//======================|Operacja mnozenia macierzy|============================
begin
writeln;
writeln('A * B = C');
for i:=1 to  wA do
begin
  for k:=1 to  kB do
  begin
     suma:=0;
    for j:=1 to kA do  //w tym miejscu kA = wB//
     begin
     suma:=suma + A[i][j]*B[j][k];
     C[i][k]:=suma;
     end;

  end;

end;
end;


writeln; writeln('Macierz C:'); writeln;

//===================|wypisanie macierzy C|=====================================
begin
  for i:=1 to wA do
  begin
     for j:=1 to kB do
     begin
     write( C[i][j]:0:0,' ');
     end;
     writeln;
  end;

end;
//==============================================================================

end else writeln; writeln('Ilosc kolumna A i wierszy B nie jest taka sama, mnozenie nie mozliwe');


readln;
end.
Niewiem czy jest rosciej wizualnie ale usunalem procedury i reszte. wiecej niemoge usunac. [dziwne ze jescze niemieliscie procedur i funkcji]
Awatar użytkownika
Natasha
Użytkownik
Użytkownik
Posty: 986
Rejestracja: 9 lis 2008, o 15:08
Płeć: Kobieta
Podziękował: 97 razy
Pomógł: 167 razy

[Pascal] Mnożenie macierzy

Post autor: Natasha »

A gdybym sobie chciala wczytać jakąś swoją macierz, to co trzeba by było zmienić w tym kodzie?
I jak zmienić koncówkę, zeby info o tym, że mnożenie nie jest możliwe nie wyskakiwalo, gdy liczba wierszy A i kolumn B sie zgadza?

PS co to znaczy random/ize?
Awatar użytkownika
matthewmaster04
Użytkownik
Użytkownik
Posty: 63
Rejestracja: 17 sty 2010, o 18:34
Płeć: Mężczyzna
Lokalizacja: Internet
Podziękował: 4 razy
Pomógł: 9 razy

[Pascal] Mnożenie macierzy

Post autor: matthewmaster04 »

w linijce 22 zamien A[j]:=random(10); na:

Kod: Zaznacz cały

write('A[',i,'][',j,'] :');
readln(A[i][j]);
i w linii 37 tak samo tylko zamien na :

Kod: Zaznacz cały

write('B[',i,'][',j,']: ');
readln(B[i][j]);
Jesli chodzi o to wyswietlanie tego napisu to usun wiersze:

78,
79,
118.

randomize(); odpowiada za wlaczenie generatora liczb.
np: gdy zainicjuje ta funkcje na poczatku programu glownego i bede chcial wylosowac dowolna liczbe z zakresu np: 0..9 to: wywoluje funkcje x:=random(10); wtedy do zmiennej x zostanie przypisana losowa liczba z zakresu od 0..9. :D
ODPOWIEDZ