Fondamenti di Informatica Esempi di Problemi Iterativi

Corso di Laurea Ingegneria Informatica
Fondamenti di Informatica
Dispensa E07
Esempi di Problemi Iterativi
C. Limongelli
Dicembre 2011
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
1
Contenuti
q  Esercizi:
§  Palindroma
§  Anagramma
§  Fibonacci
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
2
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
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
3
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");
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
4
…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
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
5
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
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
6
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;
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
7
…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
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
8
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 . . .
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
9
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
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
10
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");
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
11
… 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
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
12
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
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
13
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
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
14
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{
. . .
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
15
…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
. . .
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
16
. . . 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
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
17
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;
}
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
18
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));
. . .
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
19
…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));
. . .
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
20
…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
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
21
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 . . .
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
22
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 …
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
23
Visualizzazione dei numeri di Fibonacci:
analisi del problema
q Che tipo di problema è?
§  E’ un problema sia di conteggio che di
accumulazione:
prec
Algoritmo per il calcolo di fib(n):
fib(0) = 1 prec
fib(1) = 1 succ
fib(2) = prec +succ
prec = succ
succ = fib(2)
…
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
0
succ
1
1
f
1
1
1
2
1
1
2
3
1
2
3
4
2
3
5
24
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;
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
25
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
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
26
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
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
27
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
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
28
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);}}}
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
29
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
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
30
Somma dei primi N numeri di Fibonacci:
l’algoritmo
prec = 1;
succ = 1;
somma =2;
for (i=2; i<n; i++) {
prec
//calcolo l'iesimo numero di Fibonacci
f = prec+succ;
//aggiorno la somma
somma = somma+f;
prec = succ;
succ = f;
}// end for
http://www.dia.uniroma3.it/~java/fondinf/
succ
f
somma
1
1
1
1
2
0
1
1
1
2
1
+
1
2
4
3
1
+
2
3
7
4
2
+
3
5
12
Esempi di Problemi Iterativi
31
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;
. . .
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
32
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;}
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
33
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 . . .
http://www.dia.uniroma3.it/~java/fondinf/
Esempi di Problemi Iterativi
34