program matice;
uses crt;
type tmatice=array[1..20,1..20] of integer;
var e,f,g,h,max,min:integer;
    a,b,c,d,soucinmatice:tmatice;

procedure NactiRozsah(var min:integer; var max:integer);
begin
 write('Zadej minimum matice: ');
 readln(min);
 write('Zadej maximum matice: ');
 readln(max);
end;

procedure NactiRozmer(var radky,sloupce:integer;NazevMatice:string);
 begin
 radky:=0;
 sloupce:=0;
 while (radky<1) or (radky>20) or (sloupce<1) or (sloupce>20) do
  begin
  write('Zadejte pocet radku matice ',NazevMatice,' (1 - 20): ');
  readln(radky);
  write('Zadejte pocet sloupcu matice ',NazevMatice,' (1 - 20): ');
  readln(sloupce);
  if (radky<1) or (radky>20) or (sloupce<1) or (sloupce>20) then
   begin

   writeln('Pocet radku a sloupcu vychazi z intervalu <1,20>:');

   end;
  end;
 end;

function generuj(a,b:integer):integer;
 begin
 generuj:=random((b+1)-a)+a;
 end;

procedure NactiPrvky(radky,sloupce,min,max:integer;var matice:tmatice);
var i,j:integer;
 begin
 for i:=1 to radky do
  begin
   for j:=1 to sloupce do
    begin
    matice[i,j]:=generuj(min,max);
    end;
   end;
 end;

procedure VypisMatici(radky,sloupce:integer;matice:tmatice;NazevMatice:string);
var i,j:integer;
 begin

 writeln('Matice ',NazevMatice,':');

 for i:=1 to radky do
  begin
  for j:=1 to sloupce do
   begin
   write(' ',matice[i,j]:3);
   end;
  writeln;
  end;
 end;

function JeMozneVypocitat(radky1,sloupce1,radky2,sloupce2:integer):boolean;
 begin
 if (radky1=radky2) and (sloupce1=sloupce2) then
  begin
  JeMozneVypocitat:=true;
  end
 else
  begin
  JeMozneVypocitat:=false;
  end;
 end;

function JeMozneNasobit(radky1,sloupce1,radky2,sloupce2:integer):boolean;
 begin
 if (sloupce1=radky2) then
  JeMozneNasobit:=true
 else
  JeMozneNasobit:=false;
 end;

procedure SoucetMatic(radky,sloupce:integer;maticea,maticeb:tmatice;var maticec:tmatice);
var i,j:integer;
 begin
 for i:=1 to radky do
  begin
  for j:=1 to sloupce do
   begin
   maticec[i,j]:=0;
   maticec[i,j]:=maticea[i,j]+maticeb[i,j];
   end;
  end;
 end;

procedure SoucinMatic(radky1,sloupce1,radky2,sloupce2:integer; maticea,maticeb:tmatice; var maticee:tmatice);
var i,j,k:integer;
 begin
  for i:=1 to radky1 do
  begin
   for j:=1 to sloupce2 do
    begin
    maticee[i,j]:=0;
    begin
    for k:=1 to sloupce1 do
    maticee[i,j]:=maticee[i,j]+(maticea[i,k]*maticeb[k,j]);
    end;
    end;
  end;
 end;

procedure RozdilMatic(radky,sloupce:integer;maticea,maticeb:tmatice;var maticee:tmatice);
var i,j:integer;
 begin
 for i:=1 to radky do
  begin
  for j:=1 to sloupce do
   begin
      maticee[i,j]:=maticea[i,j]-maticeb[i,j];
   end;
  end
 end;



begin
 clrscr;
 randomize;
 NactiRozsah(min,max);
 NactiRozmer(e,f,'A');
 NactiRozmer(g,h,'B');
 NactiPrvky(e,f,min,max,a);
 NactiPrvky(g,h,min,max,b);
 VypisMatici(e,f,a,'A');
 VypisMatici(g,h,b,'B');
 if JeMozneVypocitat(e,f,g,h)=true then
  begin
  SoucetMatic(e,f,a,b,c);
  RozdilMatic(e,f,a,b,d);
  VypisMatici(e,f,c,'C (C = A + B)');
  VypisMatici(e,f,d,'D (D = A - B)');
  end
 else
  begin
  writeln('Soucet a rozdil nejde vypocitat!');
  end;
 if JeMozneNasobit(e,f,g,h)=true then
  begin
  SoucinMatic(e,f,g,h,a,b,soucinmatice);
  VypisMatici(e,h,soucinmatice,'E (soucin)');
  end
 else
  begin
  writeln('Nelze provest soucin matic!');
  end;
 readln;
end.
