(* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)
(*  Soubor: MAT_U.PAS                                                      *)
(*  Obsah: procedury pro nacteni, ulozeni a nasobeni matic (max. 10x10)    *)
(*  Autor: Mircosoft                                                       *)
(*  Posledni uprava: ?.?.2005                                              *)
(*  Pro kompilaci: nic                                                     *)
(*  Pro spusteni: nic                                                      *)
(*  Upozorneni: tyto zdrojove kody pouzivate na vlastni nebezpeci          *)
(* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)
unit mat_u;
interface
{verejne konstanty a typy:}
const max=10;

type matice = record
              sloupcu,radku:word;
              data:array[1..max,1..max] of integer;
              end;

{verejne procedury:}
procedure NactiMatici(var kterou:matice; odkud:string);
procedure UlozMatici(kterou:matice; kam:string);
procedure NasobMatice(m1,m2:matice; var vysledek:matice);

implementation
{$I+} {nedelame zadnou rucni kontrolu diskovych operaci, tak zapneme automatickou}

{definice vsech procedur:}

procedure NactiMatici(var kterou:matice; odkud:string);
var f:text;
    i,j:word;
Begin
assign(f,odkud);
reset(f);
with kterou do begin
               readln(f,radku);
               readln(f,sloupcu);
               for i:=1 to radku do
                for j:=1 to sloupcu do read(f,data[i,j]); {mezery mezi cisly a konce radku se preskakuji automaticky}
               end;
close(f);
End;{nactimatici}

procedure UlozMatici(kterou:matice; kam:string);
var f:text;
    i,j:word;
Begin
assign(f,kam);
rewrite(f);
with kterou do begin {with proto, abych nemusel vsude psat "kterou."}
               writeln(f,radku);
               writeln(f,sloupcu);
               for i:=1 to radku do begin
                                    for j:=1 to sloupcu do write(f,data[i,j]:5);
                                    writeln(f);
                                    end;
               end;
close(f);
End;{ulozmatici}

procedure NasobMatice(m1,m2:matice; var vysledek:matice);
var i,j,k:word;
Begin
if m2.radku<>m1.sloupcu then writeln('nelze nasobit')
 else begin
      {rozmery vysledne matice:}
      vysledek.radku:=m1.radku;
      vysledek.sloupcu:=m2.sloupcu;
      {nasobeni:}
      for i:=1 to vysledek.radku do
       for j:=1 to vysledek.sloupcu do
         begin
         vysledek.data[i,j]:=0;
         for k:=1 to m2.radku do inc(vysledek.data[i,j], m1.data[i,k]*m2.data[k,j]);
         end;                   {inc(a,b) znamena a:=a+b (pohodlnejsi zapis)}
      end;
End;{nasobmatice}

END.