Esercizi svolti a lezione il 17 Novembre 2000 & Esercizi proposti

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

Lo scopo di questa lezione e' lo stesso della lezione di ieri.

Rovesciare un array di interi

Scriviamo una procedura invertiVett, che potra' essere usata in ogni programma in cui sono disponibili le seguenti dichiarazioni:

const LungVett = 100;
type VettInt = array [1..LungVett] of integer;

La procedura puo' essere facilmente scritta usando la procedura copiaInv (vedi pagina web della lezione del 16 Novembre 2000):

{Assume 1<=n<=MaxVett.
 Rovescia gli elementi di a[1..n].}
procedure invertiVett(var a:VettInt; n:integer)

{--------------------------------------------------}
var 
    i:integer;  {Contatore usato nel ciclo for}
    b: VettInt; {Per memorizzare a invertito} 

begin
   
   copiaInv(a,b,n);
   {b[1],...,b[n] contengono rispettivamente a[n],...,a[1]}

   for i:=1 to n do
     a[i]:=b[i]; {a[1..i]=b[1..i]}  

end;
{--------------------------------------------------}

Cerchiamo di riscrivere la procedura evitando di usare l'array ausiliario b, che occupa spazio (l'intestazione della procedura non cambia). Ricordiamo la condizione di uscita dal ciclo deve essere scritta DOPO aver scritto l'invariante di ciclo.


{--------------------------------------------------}
var 
    i:integer;    {Contatore usato nel ciclo while}
    temp:integer; {Per effettuare lo scambio}

begin

  i:=1;

  while ??? do {a[1..i-1] e a[n-i+2..n] 
                           sono stati "scambiati al rovescio"
                           SPIEGAZIONE DELLA NOTAZIONE:
                           ovvero: a[1] scambiato con a[n],
                                   a[2] scambiato con a[n-1],
                                   ...
                                   a[i-1] scambiato con a[n-i+2],
                           ricordando: che se inf>sup allora a[inf..sup]
                                       e' vuoto e la condizione e' vera}
    begin
       temp:=a[i];
       a[i]:=a[n-i+1]; 
       a[n-i+1]:=temp; 
       i:=i+1;
     end;
  {a[1..n] e' stato rovesciato}

end;
{--------------------------------------------------}

Esercizi proposti

Esercizi

1. Completare la procedura invertiVett, ovvero 
   mettere la condizione mancante (???) nel ciclo while precedente.

2. Riscivere la procedura invertiVett usando un ciclo for (nota l'intestazione
   non deve essere cambiata).

3. Tradurre il ciclo for precedente in while (usando la traduzione 
   illustrata a lezione, e riportata nella soluzione degli esercizi
   della lezione del 9 Novembre 2000).

4. Scrivete una funzione che soddisfa la seguente specifica.

{Assume 0<=n<=MaxVett. 
 Non modifica a.
 Restituisce
 true se a[1..n] e' uguale a[1..n] rovesciato
      (SPIEGAZIONE DELLA NOTAZIONE:
                           ovvero: a[1] = a[n],
                                   a[2] = a[n-1],
                                   ...
                                   a[n] = a[1],
                           ricordando: che se inf>sup allora a[inf..sup]
                                       e' vuoto e la condizione e' vera
 false altrimenti.}
function palindromo(var a:VettInt; n:integer):boolean;


Soluzioni (NON ANCORA PRESENTI)