{ File: prodmat1.pas }

{ Scopo: lettura e scrittura di matrici da file }

program ProdottoMatrici;
{ Legge due matrici quadrate da due file, ne calcola la matrice prodotto e
  la salva su un terzo file.
}

const
  Righe   = 3;
  Colonne = Righe;  { deve coincidere con il numero di righe }


type
  TipoElementoMatrice = integer;
  TipoMatrice         = array [1..Righe, 1..Colonne] of TipoElementoMatrice;


var
  m1, m2, mprod : TipoMatrice;
  i, j          : integer;


  procedure LeggiMatrice (var matrice: TipoMatrice);
  { Legge una matrice da file. }
  var
    nome : string;    { nome del file dal quale leggere la matrice }
    f    : text;      { file logico }
    i, j : integer;

  begin { LeggiMatrice }
    write('Nome del file dal quale leggere la matrice ? ');
    readln(nome);

    assign(f, nome);
    reset(f);

    for i := 1 to Righe do
      for j := 1 to Colonne do
        read(f, matrice[i,j]);

    close(f)
  end; { LeggiMatrice }


  procedure SalvaMatrice (matrice: TipoMatrice);
  { Salva una matrice su file }
  var
    nome : string;    { nome del file dal quale leggere la matrice }
    f    : text;      { file logico }
    i, j : integer;

  begin { SalvaMatrice }
    write('Nome del file sul quale scrivere la matrice ? ');
    readln(nome);

    assign(f, nome);
    rewrite(f);

    for i := 1 to Righe do
    begin
      for j := 1 to Colonne do
        write(f, matrice[i,j]:7);
      writeln(f)
    end;

    close(f);
  end; { SalvaMatrice }


  procedure StampaMatrice (matrice: TipoMatrice);
  { Stampa una matrice su video. }
  var
    i, j : integer;

  begin { StampaMatrice }
    for i := 1 to Righe do
    begin
      for j := 1 to Colonne do
        write(matrice[i,j]:7);
      writeln
    end;
    writeln
  end; { StampaMatrice }


  procedure MoltiplicaMatrici (matrice1, matrice2: TipoMatrice;
                               var matrice_prod: TipoMatrice);
  { Moltiplicazione fra matrici quadrate. }
  var
    i, j, k : integer;
  begin { MoltiplicaMatrici }
    for i := 1 to Righe do
      for j := 1 to Colonne do
      begin
        matrice_prod[i,j] := 0;
        for k := 1 to Righe do
          matrice_prod[i,j] := matrice_prod[i,j] +
                               matrice1[i,k] * matrice2[k,j]
      end
  end; { MoltiplicaMatrici }


begin { ProdottoMatrici }
  LeggiMatrice(m1);                     { lettura della prima matrice }
  writeln('Matrice 1:');
  StampaMatrice(m1);                    { stampa di verifica su video }

  LeggiMatrice(m2);                     { lettura della seconda matrice }
  writeln('Matrice 2:');
  StampaMatrice(m2);                    { stampa di verifica su video }

  MoltiplicaMatrici(m1, m2, mprod);     { calcolo della matrice prodotto }
  writeln('Matrice prodotto:');

  StampaMatrice(mprod);                 { stampa di verifica su video }
  SalvaMatrice(mprod)                   { salvataggio su file }
end. { ProdottoMatrici }