Sei sulla pagina 1di 29

09/11/19

TIPI DI DATO IN JAVA


Riferimento: Javanotes Sez 2.2, 2.3

Contenuto realizzato da:


Giuseppe Landolfi, Tiziano Leidi, Andrea Emilio Rizzoli e Sandro Pedrazzini

I DATI

DATI
DATI INPUT PROGRAMMA
OUTPUT

TIPI DI DATO 2

1
09/11/19

I TIPI DI DATO

Memoria
int a;

...//Programma
a 0 0 1 1 01 0 0 0
int b; b 0 1 1 0 1 0

TIPI DI DATO 3

VARIABILI: DICHIARAZIONE

Identificatore

Tipo float temp = 36.8; Inizializzazione

String nome = pippo ;


int eta = 10;

COSTANTI E VARIABILI 4

2
09/11/19

MA PRIMA DI INIZIARE ALCUNE NOTE: I NOMI DEGLI IDENTIFICATORI

• Gli identificatori (nomi delle variabili e delle classi) sono fondamentali per
assegnare dei nomi facili da ricordare ad aree della memoria RAM.

• In Java gli identificatori devono rispettare delle regole sintattiche


– iniziano con una lettera o con una sottlineatura (underscore: _ )
– devono essere costituiti solo da lettere, cifre e sottolineature

ESPRESSIONI ED OPERATORI 5

MA PRIMA DI INIZIARE ALCUNE NOTE: I NOMI DEGLI IDENTIFICATORI

• Gli identificatori (nomi delle variabili e delle classi) sono fondamentali per
assegnare dei nomi facili da ricordare ad aree della memoria RAM.

• In Java gli identificatori devono rispettare delle regole sintattiche


– iniziano con una lettera o con una sottlineatura (underscore: _ )
– devono essere costituiti solo da lettere, cifre e sottolineature

x, a123, My_Name, your_N4m3, A_long_Name, HelloWorld

32k, My-Name, Your%Name

ESPRESSIONI ED OPERATORI 6

3
09/11/19

MA PRIMA DI INIZIARE ALCUNE NOTE: CASE SENSITIVE!

• L‘identificatore HelloWorld è
– diverso da HELLOWORLD
– diverso da helloworld
– diverso da hELLOwORLD
– e così via

• Come usare maiuscole e minuscole? La pragmatica: CamelCase


– la notazione a “cammello”;
– le maiuscole sono le inziali delle parole, come gobbe di un cammello;
– per convenzione l’identificatore della variabile ha la prima lettera minuscola;
– Esempio:
• helloWorld
• HelloWorld
• MioPrimoProgramma

ESPRESSIONI ED OPERATORI 7

VARIABILI: DICHIARAZIONE

Identificatore

Tipo float temp = 36.8; Inizializzazione

String nome = pippo ;


int eta = 10;

COSTANTI E VARIABILI 8

4
09/11/19

QUALI SONO LE CARATTERISTICHE DEI TIPI DI DATO?


I tipi di dati permettono di caratterizzare:

– lo spazio allocato in memoria,


– i valori che possono essere assunti dagli oggetti di quel tipo
– le operazioni che possono essere effettuate su tali oggetti.

TIPI DI DATO 9

TIPI DI DATO IN JAVA

Tipi Primitivi Tipi Referenza

boolean Tipi Numerici Array Class Interface

Tipi Interi Tipi a Virgola Mobile String

byte short int long char float double


8bits 16bits 32bits 64bits 16bits 32bits 64bits

TIPI DI DATO 10

5
09/11/19

TIPI PRIMITIVI: INTERI

• Rappresentano un‘approssimazione di Z (insieme numeri interi).

TIPI DI DATO 11

TIPI PRIMITIVI: INTERI

• Rappresentano un‘approssimazione di Z (insieme numeri interi).


• il tipo byte rappresenta i numeri tra -128 e 127.

TIPI DI DATO 12

6
09/11/19

TIPI PRIMITIVI: INTERI

• Rappresentano un‘approssimazione di Z (insieme numeri interi).


• il tipo byte rappresenta i numeri tra -128 e 127.
• il tipo short ha 16 bit, il suo range è tra -32768 e 32767.

TIPI DI DATO 13

TIPI PRIMITIVI: INTERI

• Rappresentano un‘approssimazione di Z (insieme numeri interi).


