AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

34
AN FI 98-99 Metodologie 1 Metodologie di progetto Metodologie top-down e bottom-up

Transcript of AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

Page 1: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Metodologie di progetto

Metodologie top-down e bottom-up

Page 2: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Metodologia top-down

Si parte dal problema e dalle proprieta’ note sul dominio dei dati

Si disgrega il problema in sottoproblemi Si affronta ciascun sottoproblema (con la

stessa metodologia) fino a raggiungere problemi risolubili con le mosse elementari

Page 3: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Impostazione ricorsiva

Si esprime la soluzione di un caso particolare

Si tenta di disgregare il problema in modo da ricondurre la soluzione del caso generale al caso particolare

Page 4: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Problema H(n)

Determinare il valore

H(n) = 1 + 1/2 +1/3 + ... + 1/n

Page 5: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

H(n): progetto

H(n): nat -> double

IPOTESI: n >0Riscrittura della relazione:

H(n) = (1 + 1/2 + … + 1/(n-1)) + 1/n

H(n) vale 1 per n = 1

H(n) vale 1/n + H(n-1) per n >1

Page 6: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

H(n): codifica

double H( int n ){

return

(n==1) ? 1: 1.0/n + H(n-1);

}

Page 7: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Problema: bk

Scrivere una funzione che restituisce il valore dell’espressione che segue:

bk

con b reale, k intero, k>= 0

Page 8: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

bk : progetto

power(b,k) double x nat -> double

IPOTESI: k >= 0Riscrittura della relazione:

b0 = 1

bk = b * bk-1 per k > 0

power(b,k) -> 1 per k = 0

power(b,k) -> b*power(b,k-1) per k > 0

Page 9: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

bk : codifica

double power(double b,int k){

return

(k==0)? 1 : b*power(b,k-1);

}

Page 10: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Valore di un polinomio a coeff 1

Scrivere una funzione che restituisce il valore dell’espressione che segue:

xn + xn-1 + ... + x + x0

con x reale, n intero, n>= 0

Page 11: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Polinomio: progetto

Riscrittura della relazione:

polin(x,n)= xn + xn-1 + ... + x + x0 =

xn + (xn-1 + ... + x + x0) =xn + polin(x,n-1)

Page 12: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Polinomio: codifica

double pol( double x, int n ){

return

(n==0)?1:power(x,n)+pol(x,n-1);

}

Page 13: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Polinomio: un altro ragionamento

polin(x,n)= xn + xn-1 + ... + x + x0 =( ... ( (x + 1 ) *x + 1 ) * x + ... +1)* x + 1

v

v = 1v = v*x + 1 n volte

Page 14: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Polinomio: un altro ragionamento

x4 + x3 + x2 + x1 + x0=(( ( x + 1 ) *x + 1 ) * x +1) *x

+1v = 1

v = v*x + 1

v = v*x + 1

v = v*x + 1

v = v*x + 1

0

1

2

3

4

Page 15: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Polinomio: un altro ragionamento

so che al passo k=0, il valore corrente del polinomio vale 1

sapendo che, al passo k, il valore corrente del polinomio vale v, al passo k+1 il valore corrente del polinomio vale v*x+1

Page 16: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Polinomio

double pol( double x, int n ){return polin(x,n,1,0);

}

double polin (double x,int n,double v,int k){return(k==n)?v:polin(x,n,v*x+1,k+1);}

Page 17: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Fattoriale

N! = 1*1*2*3*…*N

so che al passo k=0, n! vale 1 sapendo che, al passo k, n! vale v, al passo

k+1 n! vale v*k

Page 18: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Fattoriale

int fact( int n ){//so che al passo 0 n! vale 1

return factIter(n,1,0); }

int factIter (int n,int v,int k){//so che al passo k n! vale v//dunque al passo k+1 n! vale v*k

return (k<n)?factIter(n,v*(k+1),k+1):v; }

Page 19: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Contaminuscole

Definire una funzione ContaMinuscole che restituisca il numero di lettere minuscole del tipo prededfinito char

int ContaMinuscole ()

