Fondamenti di informatica Oggetti e Java Luca Cabibbo Problemi, algoritmi e oggetti Capitolo 5 dicembre 2003 1 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Problemi e algoritmi Il problema dell’attraversamento di un labirinto semplice in out una soluzione robbie 1: avanza() 2: avanza() 3: avanza() 2 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Comprensione del problema I problemi sono descritti dalla loro specifica Problema attraversamento di un labirinto semplice in out Insieme di ingresso il robot robbie Pre-condizione il robot robbie si trova all’ingresso di un labirinto semplice, nella direzione di ingresso Insieme di uscita vuoto Post-condizione il robot robbie si trova all’uscita del labirinto semplice 3 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Specifica di un problema La specifica di un problema insieme di ingresso o parametri i parametri del problema dati di ingresso e oggetti di ingresso pre-condizione condizione relativa all’insieme di ingresso insieme di uscita o risultati dati di uscita e oggetti di uscita post-condizione condizione relativa all’insieme di uscita 4 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Identificazione di un algoritmo per il problema Un algoritmo per un problema una sequenza di istruzioni che permette di far evolvere gli oggetti di interesse da uno stato iniziale che soddisfa la precondizione a uno stato finale che soddisfa la post-condizione sulla base di ulteriori dati di ingresso calcolando eventuali dati in uscita espressa in termini delle istruzioni di un esecutore automatico 5 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Identificazione di un algoritmo I procedimenti risolutivi possono essere espressi a vari livelli di dettaglio 1. fai avanzare robbie tre volte 1. fai avanzare robbie tre volte 1.1 fai avanzare robbie 1.2 fai avanzare robbie 1.3 fai avanzare robbie 1. fai avanzare robbie tre volte 1.1 fai avanzare robbie robbie.avanza(); 1.2 fai avanzare robbie robbie.avanza(); 1.3 fai avanzare robbie robbie.avanza(); 6 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Dall’algoritmo all’oggetto import fiji.robot.*; /* Oggetto per l'attraversamento di labirinti semplici. */ class AttraversatoreLabirintoSemplice { /* Fa attraversare a robbie un labirinto semplice. */ public static void attraversaLabirintoSemplice( Robot robbie) { // pre: robbie all'ingresso di un labirinto semplice /* 1. fai avanzare robbie tre volte */ /* 1.1 fai avanzare robbie */ robbie.avanza(); /* 1.2 fai avanzare robbie */ robbie.avanza(); /* 1.3 fai avanzare robbie */ robbie.avanza(); } } 7 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Uso dell’oggetto import fiji.robot.*; /* Crea un robot e gli * semplice. */ class Teseo { public static void Labirinto l; Robot r; fa attraversare un labirinto main(String[] args) { // un labirinto semplice // robot nel labirinto l /* crea il robot in un labirinto semplice */ l = new Labirinto("semplice"); r = new Robot(l); /* fa attraversare il labirinto l a r */ AttraversatoreLabirintoSemplice. attraversaLabirintoSemplice(r); /* ora r è all'uscita di l */ } } 8 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Uso dell’oggetto 1.3: attraversaLabirintoSemplice(r) 1: main() «applicazione» Teseo AttraversatoreLabirinto Semplice void attraversaLabirintoSemplice(Robot r) main(...) 1.2: r = new Robot(l) 1.1: l = new Labirinto("semplice") 1.3.1: avanza() 1.3.2: avanza() 1.3.3: avanza() r : Robot l : Labirinto 9 Problemi, algoritmi e oggetti avanza() giraDestra() giraSinistra() boolean dentro() boolean fronteAlMuro() Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Qualità degli algoritmi Qualità fondamentali degli algoritmi correttezza efficienza leggibilità modificabilità parametricità riusabilità essere consegnato nei tempi previsti 10 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Correttezza Il procedimento presentato risolve il problema dell’attraversamento di un labirinto semplice è corretto Il seguente procedimento è invece non corretto 1. fai avanzare robbie due volte 1.1 fai avanzare robbie 1.2 fai avanzare robbie in 11 Problemi, algoritmi e oggetti out Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Correttezza Un altro esempio di procedimento non corretto 1. fai avanzare robbie 2. fai girare a sinistra robbie 3. fai avanzare robbie in 12 Problemi, algoritmi e oggetti out Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Efficienza Un algoritmo è tanto più efficiente quanto meno risorse richiede per la sua esecuzione 1. fai avanzare robbie due volte robbie.avanza(); robbie.avanza(); 2. fai fare a robbie un giro su se stesso robbie.giraSinistra(); robbie.giraSinistra(); robbie.giraSinistra(); robbie.giraSinistra(); 3. fai avanzare robbie robbie.avanza(); 13 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Introduzione agli algoritmi (per esempi) Le nozioni di problema e di algoritmo vengono ora approfondite mediante lo studio di alcuni esempi un algoritmo è una sequenza di istruzioni che, se eseguite ordinatamente, permettono di risolvere un certo problema gli algoritmi vengono scritti mediante un linguaggio per esprimere algoritmi la progettazione degli algoritmi avviene solitamente per raffinamenti successivi la verifica delle qualità di un algoritmo (in particolare, la correttezza e l’efficienza) richiede strumenti adeguati 14 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Un linguaggio per scrivere algoritmi Gli algoritmi vengono solitamente espressi mediante linguaggi intermedi basati sull’uso delle seguenti tipologie di istruzioni istruzioni semplici invio di un messaggio a un oggetto calcolo di una espressione e assegnazione istruzioni di controllo sequenza istruzione condizionale istruzione ripetitiva 15 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Sequenza Una sequenza (o istruzione composta o blocco) è un gruppo di istruzioni che devono essere eseguite in sequenza { istruzione-1 istruzione-2 ... istruzione-n } 16 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Istruzione condizionale L’istruzione condizionale (istruzione if-else) consente di eseguire una istruzione tra una coppia di istruzioni istruzione-1 e istruzione-2 condizionatamente al verificarsi (o meno) di una condizione condizione if (condizione) istruzione-1 else istruzione-2 Una variante l’istruzione if 17 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Istruzione ripetitiva L’istruzione ripetitiva (istruzione while) consente di eseguire ripetutamente una istruzione istruzione fintanto che la condizione condizione risulta verificata while (condizione) istruzione 18 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Progettazione di algoritmi Progettazione di algoritmi per raffinamenti successivi (strategia top-down) scrivi una versione iniziale dell’algoritmo raffina ciascun passo dell’algoritmo, fintato che l’algoritmo non è completo di tutti i dettagli la progettazione di un algoritmo per raffinamenti successivi è una attività iterativa 19 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Una metodologia per la progettazione di algoritmi Esempio 1. fai avanzare robbie tre volte 1. fai avanzare robbie tre volte 1.1 fai avanzare robbie 1.2 fai avanzare robbie 1.3 fai avanzare robbie 1. fai avanzare robbie tre volte 1.1 fai avanzare robbie robbie.avanza(); 1.2 fai avanzare robbie robbie.avanza(); 1.3 fai avanzare robbie robbie.avanza(); 20 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Problemi di ingresso-uscita I problemi di ingresso-uscita sono una classe ristretta di problemi i dati di ingresso del problema vengono letti dalla tastiera i dati di uscita calcolati risolvendo il problema vengono visualizzati sullo schermo Un esempio di problema di ingresso-uscita si vuole leggere dalla tastiera una coppia di numeri A e B, calcolarne la somma e visualizzarla sullo schermo Scrivi due numeri interi 10 15 La somma dei due numeri è 25 21 problemi di questo tipo portano alla scrittura di applicazioni Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Problemi di ingresso-uscita Specifica di un problema di ingresso-uscita dati di ingresso letti dalla tastiera pre-condizione dati di uscita visualizzati sullo schermo post-condizione 22 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Lettura e somma di due numeri interi Si vuole leggere dalla tastiera una coppia di numeri A e B, calcolarne la somma e visualizzarla sullo schermo Problema lettura e somma di due numeri interi Dati di ingresso una coppia di numeri interi, A e B Pre-condizione nessuna Dati di uscita un numero S Post-condizione S è la somma di A e B 23 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Algoritmo per la lettura e somma di due numeri interi Algoritmo per il problema della lettura e somma di due numeri interi 1. leggi (dalla tastiera) i due numeri interi a e b 2. calcola la somma somma di a e b 3. visualizza somma (sullo schermo) Una sequenza di tre passi il procedimento va ulteriormente raffinato 24 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Raffinamenti del passo 1 1. leggi (dalla tastiera) i due numeri interi a e b 1. leggi (dalla tastiera) i due numeri interi a e b 1.1 leggi il numero intero a dalla tastiera 1.2 leggi il numero intero b dalla tastiera 1. leggi (dalla tastiera) i due numeri interi a e b 1.1 leggi il numero intero a dalla tastiera a = Lettore.in.leggiInt(); 1.2 leggi il numero intero b dalla tastiera b = Lettore.in.leggiInt(); 25 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Raffinamenti dei passi 2 e 3 2. calcola la somma somma di a e b somma = a + b; 3. visualizza somma (sullo schermo) System.out.println(somma); 26 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Algoritmo per la lettura e somma di due numeri interi 1. leggi (dalla tastiera) i due numeri interi a e b 1.1 leggi il numero intero a dalla tastiera a = Lettore.in.leggiInt(); 1.2 leggi il numero intero b dalla tastiera b = Lettore.in.leggiInt(); 2. calcola la somma somma di a e b somma = a + b; 3. visualizza somma (sullo schermo) System.out.println(somma); 27 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Variabili e oggetti per l’algoritmo L’algoritmo per la lettura e somma di due numeri interi fa uso delle seguenti variabili e oggetti la variabile intera a la variabile intera b la variabile intera somma l’oggetto Lettore.in l’oggetto System.out 28 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Programma per la lettura e somma di due numeri interi import fiji.io.*; /* Applicazione che legge dalla tastiera due numeri interi * e ne calcola e visualizza la somma. */ class SommaDueNumeri { public static void main(String[] args) { ... } } 29 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Programma per la lettura e somma di due numeri interi public static void main(String[] args) { int a; // il primo numero intero int b; // il secondo numero intero int somma; // la somma di a e b /* leggi dalla tastiera i due numeri interi a e b */ System.out.println("Scrivi due numeri interi"); /* leggi il numero intero a dalla tastiera */ a = Lettore.in.leggiInt(); /* leggi il numero intero b dalla tastiera */ b = Lettore.in.leggiInt(); /* calcola la somma somma di a e b */ somma = a+b; /* visualizza somma (sullo schermo) */ System.out.print("La somma dei due numeri è "); System.out.println(somma); } 30 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Somma di una sequenza di numeri interi Si vuole leggere dalla tastiera una sequenza di numeri interi, disposti su una singola linea e separati da spazi, calcolare la somma degli elementi della sequenza e visualizzarla sullo schermo Scrivi una sequenza di numeri interi 10 15 0 -2 La somma dei numeri è 23 31 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Lettura e somma di una sequenza di numeri interi Problema lettura e somma di una sequenza di numeri interi Dati di ingresso una sequenza di numeri interi A1, A2, ..., AN Pre-condizione N>=0, i numeri sono disposti su una singola linea e separati da spazi Dati di uscita un numero S Post-condizione S è uguale alla somma A1 + A2 + ... + AN 32 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Lettura e somma di una sequenza di numeri interi La versione iniziale dell’algoritmo 1. leggi una sequenza di numeri interi e calcolane la somma somma 2. visualizza somma System.out.println(somma); 33 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Raffinamento del passo 1 1. leggi una sequenza di numeri interi e calcolane la somma somma 1. leggi una sequenza di numeri interi e calcolane la somma somma 1.1 inizialmente somma vale zero somma = 0; 1.2 finché ci sono altri elementi, leggili e sommali a somma while ( ci sono altri elementi nella sequenza ) { leggi un elemento della sequenza numero dalla tastiera incrementa somma di numero } 34 come viene usata la variabile somma? Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ulteriori raffinamenti 1.2 finché ci sono altri elementi nella sequenza, leggili e sommali a somma while (ci sono altri elementi nella sequenza) { leggi un elemento della sequenza numero dalla tastiera numero = Lettore.in.leggiInt(); incrementa somma di numero somma = somma + numero; } 35 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Raffinamento della condizione while ( ci sono altri elementi nella sequenza ) Rimane da raffinare la condizione dell’istruzione ripetitiva bisogna sapere che l’oggetto Lettore.in fornisce una operazione boolean eoln() che verifica se è stata raggiunta la fine della linea corrente l’operatore ! calcola la negazione di una condizione !Lettore.in.eoln() 36 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Algoritmo per la somma di una sequenza di numeri interi 1. leggi una sequenza di numeri interi e calcolane la somma somma 1.1 inizialmente somma vale zero somma = 0; 1.2 finché ci sono altri elementi nella sequenza, leggili e sommali a somma while ( ci sono altri elementi nella sequenza ) while ( !Lettore.in.eoln() ) { leggi un elemento della sequenza numero dalla tastiera numero = Lettore.in.leggiInt(); incrementa somma di numero somma = somma + numero; } 2. visualizza somma System.out.println(somma); 37 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Programma per la somma di una sequenza di numeri int numero; int somma; // elemento corrente della sequenza // somma degli elementi della sequenza /* leggi una sequenza di numeri interi e * calcolane la somma */ /* inizialmente somma vale zero */ somma = 0; /* finché ci sono altri elementi nella sequenza, * leggili e sommali a somma */ while (!Lettore.in.eoln()) { // finché ci sono // altri elementi /* leggi un elemento della sequenza */ numero = Lettore.in.leggiInt(); /* incrementa somma di numero */ somma = somma + numero; } /* visualizza somma */ System.out.println(somma); 38 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Lunghezza di una sequenza Si vuole leggere dalla tastiera una sequenza di numeri interi, disposti su una singola linea e separati da spazi, calcolare la lunghezza della sequenza (ovvero, il numero di elementi della sequenza) e visualizzarla sullo schermo Scrivi una sequenza di numeri interi 10 15 0 -2 La lunghezza della sequenza è 4 39 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Lunghezza di una sequenza Una variante del problema della lettura e somma di una sequenza di numeri interi è possibile scrivere un algoritmo come adattamento di quello della somma di una sequenza di numeri anziché gestire la variabile somma va gestita una variabile lunghezza – per contare il numero degli elementi della sequenza che sono stati letti 40 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Algoritmo per il calcolo della lunghezza di una sequenza 1. leggi una sequenza di numeri interi e calcolane la lunghezza lunghezza 1.1 inizialmente lunghezza vale zero lunghezza = 0; 1.2 finché ci sono altri elementi nella sequenza, leggili e incrementa lunghezza while ( !Lettore.in.eoln() ) { leggi un elemento della sequenza numero dalla tastiera numero = Lettore.in.leggiInt(); incrementa lunghezza lunghezza = lunghezza + 1; } 2. visualizza lunghezza System.out.println(lunghezza); 41 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Somma dei pari e dei dispari in una sequenza Si vuole leggere dalla tastiera una sequenza di numeri interi, disposti su una singola linea e separati da spazi, calcolare la somma degli elementi di valore pari e la somma degli elementi di valore dispari, e visualizzare la somma dei pari e la somma dei dispari sullo schermo Scrivi una sequenza di numeri interi 10 15 0 -2 La somma dei pari è 8 La somma dei dispari è 15 42 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Somma dei pari e dei dispari in una sequenza Per risolvere il problema bisogna gestire una coppia di variabili sommaPari sommaDispari In questo caso, all’interno dell’istruzione ripetitiva, deve essere usata una istruzione condizionale if-else per ogni elemento della sequenza deve essere eseguita una tra due istruzioni al verificarsi (o meno) di una condizione l’incremento di sommaPari l’incremento di sommaDispari la condizione è “numero è pari” l’operatore % calcola il resto della divisione tra due numeri interi la condizione dell’istruzione condizionale può essere scritta come numero%2==0 43 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Uso dell’istruzione if-else leggi gli elementi della sequenza e calcola la somma dei pari e la somma dei dispari sommaPari = 0; sommaDispari = 0; finché ci sono altri elementi nella sequenza, leggili e calcola la somma dei pari e la somma dei dispari while ( !Lettore.in.eoln() ) { numero = Lettore.in.leggiInt(); se numero è pari, incrementa sommaPari di numero, altrimenti incrementa sommaDispari di numero if ( numero%2==0 ) sommaPari = sommaPari + numero; else sommaDispari = sommaDispari + numero; } 44 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Programma per la somma dei pari e la somma dei dispari int numero; // elemento corrente della sequenza int sommaPari; // somma degli elementi pari int sommaDispari; // somma degli elementi dispari /* leggi una sequenza di numeri interi e calcola * la somma dei pari e la somma dei dispari */ /* inizialmente le somme valgono zero */ sommaPari = 0; sommaDispari = 0; /* finché ci sono altri elementi nella sequenza, leggili * e calcola la somma dei pari e la somma dei dispari */ while (!Lettore.in.eoln()) { /* leggi un elemento della sequenza */ numero = Lettore.in.leggiInt(); /* se numero è pari, incrementa sommaPari di numero, * altrimenti incrementa sommaDispari di numero */ if (numero%2==0) // se numero è pari /* incrementa sommaPari di numero */ sommaPari = sommaPari + numero; else // altrimenti numero è dispari /* incrementa sommaDispari di numero */ sommaDispari = sommaDispari + numero; } /* visualizza le somme */ System.out.println(sommaPari); System.out.println(sommaDispari); 45 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Somma di una sequenza di dieci numeri Si vuole leggere dalla tastiera una sequenza di numeri interi di lunghezza fissata (ad esempio, di lunghezza dieci), calcolare la somma degli elementi e visualizzarla sullo schermo Scrivi una sequenza di dieci numeri interi 1 12 -13 2 0 -4 8 0 4 10 La somma dei dieci numeri è 20 46 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Lettura e somma di una sequenza di dieci numeri interi Cerchiamo una soluzione basata su una istruzione ripetitiva si suppone che la lunghezza della sequenza sia nota a priori cerchiamo un algoritmo parametrico rispetto a questa lunghezza L’algoritmo può essere realizzato gestendo le seguenti variabili numero somma numeriLetti come vanno gestite? 47 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Algoritmo per la lettura e somma di dieci numeri leggi una sequenza di dieci numeri interi e calcolane la somma inizializza la somma e il numero di elementi letti somma = 0; numeriLetti = 0; leggi i dieci elementi della sequenza e calcolane la somma while ( ci sono altri elementi nella sequenza ) { leggi un elemento numero della sequenza numero = Lettore.in.leggiInt(); incrementa somma di numero somma = somma + numero; incrementa numeriLetti numeriLetti = numeriLetti + 1; } Bisogna raffinare la condizione dell’istruzione ripetitiva 48 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Algoritmo per la lettura e somma di dieci numeri inizializza la somma e il numero di elementi letti somma = 0; numeriLetti = 0; leggi i dieci elementi della sequenza e calcolane la somma while ( numeriLetti<10 ) { leggi un elemento numero della sequenza numero = Lettore.in.leggiInt(); incrementa somma di numero somma = somma + numero; incrementa numeriLetti numeriLetti = numeriLetti + 1; } 49 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Programma per la lettura e somma di dieci numeri int numero; // elemento corrente della sequenza int somma; // somma degli elementi della sequenza int numeriLetti; // numero degli elementi letti /* leggi una sequenza di dieci numeri interi e * calcolane la somma */ /* inizializza la somma e il numero di elementi letti */ somma = 0; numeriLetti = 0; /* leggi i dieci elementi della sequenza e * calcolane la somma */ while (numeriLetti<10) { // ci sono altri elementi /* leggi un elemento della sequenza */ numero = Lettore.in.leggiInt(); /* incrementa somma di numero */ somma = somma + numero; /* incrementa numeriLetti */ numeriLetti = numeriLetti + 1; } /* visualizza somma */ System.out.println(somma); 50 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Somma dei primi N numeri interi positivi Si vuole risolvere il problema di calcolare la somma dei primi N numeri interi positivi, dato un numero naturale N un problema nella forma più generale la sua soluzione deve portare alla scrittura di un metodo in cui il numero naturale N è un parametro del metodo la somma dei primi N numeri interi positivi deve essere restituita dal metodo 51 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Somma dei primi N numeri interi positivi Problema somma dei primi N numeri interi positivi Insieme di ingresso un numero N Pre-condizione N è un numero naturale, ovvero N 0 Insieme di uscita un numero S Post-condizione S è uguale alla somma 1+2+ ... +N dei primi N numeri positivi 52 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Somma dei primi N numeri interi positivi La somma dei primi N numeri interi positivi può essere calcolata da un algoritmo che utilizza le seguenti variabili una variabile somma una variabile i a cui si vogliono far assumere come valori tutti i numeri interi compresi tra 1 e N 53 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Algoritmo per la somma dei primi N numeri interi positivi La prima formulazione dell’algoritmo è la seguente inizializza somma somma = 0; per ogni valore di i compreso tra 1 e N, incrementa somma di i incrementa somma di i somma = somma + i; il risultato è somma 54 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Algoritmo per la somma dei primi N numeri interi positivi Bisogna introdurre nell’algoritmo dei passi che permettano di far assumere a i tutti i valori interi compresi tra 1 e N inizializza somma somma = 0; per ogni valore di i compreso tra 1 e N, incrementa somma di i inizializza i i = 1; while ( i <= N ) { incrementa somma di i somma = somma + i; incrementa i i = i + 1; } il risultato è somma 55 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Metodo per la somma dei primi N numeri interi positivi /* Oggetto che sa calcolare la somma dei primi N numeri * interi positivi. */ class SommatorePositivi { /* Calcola la somma dei primi n numeri * interi positivi. */ public static int sommaPrimiPositivi(int n) { ... } } 56 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Metodo per la somma dei primi N numeri interi positivi /* Calcola la somma dei primi n numeri * interi positivi. */ public static int sommaPrimiPositivi(int n) { // pre: n>=0 int somma; // somma dei primi n numeri positivi int i; // per iterare tra 1 e n /* inizializza somma */ somma = 0; /* per ogni valore di i compreso tra 1 e n, * incrementa somma di i */ /* inizializza i */ i = 1; while (i<=n) { /* finché i non ha assunto tutti i * valori compresi tra 1 e n */ /* incrementa somma di i */ somma = somma + i; /* incrementa i */ i = i + 1; } /* il risultato è somma */ return somma; } 57 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Uso del metodo sommaPrimiPositivi int sommaPrimiQuattro; // somma dei primi quattro // numeri interi positivi /* calcola la somma dei primi quattro numeri positivi * la visualizza sullo schermo */ sommaPrimiQuattro = SommatorePositivi.sommaPrimiPositivi(4); System.out.println(sommaPrimiQuattro); 58 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Traccia dell’esecuzione di un metodo o di un algoritmo La traccia dell’esecuzione di un metodo o algoritmo è una tabella (costruita dinamicamente) in cui sono elencati le istruzioni eseguite il valore di ciascuna variabile, dopo l’esecuzione di ciascuna istruzione Si consideri ad esempio il caso in cui n vale 4 59 istruzione eseguita n invocazione somma = 0 i=1 i<=n ? somma = somma+i i = i+1 4 Problemi, algoritmi e oggetti somma i i<=n 0 1 true 1 2 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Esecuzione del metodo 60 istruzione eseguita n somma i ... segue ... i<=n ? somma = somma+i i = i+1 i<=n ? somma = somma+i i = i+1 i<=n ? somma = somma+i i = i+1 i<=n ? return somma 4 1 2 Problemi, algoritmi e oggetti i<=n true 3 3 true 6 4 true 10 5 false Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl La formula di Gauss La formula di Gauss SN = 1+2+ ... + N = N (N+1) / 2 /* Calcola la somma dei primi n numeri positivi. */ public static int sommaPrimiPositiviGauss(int n) { // pre: n >= 0 int somma; // somma dei primi n numeri positivi /* calcola la somma dei primi n numeri positivi */ somma = n*(n+1)/2; /* il risultato è somma */ return somma; } 61 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Attraversamento di labirinti La progettazione di algoritmi è stata introdotta facendo esempi prevalentemente di natura numerica gli stessi strumenti metodologici possono essere utilizzati per affrontare e risolvere problema di natura più “orientata agli oggetti” 62 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Attraversamento di labirinti lineari Un labirinto lineare è un labirinto composto da una o più celle disposte in linea retta, senza muri che separano le celle, alle cui estremità sono posti l’ingresso e l’uscita in in in 63 out out out Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Problema — attraversamento di un labirinto lineare Problema attraversamento di un labirinto lineare Insieme di ingresso il robot robbie Pre-condizione il robot robbie si trova all’ingresso di un labirinto lineare, nella direzione di ingresso Insieme di uscita vuoto Post-condizione il robot robbie si trova all’uscita del labirinto lineare 64 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Una strategia per l’attraversamento di labirinti lineari Una strategia per l’attraversamento di labirinti lineari 1. fai entrare robbie nel labirinto 2. fai avanzare robbie fintato che robbie è dentro il labirinto 1. fai entrare robbie nel labirinto robbie.avanza(); 2. fai avanzare robbie fintato che robbie è dentro il labirinto while ( robbie è dentro il labirinto ) fai avanzare robbie robbie.avanza(); 65 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl L’operazione boolean dentro() Un robot sa eseguire una operazione dentro() che verifica se il robot si trova all’interno del labirinto i possibili esiti sono i valori logici true (vero) e false (falso) true – robbie è dentro al labirinto in out false – robbie non è dentro al labirinto in 66 out Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Raffinamento del passo 2 1. fai entrare robbie nel labirinto robbie.avanza(); 2. fai avanzare robbie fintato che robbie è dentro il labirinto while ( robbie.dentro() ) — robbie è dentro il labirinto 2.1 fai avanzare robbie robbie.avanza(); 67 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Dall’algoritmo all’oggetto /* Fa attraversare a robbie un labirinto lineare. */ public static void attraversaLabirintoLineare( Robot robbie) { // pre: robbie si trova all'ingresso // di un labirinto lineare /* fai entrare robbie nel labirinto */ robbie.avanza(); /* fai avanzare robbie * fintato che robbie è dentro il labirinto */ while (robbie.dentro()) { /* robbie è dentro il labirinto */ /* fai avanzare robbie */ robbie.avanza(); } /* ora robbie si trova all'uscita del labirinto */ } 68 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Attraversamento di labirinti Ogni labirinto contiene almeno un percorso dall’ingresso all’uscita out in 69 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Un caso particolare Un labirinto rettangolare è un labirinto composto da un’unica stanza rettangolare, con un unico ingresso e un’unica uscita in out 70 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Strategia per l’attraversamento di labirinti rettangolari Una possibile strategia per l’attraversamento di labirinti rettangolari consiste nel far procedere il robot facendogli costeggiare una parete in out 71 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Strategia per l’attraversamento di labirinti La stessa strategia consente di attraversare un qualsiasi labirinto out in 72 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Algoritmo per l’attraversamento di labirinti Versione iniziale per l’algoritmo che implementa la strategia proposta 1. fai entrare robbie nel labirinto robbie.avanza(); 2. finché robbie è dentro il labirinto, fai avanzare robbie facendogli avere sempre un muro alla sua sinistra while ( robbie.dentro() ) — robbie è dentro il labirinto 2.1 fai avanzare robbie, facendogli avere sempre un muro alla sua sinistra 73 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Raffinamento del passo 2.1 2.1 fai avanzare robbie, facendogli avere sempre un muro alla sua sinistra 2.1 fai avanzare robbie, facendogli avere sempre un muro alla sua sinistra 2.1.1 metti robbie nella direzione in cui deve avanzare (facendogli avere un muro alla sua sinistra) 2.1.2 fai avanzare robbie robbie.avanza(); 74 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Ragionamento per casi In quali situazioni può trovarsi il robot? robbie non ha un muro alla sua sinistra robbie deve girare a sinistra robbie ha un muro alla sua sinistra, ma non ha un muro di fronte a sé robbie non deve cambiare direzione robbie ha un muro alla sua sinistra e ha un muro di fronte a sé, ma non ha un muro alla sua destra robbie deve girare a destra robbie ha un muro alla sua sinistra, ha un muro di fronte a sé, ha un muro alla sua destra, ma non ha un muro dietro di sé robbie deve girarsi all’indietro 75 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Esemplificazione delle quattro situazioni robbie ha un muro alla sua sinistra e di fronte a sé, ma non ha un muro alla sua destra robbie ha un muro alla sua sinistra, ma non ha un muro di fronte a sé in 76 out robbie non ha un muro alla sua sinistra Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Esemplificazione delle quattro situazioni in out robbie ha un muro alla sua sinistra, ma non ha un muro di fronte a sé robbie ha un muro alla sua sinistra, di fronte a sé e alla sua destra, ma non ha un muro dietro di sé in out robbie non ha un muro alla sua sinistra 77 Problemi, algoritmi e oggetti robbie ha un muro alla sua sinistra, ma non ha un muro di fronte a sé Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Raffinamento del passo 2.1.1 2.1.1metti robbie nella direzione in cui deve avanzare (facendogli avere un muro alla sua sinistra) if ( robbie non ha un muro alla sua sinistra ) fai girare robbie a sinistra else if ( robbie ha un muro alla sua sinistra, ma non ha un muro di fronte a sé ) non far cambiare direzione a robbie else if ( robbie ha un muro alla sua sinistra, ha un muro di fronte a sé, ma non ha un muro alla sua destra ) fai girare robbie a destra else if ( robbie ha un muro alla sua sinistra, ha un muro di fronte a sé, ha un muro alla sua destra, ma non ha un muro dietro di sé ) fai girare robbie all’indietro 78 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl E adesso? Come si può raffinare ulteriormente il passo 2.1.1? il robot sa solo verificare se ha un muro di fronte a sé, usando l’operazione boolean fronteAlMuro() il robot però non sa verificare, ad esempio, se ha (o non ha) un muro alla sua destra o alla sua sinistra Come si può far verificare al robot se ha un muro alla sua sinistra? facendo girare il robot a sinistra facendo verificare al robot se ha un muro di fronte a sé 79 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Un diverso raffinamento del passo 2.1.1 2.1.1 metti robbie nella direzione in cui deve avanzare (facendogli avere un muro alla sua sinistra) prova a far girare robbie a sinistra robbie.giraSinistra(); if ( robbie.fronteAlMuro() ) prova a far andare dritto robbie robbie.giraDestra(); if ( robbie.fronteAlMuro() ) prova a far girare robbie a destra robbie.giraDestra(); if ( robbie.fronteAlMuro() ) fai girare robbie all’indietro robbie.giraDestra(); 80 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Dall’algoritmo all’oggetto /* Fa attraversare a robbie un labirinto. */ public static void attraversaLabirinto(Robot robbie) { // pre: robbie si trova all'ingresso // di un labirinto /* fai entrare robbie nel labirinto */ robbie.avanza(); /* finché robbie è dentro il labirinto, * fai avanzare robbie, facendogli avere sempre * un muro alla sua sinistra */ while (robbie.dentro()) { ... metti robbie nella direzione in cui deve avanzare ... /* fai avanzare robbie */ robbie.avanza(); } } 81 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Dall’algoritmo all’oggetto /* metti robbie nella direzione in cui * deve avanzare */ /* prova a far girare robbie a sinistra */ robbie.giraSinistra(); if (robbie.fronteAlMuro()) { /* prova a far avanzare robbie */ robbie.giraDestra(); if (robbie.fronteAlMuro()) { /* prova a far girare robbie a destra */ robbie.giraDestra(); if (robbie.fronteAlMuro()) { /* fai girare robbie all'indietro */ robbie.giraDestra(); } } } 82 Problemi, algoritmi e oggetti Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl