Esercizi svolti a lezione il 5 Ottobre 2000 & Esercizi proposti


program Massimo;

{pre: nessuna condizione} 
{post: massimo di una sequenza di interi in input e sua posizione}

var x, max, maxpos, c: integer;

begin
  max:=0;
  c:=1;
  readln(x);
  while (x<>0) do    {inv. 'max contiene l'intero massimo introdotto finora'}
    begin
      if (x>max)
       then begin max:=x; maxpos:=c; end;
      readln(x);
      c:=c+1;
    end;
  if (max<>0)
   then writeln('Il massimo ', max,' era in posizione ', maxpos)
   else writeln('La sequenza considerata era vuota');
  readln;
end.


NOTA:  La soluzione proposta puo` essere migliorata sotto alcuni punti di 
       vista.  Provateci, se volete...

program Moltiplicazione1;

{pre: n,m>=0 interi}
{post: calcolo e stampa di n*m iterando la somma}

var n, m, i, p: integer;

begin
   readln(n,m);
   p:= 0;      {p = n*0}
   for i:= 0 to m-1 do    {inv. p = n*i}
       p:= p+n;
   writeln(p)      {i = m, dunque p = n*m}
end.

program Moltiplicazione2;

{pre: n,m>=0 interi}
{post: calcolo e stampa di n*m iterando la somma}

var n, m, i, p: integer;

begin
   readln(n,m);
   p:= 0;      {p = n*0}
   for i:= 1 to m do    {inv. p = n*(i-1)}
       p:= p+n;
   writeln(p)      {i = m+1, dunque p = n*m}
end.

NOTA:  I programmi Moltiplicazione1 e Moltiplicazione2 sono 
       equivalenti e differiscono solo per l'inizializzazione della e 
       la condizione di terminazione sulla variabile 'i' del ciclo 'for', 
       ma e` comunque interessante comparare le rispettive invarianti 
       (asserzioni) di ciclo.

Funzioni definibili iterativamente: Esercizi proposti

Gli esercizi che seguono sono alcuni esempi di funzioni che, tranne il
fibonacciano, sono o disponibili preimplementate, oppure banalmente
definibili utilizzando funzioni di libreria (come la moltiplicazione
eseguita con somme iterate). Lo scopo degli esercizi e' invece quello di 
ridefinirle utilizzando solo un sottoinsieme delle funzioni preimplementate.

Fibonacciano

Esercizio La funzione di Fibonacci fib(n) e' definita come segue: fib(0) = 0 fib(1) = 1 fib(n+2) = fib(n) + fib(n+1) Si scriva un programma iterativo che, dato n, calcoli fib(n). Suggerimento Il calcolo di fib(n) quando n>1 dipende dai valori di fib su 0,...,n-2,n-1, ma di tutti questi servono solo gli ultimi due.

Somma, differenza, esponenziale, moltiplicazione veloce

Esercizi 1. Si definisca la somma tra interi positivi utilizzando soltanto il successore (_+1) e la relazione di minore. 2. Definire iterativamente la differenza naturale -- (n -- m = n-m se n>=m, n -- m = 0 altrimenti) utilizzando il predecessore naturale (pred(n) = n-1 se n>0, pred(0)=0). 3. Definire iterativamente l'esponenziale tra naturali usando il prodotto. 4. Velocizzare la definzione iterativa del prodotto sfruttando le eguaglianze: n * 2m = 2n * m = (n+n) * m, n * (2m + 1) = 2n * m + n = [(n+n) * m] + n. Si osservi che nella parte destra delle eguaglianze il moltiplicatore e' piu' piccolo che nella parte sinistra. Nel programma si usino div e mod.

Soluzioni.