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