Capitolo 5
Decisioni
Lucidi relativi al volume:
Java – Guida alla programmazione
James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Nozioni di base
 Le soluzioni dei problemi mostrate finora sono dirette
 Eseguono le stesse istruzioni ad ogni esecuzione del
programma
public class DisplayForecast
// main(): punto di ingresso per l'applicazione
public static void main(String[] args){
System.out.print("I think there is a world");
System.out.print(" market for maybe five ");
System.out.println("computers. “);
System.out.print(" Thomas Watson, IBM, “);
System.out.println("1943.");
}
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Nozioni di base
 Per la soluzione generale dei problemi servono maggiori
capacità
 La capacità di controllare quali istruzioni vengono eseguite
 La capacità di controllare quanto spesso viene eseguita
un'istruzione
 Per prima cosa ci concentreremo sul controllo di quali
istruzioni vengono eseguite
 Java fornisce i costrutti condizionali if e switch per controllare
se un elenco di istruzioni viene eseguito
 I costrutti if utilizzano espressioni logiche per determinare
il corso dell'azione
 L'esame inizia dalle espressioni logiche
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Espressioni logiche
 Il ramo della matematica che si occupa delle espressioni
logiche è l'algebra di Boole
 Sviluppata dal matematico britannico George Boole
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Espressioni logiche
 Un'espressione logica presenta il valore logico true o false
 Alcune espressioni i cui valori sono true logici
 L'anno 2004 è bisestile
 Un metro equivale a 100 centimetri
 Alcune espressioni i cui valori sono false logici
 Un triangolo ha quattro lati
 L'area del quadrato è sempre uguale al doppio del suo
perimetro
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Espressioni logiche
 Esistono tre operatori logici principali per la manipolazione dei
valori logici
 AND logico
 OR logico
 NOT logico
 Gli operatori funzionano come previsto
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Tabelle della verità
 Le tabelle della verità sono utilizzate per fornire specifiche
formali degli operatori
 “Funzionano come previsto” lascia una certa ambiguità di
interpretazione
 Jim sta sorridendo o Patty sta sorridendo
 Jim e Patty possono sorridere entrambi?
 Tabelle della verità
 Elenca tutte le combinazioni dei valori degli operandi e il
risultato dell'operazione per ogni combinazione
p
q
p and q
False
False
True
True
False
True
False
True
False
False
False
True
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Tabelle della verità di OR e NOT
p
q
False
False
True
True
False
True
False
True
p or q
False
True
True
True
p
False
True
not q
True
False
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Algebra di Boole
 Può creare espressioni logiche complesse combinando
semplici espressioni logiche
 not (p and q)
p
q
p and q
not (p and q)
False
False
True
True
False
True
False
True
False
False
False
True
True
True
True
False
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Leggi di DeMorgan
 not (p and q) equivale a (not p) or (not q)
p
False
False
True
True
q
False
True
False
True
p and q
False
False
False
True
( not p) or
not (p and q) ( not p) (not q)
( not q)
True
True
True
False
True
True
True
False
False True
False False
True
True
True
False
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Leggi di DeMorgan
 not (p or q) equivale a (not p) and (not q)
p
False
False
True
True
q
False
True
False
True
p or q
False
False
False
True
not (p or q)
True
False
False
False
( not p) and
( not p) (not q)
( not q)
True
True
True
False
False True
False False
True
False
False
False
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Un tipo boolean
 Java dispone del tipo logico boolean
 Il tipo boolean usa due costanti letterali
 true
 false
 Operatori
 L'operatore and è &&
 L'operatore or è ||
 L'operatore not è !
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Definizione delle variabili boolean

Le variabili boolean locali non sono inizializzate per impostazione
predefinita
boolean isWhitespace;
boolean receivedAcknowledgement;
boolean haveFoundMissingLink;
isWhitespace
-
receivedAcknowledgement
-
haveFoundMissingLink
-
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Definizione delle variabili boolean

Variabili boolean locali con inizializzazione
boolean canProceed = true;
boolean preferCyan = false;
boolean completedSecretMission = true;
canProceed
true
preferCyan
false
completedSecretMission
true
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Altri operatori
 Operatori di uguaglianza == e !=
 Operatore ==
 Restituisce true se gli operandi hanno lo stesso valore,
altrimenti restituisce false
 Operatore !=
 Restituisce true se gli operandi hanno valori diversi,
altrimenti restituisce false
 Gli operatori funzionano con tutti i tipi di valori
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Valutazione delle espressioni boolean


Supporre
boolean
boolean
boolean
boolean
p = true;
q = false;
r = true;
s = false;
Qual è il valore di
p
!s
q
p && r
q || s
p && s
p == q
q != r
r == s
q != s
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Valutazione delle espressioni boolean

Supporre
int i = 1;
int j = 2;
int k = 2;
char c = '#';
char d = '%';
char e = '#';

Qual è il valore di
j == k
i == j
c == e
c == d
i != k
j != k
d != e
c != e
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Attenzione ai valori in virgola mobile
 Considerare
double a = 1;
double b = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1
+ 0.1 + 0.1 + 0.1 + 0.1
double c = 9999999999999999;
 Due espressioni true!
a == b
b != c
 Due espressioni false!
a != b
b == c
 Il problema sta nella precisione dei tipi in virgola mobile
 Preferire gli operatori di ordinamento per la vicinanza
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Operatori di ordinamento
 Java fornisce operatori di ordinamento per i tipi primitivi
 Quattro operatori di ordinamento, <, >, <= e >=
 Corrispondono agli operatori matematici <, >,  e 
 Insieme gli operatori di uguaglianza e ordinamento sono detti
operatori relazionali
 False è minore di true
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Valutazione delle espressioni boolean
 Supporre
int i = 1;
int j = 2;
int k = 2;
 Qual è il valore di
i<j
j<k
i <= k
j >= k
i >= k
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Valori Unicode
 I confronti tra caratteri sono basati sui loro valori Unicode
 I caratteri hanno l'ordine previsto '0', '1', … '9'
 Il carattere '0' ha codifica 48
 Il carattere '1' ha codifica 49 e così via.
 Le lettere maiuscole 'A', 'B', … 'Z' seguono l'ordine previsto
 Il carattere 'A' ha codifica 65, il carattere 'B' ha codifica 66
e così via.
 Le lettere maiuscole 'A', 'B', … 'Z' seguono l'ordine previsto
 Il carattere 'a' ha codifica 97
 Il carattere 'b' ha codifica 98 e così via.
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Valutazione delle espressioni boolean
 Supporre
char c = '2';
char d = '3';
char e = '2';
 Qual
c
c
c
d
c
è il valore di
< d
< e
<= e
>= e
>= e
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Precedenza degli operatori
 Dal più alto al più basso
 Parentesi
 Operatori unari
 Operatori di moltiplicazione
 Operatori di somma
 Ordinamento relazionale
 Uguaglianza relazionale
 AND logico
 OR logico
 Assegnazione
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Costrutti condizionali
 Forniscono
 Capacità di controllare se viene eseguito un elenco di
istruzioni
 Due costrutti
 Istruzione if
if
if-else
if-else-if
 Istruzione switch
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Istruzione if di base
 Sintassi
if (espressione)
azione
 Se espressione è true viene
eseguita azione
 Azione è una singola istruzione
o un gruppo di istruzioni tra
parentesi graffe
 Per noi sarà sempre un gruppo
di istruzioni tra parentesi graffe
Espressione
true
azione
false
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Esempio
if (value < 0) {
value = -value;
}
Is
our number
Il numero
è
negativo?
negative?
IfSeValue
than
Valueisèless
inferiore
zero
thenoccorre
we need
a zero,
to update its
value
aggiornare
il valore
conofl’inverso
to that
its additive
dell’additivo
inverse
Value < 0
true
Value = -Value
Our
numberèisora
now
Il numero
definitelynon
sicuramente
negativo
nonnegative
false
If Se
Value
is not
Value
è
less thana zero
inferiore
zero,
then
our number
il numero
va
cosìis
isbene
fine as
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Ordinamento di due valori
System.out.print("Enter an integer number: ");
int value1 = Integer.parseInt(stdin.readLine());
System.out.print("Enter another integer number: ");
int value2 = Integer.parseInt(stdin.readLine());
// riorganizza i numeri, se necessario
if (value2 < value1) {
// i valori non sono ordinati
int rememberValue1 = value1;
value1 = value2;
value2 = rememberValue1;
}
Che cosa accade se
l'utente inserisce 11
e 28?
Che cosa accade se
l'utente inserisce 11
e 4?
// visualizza i valori
System.out.println("The numbers in sorted order are "
+ value1 + " and then " + value2);
Are
the numbers
I numeri
non sono out
in
ofordine?
order
Semantica di if
Rearrange
Riordina value1 and
e
value2
put their
value2
pertomettere
nell'ordine
corretto
i
values in the
proper
valori
order
value2 < value1
true
false
int rememberValue1 = value1
value1 = value2
value2 = rememberValue1
numeri sono
messi into
The Inumbers
were stati
rearranged
nell'ordine
the propercorretto
order
numeri erano
già in in
TheInumbers
were initially
ordine
order
numbers
in order
IThe
numeri
sono are
in ordine
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Perché utilizzare sempre le parentesi
graffe
Copyright © 2004 - The McGraw-Hill Companies srl
 Qual è l'output?
int m = 5;
int n = 10;
if (m < n)
++m;
++n;
System.out.println(" m = " + m + " n = " n);
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
L'istruzione if-else
 Sintassi
if (espressione)
azione1
else
azione2
 Se espressione è true esegue
azione1
altrimenti esegue azione2
 Le azioni sono una singola
istruzione o un elenco di
istruzioni tra parentesi graffe
Espressione
true
false
azione1
azione2
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Trovare il massimo di due valori
System.out.print("Enter an integer number: ");
int value1 = Integer.parseInt(stdin.readLine());
System.out.print("Enter another integer number: ");
int value2 = Integer.parseInt(stdin.readLine());
int maximum;
if (value1 < value2)
// value2 è maggiore??
maximum = value2;
// sì: value2 è maggiore
}
else // (value1 >= value2)
maximum = value1;
// no: value2 non è maggiore
}
System.out.println("The maximum of " + value1
+ " and " + value2 + " is " + maximum);
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Trovare il massimo di due valori
Is
value2
larger than
value1
value2
è maggiore
di value1?
Sì, lo it
è.is
Dunque,
value2is
è
Yes,
. So value2
maggiore di value1. In
larger
than value1. In
questo caso, maximum
thisviene
case,
maximum
impostato
su is
set value2
to value2
value1 < value2
true
maximum = value2
maximum
impostata
Either
case,viene
maximum
is set
correttamente
in entrambi
correctly
i casi
No,its
non
lo So
è. Dunque,
No,
not.
value1
value1
è grande
almeno
is
at least
as large
as
quanto value2. In
value2. In this case,
questo caso, maximum
maximum
is set to
viene impostato
su
value1
value2
false
maximum = value1
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Perché utilizzare gli spazi vuoti
 Che cosa fa il codice seguente?
