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