Page 20: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Contaminuscole: progetto

Partendo dal carattere ‘a’ e procedendo con il carattere successivo, si incrementa un contatore, fino a raggiungere il carattere ‘z’

IPOTESI:– la funzione Succ(char c) restituisce il

carattere ASCII successivo al carattere c

Page 21: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Contaminuscole: riprogetto

detto chIn il carattere di partenza e chEnd il carattere finale,– se chIn e’ uguale a chEnd il il numero dei

caratteri e’ uguale al 1;– se chIn precede chEnd il numero dei

caratteri e’ uguale al 1 piu’ il numero dei caratteri da Succ(chIn) a chEnd

Page 22: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Contaminuscole: codifica

int ContaMinuscole () {return contaChar(‘a’,’z’);

}

La soluzione introduce un componente software (la funzione contaChar) che risolve un problema piu’ generale di quello dato

Page 23: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

contaChar

int contaChar(char chIn, char chEnd){// chIn: carattere iniziale

// chEnd: carattere finale

return(chIn == chEnd) ? 1 :

1+contaChar(Succ(chIn),chEnd);

}

Page 24: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

La funzione succ sui caratteri

char Succ(char ch){

int succRep = ord(ch)+1;

return (succRep<=255)?((char)succRep):‘\0’;

}

Page 25: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Le funzioni ord e chr

int ord(char ch){

return (int)ch; }

char chr(int rapCh){

return

((rapCh>=0)&&(rapCh<=255))?

(char)rapCh:‘\0’; }

Page 26: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Scorciatoie

int contaChar(char chIn, char chEnd){// chIn: carattere iniziale

// chEnd: carattere finale

return( chIn==chEnd ) ? 1 :

1+contaChar((int)chIn+1,chEnd);

}

Page 27: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Un altro ragionamento contaChar puo’ ricevere come informazione di

ingresso:– un carattere generico ch compreso tra chIn e chEnd ;– il valore nc del numero di caratteri che va dal carattere

di inizio a ch

contaChar(contaChar(charchar ch, ch,int int ncnc,char,char chEnd) chEnd) In tal caso:

Page 28: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Un ragionamento iterativo

Se ch coincide con chEnd, allora il numero dei caratteri compresi tra chIn e chEnd vale nc

Se ch precede chEnd, allora il numero dei caratteri compresi tra chIn e chEnd puo’ essere denotato dall’espressione:

contaChar(Succ(ch),nc+1,chEnd)

Page 29: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

contaCharTl

intint contaCharTl( contaCharTl(charchar ch, ch, int int ncnc, char, char chEnd){ chEnd){// ch: carattere corrente

// nc: numero dei caratteri dall’inizio a ch

// chEnd: carattere finale

return(ch==chEnd)? nc :

contaCharTl(Succ(ch),nc+1,chEnd);

}

Page 30: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

ContaMinuscole

int ContaMinuscole () {return contaCharTlcontaCharTl(‘a’,1,’z’);

}

Page 31: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Una strada molto breve

Avendo realizzato una funzione di trasformazione da caratteri a interi, la soluzione del problema e’:

ord(‘z’)-ord(‘a’)+1;

Page 32: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Numero cifre

Determinare il numero di cifre decimali che compaiono in una stringa data

Page 33: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Numero cifre: progetto

int numCifre( String s )

sapendo che nella sottostringa da 0 a k di s vi sono n digit, nella sottostringa da 0 a k+1:– vi sono n+1 digit se il carattere di posizione k+1

e’ un digit– vi sono n digit se il carattere di posizione k+1 non

e’ un digit

Page 34: AN FI 98-99 Metodologie1 Metodologie di progetto Metodologie top-down e bottom-up.

AN FI 98-99 Metodologie1

Numero cifre: codifica

int numCifre( String s ){

return numCifre1( s,0,0 ); }

int numCifre1(String s,int n,int k){

return (k==s.length()) ? n :

((isDigit(s.charAt(k))) ? numCifre1( s,n+1,k+1 ):

numCifre1( s,n,k+1 ) );

}