• il tipo byte rappresenta i numeri tra -128 e 127.
• il tipo short ha 16 bit, il suo range è tra -32768 e 32767.
• il tipo int ha 32 bit, il suo range: da -2147483648 a 2147483647.

TIPI DI DATO 14

7
09/11/19

TIPI PRIMITIVI: INTERI

• Rappresentano un‘approssimazione di Z (insieme numeri interi).


• il tipo byte rappresenta i numeri tra -128 e 127.
• il tipo short ha 16 bit, il suo range è tra -32768 e 32767.
• il tipo int ha 32 bit, il suo range: da -2147483648 a 2147483647.
• il tipo long ha 64 bit, da -9223372036854775808 to 9223372036854775807.

TIPI DI DATO 15

TIPI PRIMITIVI: INTERI

• Rappresentano un‘approssimazione di Z (insieme numeri interi).


• il tipo byte rappresenta i numeri tra -128 e 127.
• il tipo short ha 16 bit, il suo range è tra -32768 e 32767.
• il tipo int ha 32 bit, il suo range: da -2147483648 a 2147483647.
• il tipo long ha 64 bit, da -9223372036854775808 to 9223372036854775807.

à Operazioni: +, -, *, / (operazioni fondamentali) e % (resto); gli operatori matematici


sono invece definiti nella clase Math.

TIPI DI DATO 16

8
09/11/19

TIPI PRIMITIVI: IL CARATTERE

• Serve per rappresentare i singoli caratteri dell’alfabeto.

TIPI DI DATO 17

TIPI PRIMITIVI: IL CARATTERE

• Serve per rappresentare i singoli caratteri dell’alfabeto.

• Per assegnare un carattere ad una variabile di tipo char bisogna circondare il


carattere con gli apici.

TIPI DI DATO 18

9
09/11/19

TIPI PRIMITIVI: IL CARATTERE

• Serve per rappresentare i singoli caratteri dell’alfabeto.

• Per assegnare un carattere ad una variabile di tipo char bisogna circondare il


carattere con gli apici.

• Esempio: char c = ‘a’;

TIPI DI DATO 19

TIPI PRIMITIVI: REALI A VIRGOLA MOBILE

Rappresentano un’approssimazione dell‘insieme matematico ℜ

TIPI DI DATO 20

10
09/11/19

TIPI PRIMITIVI: REALI A VIRGOLA MOBILE

Rappresentano un’approssimazione dell‘insieme matematico ℜ

• Il tipo float :
– ha 7 cifre significative;
– il numero più grande è 1038;

TIPI DI DATO 21

TIPI PRIMITIVI: REALI A VIRGOLA MOBILE

Rappresentano un’approssimazione dell‘insieme matematico ℜ

• Il tipo float :
– ha 7 cifre significative;
– il numero più grande è 1038;

• Il tipo double :
– ha 15 cifre significative;
– il numero più grande è 10308;

TIPI DI DATO 22

11
09/11/19

TIPI PRIMITIVI: REALI A VIRGOLA MOBILE

Rappresentano un’approssimazione dell‘insieme matematico ℜ

• Il tipo float :
– ha 7 cifre significative;
– il numero più grande è 1038;

• Il tipo double :
– ha 15 cifre significative;
– il numero più grande è 10308;

à Operazioni: sono predefiniti gli operatori +, -, *, / (operazioni fondamentali).

TIPI DI DATO 23

I LETTERALI

• I nomi di valori immutabili sono detti letterali (literals).

TIPI DI DATO 24

12
09/11/19

I LETTERALI

• I nomi di valori immutabili sono detti letterali (literals).

• Un letterale è la rappresentazione (in codice sorgente) di un valore di tipo


primitivo, una stringa o il valore null (dalla Java language specification).

TIPI DI DATO 25

I LETTERALI

• I nomi di valori immutabili sono detti letterali (literals).

• Un letterale è la rappresentazione (in codice sorgente) di un valore di tipo


primitivo, una stringa o il valore null (dalla Java language specification).

• Letterali di tipo numerico:


– 317, 3.1415, 1.3e12, 12.3737e-108;
– se un letterale contiene la virgola ( . ), allora è automaticamente di tipo
double;
– per creare un letterale di tipo float bisogna aggiungere una f;

TIPI DI DATO 26

13
09/11/19

LETTERALI: ESEMPIO

• Le istruzioni:

float f = 12.3;

danno un errore in compilazione, perchè 12.3 è un letterale di tipo double!!

TIPI DI DATO 27

LETTERALI: ESEMPIO

