Esercizi proposti in laboratorio l'11-12-15 Gennaio 2001

(ATTENZIONE: chi trova un errore in questa pagina ricevera' un premio!!!)

Gli esercizi proposti hanno lo scopo di introdurre gli array a piu' dimensioni. Supponiamo di avere a disposizione le seguenti dichiarazioni:

const Imax = 30;
type MatInt = array [1..Imax,1..Imax] of integer;

In generale una variabile di tipo MatInt conterra' una matrice di interi "parzialmente riempita con m righghr e n colonne" (con 1<=m,n<=Imax).

Completare (nell'ordine) le seguenti procedure. Scrivere un main per testarle (utilizzate un'interfacca a menu', come spiegato a lezione).

Durante lo sviluppo del programma procedere in modo incrementale:

  1. Pensare alla struttura del main e scriverlo (eventualmente lasciarlo incompleto, l'importante e' che possa essere compilato con successo).
  2. Man mano che si completa una procedura, aggiornare il main e effettuare il testing.

procedure Init (var a:MatInt;
                    m,n:integer; 
                    s:integer);
          {AI: 1<=m,n<=Imax, s e' inizializzato}
          {AF: per ogni i in 1..n. per ogni j in 1..m. a[i,j]=s}

procedure ScriviMatrice (var a:MatInt;
                             m,n:integer); 
          {AI: 1<=m,n<=Imax, 
               a[1..m,1..n] e' inizializzata.}
          {COMMENTO: a[1..m,1..n] e' scritta sul terminale,
                     il contenuto di a non e' modificato.}

procedure Somma (var a,b,c:MatInt;
                     m,n:integer); 
          {AI: 1<=m,n<=Imax, 
               a[1..m,1..n] e b[1..m,1..n] sono inizializzate.}
          {AF: c[1..m,1..n] = a[1..m,1..n] + b[1..m,1..n]}
          {COMMENTO: il contenuto di a e b non e' modificato.}

procedure ProdottoPerScalare (var a,b:MatInt;
                                  m,n:integer; 
                                  s:integer);
          {AI: 1<=m,n<=Imax, 
               a[1..m,1..n] e s sono inizializzati.}
          {AF: per ogni i in 1..n}. per ogni j in 1..m. b[i,j]=s*a[i,j]}
          {COMMENTO: il contenuto di a non e' modificato.}


procedure Prodotto (var a,b,c:MatInt;
                        m,n,p:integer); 
          {AI: 1<=m,n,p<=Imax, 
               a[1..m,1..n] e b[1..n,1..p] sono inizializzate.}
          {AF: c[1..m,1..p] = prodotto "righe per colonne" 
                              di a[1..m,1..n] e b[1..n,1..p],
               ovvero:
               per ogni i in 1..m, per ogni j in 1..p. 
               c[i,j]=a[i,1]*b[1,j]+a[i,2]*b[2,j]+...+a[i,n]*b[n,j]}
          {COMMENTO: il contenuto di a e b non e' modificato.}


procedure MatriceIdentica (var a:MatInt;
                               m:integer); 
          {AI: 1<=m<=Imax}
          {AF: a[1..m,1..m] e' la matrice identica per 
               il "prodotto righe per colonne",
               ovvero: 
               per ogni i,j in 1..m. a[i,i]=1, e per i\=j a[i,j]=0}