Esempi di Problemi Iterativi

Documenti analoghi
Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Esercizi sui metodi. Carla Limongelli. Maggio Esercizi 1

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

Problemi, algoritmi e oggetti

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Programmazione 1 A.A. 2015/2016

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Esercitazione 6. Array

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe

Laboratorio di Programmazione 1 [Java]

Polinomio di secondo grado: Calcolo delle soluzioni di una equazione di secondo grado: import GraphicIO.*; public class Polinomio2 {

Esercizi della lezione 5 di Java

Esercitazione 3. Espressioni booleane I comandi if-else e while

INFORMATICA GRAFICA - FONDAMENTI DI INFORMATICA Ing. Civile - Edile/Architettura Dott. Penzo SOLUZIONE PROVA SCRITTA DEL 16/09/2002.

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

PROGRAMMAZIONE STRUTTURATA

Corso sul linguaggio Java

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Compitino di Laboratorio di Informatica CdL in Matematica 13/11/2007 Teoria Compito A

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Matlab: esempi ed esercizi

5 - Istruzioni condizionali

Unità B3 Strutture di controllo

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

Roadmap. Ricorsione: funzioni ricorsive. Definizione di fattoriale. Definizione dei numeri Fibonacci

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

10 - Programmare con gli Array

Esempio: L EURO-CONVERTITORE (1) Scopo

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

ARRAY E STRINGHE. G. Frosini Slide 1

Informatica/ Ing. Meccanica/ Prof. Verdicchio/ 14/02/2012 / Foglio delle domande / VERSIONE 1

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

ESERCIZI DI PROGRAMMAZIONE. - condizionali e cicli -

PROGRAMMAZIONE: Le strutture di controllo

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Prova di Laboratorio del [ Corso A-B di Programmazione (A.A. 2004/05) Esempio: Media Modalità di consegna:

Corso di Informatica 1 Esercitazione n. 4

Esercizi per la prova in itinere (con soluzioni)

MODULO 4: LE STRUTTURE ITERATIVE: FOR, WHILE E DO LOOP UNTIL

Istruzioni Condizionali

Esercitazione 4. Comandi iterativi for, while, do-while

Le Strutture di controllo Del Linguaggio C. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Istruzioni iterative. Istruzioni iterative

Le strutture di controllo in C++

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Esercizi in Java. 22 novembre Anni Bisestili 3. 2 Massimo e Media di un array di 10 elementi 3. 3 Primi 10 Numeri Triangolari 4

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Esercizi su Python. 14 maggio Scrivere una procedura che generi una stringa di 100 interi casuali tra 1 e 1000 e che:

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

Laboratorio di Informatica

Programmazione Orientata agli Oggetti in Linguaggio Java

Pr1: determinare il maggiore di n numeri interi n. Fondamenti di Informatica Prof. Vittoria de Nitto Personè

Dati aggregati. Violetta Lonati

Esercizi di Fondamenti d Informatica I

Esercitazione 15. Il problema dello Sleeping Barber

Le variabili. Olga Scotti

AA LA RICORSIONE

Definizione di metodi in Java

n deve essere maggiore di 0, altrimenti il metodo restituisce null.

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Transcript:

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