• Le istruzioni:

float f = 12.3;

danno un errore in compilazione, perchè 12.3 è un letterale di tipo double!!

• Bisogna scrivere:

float f = 12.3f;

Letterale

TIPI DI DATO 28

14
09/11/19

LETTERALI INTERI

• La base di default è la base 10.

TIPI DI DATO 29

LETTERALI INTERI

• La base di default è la base 10.

• Tipici letterali di tipo intero sono:

– 177777, -32, 43 ;
– il tipo viene assegnato implicitamente a seconda della dimensione;

TIPI DI DATO 30

15
09/11/19

LETTERALI INTERI

• La base di default è la base 10.

• Tipici letterali di tipo intero sono:

– 177777, -32, 43 ;
– il tipo viene assegnato implicitamente a seconda della dimensione;

• Si può imporre che un letterale sia di tipo long: 127L;

TIPI DI DATO 31

TIPI PRIMITIVI: I BOOLEANI

• Il tipo boolean ammette solo due valori letterali: true e false.

boolean reply = true;

TIPI DI DATO 32

16
09/11/19

TIPI PRIMITIVI: I BOOLEANI

• Il tipo boolean ammette solo due valori letterali: true e false.

boolean reply = true;

• I valori booleani si ottengono anche dalla valutazione di espressioni


condizionali:

rate > 0.05

TIPI DI DATO 33

TIPI PRIMITIVI: I BOOLEANI

• Il tipo boolean ammette solo due valori letterali: true e false.

boolean reply = true;

• I valori booleani si ottengono anche dalla valutazione di espressioni


condizionali:

rate > 0.05

è un’espressione booleana che vale true se la variabile rate è maggiore (in


senso stretto) di 0.05 .

TIPI DI DATO 34

17
09/11/19

TIPI REFERENZA: LE STRINGHE

• Una stringa (String) è una sequenza di caratteri.

TIPI DI DATO 35

TIPI REFERENZA: LE STRINGHE

• Una stringa (String) è una sequenza di caratteri.

• Un letterale di tipo stringa che ben conosciamo: Hello World! .

String miaStringa = “Ciao Mondo!”;

TIPI DI DATO 36

18
09/11/19

TIPI REFERENZA: LE STRINGHE

• Una stringa (String) è una sequenza di caratteri.

• Un letterale di tipo stringa che ben conosciamo: Hello World! .

String miaStringa = “Ciao Mondo!”;

• In una stringa i caratteri speciali vengono rappresentati premettendo il


‘backslash’:
String tuaString = “Ciao \t Mondo!\n”;

TIPI DI DATO 37

CONCATENAZIONE DI STRINGHE

• Si può usare l‘operatore somma (+) per concaternare le stringhe.

• Esempio 1:
“Ciao ” + “Mondo” diventa la stringa “Ciao Mondo” .

TIPI DI DATO 38

19
09/11/19

CONCATENAZIONE DI STRINGHE

• Si può usare l‘operatore somma (+) per concaternare le stringhe.

• Esempio 1:
“Ciao ” + “Mondo” diventa la stringa “Ciao Mondo” .

• Esempio 2:
System.out.println(“Ciao, ” + name + “!”);

E potremmo leggere qualcosa come: Ciao, John!

TIPI DI DATO 39

OPERAZIONI SULLE STRINGHE

La classe String definisce numerose funzioni:

• s1.equals(s2)
• s1.equalsIgnoreCase(s2)
• s1.length()
• s1.charAt(N)
• s1.substring(N,M)
• s1.indexOf(s2) e anche s1.indexOf(ch)
• s1.compareTo(s2)
• s1.toUpperCase()
• s1.trim()

TIPI DI DATO 40

20
09/11/19

OPERAZIONI SULLE STRINGHE


La classe String definisce numerose funzioni (immaginando s1 e s2 due variabili di tipo String):

Funzione Significato

