tipi

operazioni aritmetiche con numeri forniti dall'utente

dichiarazione

Java è un linguaggio con un forte controllo sui tipi e per questo prima di poter utilizzare una variabile è necessario dichiarare il suo tipo (cioè quali informazioni potrà contenere e quali operazioni sara possibile effettuarci).

Una dichiarazione è una istruzione con la forma
tipo nomeVariabile
che specifica che da questo punto in avanti esisterà la variabile nomeVariabile che potrà contenere soltanto valori del tipo specificato.

assegnazione

In java il simbolo = ci permette di assegnare un valore ad una variabile, non è da confondere con il concetto di uguaglianza della matematica.

Un assegnazione è una istruzione con la forma
nomeVariabile = espressione
che valuta l'espressione sulla destra e ne mette il risultato nella variabile presente sulla sinistra. Il tipo dell'espressione deve essere lo stesso o meno preciso di quello della variabile.

Tratteremo nei prossimi capitoli formalmente cosa è una espressione, per adesso il significato intuitivo delle espressioni viste a matematica va bene. Un esempio di assegnazione potrebbe essere x=4 che vuol semplicemente dire mettere il valore 4 dentro la variabile x oppure x=y+1 che vuol dire "prendi il contenuto della variabile y, sommaci 1 e quel che viene mettilo nella variabile x".

Proviamo a vedere una assegnazione che potrebbe sembrare più particolare:


x = x + 4;

questa istruzione prende il valore della variabile x, ci aggiunge 4 e poi scrive il risultato sempre nella variabile x

visto che questa scrittura è molto comune abbiamo un modo per abbreviarla:


x += 4;

Spesso resta comodo fare la prima assegnazione insieme alla dichiarazione di una variabile, ad esempio se voglio assegnare il valore 5 alla variabile intera lunghezza posso scrivere:
int lunghezza = 5;
che è del tutto equivalente a: int lunghezza;
lunghezza = 5;
.

Come posso fare per incrementare il valore di una variabile di 5 unità?

a+=5;uno dei modi possibili! a=5;così si assegna il valore 5 alla variabile a a=a+5;uno dei modi possibili!

tipi di dato

Il tipo (o tipo di dato) indica le caratteristiche dei valori che una variabile o una espressione può assumere. Il tipo di una variabile viene definito al momento della sua dichiarazione e non può essere cambiato.

classificazione dei tipi

Java divide i tipi delle variabili in due grandi gruppi: tipi base e tipi riferimento.

Tipi base
numeri interi (byte, short, int, long), numeri decimali (float, double), booleani (boolean) e caratteri (char).
Tipi riferimento
in pratica tutti gli altri, ad esempio: per rappresentare dei testi (String), vettori, pulsanti (Button)…

Tipi base: numeri interi

I tipi senza parte decimale si differenziano in base al numero più grande (in valore assoluto) che possono contenere.

byte
un numero intero (con segno), occupa 8 bit bit in memoria, i suoi valori vanno da -128 a 127, non si possono scrivere valori diquesto tipo: 34 non è un valore di tipo byte
short
numero intero (con segno), occupa 16 bit in memoria, i suoi valori vanno da -32768 a 32767, non si possono scrivere valori di questo tipo: 678 non è un valore di tipo short
int
numero intero (con segno), occupa 32 bit in memoria, i suoi valori vanno da -2147483648 ... 2147483647, per ricordarci facilmente nell'ordine di ± due miliardi, i valori di questo tipo in si scrivono normalmente: ad esempio 456.
long
numero intero (con segno), occupa in memoria 64 bit, i suoi valori vanno da -9223372036854775808 a 9223372036854775807, per ricordarci più facilmente nell'ordine di ± 1018.
I numeri di tipo long si scrivono postponendo una "L" al numero intero, ad esempio 14456L è un valore long valido.

Tipi base: numeri decimali

Sono anche chiamati numeri in virgola mobile, e si differenziano in base alla precisione che hanno (tecnicamente il numero di cifre per la mantissa e per esponente).

Nei numeri in virgola mobile per separare la parte intera da quella decimale si usa il "." come nella notazione anglosassone e non la "," come nella notazione italiana.

float
numero in virgola mobile, in memoria occupa 32 bit, il numero più piccolo memorizzabile è circa ±1,45x10-45 e il più grande è circa 3,4x1038 I numeri di tipo float si scrivono utilizzando il "." per separare la parte decimale e postponendo una "f" al numero, ad esempio 14.456f è un valore float valido.
double
numero in virgola mobile, in memoria occupa 64 bit, il numero più piccolo memorizzabile è circa ±4,5x10-324 e il più grande è circa 1,7x10308.
I numeri di tipo double si scrivono utilizzando il "." per separare la parte decimale, ad esempio 14.456 è un valore double valido.

Tipi base: booleani

I booleani (a volte anche chiamati "valori di verità") sono rappresentati dal tipo boolean e possono contenere soltanto due valori: true o false.

Tipi base: caratteri

Il tipo che rappresenta un carattere è char, un char rappresenta un singolo carattere Unicode e va racchiuso tra virgolette singole, ad esempio: 'a' oppure '😱'.

Quale dei seguenti tipi può contenere valori con la parte decimale?

byte no, numeri interi molto piccoli float long no, numero interi molto grandi double booleanno, soltanto true o false

Tipi riferimento: testi, vettori, pulsanti …

I tipi riferimento sono molto numerosi e in più ognuno può definirne di nuovi, per comodità qui tratteremo soltanto il tipo che rappresenta i testi perché si usa molto spesso: String.

Una variabile di tipo String contiene un testo Unicode di lunghezza arbitraria racchiuso tra doppie virgolette come ad esempio: "ciao" o "ཨ་རོགས".

