Iterazione Iterazione
C. Horstmann C. Horstmann Fondamenti di programmazione e Java 2 Fondamenti di programmazione e Java 2 3^ edizione Apogeo 3^ edizione Apogeo trad. Nicola Fanizzi trad. Nicola Fanizzi corso di Programmazione, CdS: Informatica TPS corso di Programmazione, CdS: Informatica TPS Dip. di Informatica, Università degli studi di Bari Dip. di Informatica, Università degli studi di Bari
2 2
Obiettivi Obiettivi
Essere in grado di programmare iterazioni con le Essere in grado di programmare iterazioni con le istruzioni
istruzioni while while , , for for e e do do
Per evitare cicli infiniti ed errori per scarto di uno Per evitare cicli infiniti ed errori per scarto di uno
Capire i cicli annidati Capire i cicli annidati
Imparare come elaborare l'input Imparare come elaborare l'input
Implementare simulazioni Implementare simulazioni
3 3
Ciclo
Ciclo while while
Esegue ripetutamente un blocco di codice Esegue ripetutamente un blocco di codice
Una condizione controlla quante volte viene eseguito Una condizione controlla quante volte viene eseguito il loop
il loop
Più comunemente, l'istruzione è un blocco di Più comunemente, l'istruzione è un blocco di istruzioni (insieme di istruzioni delimitata da
istruzioni (insieme di istruzioni delimitata da { } { } ) )
while (condition) while (condition)
statement;
statement;
4 4
Calcolo della Calcolo della Crescita di un Investimento Crescita di un Investimento
SI Investano $10,000, al 5% di interesse, accumulato SI Investano $10,000, al 5% di interesse, accumulato annualmente
annualmente
$12,155.06
$12,155.06 44
$11,576.25
$11,576.25 33
$11,025
$11,025 22
$10,500
$10,500 11
$10,000
$10,000 00
Balance Balance YearYear
5 5
Calcolo della Calcolo della Crescita di un Investimento Crescita di un Investimento
Quando raggiungerà un certo ammontare il capitale Quando raggiungerà un certo ammontare il capitale investito ?
investito ?
while (balance < targetBalance) while (balance < targetBalance) {{
year++;
year++;
double interest = balance * rate / 100;
double interest = balance * rate / 100;
balance = balance + interest;
balance = balance + interest;
}}
6 6
Investment.java Investment.java
01: /**
01: /**
02: Una classe per monitorare la crescita di un investimento 02: Una classe per monitorare la crescita di un investimento 03: che accumula interesse ad un fissato tasso annuo.
03: che accumula interesse ad un fissato tasso annuo.
04: */
04: */
05: public class Investment 05: public class Investment 06: {
06: {
07: /**
07: /**
08: Costruisce un oggetto Investment da un saldo iniziale 08: Costruisce un oggetto Investment da un saldo iniziale 09: ed un tasso di interesse.
09: ed un tasso di interesse.
10: @param aBalance il saldo iniziale 10: @param aBalance il saldo iniziale
11: @param aRate il tasso d'interesse in percentuale 11: @param aRate il tasso d'interesse in percentuale 12: */
12: */
13: public Investment(double aBalance, double aRate) 13: public Investment(double aBalance, double aRate) 14: {
14: {
15: balance = aBalance;
15: balance = aBalance;
7 7
Investment.java Investment.java
20: /**
20: /**
21: Continua ad accumulare interessi finquando il saldo 21: Continua ad accumulare interessi finquando il saldo 22: obiettivo è stato raggiunto.
22: obiettivo è stato raggiunto.
23: @param targetBalance il bilancio desiderato 23: @param targetBalance il bilancio desiderato 24: */
24: */
25: public void waitForBalance(double targetBalance) 25: public void waitForBalance(double targetBalance) 26: {
26: {
27: while (balance < targetBalance) 27: while (balance < targetBalance) 28: {
28: {
29: years++;
29: years++;
30: double interest = balance * rate / 100;
30: double interest = balance * rate / 100;
31: balance = balance + interest;
31: balance = balance + interest;
32: } 32: } 33: } 33: } 34: 34:
35: /**
35: /**
36: ottiene il saldo corrente nell'investimento.
36: ottiene il saldo corrente nell'investimento.
37: @return il saldo corrente 37: @return il saldo corrente
8 8
Investment.java Investment.java
39: public double getBalance() 39: public double getBalance() 40: {
40: {
41: return balance;
41: return balance;
42: } 42: } 43: 43:
44: /**
44: /**
45: Ottiene il numero di anni per cui questo investimento 45: Ottiene il numero di anni per cui questo investimento 46: ha accumulato interessi.
46: ha accumulato interessi.
47: @return numero di anni dall'inizio dell'investimento 47: @return numero di anni dall'inizio dell'investimento 48: */
48: */
49: public int getYears() 49: public int getYears() 50: {
50: {
51: return years;
51: return years;
52: } 52: } 53: 53:
9 9
Collaudo di
Collaudo di Investment Investment
01: /**
01: /**
02: Questo programma serve a calcolare quanto occorre 02: Questo programma serve a calcolare quanto occorre 03: ad un investimento per raddoppiare.
03: ad un investimento per raddoppiare.
04: */
04: */
05: public class InvestmentTester 05: public class InvestmentTester 06: {
06: {
07: public static void main(String[] args) 07: public static void main(String[] args) 08: {
08: {
09: final double INITIAL_BALANCE = 10000;
09: final double INITIAL_BALANCE = 10000;
10: final double RATE = 5;
10: final double RATE = 5;
11: Investment invest 11: Investment invest
= new Investment(INITIAL_BALANCE, RATE);= new Investment(INITIAL_BALANCE, RATE);
12: invest.waitForBalance(2 * INITIAL_BALANCE);
12: invest.waitForBalance(2 * INITIAL_BALANCE);
13: int years = invest.getYears();
13: int years = invest.getYears();
14: System.out.println("The investment doubled after "
14: System.out.println("The investment doubled after "
15: + years + " years");
15: + years + " years");
16: } 16: } 17: }
17: }
10 10
Collaudo di
Collaudo di Investment Investment
The investment doubled after 15 years The investment doubled after 15 years
Output Output
11 11
Flowchart di un Ciclo
Flowchart di un Ciclo while while
12 12
Sintassi 7.1: l'istruzione
Sintassi 7.1: l'istruzione while while
while ( while ( condition condition ) ) statement statement
Esempio: Esempio:
while (balance < targetBalance) while (balance < targetBalance) { {
year++;
year++;
double interest = balance * rate / 100;
double interest = balance * rate / 100;
balance = balance + interest;
balance = balance + interest;
} }
13 13
Errore Comune: Cicli Infiniti Errore Comune: Cicli Infiniti
Cicli che girano per sempre – occorre uccidere il Cicli che girano per sempre – occorre uccidere il
int years = 0;
int years = 0;
while (years < 20) while (years < 20) {{
double interest = balance * rate / 100;
double interest = balance * rate / 100;
balance = balance + interest;
balance = balance + interest;
} }
int years = 20;
int years = 20;
while (years > 0) while (years > 0) {{
years++; // Oops, should have been years-- years++; // Oops, should have been years-- double interest = balance * rate / 100;
double interest = balance * rate / 100;
balance = balance + interest;
balance = balance + interest;
} }
14 14
Errore Comune: Scarto di Uno Errore Comune: Scarto di Uno
int years = 0;
int years = 0;
while (balance < 2 * initialBalance) while (balance < 2 * initialBalance) {{
years++;
years++;
double interest = balance * rate / 100;
double interest = balance * rate / 100;
balance = balance + interest;
balance = balance + interest;
}}
System.out.println("The investment reached the target after "
System.out.println("The investment reached the target after "
+ years + " years.");
+ years + " years.");
years years dovrebbe cominciare da dovrebbe cominciare da 0 0 o da o da 1 1 ? ?
Il test dovrebbe essere Il test dovrebbe essere < < oppure oppure <= <= ? ?
15 15
Evitare Evitare l'Errore dello Scarto di Uno l'Errore dello Scarto di Uno
Si guardi lo scenario con valori semplici: Si guardi lo scenario con valori semplici:
Saldo iniziale: Saldo iniziale: $100 $100
Tasso iniziale: Tasso iniziale: 50% 50%
Dopo l'anno 1, il saldo è $150 Dopo l'anno 1, il saldo è $150
Dopo l'anno 2, il saldo è $225 Dopo l'anno 2, il saldo è $225 , o al di sopra di , o al di sopra di $200 $200
Così l'investimento si è raddoppiato dopo 2 anni Così l'investimento si è raddoppiato dopo 2 anni
Ciclo eseguito 2 volte, incrementando Ciclo eseguito 2 volte, incrementando years years ogni volta ogni volta
Perciò: Perciò: years years deve iniziare da 0, non da 1 deve iniziare da 0, non da 1
16 16
Evitare Evitare l'Errore dello Scarto di Uno l'Errore dello Scarto di Uno
Tasso di interesse: Tasso di interesse: 100% 100%
dopo 1 anno: dopo 1 anno:
balance
balance diventa diventa 2 * initialBalance 2 * initialBalance il ciclo dovrebbe fermarsi
il ciclo dovrebbe fermarsi Pertanto: si deve usare Pertanto: si deve usare < <
Pensare, non compilare e provare a caso Pensare, non compilare e provare a caso
17 17
Cicli
Cicli do do
Esegue i corpo almeno una volta Esegue i corpo almeno una volta
Esempio: Validare l'input Esempio: Validare l'input
dodo
statement while (condition);
statement while (condition);
double value;
double value;
dodo {{
System.out.print("Please enter a positive number: ");
System.out.print("Please enter a positive number: ");
value = in.nextDouble();
value = in.nextDouble();
}}
while (value <= 0);
while (value <= 0);
18 18
Cicli
Cicli do do
Alternativa: Alternativa:
boolean done = false;
boolean done = false;
while (!done) while (!done) {{
System.out.print("Please enter a positive number: ");
System.out.print("Please enter a positive number: ");
value = in.nextDouble();
value = in.nextDouble();
if (value > 0) done = true;
if (value > 0) done = true;
}}
19 19
Flowchart del Ciclo
Flowchart del Ciclo do do
20 20
Codice Spaghetti
Codice Spaghetti
21 21
Cicli
Cicli for for
Esempio: Esempio:
for (inizializzazione; condizione; aggiornamento) for (inizializzazione; condizione; aggiornamento) istruzione
istruzione
for (int i = 1; i <= n; i++) for (int i = 1; i <= n; i++) {{
double interest = balance * rate / 100;
double interest = balance * rate / 100;
balance = balance + interest;
balance = balance + interest;
} }
22 22
Cicli
Cicli for for
Equivalenti a Equivalenti a
Altri Esempi: Altri Esempi:
inizializzazione;
inizializzazione;
while (condizione) while (condizione)
{ istruzione; aggiornamento; } { istruzione; aggiornamento; }
for (years = n; years > 0; years--) . . . for (years = n; years > 0; years--) . . .
23 23
Flowchart del Ciclo
Flowchart del Ciclo for for
24 24
Sintassi 7.2: Ciclo
Sintassi 7.2: Ciclo for for
for (
for ( initialization initialization ; ; condition condition ; ; update update ) ) statement statement
Esempio: Esempio:
for (int i = 1; i <= n; i++) for (int i = 1; i <= n; i++) { {
double interest = balance * rate / 100;
double interest = balance * rate / 100;
balance = balance + interest;
balance = balance + interest;
} }
25 25
Investment.java Investment.java
01: /**
01: /**
02: Classe per monitorare la crescita di un investimento 02: Classe per monitorare la crescita di un investimento 03: che accumula interessi ad un prefissato tasso annuo 03: che accumula interessi ad un prefissato tasso annuo 04: */
04: */
05: public class Investment 05: public class Investment 06: {
06: {
07: /**
07: /**
08: Costruisce un oggetto Investment a partire da un 08: Costruisce un oggetto Investment a partire da un 09: saldo iniziale ed tasso di interesse.
09: saldo iniziale ed tasso di interesse.
10: @param aBalance saldo iniziale 10: @param aBalance saldo iniziale
11: @param aRate tasso di interesse in percentuale 11: @param aRate tasso di interesse in percentuale 12: */
12: */
13: public Investment(double aBalance, double aRate) 13: public Investment(double aBalance, double aRate) 14: {
14: {
15: balance = aBalance;
15: balance = aBalance;
16: rate = aRate;
16: rate = aRate;
17: years = 0;
17: years = 0;
26 26
Investment.java Investment.java
19: 19:
20: /**
20: /**
21: Continua ad accumulare interesse finché un saldo 21: Continua ad accumulare interesse finché un saldo 22: obiettivo sia stato raggiunto.
22: obiettivo sia stato raggiunto.
23: @param targetBalance il saldo desiderato 23: @param targetBalance il saldo desiderato 24: */
24: */
25: public void waitForBalance(double targetBalance) 25: public void waitForBalance(double targetBalance) 26: {
26: {
27: while (balance < targetBalance) 27: while (balance < targetBalance) 28: {
28: {
29: years++;
29: years++;
30: double interest = balance * rate / 100;
30: double interest = balance * rate / 100;
31: balance = balance + interest;
31: balance = balance + interest;
32: } 32: }
27 27
Investment.java Investment.java
35: /**
35: /**
36: Continua ad accumulare interesse per un numero di anni 36: Continua ad accumulare interesse per un numero di anni 37: @param n il numero di anni
37: @param n il numero di anni 38: */
38: */
39: public void waitYears(int n) 39: public void waitYears(int n) 40: {
40: {
41: for (int i = 1; i <= n; i++) 41: for (int i = 1; i <= n; i++) 42: {
42: {
43: double interest = balance * rate / 100;
43: double interest = balance * rate / 100;
44: balance = balance + interest;
44: balance = balance + interest;
45: } 45: }
46: years = years + n;
46: years = years + n;
47: } 47: } 48: 48:
49: /**
49: /**
50: ottiene il saldo corrente dell'investimento.
50: ottiene il saldo corrente dell'investimento.
51: @return il saldo corrente 51: @return il saldo corrente 52: */
28 28
Investment.java Investment.java
53: public double getBalance() 53: public double getBalance() 54: {
54: {
55: return balance;
55: return balance;
56: } 56: } 57: 57:
58: /**
58: /**
59: Ottiene il numero di anni per i quali questo 59: Ottiene il numero di anni per i quali questo 60: investimento ha accumulato interesse.
60: investimento ha accumulato interesse.
61: @return il numero di anni da inizio investimento 61: @return il numero di anni da inizio investimento 62: */
62: */
63: public int getYears() 63: public int getYears() 64: {
64: {
65: return years;
65: return years;
66: } 66: }
29 29
Collaudo di Collaudo di Investment.java Investment.java
01: /**
01: /**
02: Programma che calcola quanto cresce un investimento in 02: Programma che calcola quanto cresce un investimento in
03: un dato numero di anni.
03: un dato numero di anni.
04: */
04: */
05: public class InvestmentTester 05: public class InvestmentTester
06: { 06: {
07: public static void main(String[] args) 07: public static void main(String[] args)
08: { 08: {
09: final double INITIAL_BALANCE = 10000;
09: final double INITIAL_BALANCE = 10000;
10: final double RATE = 5;
10: final double RATE = 5;
11: final int YEARS = 20;
11: final int YEARS = 20;
12: Investment invest = new Investment(INITIAL_BALANCE, 12: Investment invest = new Investment(INITIAL_BALANCE,
RATE);
RATE);
13: invest.waitYears(YEARS);
13: invest.waitYears(YEARS);
14: double balance = invest.getBalance();
14: double balance = invest.getBalance();
15: System.out.printf("The balance after %d years is 15: System.out.printf("The balance after %d years is
%.2f\n",
%.2f\n",
16: YEARS, balance);
16: YEARS, balance);
17: } 17: }
30 30
Collaudo di Collaudo di Investment.java Investment.java
The balance after 20 years is 26532.98 The balance after 20 years is 26532.98
Output Output
31 31
Errore Comune: Punto e Virgola Errore Comune: Punto e Virgola
Un punto e virgola non correttamente posizionato Un punto e virgola non correttamente posizionato
Un punto e virgola mancante Un punto e virgola mancante
sum = 0;
sum = 0;
for (i = 1; i <= 10; i++) for (i = 1; i <= 10; i++);; sum = sum + i;
sum = sum + i;
System.out.println(sum);
System.out.println(sum);
for (years = 1; (balance = balance + balance * for (years = 1; (balance = balance + balance * rate / 100) < targetBalance; years++)rate / 100) < targetBalance; years++)
System.out.println(years);
System.out.println(years);
32 32
Cicli Annidati Cicli Annidati
Creare motivi triangolari Creare motivi triangolari
Ciclare sulle righe Ciclare sulle righe
[][]
[][][][]
[][][]
[][][]
[][][][]
[][][][]
for (int i = 1; i <= n; i++) for (int i = 1; i <= n; i++) {{
// crea una riga del triangolo // crea una riga del triangolo
33 33
Cicli Annidati Cicli Annidati
Creare una riga del triangolo comporta un altro ciclo Creare una riga del triangolo comporta un altro ciclo
Mettendo insieme i cicli → Mettendo insieme i cicli → cicli annidati cicli annidati
for (int j = 1; j <= i; j++) for (int j = 1; j <= i; j++) r = r + "[]";
r = r + "[]";
r = r + "\n";
r = r + "\n";
34 34
Triangle.java Triangle.java
01: /**
01: /**
02: Classe che descrive oggetti triangolari che 02: Classe che descrive oggetti triangolari che 03: si possono mostrare come le forme seguenti:
03: si possono mostrare come le forme seguenti:
04: []
04: []
05: [][]
05: [][]
06: [][][]
06: [][][]
07: */
07: */
08: public class Triangle 08: public class Triangle 09: {
09: {
10: /**
10: /**
11: Costruisce un triangolo 11: Costruisce un triangolo
12: @param aWidth numero di [] nell'ultima riga.
12: @param aWidth numero di [] nell'ultima riga.
13: */
13: */
14: public Triangle(int aWidth) 14: public Triangle(int aWidth)
35 35
Triangle.java Triangle.java
19: /**
19: /**
20: Calcola la stringa relativa al triangolo.
20: Calcola la stringa relativa al triangolo.
21: @return una stringa di [] e caratteri newline 21: @return una stringa di [] e caratteri newline 22: */
22: */
23: public String toString() 23: public String toString() 24: {
24: {
25: String r = "";
25: String r = "";
26: for (int i = 1; i <= width; i++) 26: for (int i = 1; i <= width; i++) 27: {
27: {
28: // Make triangle row 28: // Make triangle row
29: for (int j = 1; j <= i; j++) 29: for (int j = 1; j <= i; j++) 30: r = r + "[]";
30: r = r + "[]";
31: r = r + "\n";
31: r = r + "\n";
32: } 32: }
33: return r;
33: return r;
34: } 34: } 35: 35:
36 36
Collaudo di
Collaudo di Triangle.java Triangle.java
01: /**
01: /**
02: Programma che collauda la classe Triangle.
02: Programma che collauda la classe Triangle.
03: */
03: */
04: public class TriangleTester 04: public class TriangleTester 05: {
05: {
06: public static void main(String[] args) 06: public static void main(String[] args) 07: {
07: {
08: Triangle small = new Triangle(3);
08: Triangle small = new Triangle(3);
09: System.out.println(small.toString());
09: System.out.println(small.toString());
10: 10:
11: Triangle large = new Triangle(15);
11: Triangle large = new Triangle(15);
12: System.out.println(large.toString());
12: System.out.println(large.toString());
13: } 13: }
37 37
Output Output
[][]
[][][][]
[][][]
[][][]
[][]
[][][][]
[][][]
[][][]
[][][][]
[][][][]
[][][][][]
[][][][][]
[][][][][][]
[][][][][][]
[][][][][][][]
[][][][][][][]
[][][][][][][][]
[][][][][][][][]
[][][][][][][][][]
[][][][][][][][][]
[][][][][][][][][][]
[][][][][][][][][][]
[][][][][][][][][][][]
[][][][][][][][][][][]
[][][][][][][][][][][][]
[][][][][][][][][][][][]
[][][][][][][][][][][][][]
[][][][][][][][][][][][][]
38 38
Elaborare Valori Sentinella Elaborare Valori Sentinella
Valore sentinella: si può usare per indicare la fine di Valore sentinella: si può usare per indicare la fine di un insieme di dati
un insieme di dati
0 0 or or -1 -1 make poor sentinels; better use make poor sentinels; better use Q Q
System.out.print("Enter value, Q to quit: ");
System.out.print("Enter value, Q to quit: ");
String input = in.next();
String input = in.next();
if (input.equalsIgnoreCase("Q")) if (input.equalsIgnoreCase("Q")) Abbiamo finito Abbiamo finito
else else { {
double x = Double.parseDouble(input);
double x = Double.parseDouble(input);
39 39
Un Ciclo e Mezzo Un Ciclo e Mezzo
A volte la condizione di terminazione di un ciclo può A volte la condizione di terminazione di un ciclo può essere raggiunta solo a metà ciclo
essere raggiunta solo a metà ciclo
In tali casi, si introduce una variabile boolean per In tali casi, si introduce una variabile boolean per controllare il ciclo:
controllare il ciclo:
boolean done = false;
boolean done = false;
while (!done) while (!done) {{
Print prompt String input = read input Print prompt String input = read input;; if (
if (fine dell'input raggiuntafine dell'input raggiunta)) done = true;
done = true;
else else { {
// Elabora l'input// Elabora l'input
40 40
InputTester.java InputTester.java
01: import java.util.Scanner;
01: import java.util.Scanner;
02: 02:
03: /**
03: /**
04: Programma che calcola la media e il massimo di un 04: Programma che calcola la media e il massimo di un 05: insieme di valor in input.
05: insieme di valor in input.
06: */
06: */
07: public class InputTester 07: public class InputTester 08: {
08: {
09: public static void main(String[] args) 09: public static void main(String[] args) 10: {
10: {
11: Scanner in = new Scanner(System.in);
11: Scanner in = new Scanner(System.in);
12: DataSet data = new DataSet();
12: DataSet data = new DataSet();
13: 13:
14: boolean done = false;
14: boolean done = false;
15: while (!done) 15: while (!done)
41 41
InputTester.java InputTester.java
17: System.out.print("Enter value, Q to quit: ");
17: System.out.print("Enter value, Q to quit: ");
18: String input = in.next();
18: String input = in.next();
19: if (input.equalsIgnoreCase("Q")) 19: if (input.equalsIgnoreCase("Q")) 20: done = true;
20: done = true;
21: else 21: else 22: { 22: {
23: double x = Double.parseDouble(input);
23: double x = Double.parseDouble(input);
24: data.add(x);
24: data.add(x);
25: } 25: } 26: } 26: } 27: 27:
28: System.out.println("Average = " + data.getAverage());
28: System.out.println("Average = " + data.getAverage());
29: System.out.println("Maximum = " + data.getMaximum());
29: System.out.println("Maximum = " + data.getMaximum());
30: } 30: } 31: } 31: }
42 42
DataSet.java DataSet.java
01: /**
01: /**
02: Calcola media di un insieme di valori.
02: Calcola media di un insieme di valori.
03: */
03: */
04: public class DataSet 04: public class DataSet 05: {
05: {
06: /**
06: /**
07: Costruisce un data set vuoto.
07: Costruisce un data set vuoto.
08: */
08: */
09: public DataSet() 09: public DataSet() 10: {
10: {
11: sum = 0;
11: sum = 0;
12: count = 0;
12: count = 0;
13: maximum = 0;
13: maximum = 0;
14: } 14: }
43 43
DataSet.java DataSet.java
16: /**
16: /**
17: Aggiunge un valore ai dati 17: Aggiunge un valore ai dati 18: @param x un valore
18: @param x un valore 19: */
19: */
20: public void add(double x) 20: public void add(double x) 21: {
21: {
22: sum = sum + x;
22: sum = sum + x;
23: if (count == 0 || maximum < x) maximum = x;
23: if (count == 0 || maximum < x) maximum = x;
24: count++;
24: count++;
25: } 25: } 26: 26:
27: /**
27: /**
28: Dà la media dei valori nel data set.
28: Dà la media dei valori nel data set.
29: @return la media o 0 se nessun dato aggiunto 29: @return la media o 0 se nessun dato aggiunto 30: */
30: */
31: public double getAverage() 31: public double getAverage() 32: {
32: {
44 44
DataSet.java DataSet.java
36: 36:
37: /**
37: /**
38: Dà il più grande valore aggiunto.
38: Dà il più grande valore aggiunto.
39: @return massimo o 0 se nessun dato aggiunto 39: @return massimo o 0 se nessun dato aggiunto 40: */
40: */
41: public double getMaximum() 41: public double getMaximum() 42: {
42: {
43: return maximum;
43: return maximum;
44: } 44: } 45: 45:
46: private double sum;
46: private double sum;
47: private double maximum;
47: private double maximum;
48: private int count;
48: private int count;
49: } 49: }
45 45
Output Output
Enter value, Q to quit: 10 Enter value, Q to quit: 10 Enter value, Q to quit: 0 Enter value, Q to quit: 0 Enter value, Q to quit: -1 Enter value, Q to quit: -1 Enter value, Q to quit: Q Enter value, Q to quit: Q Average = 3.0
Average = 3.0 Maximum = 10.0 Maximum = 10.0
46 46
Numeri Casuali e Simulazioni Numeri Casuali e Simulazioni
In una simulazione, si generano ripetutamente In una simulazione, si generano ripetutamente
numeri casuali che si usano per simulare un'attività numeri casuali che si usano per simulare un'attività
Generatore di numeri casuali ( Generatore di numeri casuali ( random random ) )
Lancio di un dado (numero casuale tra 1 e 6) Lancio di un dado (numero casuale tra 1 e 6)
Random generator = new Random();
Random generator = new Random();
int n = generator.nextInt(a); // 0 <= n < a int n = generator.nextInt(a); // 0 <= n < a
double x = generator.nextDouble(); // 0 <= x < 1 double x = generator.nextDouble(); // 0 <= x < 1
47 47
Die.java Die.java
01: import java.util.Random;
01: import java.util.Random;
02: 02:
03: /**
03: /**
04: Simula un dado che, lanciato, mostra 04: Simula un dado che, lanciato, mostra 05: una faccia in maniera casuale.
05: una faccia in maniera casuale.
06: */
06: */
07: public class Die 07: public class Die 08: {
08: {
09: /**
09: /**
10: Costruisce un oggetto die con un dato numero di lati 10: Costruisce un oggetto die con un dato numero di lati 11: @param s numero di lati, es. 6 per un dado normale 11: @param s numero di lati, es. 6 per un dado normale 12: */
12: */
13: public Die(int s) 13: public Die(int s) 14: {
14: {
15: sides = s;
15: sides = s;
16: generator = new Random();
16: generator = new Random();
17: } 17: }
48 48
Die.java Die.java
19: /**
19: /**
20: Simula il lancio del dado 20: Simula il lancio del dado 21: @return la faccia del dado 21: @return la faccia del dado 22: */
22: */
23: public int cast() 23: public int cast() 24: {
24: {
25: return 1 + generator.nextInt(sides);
25: return 1 + generator.nextInt(sides);
26: } 26: } 27:
27:
28: private Random generator;
28: private Random generator;
29: private int sides;
29: private int sides;
30: } 30: }
49 49
Collaudo di
Collaudo di Die.java Die.java
01: /**
01: /**
02: Questo programma simula dieci lanci d'un dado.
02: Questo programma simula dieci lanci d'un dado.
03: */
03: */
04: public class DieTester 04: public class DieTester 05: {
05: {
06: public static void main(String[] args) 06: public static void main(String[] args) 07: {
07: {
08: Die d = new Die(6);
08: Die d = new Die(6);
09: final int TRIES = 10;
09: final int TRIES = 10;
10: for (int i = 1; i <= TRIES; i++) 10: for (int i = 1; i <= TRIES; i++) 11: {
11: {
12: int n = d.cast();
12: int n = d.cast();
13: System.out.print(n + " ");
13: System.out.print(n + " ");
14: } 14: }
15: System.out.println();
15: System.out.println();
16: } 16: }
50 50
Output Output
una seconda esecuzione:
una seconda esecuzione:
6 5 6 3 2 6 3 4 4 1 6 5 6 3 2 6 3 4 4 1
3 2 2 1 6 5 3 4 1 2
3 2 2 1 6 5 3 4 1 2
51 51
Esperimento dell'Ago
Esperimento dell'Ago
52 52
Posizione dell'Ago
Posizione dell'Ago
53 53
Posizione dell'Ago Posizione dell'Ago
Lunghezza ago = 1, distanza tra le righe = 2 Lunghezza ago = 1, distanza tra le righe = 2
Generare un y Generare un y low low casuale tra 0 e 2 casuale tra 0 e 2
Generare un angolo casuale α tra 0 e 180 gradi Generare un angolo casuale α tra 0 e 180 gradi
y y high high = y = y low low + sin( α ) + sin( α )
Colpito se y Colpito se y high high ≥ 2 ≥ 2
54 54
Needle.java Needle.java
01: import java.util.Random;
01: import java.util.Random;
02: 02:
03: /**
03: /**
04: Classe che simula l'ago nell'esperimento di Buffon.
04: Classe che simula l'ago nell'esperimento di Buffon.
05: */
05: */
06: public class Needle 06: public class Needle 07: {
07: {
08: /**
08: /**
09: Costruisce un ago.
09: Costruisce un ago.
10: */
10: */
11: public Needle() 11: public Needle() 12: {
12: {
13: hits = 0;
13: hits = 0;
14: tries = 0;
14: tries = 0;
55 55
Needle.java Needle.java
18: /**
18: /**
19: lascia cadere l'ago sulla griglia di righe e 19: lascia cadere l'ago sulla griglia di righe e 20: registra se l'ago ha colpito una linea.
20: registra se l'ago ha colpito una linea.
21: */
21: */
22: public void drop() 22: public void drop() 23: {
23: {
24: double ylow = 2 * generator.nextDouble();
24: double ylow = 2 * generator.nextDouble();
25: double angle = 180 * generator.nextDouble();
25: double angle = 180 * generator.nextDouble();
26:
26:
27: // Calcolo il punto superiore (high) dell'ago 27: // Calcolo il punto superiore (high) dell'ago 28:
28:
29: double yhigh = ylow + Math.sin(Math.toRadians(angle));
29: double yhigh = ylow + Math.sin(Math.toRadians(angle));
30: if (yhigh >= 2) hits++;
30: if (yhigh >= 2) hits++;
31: tries++;
31: tries++;
32: } 32: } 33: 33:
56 56
Needle.java Needle.java
34: /**
34: /**
35: Dà il numero di volte in cui l'ago ha preso una riga 35: Dà il numero di volte in cui l'ago ha preso una riga 36: @return il conto dei colpi
36: @return il conto dei colpi 37: */
37: */
38: public int getHits() 38: public int getHits() 39: {
39: {
40: return hits;
40: return hits;
41: } 41: } 42: 42:
43: /**
43: /**
44: Dà il totale dei lanci.
44: Dà il totale dei lanci.
45: @return il conto dei tentativi 45: @return il conto dei tentativi 46: */
46: */
47: public int getTries() 47: public int getTries() 48: {
48: {
49: return tries;
49: return tries;
57 57
Collaudo di
Collaudo di Needle.java Needle.java
01: /**
01: /**
02: Questo programma simula l'esperimento dell'ago di Buffon 02: Questo programma simula l'esperimento dell'ago di Buffon 03: e stampa l'approssimazione di pi greco.
03: e stampa l'approssimazione di pi greco.
04: */
04: */
05: public class NeedleTester 05: public class NeedleTester 06: {
06: {
07: public static void main(String[] args) 07: public static void main(String[] args) 08: {
08: {
09: Needle n = new Needle();
09: Needle n = new Needle();
10: final int TRIES1 = 10000;
10: final int TRIES1 = 10000;
11: final int TRIES2 = 1000000;
11: final int TRIES2 = 1000000;
12: 12:
58 58
Collaudo di
Collaudo di Needle.java Needle.java
13: for (int i = 1; i <= TRIES1; i++) 13: for (int i = 1; i <= TRIES1; i++) 14: n.drop();
14: n.drop();
15: System.out.printf("Tries = %d, Tries / Hits = %8.5f\n", 15: System.out.printf("Tries = %d, Tries / Hits = %8.5f\n", 16: TRIES1, (double) n.getTries() / n.getHits());
16: TRIES1, (double) n.getTries() / n.getHits());
17: 17:
18: for (int i = TRIES1 + 1; i <= TRIES2; i++) 18: for (int i = TRIES1 + 1; i <= TRIES2; i++) 19: n.drop();
19: n.drop();
20: System.out.printf("Tries = %d, Tries / Hits = %8.5f\n", 20: System.out.printf("Tries = %d, Tries / Hits = %8.5f\n", 21: TRIES2, (double) n.getTries() / n.getHits());
21: TRIES2, (double) n.getTries() / n.getHits());
22: } 22: } 23: } 23: }