s1.equals(s2) Restituisce un booleano che indica se la stringa s1 è uguale alla stringa s2.
Restituisce un booleano (true/false) che indica se la stringa s1 è uguale alla
s1.equalsIgnoreCase(s2)
stringa s2 ingnorando il case (maiuscole e minuscole).
s1.length() Restituisce un numero intero che indica la lunghezza della stringa.
s1.charAt(n) Restituisce l’n carattere della stringa s1.
Restituisce una sottostringa della stringa s1 partendo dall’n-esima lettera all’m-esima
s1.substring(n,m)
lettera (estremi compresi).
Restituisce un numero intero che indica la posizione in cui la stringa s2 è presente
s1.indexOf(s2)
nella stringa s1.
Restituisce un numero intero che indica la posizione in cui il carattere ch è presente
s1.indexOf(ch)
nella stringa s1.
Restituisce un numero intero:
• = 0 se le due stringhe sono uguali
s1.compareTo(s2)
• > 0 se la stringa s1 è maggiore di s2 (secondo l’ordine alfanumerico)
• < 0 se la stringa s1 è minore di s2 (secondo l’ordine alfanumerico)
s1.toUpperCase() Restituisce una stringa costituita da tutte lettere maiuscole della stringa s1.
s1.toLowerCase() Restituisce una stringa costituita da tutte lettere minuscole della stringa s1.
s1.trim() Restituisce una copia della stringa s1 eliminando gli spazi bianchi.

TIPI DI DATO 41

