{ File: sommamat.pas }

{ Scopo: operazioni su array completi }

program SommaRigheColonne;
{ Calcola il vettore somma delle righe e
          il vettore somma delle colonne
  di una matrice. }

const
  NumRighe   = 2;
  NumColonne = 3;

type
  IndiceRiga    = 1..NumRighe;
  IndiceColonna = 1..NumColonne;

  TipoRiga      = array [IndiceColonna] of integer;  { tipo vettore riga }
                        { uan riga e` indicizzata con le colonne }

  TipoColonna   = array [IndiceRiga] of integer;     { tipo vettore colonna }
                        { una colonna e` indicizzata con le righe }

  TipoMatrice   = array [IndiceRiga] of TipoRiga;

{ NOTA: usando la seguente dichiarazione

  TipoMatrice   = array [IndiceRiga,IndiceColonna] of integer;

  o equivalentemente

  TipoMatrice   = array [IndiceRiga] of array[IndiceColonna] of integer;

  non e` possibile assegnare direttamente ad un vettore di tipo TipoRiga
  una intera riga di una matrice.
}

var
  mat           : TipoMatrice;  { matrice }
  somma_righe   : TipoRiga;     { vettore che contiene la somma delle righe }
  somma_colonne : TipoColonna;  { vettore che contiene la somma delle colonne }

  i : IndiceRiga;     { indice di riga usato per la lettura e stampa }
  j : IndiceColonna;  { indice di colonna usato per la lettura e stampa }



  procedure SommaRighe (matrice: TipoMatrice; var riga: TipoRiga);
  var
    i : IndiceRiga;
    j : IndiceColonna;

  begin { SommaRighe }
    riga := matrice[1];   { copia in riga la prima riga di matrice; questo e`
                            possibile poiche` sono entrambe di tipo TipoRiga }

    for j := 1 to NumColonne do    { calcola l'elemento j del vettore somma }
      for i := 2 to NumRighe do
        riga[j] := riga[j] + matrice[i,j]
  end; { SommaRighe }


  procedure SommaColonne (matrice: TipoMatrice; var colonna: TipoColonna);
  var
    i : IndiceRiga;
    j : IndiceColonna;

  begin { SommaColonne }
    for i := 1 to NumRighe do      { calcola l'elemento i del vettore somma }
    begin
      colonna[i] := matrice[i,1];  { copia in colonna[i] il primo elemento
                                     della prima colonna di matrice }
      for j := 2 to NumColonne do
        colonna[i] := colonna[i] + matrice[i,j]
    end
  end; { SommaColonne }


begin { SommaRigheColonne }

  { lettura matrice }
  writeln('Immetti gli elementi della matrice ',
          NumRighe, 'x', NumColonne, ' !');
  for i := 1 to NumRighe do
  begin
    writeln('Riga ', i);
    for j := 1 to NumColonne do
    begin
      write('  Colonna ', j:2, ' ? ');
      readln(mat[i,j])
    end
  end;
  writeln;

  { calcolo e stampa del vettore somma delle righe }
  SommaRighe(mat, somma_righe);
  writeln('Il vettore somma delle righe e'':');
  for j := 1 to NumColonne do
    writeln('  Colonna ', j, ' : ', somma_righe[j]);
  writeln;

  { calcolo e stampa del vettore somma delle colonne }
  SommaColonne(mat, somma_colonne);
  writeln('Il vettore somma delle colonne e'':');
  for i := 1 to NumRighe do
    writeln('  Riga    ', i, ' : ', somma_colonne[i])

end. { SommaRigheColonne }