Tipi base
Tipi interi
Operatori numerici
Tipi float
Caratteri
Tipo booleano
13/08/02
Tipi base
1
Tipo intero
La parola chiave int definisce una variabile di tipo intero
Un int permette di memorizzare un intero di 4 byte (32 bit) con la tecnica del
complemento a 2
Costanti di tipo intero sono sequenze di caratteri numerici senza il punto
decimale
Se la prima cifra è 0 il numero è interpretato come scritto secondo la notazione
ottale
Se la prima cifra è 0 seguito da x (X) il numero è considerato esadecimale
127 può perciò anche essere scritto sia come 0177 che 0x7f
13/08/02
Tipi base
2
Tipo intero: operatori
Espressioni di tipo intero utilizzano:
operatori unari
+, operatori di tipo aritmetico
+, -, *, /,
% (resto della divisione)
28 / 5 --> 5
28 % 5 --> 3
13/08/02
Tipi base
3
Programma PortaMonete.java
1. public class PortaMonete {
2.
public static void main(String[] args) {
// il portamonete contiene
3.
int unCent = 8; // 8 monete da 1 cent,
int dieciCent = 4; // quattro da 10 cent,
4.
int ventiCent = 3; // e tre da 20
5.
6.
// calcola il valore totale della moneta
7.
int totale = unCent*1 + dieciCent*10 + ventiCent*20;
8.
9.
// stampa il risultato
10.
System.out.print(“Valore totale = ”);
11.
System.out.print(totale);
Ho definito 4
12.
System.out.println(“ centesimi”);
variabili di
13.
}
tipo int
14.}
Valore totale = 108 centesimi
13/08/02
Tipi base
4
Programma PortaMonete.java
E:\Java\esempi> java PortaMonete
Valore totale = 108 centesimi
E:\Java\esempi>
13/08/02
Tipi base
5
Programma Monete2.java
1. public class Monete2 {
2.
public static void main(String[] args) {
3.
int unCent = 8;
// 8 monete da 1 cent,
4.
int dieciCent = 4;
// 4 da 10 cent,
5.
6.
int totale = unCent * 1 + dieciCent * 10;
7.
8.
int ventiCent = 3; // e 3 da 20 cent
9.
10.
// somma il valore dei venti cent
11.
totale = totale + ventiCent * 20;
12.
13.
// stampa il risultato
14.
System.out.print(“Valore totale = ”);
15.
System.out.print(totale);
16.
System.out.println(“ centesimi”);
17.
}
18.}
Valore totale = 108 centesimi
13/08/02
Tipi base
6
Assegnazione
11.
totale = totale + ventiCent * 20;
ventiCent
totale
3
ventiCent
48
totale
3
48
totale + ventiCent * 20
108
Il nuovo valore ha sostituito irreversibilmente quello vecchio
13/08/02
Tipi base
7
Il concetto di memoria
Variabili
Ogni variabile ha un nome, un tipo, una dimensione e un valore
Il nome corrisponde a un indirizzo di memoria
Quando un nuovo valore è posto in una variabile, sostituisce (e quindi distrugge)
il contenuto precedente
Leggere variabili dalla memoria non altera il loro valore
Nome: “totale”
Tipo: int
Dimensione: 4 byte
totale
ventiCent
108
3
108 è il valore
memorizzato nella cella
13/08/02
Tipi base
8
Tipo intero: operatori
operatori bit a bit
& (and)
0xe & 0x3 0x2
| (or)
0xe | 0x3 0xf
^ (exor)
0xe ^ 0x3 0xd
~ (not)
(scambia gli 1 con gli 0)
>>, <<, >>> (shift)
0xe << 4 0xe0
0xe >> 2 0x3
(implementano in modo efficiente moltiplicazioni
e divisioni per potenze di 2)
>> conserva il bit di segno
>>> inserisce sempre uno zero come bit più significativo
13/08/02
Tipi base
9
Test Operatori
1. public class TestOperatori {
2.
3.
public static void main(String[] args) {
4.
System.out.println(0xe & 0x3);
5.
System.out.println(0xe | 0x3);
6.
System.out.println(0xe ^ 0x3);
7.
System.out.println(~ -2 );
8.
System.out.println(-1 << 2);
9.
System.out.println(-4 >> 2);
10.
System.out.println(-4 >>> 2);
11.
System.out.println(-1 >> 1);
12.
System.out.println(-1 >>> 1);
13.
}
14.
15. }
13/08/02
Tipi base
2
15
13
1
-4
-1
1073741823
-1
2147483647
10
Operatori di incremento
++, -- incrementano o decrementano di 1 l'operando
se l'operatore precede l'operando il risultato dell'espressione è quello ottenuto dopo l'applicazione
dell'operatore stesso
esempio:
a = 4;
b = ++a; // sia ad a che a b è assegnato il valore 5
a = 4;
b = a++; // ad a è assegnato ancora 5, mentre a b il valore 4
a = 4;
b = --a; // (a memorizza 3, b 3)
a = 4;
b = a--; // (a memorizza 3, b 4)
++ e -- sono applicabili solo a variabili non espressioni
es. ++4 non è corretto
13/08/02
Tipi base
11
Operatori: priorità
Esiste una priorità fra gli operatori che corrisponde in genere alle normali regole
dell’algebra: prima moltiplicazioni e divisioni (e modulo), poi somme e sottrazioni
A parità di priorità le operazioni vengono solitamente eseguite da sinistra a destra,
esiste comunque la possibilità di utilizzare le parentesi tonde per forzare un ordine
particolare nell’ordine di esecuzione
In caso di dubbi usate sempre le parentesi, in genere i programmi diventano anche più
leggibili
In generale la leggibilità aumenta spezzando espressioni complesse in più istruzioni
semplici
13/08/02
Tipi base
12
Altri tipi interi
byte intero di 8 bit
short intero di 16 bit
long intero di 64 bit
costanti di tipo long hanno come ultimo carattere L (l)
Tipo
13/08/02
Memoria
Valore minimo
Valore Massimo
byte
8 bit
-128
127
short
16 bit
-32768
32767
int
32 bit
-2147483648
2147483647
long
64 bit
minore di -1018
maggiore di 1018
Tipi base
13
Programma Monete3.java
1. public class Monete3 {
2.
public static void main(String[] args) {
3.
final int VAL_CENT = 1;
4.
final int VAL_10CENT = 10;
5.
final int VAL_20CENT = 20;
6.
final int VAL_EURO = 100;
7.
8.
int unCent = 8;
9.
int dieciCent = 4;
10.
int ventiCent = 7;
11.
12.
// calcola il valore totale della moneta
13.
int totale =
14.
unCent * VAL_CENT +
15.
dieciCent * VAL_ 10CENT +
16.
ventiCent * VAL_20CENT;
17.
13/08/02
Tipi base
14
Programma Monete3.java
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.}
// usa la divisione fra integer per convertire
// i centesimi in dollari
int euro = totale / VAL_EURO;
int cent = totale % VAL_EURO;
System.out.print("Valore totale = ");
System.out.print(euro);
System.out.print(" euro e ");
System.out.print(cent);
System.out.println(" centesimi");
}
Valore totale = 1 euro e 88 centesimi
13/08/02
Tipi base
15
Tipi floating point
float precisione semplice (4 byte), double precisione doppia (8 byte)
Costanti
double
133.3
78e-5
sono caratterizzate o dal punto decimale o dall'esponente
float
133.3f
78e-5F
sono caratterizzate dal suffisso f(F)
Tipo
13/08/02
Memoria
Esponente
double
64 bit
10 bit
maggiore di 10308
float
32 bit
8 bit
maggiore di 1038
Tipi base
Valore Massimo
16
Tipi floating point : operatori
Sono gli stessi operatori visti per i tipi interi
Non sono definiti gli operatori relativi alla gestione dei bit
La divisione ovviamente produce decimali
28.0 / 5.0 --> 5.6
Esiste l’operatore % definito come a%b = a – ( (int)(a/b) ) * b
28.0 / 5.1 --> 2.5
13/08/02
Tipi base
17
Funzioni matematiche
La classe Math mette a disposizione una serie di metodi statici che implementano le
più note funzioni matematiche
Attenzione ogni volta che si utilizza uno di questi metodi occorre sempre
specificare anche il nome della classe
Esempio:
Math.sin(Math.toRadians(45))
13/08/02
Tipi base
18
Funzioni matematiche
Il tipo restituito dipende dagli argomenti
abs(x)
Restituisce il valore assoluto
max(a, b) Restituisce il maggiore dei due valori
min(a, b) Restituisce il minore dei due valori
Il tipo restituito è un double (escluso round che restituisce un long)
ceil(x)
Restituisce l’intero più piccolo maggiore o uguale all'argomento
floor(x)
Restituisce l’intero più grande minore o uguale all'argomento
rint(x)
Restituisce l’intero più vicino a x
round(x)
Restituisce l’intero più vicino a x
sqrt(x)
Restituisce la radice quadrata
pow(a, b) Operazione di elevamento a potenza ab
exp(x)
Funzione esponenziale ((Math.E)x )
log(x)
Restituisce il logaritmo naturale (in base e)
random()
13/08/02
Restituisce un numero "a caso" compreso fra 0.0 e 1.0 escluso
Tipi base
19
Funzioni trigonometriche
sin(x)
Restituisce il seno dell'angolo
cos(x)
Restituisce il coseno dell'angolo
tan(x)
Restituisce la tangente dell'angolo
acos(x)
Funzione inversa di cos
asin(x)
Funzione inversa di sin
atan(x)
Funzione inversa di tan
atan2(y, x) Restituisce la componente q del punto (r, q) in coordinate polari
che corrisponde a (x, y) in coordinate Cartesiane
per x positivo atan2(y,x)==atan(y/x)
Per riferirsi a p si può utilizzare la costante Math.PI
13/08/02
Tipi base
20
Funzioni trigonometriche
Versioni recenti di Java hanno implementati anche i metodi:
toDegrees(angrad)
Converte da radianti a gradi
toRadians(angdeg)
Converte da gradi a radianti
In alternativa si può ottenere lo stesso risultato con il codice:
degrees = angrad / Math.PI * 180.0
angrad = degrees / 180.0 * Math.PI
13/08/02
Tipi base
21
FunzioniTrigonometriche.java
1. public class FunzioniTrigonometriche {
2.
public static void main(String[] args) {
3.
int ang=45;
4.
double seno=Math.sin(Math.toRadians(ang));
5.
double pi = Math.asin(seno)*4;
6.
System.out.print("sen(45°)=");
7.
System.out.println(seno);
8.
System.out.print("pi greco=");
9.
System.out.println(pi);
10.
System.out.print("Math.PI= ");
11.
System.out.println(Math.PI);
12.
}
13. }
E:\Java\esempi\Math> java FunzioniTrigonometriche
sen(45°)=0.7071067811865475
pi greco=3.1415926535897927
Math.PI= 3.141592653589793
E:\Java\esempi\Math>
13/08/02
Tipi base
22
Tipo boolean
Espressioni boolean possono assumere solo due valori corrispondenti alle costanti
predefinite true (vero) e false (falso), variabili booleane assumono per default il
valore false
Operatori booleani &, |, ^, !, &&, ||
And & false
true
Xor ^
false
true
false
false
false
false
false
true
true
false
true
true
true
false
Or |
false
true
Not !
false
false
true
false
true
true
true
true
true
false
&& e || si comportano come i corrispondenti & e |, terminando la valutazione
dell’espressione non appena questa è definita
13/08/02
Tipi base
23
Tipo boolean
Operatori relazionali (permettono di confrontare fra di loro due valori):
== uguale
!= diverso
> maggiore
+ è l’operatore di concatenazione fra
stringhe, se un operando non è una
< minore
stringa, viene automaticamente
>= maggiore o uguale
convertito in maniera opportuna
<= minore o uguale
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class Confronti {
public static void main(String[] args) {
int a=0, c=5;
boolean b=(c>3) || (a++>0);
System.out.println("(c>3) || (a++>0): "+b+" a="+a);
b=(c>3) | (a++>0);
System.out.println("(c>3) | (a++>0): "+b+" a="+a);
}
}
13/08/02
(c>3) || (a++>0): true a=0
(c>3) | (a++>0): true a=1
Tipi base
24
Concatenazione di stringhe (cenni)
1.
2.
3.
4.
5.
6.
7.
public class Concatenazione {
public static void main(String[] args) {
int a=1, b=2;
System.out.println("a+b="+a+b);
}
a+b=12
}
6.
System.out.println("a+b="+a+b);
L’operatore + viene valutato da sinistra verso destra perciò “a+b”+a concatena la stringa
“a+b=” con la stringa “1”, il risultato di questa operazione viene quindi concatenato alla
stringa “2”
Probabilmente si voleva scrivere:
6.
13/08/02
System.out.println("a+b="+(a+b));
Tipi base
a+b=3
25
Operatore ?
L’operatore ? È l’unico operatore che coinvolge 3 valori
Sintassi: <espressione booleana> “?” <espressione 1> “:” <espressione 2>
Viene valutata l’espressione booleana, se risulta vera il valore finale è il risultato della
prima espressione, altrimenti della seconda
min = a<b ? a : b; // assegna a min il valore più piccolo fra a e b
1.
2.
3.
4.
5.
6.
7.
8.
public class OperatoreTernario {
public static void main(String[] args) {
int età = 23;
System.out.println(
"Mario è "+(età>=18 ? "maggiorenne" : "minorenne"));
}
}
13/08/02
Java accetta anche lettere accentate negli
identificatori, non è comunque una pratica
consigliabile
Tipi base
Mario è maggiorenne
26
Tipo char
Il tipo char permette di memorizzare e stampare lettere, cifre, caratteri di
punteggiatura, operatori, caratteri speciali
Una costante di tipo char viene rappresentata dal carattere (o dalla corrispondente
sequenza di escape) tra apici singoli
char c = ‘a’; // ho memorizzato in c il codice del carattere a
char d = ‘\n’; // ho memorizzato in d il codice del “new line”
Un char viene memorizzato con 16 bit (2 byte) in questo modo è possibile trattare cifre e
caratteri di alfabeti diversi (cirillico, ebraico, arabo, … )
Viene garantito il normale ordinamento alfabetico: ‘a’<‘b’, ma ‘B’<‘a’ (le lettere maiuscole
precedono le minuscole), sono quindi lecite anche le operazioni di incremento e
decremento
13/08/02
Tipi base
27
Caratteri unicode
I caratteri estesi (unicode) sono rappresentati dalla sequenza \uXXXX (X cifra
esadecimale)
char digit = ‘\u0f23’; // è la cifra 3 secondo l’alfabeto tibetano
1.
2.
3.
4.
5.
6.
7.
8.
public class CaratteriUnicode {
public static void main(String[] args) {
char digit = '\u0f23';
int val = Integer.parseInt(""+digit);
System.out.println(digit+"="+val);
}
}
digit è riconosciuto come una
cifra, quindi la stringa risultante è
trattata come una stringa numerica
13/08/02
?=3
Tipi base
Il sistema non sa come
trattare il carattere
28
Caratteri unicode
Menù con caratteri cinesi
L’alfabeto Thai
13/08/02
Tipi base
29
Caratteri unicode
I codici minori di 0x7F corrispondono ai codici ASCII
‘\u0033’ il codice della cifra ‘3’
1.
2.
3.
4.
5.
6.
7.
8.
public class CaratteriUnicode {
public static void main(String[] args) {
char digit = '\u0033';
int val = Integer.parseInt(""+digit);
System.out.println(digit+"="+val);
}
3=3
}
In linea di principio qualunque carattere unicode riconosciuto come lettera o cifra potrebbe
essere utilizzato in un identificatore (ammesso di avere un editor adatto)
13/08/02
Tipi base
30
Operatore di assegnazione
Anche l'operatore = è un operatore lecito all'interno di una espressione restituisce come
valore il risultato dell'espressione alla sua destra, gli operatori di assegnazione sono
eseguiti da destra a sinistra (la maggior parte degli operatori viene associata da sinistra
a destra)
a=b=0; // assegna 0 sia a b che ad a
1.
2.
3.
4.
5.
6.
7.
8.
public class Assign {
1.
2.
3.
4.
5.
6.
7.
8.
public class Assign {
public static void main(String[] args) {
int a, b;
a = b = 4 * 5 / 3;
System.out.println("a="+a+" b="+b);
}
a=6
a=? b=6
b=?
}
public static void main(String[] args) {
int a, b;
a = (b = 4 * 5) / 3;
System.out.println("a="+a+" b="+b);
}
}
13/08/02
Tipi base
a=6
a=? b=20
b=?
31
Operatore di assegnazione
Esistono altri operatori di assegnazione:
+=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, |=, ^=
il risultato dell'espressione
(var op= espr) sarà in generale equivalente all'espressione
(var = var op espr)
Esempio
x += 3 (x = x + 3)
NB:
Si ricorda che l'assegnazione non è una equazione
x=2*x-3
non dà come risultato x = 3, ma il risultato dipenderà dal valore che x assumeva
prima del calcolo dell'espressione alla destra di =
(esempio se x valeva 2 il nuovo valore di x è 1)
13/08/02
Tipi base
32
Regole di conversione
Risultato di un’espressione
Tipo di dato degli operandi
double
Almeno un operando e’ double.
float
Almeno un operando e’ float; nessun operando e’ double.
long
Non ci sono operandi float o double; almeno un operando e’
long.
int
Non ci sono operandi float o double; nessun operando e’ long.
13/08/02
Tipi base
33
Operatori: precedenza e associatività
Operatore
( ) ++ (postfisso)
Associatività
-- (postfisso)
da sinistra a destra
+ (unario) – (unario) ++ (prefisso) -- (prefisso)
da destra a sinistra
new
da destra a sinistra
(tipo)espressione
*
/
+
-
%
da sinistra a destra
da sinistra a destra
= += -= *= /=
13/08/02
da destra a sinistra
Tipi base
34
Operatori: priorità
postfix operators
[] . (params) expr++ expr--
unary operators
++expr --expr +expr -expr ~ !
creation or cast
new (type)expr
multiplicative
* / %
additive
+ -
shift
<< >> >>>
Relational
< > <= >= instanceof
equality
== !=
bitwise AND
&
bitwise inclusive OR
^
bitwise exclusive OR
|
logical AND
&&
logical OR
||
Conditional
? :
Assignment
= += -= *= /= %= &= ^= |= <<= >>= >>=
Quando operatori con la medesima priorita’ sono presenti in un’espressione si deve seguire una regola che stabilisca l’ordine di
valutazione.
Tutti gli operatori, ad esclusione degli operatori di assegnazione, vengono valutati da sinistra verso destra.
Gli operatori di assegnamento vengono valutati da destra a sinistra.
13/08/02
Tipi base
35