STRINGHE: UN ESEMPIO
public class TestStringhe {

public static void main(String[] args) {


String testStr = "Ciao, Mondo!";
String newStr = "ciao, Mamma!";

System.out.println(”La prima stringa è " + testStr);


System.out.println("La seconda stringa è " + newStr);

boolean uguali = testStr.equals(newStr);


System.out.println("E’ " + uguali +" che le due stringhe sono uguali");

boolean ugualiIgnorandoCase = testStr.equalsIgnoreCase(newStr);


System.out.print("Ma se ingnorassimo la differenza tra minuscole e maiuscole,allora ");
System.out.println(ugualiIgnorandoCase);

int lunghezza = testStr.length();


System.out.println("La prima stringa è lunga " + lunghezza + " caratteri");
System.out.println("Il primo carattere della prima stringa è " + testStr.charAt(0));

int inizio = 0; int fine = 4;


String sottoStringa = testStr.substring(inizio , fine);
System.out.println("La sottostringa compresa tra "+inizio+" e "+fine+" è "+ sottoStringa );
System.out.println("La prima stringa in maiuscolo è:"+testStr.toUpperCase());
}
}

TIPI DI DATO 42

21
09/11/19

LE VARIABILI: RIASSUMENDO…

• Ricapitolando: per dichiarare una variabile si deve scrivere:

type-name variable-name

TIPI DI DATO 43

LE VARIABILI: RIASSUMENDO…

• Ricapitolando: per dichiarare una variabile si deve scrivere:

type-name variable-name

• Esempi

int numberOfStudents;
String name;
double x, y;
boolean isFinished = true;
char firstInitial, middleInitial, lastInitial;

TIPI DI DATO 44

22
09/11/19

LE VARIABILI: RIASSUMENDO…

• Ricapitolando: per dichiarare una variabile si deve scrivere:

type-name variable-name

• Esempi

int numberOfStudents;
String name;
double x, y;
boolean isFinished = true;
char firstInitial, middleInitial, lastInitial;

Tipi di dato

TIPI DI DATO 45

LE VARIABILI: RIASSUMENDO…

• Ricapitolando: per dichiarare una variabile si deve scrivere:

type-name variable-name

• Esempi

int numberOfStudents;
String name;
double x, y;
boolean isFinished = true;
char firstInitial, middleInitial, lastInitial;

Tipi di dato Assegnamento

TIPI DI DATO 46

23
09/11/19

LE VARIABILI: RIASSUMENDO…

• Ricapitolando: per dichiarare una variabile si deve scrivere:

type-name variable-name

• Esempi

int numberOfStudents;
String name;
double x, y;
boolean isFinished = true;
char firstInitial, middleInitial, lastInitial;

Tipi di dato Assegnamento Per dichiarare più variabili dello stesso tipo

TIPI DI DATO 47

LA CLASSE SCANNER

• In Java la classe serve come contenitore per il codice da eseguire.


Per esempio: abbiamo creato la classe HelloWorld.

TIPI DI DATO 48

24
09/11/19

LA CLASSE SCANNER

• In Java la classe serve come contenitore per il codice da eseguire.


Per esempio: abbiamo creato la classe HelloWorld.

• Altri programmatori hanno creato molte classi che possiamo riutilizzare.

TIPI DI DATO 49

LA CLASSE SCANNER

• In Java la classe serve come contenitore per il codice da eseguire.


Per esempio: abbiamo creato la classe HelloWorld.

• Altri programmatori hanno creato molte classi che possiamo riutilizzare.

• Per usare una classe creata da altri programmatori e disponibile nelle librerie di
Java dobbiamo usare la seguente sintassi:

import nome-qualificato-classe

TIPI DI DATO 50

25
09/11/19

LA CLASSE SCANNER

• In Java la classe serve come contenitore per il codice da eseguire.


Per esempio: abbiamo creato la classe HelloWorld.

• Altri programmatori hanno creato molte classi che possiamo riutilizzare.

• Per usare una classe creata da altri programmatori e disponibile nelle librerie di
Java dobbiamo usare la seguente sintassi:

import nome-qualificato-classe

• Nel nostro caso, per leggere input di testo dal terminale, importiamo la classe
Scanner
import java.util.Scanner

• java.util è il nome del package che contiene Scanner e altre classi di utilità.

TIPI DI DATO 51

RICORDATE L’OGGETTO Scanner?

La classe Scanner mette a disposizione una serie di metodi utili a leggere diversi
tipi di dato:

• Per le stringhe next(), nextLine()

• Per gli interi nextInt(), nextByte()

• Per i float e double nextFloat(), nextDouble()

• Per i boolean nextBoolean()

TIPI DI DATO 52

26
09/11/19

SCANNER: UN ESEMPIO COMPLETO

import java.util.Scanner;

public class HelloFriend {

public static void main(String[] args) {


String nome;
int eta;
Scanner stdin = new Scanner(System.in);
// lettura del nome
System.out.print("Ciao! Come ti chiami? ");
nome = stdin.nextLine();
System.out.println("Ciao "+ nome);
// lettura dell'età
System.out.print("E quanti anni hai? ");
eta = stdin.nextInt();
System.out.println("Ah, hai già "+ eta +" anni!");
stdin.close();
}
}

TIPI DI DATO 53

ANOMALIA DELL’INPUT

• Attenzione: purtroppo, la classe Scanner ha un comportamento che può risultare


anomalo quando si legge da tastiera.
• Se si fa un nextInt() oppure un qualsiasi altro ‘next numerico’, il carattere di ‘a
capo’ rimane nel buffer di entrata (non viene letto).
• Questa situazione non è problematica se successivamente si fa un altro
nextInt() oppure un altro ‘next numerico’, perché il carattere di ‘a capo’ viene
ignorato. Ma la situazione diventa problematica se si fa un nextLine().
• Il nextLine() legge il carattere di ‘a capo’ che è rimasto nel buffer come se
fosse una nuova linea di testo. Di conseguenza, la lettura sembra andare a vuoto.

TIPI DI DATO 54

27
09/11/19

ANOMALIA DELL’INPUT

import java.util.Scanner;

public class CiaoAmicoConAnomalia {

public static void main(String[] args) {


Scanner stdin = new Scanner(System.in);

System.out.print("Ciao, quanti anni hai? ");


int eta = stdin.nextInt();

System.out.print("Come ti chiami? ");


String nome = stdin.next();

System.out.println("Anni:" + eta);
System.out.println("Nome:" + nome);
OUTPUT
stdin.close();
Ciao, quanti anni hai? 34
}
Come ti chiami? Anni: 34
}
Nome:

TIPI DI DATO 55

ANOMALIA DELL’INPUT

Per ovviare al problema, se il codice presenta una sequenza del tipo:


• uno o più nextInt() (o un qualsiasi altro ‘next numerico’),
• seguito da uno o più nextLine() . . .

. . . basta fare un nextLine() supplementare dopo l’ultimo nextInt() (e prima del


primo nextLine()) per assicurarsi di catturare il carattere di ‘a capo’ rimasto nel
buffer.

TIPI DI DATO 56

28
09/11/19

ANOMALIA DELL’INPUT

import java.util.Scanner;

public class CiaoAmicoSenzaAnomalia {


public static void main(String[] args) {
Scanner stdin = new Scanner(System.in);

System.out.print("Ciao, quanti anni hai? ");


int eta = stdin.nextInt();
stdin.nextLine(); // Svuoto il buffer

System.out.print("Come ti chiami? ");


String nome = stdin.next();

System.out.println("Anni:" + eta);
System.out.println("Nome:" + nome); OUTPUT
Ciao, quanti anni hai? 34
stdin.close();
Come ti chiami? Giuseppe
}
Anni: 34
}
Nome: Giuseppe

TIPI DI DATO 57

29

Potrebbero piacerti anche