uses crt;
type tMatice = array[1..20,1..20] of integer;
var z: char;
    m,n,o,p:integer;
    maticeA,maticeB,maticeSoucet,maticeRozdil:tMatice;

procedure nactiRozmer(var radky, sloupce:integer; popis:char);
begin
     write('Zadej pocet sloupcu matice ',popis,': '); readln(sloupce);
     write('Zadej pocet radku matice ',popis,':   '); readln(radky);
end;

procedure nactiPrvky(sloupce, radky:integer; var matice:tMatice);
var i,j:integer;
begin
     randomize;
     for i:=1 to sloupce do
         begin
              for j:=1 to radky do
                  matice[i,j]:=random(9)+1;
         end;
end;

procedure vypisMatici(sloupce,radky:integer; matice:tMatice);
var i,j:integer;
begin
     for i:=1 to sloupce do
         begin
              for j:=1 to radky do
                  write(matice[i,j]:4);
              writeln;
         end;
end;

function jeMozneVypocitat(radkyA,sloupceA,radkyB,sloupceB:integer):boolean;
begin
     jeMozneVypocitat:=false;
     if ((radkyA=radkyB) AND (sloupceA=sloupceB)) then
        jeMozneVypocitat:=true;
end;

procedure soucetMatic(sloupce,radky:integer; matice1,matice2:tMatice; var matice:tMatice);
var i,j:integer;
begin
     for i:=1 to sloupce do
         begin
              for j:=1 to radky do
                  matice[i,j]:=matice1[i,j]+matice2[i,j];
         end;
end;

procedure rozdilMatic(sloupce,radky:integer; matice1,matice2:tMatice; var matice:tMatice);
var i,j:integer;
begin
     for i:=1 to sloupce do
         begin
              for j:=1 to radky do
                  matice[i,j]:=matice1[i,j]-matice2[i,j];
         end;
end;

{hlavni telo programu}
begin
repeat
clrscr;
writeln('Trtkal 2008 - http://fei.trtkal.net');
writeln('-----------------------------------');
begin
     {nacteni matice A}
     nactiRozmer(m,n,'A');
     nactiPrvky(m,n,maticeA);
     {nacteni matice B}
     nactiRozmer(o,p,'B');
     nactiPrvky(o,p,maticeB);

     {vypsani matic}
     writeln('-----------------------------------');
     writeln('Matice A:');
     vypisMatici(m,n,maticeA);
     writeln('-----------------------------------');
     writeln('Matice B:');
     vypisMatici(o,p,maticeB);

     {Zjisteni, zda-li jde matice vypocitat}
     writeln('-----------------------------------');
     if (jeMozneVypocitat(m,n,o,p)) then
         writeln('Matici je mozne vypocitat :-)')
     else
         writeln('POZOR: nelze vypocitat!');

     {pokud je mozne vypocitat, tajk vypocitej matici}
     if (jeMozneVypocitat(m,n,o,p)) then
        begin
             writeln('-----------------------------------');
             writeln('Soucet matic:');
             soucetMatic(m,n,maticeA,maticeB,maticeSoucet);
             vypisMatici(m,n,maticeSoucet);
             writeln('-----------------------------------');
             writeln('Rozdil matic:');
             rozdilMatic(m,n,maticeA,maticeB,maticeRozdil);
             vypisMatici(m,n,maticeRozdil);
        end;
end;
writeln('-----------------------------------');
write('Opakovat a/n: ');readln(z);
until (z='n');
end.