System.out.print("Enter an integer number: ");
int value1 = Integer.parseInt(stdin.readLine());
System.out.print("Enter another integer number: ");
int value2 = Integer.parseInt(stdin.readLine());
if (value2 < value1) {
int rememberValue1 = value1;
value1 = value2;
value2 = rememberValue1;
}
System.out.println("The numbers in sorted order are "
+ value1 + " and then " + value2);
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Verifica dell'uguaglianza tra oggetti
 Considerare
System.out.print("Enter an integer number: ");
int n1 = Integer.parseInt(stdin.readLine());
System.out.print("Enter another integer number: ");
int n2 = Integer.parseInt(stdin.readLine());
if (n1 == n2) {
System.out.println("Same");
}
else{
System.out.println(“Different");
}
Qual è l'output se l'utente inserisce 88 in entrambi i
casi?
Qual è l'output se l'utente inserisce 88 e 3?
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Verifica dell'uguaglianza tra oggetti
 Considerare
System.out.print("Enter a string: ");
String s1 = stdin.readLine();
System.out.print("Enter another string: ");
String s2 = stdin.readLine();
if (s1 == s2) {
System.out.println("Same");
}
else{
System.out.println("Different");
}
Qual è l'output se l'utente inserisce "pastel" in
entrambi i casi?
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Verifica dell'uguaglianza tra oggetti
 Quando viene eseguito
System.out.print("Enter a string: ");
String s1 = stdin.readLine();
System.out.print("Enter another string: ");
String s2 = stdin.readLine();
 La memoria appare così
s1
"pastel"
s2
"pastel"
 Come risultato, indipendentemente da ciò che viene inserito
s1 e s2 non sono uguali
 Fanno riferimento a oggetti diversi
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Prova degli operatori per l'uguaglianza

Considerare
System.out.print("Enter a string: ");
String s1 = stdin.readLine();
System.out.print("Enter another string: ");
String s2 = stdin.readLine();
Verifica se s1 e s2
rappresentano lo stesso
if (s1.equals(s2)) {
oggetto
System.out.println("Same");
}
else{
System.out.println("Different");
}
Tutti gli oggetti hanno un metodo equals(). La loro
implementazione è specifica per la classe. Il metodo
String equals() – come molti altri – verifica l'equivalenza
nella rappresentazione
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Alcuni metodi utili della classe String
 isDigit()
 Verifica se il carattere è numerico
 isLetter()
 Verifica se il carattere è alfabetico
 isLowerCase()
 Verifica se il carattere è alfabetico minuscolo
 isWhiteSpace()
 Verifica se il carattere è un carattere di spazio,
tabulazione, avanzamento riga o nuova riga
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Alcuni metodi utili della classe String
 isUpperCase()
 Verifica se il carattere è alfabetico maiuscolo
 toLowerCase()
 Se il carattere è alfabetico viene restituito l'equivalente
minuscolo del carattere, altrimenti viene restituito il
carattere
 toUpperCase()
 Se il carattere è alfabetico viene restituito l'equivalente
maiuscolo del carattere, altrimenti viene restituito il
carattere
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
If-else-if
 Considerare
if (number == 0) {
System.out.println("zero");
}
else{
if (number > 0) {
System.out.println("positive");
}
else{
System.out.println("negative");
}
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
If-else-if
 Meglio
if (number == 0) {
System.out.println("zero");
}
else if (number > 0) {
System.out.println("positive");
}
else{
System.out.println("negative");
}
Stessi risultati del segmento precedente, ma questo
segmento esprime meglio il significato di cosa accade
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Ordinamento di tre valori
 Per l'ordinamento dei valori n1, n2 e n3 esistono sei possibili
ordinamenti
 n1  n2  n3
 n1  n3  n2
 n2  n1  n3
 n2  n3  n1
 n3  n1  n2
 n3  n2  n1
 Si supponga che s1, s2, s3 deve essere una versione ordinata
di n1, n2 e n3
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Ordinamento di tre valori
if ((n1 <= n2) && (n2 <= n3))
s1 = n1;
s2 = n2;
s3 =
}
else if ((n1 <= n3) && (n3 <=
s1 = n1;
s2 = n3;
s3 =
}
else if ((n2 <= n1) && (n1 <=
s1 = n2;
s2 = n1;
s3 =
}
else if ((n2 <= n3) && (n3 <=
s1 = n2;
s2 = n3;
s3 =
}
else if ((n3 <= n1) && (n1 <=
s1 = n3;
s2 = n1;
s3 =
}
else // n3 <= n2 <= n1
s1 = n3;
s2 = n2;
s3 =
}
// n1 <= n2 <= n2
n3;
n2))
n2;
// n1 <= n3 <= n2
n3))
n3;
// n2 <= n1 <= n3
n1))
n1;
// n2 <= n3 <= n1
n2))
n2;
// n3 <= n1 <= n2
n1;
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Istruzione switch
 Gli ingegneri del software sono spesso alle prese con attività
