Problemi, algoritmi e oggetti

annuncio pubblicitario
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
Scarica