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 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)