Una qualsiasi variabile di tipo riferimento se non viene inizializzata assume un valore speciale: null

Il valore contenuto in una variabile di tipo riferimento è l'indirizzo di memoria in cui inizia l'oggetto rappresentato dalla varibile stessa. Ad esempio una variabile String testo possiamo ipotizzare che contenga una sequenza di caratteri che saranno memorizzati in una sequenza di byte: il valore di testo è l'indirizzo di memoria in cui inizia la sequenza di byte in questione.

Conversione di tipo

È a volte necessario convertire un valore da un tipo ad un altro, Java in automatico converte da un tipo meno preciso ad uno più preciso (es int → double oppure byte → int).

Se la variabile i è di tipo int e d è di tipo double posso scrivere:
d = i
ma non il viceversa (i=d).

cast

Assegnare un valore più preciso ad un tipo meno preciso non può essere fatto automaticamente. Sarebbe a dire che non posso ad esempio mettere un valore in virgola mobile in una variabile di tipo intero perché si rischierebbe di perdere informazioni quindi se lo faccio java mi rileva un errore.

È possibile però forzare questa operazione quando si è sicuri che il valore sia convertibile usando l'operazione di cast che si fa racchiudendo tra parentesi tonde il nome di un tipo prima di un espessione.

Poniamo che la variabile x sia di tipo int: x=(int) 10.8 converte il valore 10.8 ad un intero (non arrotondando ma troncando il valore) ottenendo quindi 10, questa operazione può essere fatta tra i diversi tipi numerici, attenzione però che la converisone tra i tipi interi viene fatta semplicemente scartando dei byte.

Quanto vale (byte) 257 ?

257no, 257 non è rappresentabile in un byte 255no, i byte per Java hanno un segno... 255 è troppo grande 127no, sarebbe rappresentabile ma i cast non fanno arrotondamenti tra numeri interi 1giusto! 257 in binario è 100000001, siccome viene preso il solo byte più a destra il risultato è 1

L'operazione di cast può essere fatta anche in altri contesti che qui però non trattiamo.

convertire numeri in testi e viceversa

Le conversioni di questo genere sono meno ovvie e bisogna far uso di metodi specifici a seconda della conversione che si vuol fare:

String → int
intero = Integer.parseInt(testo)
String → double
decimale = Double.parseDouble(testo)
numero → String
testo = String.valueOf(numero), spesso per comodità si usa la conversione automatica che fa Java quando si concatena una variabile di qualsiasi tipo ad una String, ad esempio testo = "" + numero.

Esempio: prodotto di due numeri

Poniamo che la nostra interfaccia contenga due caselle di testo (cOperando1 e cOperando2) in cui l'utente scrive due numeri interi e una etichetta (eRisultato) in cui vogliamo che venga visualizzato il prodotto dei due numeri interi


public void calcolaProdotto() {
   String testo1, testo2, risposta;
   int numero1, numero2, prodotto;
   testo1 = cOperando1.getText();
   testo2 = cOperando2.getText();
   numero1 = Integer.parseInt(testo1);
   numero2 = Integer.parseInt(testo2);
   prodotto = numero1 * numero2;
   risposta = String.valueOf(prodotto);
   eRisultato.setText(risposta);
}

Esempio: divisione di due numeri

Poniamo che la nostra interfaccia contenga due caselle di testo (cOperando1 e cOperando2) in cui l'utente scrive due numeri decimali e una etichetta (eRisultato) in cui vogliamo che venga visualizzato il rapporto tra i due numeri decimali


public void calcolaRapporto() {
   String testo1, testo2, risposta;
   double numero1, numero2, rapporto;
   testo1 = cOperando1.getText();
   testo2 = cOperando2.getText();
   numero1 = Double.parseDouble(testo1);
   numero2 = Double.parseDouble(testo2);
   rapporto = numero1 / numero2;
   risposta = "" + rapporto;
   eRisultato.setText(risposta);
}

Osservando la penultima riga vedrai che un argomento dell'operatore è di tipo stringa e l'altro è di tipo double. Quando uno degli operandi è di tipo stringa, Java rappresenterà anche l'altro operando come stringa, eseguendo così una conversione implicita da double a testo. Dato che la stringa vuota concatenata ad una seconda stringa (che è il risultato della trasformazione in stringa di rapporto) restituisce esattamente laa stringa rappresentante il numero, abbiamo ottenuto ciò che si voleva.

Se lunghezza è una variabile di tipo intero e testo è una variabile di tipo String che contiene la rappresentazione di un numero come posso fare per avere il valore che rappresenta in lunghezza?

Integer.parseInt(testo, lunghezza)Integer.parseInt() ha un solo argomento qui ne vengono usati due testo=Integer.parseInt(lunghezza)L'argomento dei Integer.parseInt() deve essere il testo, come risultato dà un numero, qui l'argomento è un numero lunghezza=Integer.parseInt(testo)

Per terminare prova ad analizzare la seguente funzione analoga alla precedente:


public void calcolaProdotto() {
   int numero1, numero2, prodotto;
   numero1 = Integer.parseInt(operando1.getText());
   numero2 = Integer.parseInt(operando2.getText());
   prodotto = n1 * n2;
   risultato.setText("" + prodotto);
}

Come si vede si tratta della sola eliminazione delle variabili stringa che erano state utilizzate per leggere i valori (in questo caso l'istruzione per leggere è stata inserita direttamente in Integer.parseInt() ) o per calcolare il risultato che andava poi visualizzato.

Crea un programma che calcola l'area e il perimetro di un quadrato, il lato del quadrato è un numero senza parte decimale.