Esercizi svolti a lezione il 2 Novembre 2000 & Esercizi proposti


Lo scopo degli esercizi di oggi e` quello di mettere insieme una libreria di funzioni e procedure che lavorano sugli array.

program Uso_Array

const Imax = 100;

type VettInt = array [1..Imax] of integer;

var a:VettInt;
    n,max:integer;


procedure ReadArray(var v:VettInt; n:integer);

** FARE: introduce gli elementi nell'array **


procedure WriteArray(var v:VettInt; n:integer);

** FARE: visualizza l'array **


function MaxVett(var v:VettInt; n:integer):integer;

** ADATTARE il programma che avete gia` scritto **

NOTA: L'ultima istruzione della funzione deve essere 
              MaxVett:= ris
      ovvero al nome della funzione occorre assegnare la 
      variabile che avete usato nella computazione
      (potete chiamarla come volete, non solo 'ris') e che
      contiene il risultato voluto, in questo caso il
      massimo elemento dell'array.
      Notate anche che, siccome una funzione restituisce 
      esplicitamente un risultato, occorre specificare il
      tipo di tale risultato. Questo e` fatto nell'intestazione
      della funzione, dopo ')' e prima di ';'. 
      Nel nostro caso, il tipo del risultato e` 'integer', per cui:
              function MaxVett(var v:VettInt; n:integer):integer;


procedure SelectionSort (var v:VettInt, n:integer);

{pre:}
{post: restituisce l'array ordinato in ordine crescente}

** QUESTA PROCEDURA VERRA` RESA DISPONIBILE PER GIOVEDI` 9 NOVEMBRE 
   NELLE SOLUZIONI, ANCHE SE E` STATA FATTA A LEZIONE ** 


{main program}
begin

writeln('Inserisci il numero degli elementi');
readln(n);

{mettere un test che controlli che 'n' non sia > di Imax;
 se lo fosse, richiedere all'utente che inserisca di nuovo
 il numero di elementi}

ReadArray(a,n);
max:=MaxVett(a,n);

{STAMPARE L'ARRAY E IL MASSIMO} 

SelectionSort(a,n);
WriteArray(a,n);
readln;

end.

NOTA: Notate che, pur essendo 'n' una variabile globale, la passiamo come
      parametro a ciascuna procedura o funzione.  Questa decisione ci permette
      di rendere ciascun sottoprogramma il piu' modulare possibile, ovvero di
      poter riusare gli stessi sottoprogrammi in altri programmi main facendo meno 
      errori, perche' ogni funzione o procedura mostra esplicitamente che fara` 
      uso di un parametro di tipo 'integer', oltre che del parametro di tipo 
      'VettInt'.


Array: Esercizi proposti

Esercizi 
	  1. Completare opportunamente la prima versione della libreria per 
	     gli array come descritto qui sopra.

	     NOTA: la sintassi per il Pascal riguardo ai parametri formali
		   delle funzioni e procedure richiede ';' tra le dichiarazioni
		   dei suddetti, e richiede "," se si vuole dichiarare una lista
		   di parametri con lo stesso tipo e la stessa modalita` (per
		   valore o riferimento).
		   Esempio:
		   -------
                   procedure A(a,b:integer; var c,d:bool; e:string; var f:string)

	  2. Non esiste un solo algoritmo per ordinare un array. Dopo aver
	     scritto e capito il 'SelectionSort' (questo vale per gli studenti
	     non presenti a lezione il 2 Novembre), scrivere l'algoritmo di 
	     'InsertionSort' introdotto a lezione (questo vale per tutti).

	     Specifica del SelectionSort:
	     ----------------------------
	     andare a cercare l'elemento minimo nell'array e metterlo in posizione 
	     1, andare a cercare il secondo piu' piccolo e metterlo in posizione 2, 
	     e cosi` via. 
	     Piu' formalmente: per ciascun valore di un indice 'i', che facciamo
	     variare sull'array 'a', per i compreso tra 1 e n-1 (dove 'n' e` 
	     il numero di elementi dell'array), rendere ordinata la porzione di 
	     array a[1..i] e far si' che a[1..i]<=a[i+1..n] (ovvero tutti gli 
	     elementi gia` ordinati devono essere piu' piccoli o uguali a quelli 
	     ancora da ordinare). Chiaramente, quando i=1, a[1] e` ordinato
	     per definizione (essendo composto di un solo elemento), e perche` esso
	     sia minore di tutti gli altri elementi (quelli in a[2..n]) deve essere 
	     il minimo.
	     Esempio:
	     -------
	     4|10|7|2 --> 2|10|7|4 --> 2|4|7|10 --> 2|4|7|10
	     
	     Specifica dell'InsertionSort:
	     ----------------------------
             per ciascun valore di 'i' compreso tra 2 e n, si consideri la porzione
	     di array a[1..i-1] gia` ordinata e si vada ad inserire l'elemento
	     'a[i]' nella posizione giusta, in modo che la porzione di array
	     a[1..i] risulti ordinata. Se i=2, allora, siccome a[1] e` ordinato per 
	     definizione, l'algoritmo deve inserire a[2] al posto giusto (se e` piu'
	     piccolo di a[1], lo dovra` mettere al posto di a[1]), in modo che
	     a[1..2] risulti ordinato.
	     Esempio:
             -------
	     15|10|7|4 --> 10|15|7|4 --> 7|10|15|4 --> 4|7|10|15 

Soluzioni.