Corso di Laurea Ingegneria Civile Elementi di Informatica Esempi di Problemi Iterativi C. Limongelli Esempi di Problemi Iterativi 1
Contenuti Esercizi: Palindroma Anagramma Fibonacci Esempi di Problemi Iterativi 2
Palindroma Scrivere un programma che data in input una stringa non nulla, verifica se è palindroma Esempi: : è palindroma anna : è palindroma anno : non è palindroma anilina : è palindroma f : è palindroma 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"); 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 NON 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 Esempi di Problemi Iterativi 5
Palindroma: analisi del problema 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. Algoritmo: Esamino gli estremi della stringa e mi muovo verso il centro verificando che i caratteri simmetrici in esame siano uguali: uso due variabili inf e sup che all inizio sono gli indici estremi della stringa: inf = 0 e sup = s.length()-1 Verifico che i caratteri relativi siano uguali Incremento inf e decremento sup Ripeto il controllo Il ciclo si interrompe quando gli indici si sono accavallati oppure quando trovo due caratteri simmetrici diversi 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; 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 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... Esempi di Problemi Iterativi 9
Anagramma Scrivere un programma che, date due stringhe non nulle, verifica se una stringa è anagramma dell altra. Esempi: e sono anagrammi a e a sono anagrammi aroma e amaro sono anagrammi Aroma e amaro non sono anagrammi 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"); 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 Esempi di Problemi Iterativi 12
Anagramma: analisi del problema 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 Algoritmo: Se le stringhe hanno diversa lunghezza non sono anagrammi Verifico che ogni carattere di s occorre nella stringa t: se ciò accade elimino da t il carattere individuato Se al termine dell esame dei caratteri di s, t è vuota allora le stringhe originali sono una l anagramma dell altra Esempi di Problemi Iterativi 13
Anagramma: raffinamento dell algoritmo Input: s,t Output: true/false 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 sarà vuota alla fine del ciclo uscita dal ciclo se t è vuota allora t (originale) è anagramma di s 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{ 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 //uscita dal ciclo se t e' vuota allora la t e' anagramma di s anagramma = (t.equals("")); } return anagramma; }// end anagramma Esempi di Problemi Iterativi 16
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; } Esempi di Problemi Iterativi 17
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)); 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)); Esempi di Problemi Iterativi 18
Verifica del metodo elimina /* 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)); /* 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 Esempi di Problemi Iterativi 19
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... Esempi di Problemi Iterativi 20
Un algoritmo più efficiente Si può migliorare l algoritmo in modo che il controllo si fermi non appena un carattere di una stringa non occorre nell altra (e quindi le parole non sono anagramma l una dell altra)? C è sempre bisogno di eliminare i caratteri della stringa t che sono già stati esaminati, altrimenti non si prendono in considerazione doppioni es: abba babb potrebbe dare esito positivo nel confronto seguire lo schema della verifica universale: Inizialmente la proprietà è soddisfatta. Esempi di Problemi Iterativi 21
I numeri di Fibonacci Scrivere un programma che, dato un numero naturale N, visualizza sullo schermo i primi N numeri della successione di Fibonacci: I primi due numeri della successione di Fibonacci valgono 1 Ciascun termine della successione è dato dalla somma dei due termini che lo precedono Esempio: per n = 9 si ha: 1 1 2 3 5 8 13 21 34 Esempi di Problemi Iterativi 22
Visualizzazione dei numeri di Fibonacci: analisi del problema Che tipo di problema è? E un problema sia di conteggio che di accumulazione: Algoritmo per il calcolo di fib(n): fib(0) = 1 (prec ) fib(1) = 1 (succ ) fib(2) = prec +succ prec = succ succ = fib(2) prec succ f 1 1 1 2 1 1 3 1 1 2 4 1 2 3 5 2 3 5 Esempi di Problemi Iterativi 23
Visualizzazione dei numeri di Fibonacci: algoritmo Input: n Output: primi n+1 numeri di Fibonacci Per i=0,n Calcolo fib(i); Lo stampo Calcolo di fib(i) Servono due variabili prec e succ che rappresentano i due precedenti numeri di Fibonacci: prec = 1; succ = 1; f è 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; Esempi di Problemi Iterativi 24
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 Esempi di Problemi Iterativi 25
Generazione dell n-esmio numero di Fibonacci: il programma /* 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 Esempi di Problemi Iterativi 26
Riflessioni Ogni volta bisogna ricominciare a contare da fib(0) e fib(1) Si può tenere conto dei valori calcolati precedentemente per non ripetere ogni volta i conti? In questo caso il metodo deve essere unico Input: n Output: stampa dei primi n numeri di Fibonacci Esempi di Problemi Iterativi 27
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);}}} Esempi di Problemi Iterativi 28
Somma dei primi N numeri di Fibonacci Scrivere un programma che calcola la somma dei primi n numeri di Fibonacci Esempio: per n = 4 si ha: 1 + 1 + 2 + 3 = 7 Esempi di Problemi Iterativi 29
Somma dei primi N numeri di Fibonacci: algoritmo 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 prec succ f somma 1 1 1 1 2 1 1 1 2 3 1 + 1 2 4 4 1 + 2 3 7 5 2 + 3 5 12 Esempi di Problemi Iterativi 30
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; 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;} Esempi di Problemi Iterativi 31
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... Esempi di Problemi Iterativi 32