Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
1 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Dispensa E07 Esempi di Problemi Iterativi
C. Limongelli Dicembre 2011
2 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Contenuti
q Esercizi:
§ Palindroma
§ Anagramma § Fibonacci
3 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Palindroma
q Scrivere un programma che verifica se una stringa, non vuota, data in input sia palindroma
q Esempi: “anna”: è palindroma
“anno”: non è palindroma “anilina”: è palindroma “f”: è palindroma “”: è palindroma
4 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Palindroma: verifica di correttezza public static void test(){ String s; //stringa su cui vengono effettuate le prove
/* stringa vuota */ s = ""; System.out.println(palindroma(s) + " = true");
/* stringa formata da un solo elemento */ s = "a"; System.out.println(palindroma(s) + " = true");
/* stringa palindroma formata da due elementi */ s = "bb"; System.out.println(palindroma(s) + " = true");
/* stringa NON palindroma formata da due elementi */ s = "bc"; System.out.println(palindroma(s) + " = false");
/* stringa palindroma con 3 o piu' elementi dispari */ s = "madamimadam"; System.out.println(palindroma(s) + " = true");
5 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
…Palindroma: verifica di correttezza
/* stringa NON palindroma con 3 o piu' elementi dispari */ s = "barba"; System.out.println(palindroma(s) + " = false");
/* stringa palindroma con 4 o piu' elementi pari */ s = "acca"; System.out.println(palindroma(s) + " = true");
/* stringa palindroma con 4 o piu' elementi pari */ s = "arca"; System.out.println(palindroma(s) + " = false");
/* i primi due elementi esaminati sono diversi */ s = "anccno"; System.out.println(palindroma(s) + " = false");
/* gli ultimi due elementi esaminati sono diversi */ s = "abcdefxyfedcba"; System.out.println(palindroma(s) + " = false");
}//end test
6 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Palindroma: analisi del problema
q Che tipo di verifica è? § Verifica Universale: devo verificare che tutte le
coppie di caratteri simmetrici siano uguali. Dualmente: devo verificare che esiste almeno una coppia di caratteri simmetrici che sono diversi.
q Algoritmo: § Esamino gli estremi della stringa e mi muovo verso il
centro verificando che i caratteri simmetrici in esame siano uguali
§ Il ciclo si interrompe quando gli indici si sono “accavallati” oppure quando trovo due caratteri simmetrici diversi
7 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Palindroma: il metodo… /* metodo che restituisce vero se la stringa e'
palindroma, falso altrimenti */ public static boolean palindroma(String s){ //pre: s non nulla boolean palindroma; int inf,sup; //indici per analizzare i caratteri
/* assumo che la parola sia palindroma finche'
non trovo una coppia di caratteri distinti */ palindroma = true;
/* inizializzo gli indici che si riferiscono agli
estremi della stringa */ inf = 0; sup = s.length()-1;
8 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
…Palindroma: il metodo /* il ciclo si ferma quando una delle due condizioni e‘
falsa: inf >=sup : gli indici sono sul carattere centrale
se la parola e' di lunghezza dispari oppure gli indici si sono "accavallati"
palindroma e' false: sono stati trovati due caratteri simmetrici che sono diversi tra loro */
while (inf<sup && palindroma){ if (s.charAt(inf)!=s.charAt(sup)) palindroma = false; inf = inf+1; sup = sup-1; }
return palindroma; }// end palindroma
9 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Esempio di esecuzione
true = true true = true true = true false = false true = true false = false true = true false = false false = false false = false Press any key to continue . . .
10 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Anagramma
q Scrivere un programma che, date due stringhe, verifica se una stringa è anagramma dell’altra.
q Esempi: “” e “” sono anagrammi “a” e “a” sono anagrammi “aroma” e “amaro” sono anagrammi “Aroma” e “amaro” non sono anagrammi
11 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Anagramma: verifica di correttezza… public static void testAnagramma(){ String s,t; //stringa su cui vengono effettuate
le prove /* stringa vuota */ s = ""; t= ""; System.out.println(anagramma(s,t) + " = true");
/* verifico con una stringa formata da un solo
elemento */ s = "a"; t = "b"; System.out.println(anagramma(s,t) + " = false");
/* verifico con una stringa formata da un solo
elemento */ s = "a"; t = "a"; System.out.println(anagramma(s,t) + " = true");
/* verifico con ...*/ s = "ccc"; t = "ccc"; System.out.println(anagramma(s,t) + " = true");
12 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
… Anagramma: verifica di correttezza /* verifico con ... */ s = "ciao"; t = "caio"; System.out.println(anagramma(s,t) + " = true");
/* verifico con ... */ s= "roma"; t = "aroma"; System.out.println(anagramma(s,t) + " = false");
/* verifico con ... */ s= "roma"; t = "mara"; System.out.println(anagramma(s,t) + " = false");
}//end testAnagramma
13 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Anagramma: analisi del problema
q Che tipo di verifica è? § Verifica Universale: date le stringhe s e t ogni
carattere di s deve trovarsi in t, anche se in posizione diversa
q Algoritmo: § Se le stringhe hanno diversa lunghezza non sono
anagrammi § Verifico che ogni carattere di s occorre nella stringa
t: se cio’ accade elimino da t il carattere individuato § Se al termine dell’esame dei caratteri di s, t e’ vuota
allore le stringhe originali sono una l’anagramma dell’altra
14 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Anagramma: raffinamento dell’algoritmo
q Input: s,t q Output: true/false q Algoritmo:
§ Per i=1,fino alla fine della stringa • prendo l'i-esimo carattere di s • verifico se occorre nella stringa t: pos restituisce l'eventuale
posizione • Se (pos >= 0) allora elimino il carattere dalla stringa t
nel caso in cui pos<0 non viene eliminato nessun carattere dalla stringa t, quindi t non sara' vuota alla fine del ciclo
§ uscita dal ciclo se t e' vuota allora la t e' anagramma di s
15 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Anagramma: il metodo… public static boolean anagramma(String s, String t){ //pre: s non nulla //verifica universale: ogni carattere di s deve trovarsi in t, anche se in posizione diversa
boolean anagramma; int ls,lt; //lunghezza delle stringhe int i; //contatore char c; //appoggio int pos; //posizione del carattere da eliminare
ls = s.length(); lt = t.length(); if (ls!=lt) anagramma = false;//se non hanno la
stessa lunghezza else{ . . .
16 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
…Anagramma: il metodo… . . .
for (i=0; i<ls; i++){ //prendo l'i-esimo carattere di s c= s.charAt(i); //verifico se occorre nella stringa t: //pos restituisce l'eventuale posizione pos = t.indexOf(c); if (pos >= 0) //elimino il carattere dalla stringa t t = elimina(t,pos);
/* nel caso in cui pos<0 non viene eliminato nessun carattere dalla stringa t, quindi t non sara' vuota alla fine del ciclo */
} //end for . . .
17 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
. . . Anagramma: il metodo . . .
/* uscita dal ciclo se t e' vuota allora la t
e‘ anagramma di s */ if (t.equals("")) anagramma = true; else anagramma = false; } // end else return anagramma; }// end anagramma
18 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Il metodo elimina /* metodo che restituisce una nuova stringa che e' come s ma non contiene la prima occorrenza del carattere c */
public static String elimina(String s, int i){ //pre: s non vuota //pre: i corrisponde alla posizione del carattere
da eliminare String nuova;//nuova stringa costruita int l; //lunghezza della stringa l=s.length(); nuova = s.substring(0,i) + s.substring(i+1,l); return nuova; }
19 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Verifica del metodo elimina… public static void testElimina(){ String s; int i;
/*un solo elemento */ s = "a"; i=0; System.out.print("stringa: " + s); System.out.print(" indice del carattere da eliminare " + i); System.out.println(" stringa risultato: " + elimina(s,i));
/* due elementi */ s="ab"; i=1; System.out.print("stringa: " + s); System.out.print(" indice del carattere da eliminare " + i); System.out.println(" stringa risultato: " + elimina(s,i));
. . .
20 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
…Verifica del metodo elimina… . . . s= "ab"; i=0; System.out.print("stringa: " + s); System.out.print(" indice del carattere da eliminare " + i); System.out.println(" stringa risultato: " + elimina(s,i));
/* tre o piu' caratteri: */
/* primo carattere */
s = "capra"; i=0; System.out.print("stringa: " + s); System.out.print(" indice del carattere da eliminare " + i); System.out.println(" stringa risultato: " + elimina(s,i));
. . .
21 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
…Verifica del metodo elimina . . .
/* generico carattere centrale */ s = "capra"; i=3; System.out.print("stringa: " + s); System.out.print(" indice del carattere da eliminare " + i); System.out.println(" stringa risultato: " + elimina(s,i));
/* ultimo carattere */ s = "capra"; i=4; System.out.print("stringa: " + s); System.out.print(" indice del carattere da eliminare " + i); System.out.println(" stringa risultato: " + elimina(s,i));
}//end testElimina
22 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Esempio di esecuzione
*** TEST DEL METODO DI SUPPORTO *** stringa: a indice del carattere da eliminare 0 stringa risultato: stringa: ab indice del carattere da eliminare 1 stringa risultato: a stringa: ab indice del carattere da eliminare 0 stringa risultato: b stringa: capra indice del carattere da eliminare 0 stringa risultato: apra stringa: capra indice del carattere da eliminare 3 stringa risultato: capa stringa: capra indice del carattere da eliminare 4 stringa risultato: capr *** TEST DEL METODO ANAGRAMMA *** true = true false = false true = true true = true true = true false = false false = false Press any key to continue . . .
23 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
I numeri di Fibonacci
q Scrivere un programma che, dato un numero naturale n, visualizza sullo schermo i primi n numeri della successione di Fibonacci: q I primi due numeri della successione di Fibonacci valgono 1 q Ciascun termine della successione è dato dalla somma dei due termini che lo precedono q Esempio: per n = 9 si ha:
1 1 2 3 5 8 13 21 34 …
24 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Visualizzazione dei numeri di Fibonacci: analisi del problema
q Che tipo di problema è? § E’ un problema sia di conteggio che di
accumulazione:
prec succ f
0 1 1
1 1 1
2 1 1 2
3 1 2 3
4 2 3 5
Algoritmo per il calcolo di fib(n): fib(0) = 1 prec fib(1) = 1 succ fib(2) = prec +succ prec = succ succ = fib(2) …
25 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Visualizzazione dei numeri di Fibonacci: algoritmo
q Input: n q Output: primi n+1 numeri di Fibonacci
§ Per i=0,n • Calcolo fib(i); • Lo stampo
q Calcolo di Fib(i) § Servono due variabili prec e succ che rappresentano I due
precedenti numeri di Fibonacci: § prec = 1; § succ = 1; § f e’ l’accumulatore in cui viene memorizzato il risultato f=1;
if (n>1) for (i=2; i<=n; i++){ f = prec + succ; prec = succ; succ = f;} return f;
26 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Generazione dell’n-esmio numero di Fibonacci: il metodo public static int fib(int n){ int f; //valore di ritorno del metodo int i; //indice per l'istruzione iterativa int prec,succ; //i due precedenti numeri di
Fibonacci calcolati prec = 1; //Fib(0) succ = 1; //Fib(1) f =1; if (n>1) for (i=2; i<=n; i++){ f = prec + succ; prec = succ; succ = f;} return f; }// end fib
27 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Generazione dell’n-esmio numero di Fibonacci: la classe
/* classe che crea i numeri di Fibonacci */ class Fibonacci{ public static void main(String[] args){ int n; // n-esimo numero di Fibonacci int i; //contatore System.out.println("Metodo che calcola i primi n numeri di Fibonacci");
System.out.println("scrivi un numero >=0"); n = Lettore.in.leggiInt();
for (i=0; i<n; i++) System.out.println("Fib("+i+") = " + fib(i));
}//end main
28 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Riflessioni
q Ogni volta bisogna ricominciare a contare da fib(0) e fib(1)
q Si puo’ tenere conto dei valori calcolati precedentemente per non ripetere ogni volta I conti?
q In questo caso il metodo deve essere unico § Input: n § Output: stampa dei primi n numeri di Fibonacci
29 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Il metodo stampaFib /* crea e stampa n numeri di Fibonacci "tutti insieme" */ public static void stampaFib(int n){ int f; //valore di ritorno del metodo int i; //indice per l'istruzione iterativa int prec,succ; //i due precedenti numeri di Fibonacci if (n==0) System.out.println("Fib(0)=1"); else if (n==1){ System.out.println("Fib(0)=1"); System.out.println("Fib(1)=1");} else{ System.out.println("Fib(0)=1"); System.out.println("Fib(1)=1"); prec = 1; //Fib(0) succ = 1; //Fib(1) f =1; for (i=2; i<=n; i++){ f = prec + succ; prec = succ; succ = f; System.out.println("Fib("+i+") = "+f);}}}
30 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Somma dei primi N numeri di Fibonacci
q Scrivere un programma che calcola la somma dei primi n numeri di Fibonacci
q Esempio: per n = 4 si ha: 1 + 1 + 2 + 3 = 7
31 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
prec = 1; succ = 1; somma =2; for (i=2; i<n; i++) { //calcolo l'iesimo numero di Fibonacci f = prec+succ; //aggiorno la somma somma = somma+f; prec = succ; succ = f; }// end for
Somma dei primi N numeri di Fibonacci: l’algoritmo
prec succ f somma
0 1 1 1
1 1 1 1 2
2 1 1 2 4
3 1 2 3 7
4 2 3 5 12
+
+
+
32 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Somma dei primi N numeri di Fibonacci: il metodo . . . public static int sommafib(int n){ int f; //numero di fibonacci int i; //indice per l'istruzione iterativa int prec,succ; // i due precedenti numeri di Fibonacci calcolati int somma; if (n==1) somma = 1; else if (n==2) somma = 2; else { // n>2 prec = 1; succ = 1; somma = 2;
. . .
33 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Somma dei primi N numeri di Fibonacci: il metodo
. . . for (i=2; i<n; i++){ //calcolo l'iesimo numero di Fibonacci f = prec+succ; //aggiorno la somma somma = somma+f; prec = succ; succ = f; }// end for }//end else return somma;}
34 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di Problemi Iterativi
Esempio di esecuzione
Metodo che calcola i primi n numeri di Fibonacci scrivi un numero > 0 6 Fib(0) = 1 Fib(1) = 1 Fib(2) = 2 Fib(3) = 3 Fib(4) = 5 Fib(5) = 8 Metodo che calcola la somma dei primi n numeri di Fibonacci scrivi un numero > 0 6 La somma dei primi 6 numeri di Fibonacci e' 20 Press any key to continue . . .