di programmazione che richiedono azioni dipendenti dal
valore di espressioni intere
 È possibile utilizzare il costrutto if-else-if
 Confrontare separatamente l'espressione desiderata
con un particolare valore
 Se l'espressione e il valore sono uguali viene
eseguita l'azione appropriata
 Visto che tali attività di programmazione avvengono spesso
 Java include un'istruzione switch
 L'attività è spesso più leggibile con switch che con ifelse-if
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Istruzione switch
Int egral expression
t o da
Espressione
intera
be mat associare
ched wit h a case
a
expression case
un'espressione
switch ( SwitchExpression )
case CaseExpression1 :
Action1 ;
Istruzioni
Java
stJava
at ement s
case CaseExpression2 :
Action2 ;
...
case CaseExpressionn :
Actionn;
default :
}
Actionn+1 ;
{
Const
ant
Espressione
intcostante
egral
expression
intera
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Verifica delle vocali
switch (ch) {
case 'a': case 'A':
case 'e': case 'E':
case 'i': case 'I':
case 'o': case 'O':
case 'u': case 'U':
System.out.println("vowel“);
break;
break provoca l'uscita da switch
default:
System.out.println("not a vowel“);
}
Gestisce tutti gli altri casi
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Elaborazione di una richiesta
System.out.print("Enter a number: ");
int n1 = Integer.parseInt(stdin.readLine());
System.out.print("Enter another number: ");
int n2 = Integer.parseInt(stdin.readLine());
System.out.print("Enter desired operator: ");
char operator = stdin.readLine().charAt(0);
switch (operator) {
case '+' : System.out.println(n1 + n2); break;
case '-' : System.out.println(n1 - n2); break;
case '*' : System.out.println(n1 * n2); break;
case '/' : System.out.println(n1 / n2); break;
default: System.out.println(“Illegal request“);
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Valutazione abbreviata
 Il valore di un'espressione logica può essere noto prima che
siano stati considerati tutti gli operandi
 Se l'operando sinistro di && è false, il valore deve essere
false
 Se l'operando destro di || è true, il valore deve essere
true
 Java utilizza queste proprietà per rendere efficienti le
operazioni logiche
 Valuta l'operando sinistro prima di valutare l'operando
destro
 Se il valore dell'operatore è determinato dall'operando
sinistro, allora l'operando destro non viene valutato
 L'operazione è abbreviata
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Valutazione abbreviata
 La valutazione abbreviata è utilizzata quando qualche
proprietà deve essere true per poter valutare qualche altra
espressione
 Si supponga di voler sapere se scoreSum diviso per
nbrScores è maggiore di value
 La condizione può essere valutata solo se nbrScores non è
zero
 L'espressione seguente rappresenta correttamente la
condizione
(nbrScores != 0) && ((scoreSum / nbrScores) > value)
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
ColoredTriangle
 Nozioni di base
 I triangoli sono una forma importante nel mondo della
grafica informatica
 Quando vengono create le animazioni a computer, le
scene vengono generalmente scomposte in un insieme di
triangoli colorati
 Specifica informale
 Rappresenta un triangolo colorato nello spazio
bidimensionale
 Fornisce i costruttori e i metodi previsti dall'utente
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
ColoredTriangle - vedere il gatto
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
ColoredTriangle - costruttori previsti
 Costruzione predefinita
 Costruisce una rappresentazione del triangolo anche se
non sono forniti valori di attributo espliciti
public ColoredTriangle()
 Costruzione specifica
 Costruisce la rappresentazione di un triangolo da valori di
attributo espliciti
public ColoredTriangle(Point v1, Point v2, Point v3,
Color c)
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
ColoredTriangle - comportamenti previsti
 Fornire l'area
 Restituire l'area del triangolo associato
public double getArea()
 Fornire il perimetro
 Restituire il perimetro del triangolo associato
public double getPerimeter()
 Accedere a un punto finale
 Fornire un punto finale richiesto del triangolo associato
public Point getPoint(int i)
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
ColoredTriangle - comportamenti previsti
 Accedere al colore
 Fornire il colore del triangolo associato
public Point getColor()
 Impostare un punto finale
 Impostare un particolare punto finale del triangolo
associato su un dato valore
public void setPoint(int i, Point p)
 Impostare il colore del triangolo
 Impostare il colore del triangolo associato su un dato
valore
public void setColor(Color c)
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
ColoredTriangle - comportamenti previsti
 Rappresentare
 Disegnare il triangolo associato in un dato contesto grafico
public void paint(Graphics g)
 Verificare l'uguaglianza
 Indicare se il triangolo associato è equivalente a un dato
triangolo
public boolean equals(Object v)
 Rappresentazione stringa
 Fornire una rappresentazione di testo degli attributi del
triangolo associato
public String toString()
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
ColoredTriangle - attributi
 Per implementare i comportamenti
 È sufficiente la conoscenza del colore del triangolo e dei
tre punti finali
 Il punto finale può essere rappresentato utilizzando due
valori int per posizione o come Point
 Point sembra più naturale
private Color color
 Colore del triangolo associato
private Point p1
 Fa riferimento al primo punto del triangolo associato
private Point p2
 Fa riferimento al secondo punto del triangolo associato
private Point p3
 Fa riferimento al terzo punto del triangolo associato
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Costruttore predefinito - implementazione
// ColoredTriangle(): default constructor
public ColoredTriangle() {
Point a = new Point(1, 1);
Create
endpoint
values
Point b = new Point(2, 2);
Crea
i valori
per i vertici
Point c = new Point(3, 3);
setPoint(1, a);
setPoint(2, b);
Copia desired
i valori dei
vertici desiderati
campi
dati
Copy
endpoint
values tonei
data
fields
setPoint(3, c);
Copy
desired
data desiderato
fields
setColor(Color.BLACK);
Copia nei
campicolor
dati iltocolore
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Implementazione - funzione di accesso
getPoint()
Copyright © 2004 - The McGraw-Hill Companies srl
// getPoint(): funzione di accesso al punto finale
public Point getPoint(int i)
if (i == 1)
return p1;
}
else if (i == 2)
return p2;
}
else if (i == 3)
return p3;
}
else
System.output.println("Unexpected endpoint access: “
+ i);
System.exit(i);
return null;
Non sarà eseguita, ma il compilatore
}
desidera che ogni percorso di
}
esecuzione termini con return
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Implementazione - facilitatore toString()
// toString(): facilitatore stringa
public String toString()
Point v1 = getPoint(1);
Point v2 = getPoint(2);
Point v3 = getPoint(3);
Color c = getColor();
return "ColoredRectangle[" + v1 + ", " + v2 + ", " + v3
+ ", " + c + "]";
}
Standard per includere il nome di
classe quando l'uso previsto è per il
debug
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Implementazione - facilitatore toString()
Point a = new Point(2,1),
Point b = new Point(1,2)
Point c = new Point(3,2);
ColoredTriangle u = new ColoredTriangle(a, b, c, Color.RED);
System.out.println(u); // mostra la versione stringa di u
ColoredTriangle[java.awt.Point[x=2,y=1],
java.awt.Point[x=1,y=2], java.awt.Point[x=3,y=2],
java.awt.Color[r=255,g=0,b=0]]
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Implementazione - facilitatore equals()
// equals(): facilitatore di uguaglianza
Poiché si tratta di una
sovrascrittura, il tipo di
parametro è Object
public boolean equals(Object p)
if (p instanceof ColoredTriangle)
Point v1 = getPoint(1);
instanceof verifica se
Point v2 = getPoint(2);
l'operando sinistro è
Point v3 = getPoint(3);
un'istanza di quello destro
Color c = getColor();
ColoredTriangle t = (ColoredTriangle) p;
return v1.equals(t.getPoint(1))
&& v2.equals(t.getPoint(2))
&& v3.equals(t.getPoint(3))
&& c.equals(t.getColor());
}
else
return false;
}
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Implementazione - facilitatore equals()
ColoredTriangle e = new ColoredTriangle();
ColoredTriangle f = new ColoredTriangle(new Point(2,1),
new Point(1,2), new Point(3,2), Color.YELLOW);
ColoredTriangle g = new ColoredTriangle(new Point(2,1),
new Point(1,2), new Point(3,2), Color.YELLOW);
boolean flag1 = e.equals(f);
boolean flag2 = e.equals(g);
boolean flag2 = e.equals(g);
System.out.println(flag1 + " " + flag2 + " "
+ flag3);
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Implementazione - facilitatore equals()
e
f
g
ColoredTriangle
p1:
Point
x: 1
y: 1
p2:
Point
x: 2
y: 2
p3:
Point
x: 3
y: 3
color:
Color
r: 0
y: 0
p1:
Point
x: 2
y: 1
p2:
Point
x: 1
y: 2
p3:
Point
x: 3
y: 2
color:
Color
r: 0
y:255 g: 0
g: 0
ColoredTriangle
ColoredTriangle
p1:
Point
x: 2
y: 1
p2:
Point
x: 1
y: 2
p3:
Point
x: 3
y: 2
color:
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Implementazione - facilitatore paint()
// paint(): facilitatore di rendering
public void paint(Graphics g)
Point v1 = getPoint(1);
Point v2 = getPoint(2);
Point v3 = getPoint(3);
Color c = getColor();
g.setColor(c);
Polygon t = new Polygon();
t.addPoint(v1.x, v1.y);
t.addPoint(v2.x, v2.y);
t.addPoint(v3.x, v3.y);
g.fillPolygon(t);
}
Parte di awt
Rappresenta un poligono
usando l'elenco di punti nel
poligono referenziato da t