numeri

operazioni aritmetiche con numeri forniti dall'utente

Supponiamo ora di voler calcolare il prodotto di due numeri interi forniti dall'utente. Ragionevolmente dovremo procedere in questo modo: leggere i due numeri, fare il prodotto e quindi visualizzerai i risultati. Bene. L'unica differenza è che quando leggi il contenuto di un campo testo, questo è di tipo, appunto, testo altrimenti detto stringa (String); serve quindi una esplicita conversione da stringa a intero. Questo è possibile grazie al metodo statico parseInt() dell'oggetto Integer, che in pratica si usa scrivendo: Integer.parseInt(stringa).

Nella funzione che gestirà l'evento, posto che i campi testo degli operandi si chiamino rispettivamente op1 ed op2 mentre il campo testo per mostrare il risultato si chiami risultato, immetteremo il seguente frammento di codice:

public void calcola() {
   String op1, op2, ris;
   int n1, n2, tot;
   op1 = operando1.getText();
   op2 = operando2.getText();
   n1 = Integer.parseInt(op1);
   n2 = Integer.parseInt(op2);
   tot = n1 * n2;
   ris = "" + tot;
   risultato.setText(ris);
}

Puoi senz'altro osservare che particolare risulta l'operazione inversa, cioè la conversione in testo del risultato a partire dall'intero tot. Il procedimento ha questa logica: l'operatore + ha due significati diversi a seconda che si riferisca a numeri o a stringhe; nel primo caso infatti esegue la normale addizione mentre nel secondo caso – come visto in un precedente capitolo – esegue una concatenazione di testi. Osservando la riga in questione (la penultima) vedrai che un argomento dell'operatore è di tipo stringa e l'altro è di tipo intero. Quando uno degli operandi è di tipo stringa, Java cercherà di far diventare anche l'altro operando stringa, eseguendo così una conversione implicita da intero a testo. Dato che la stringa vuota concatenata ad una seconda stringa (che è il risultato della trasformazione in stringa di tot) rende esattamente la seconda stringa, abbiamo ottenuto ciò che si voleva.

Se lunghezza è una variabile di tipo intero e testo è una variabile di tipo String che contine la rappresentazione di un numero come posso fare per avere il suo valore 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 calcola() {
   int n1, n2, tot;
   n1 = Integer.parseInt(operando1.getText());
   n2 = Integer.parseInt(operando2.getText());
   tot = n1 * n2;
   risultato.setText("" + tot);
}

Dedurrai che si tratta della sola eliminazione delle variabili stringa. Allo stesso modo Float.parseFloat(stringa) e Double.parseDouble(stringa) convertono la stringa in un numero reale a singola (float) o doppia (double) precisione.

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

tipi numerici

I tipi fondamentali di Java che 8 in tutto, di questi ben 6 servono a memorizzare dei numeri, con o senza parte decimale.

I tipi senza parte decimale si diffenziano in base al numero più grande che possono contenere, quelli con la parte decimale in base alla precisione che hanno nella mantissa e nell'esponente (per capire: quante cifre prendono in considerazione in entrabe le parti).

Tipi numerici interi

byte
un numero intero (con segno), occupa 8 bit bit in memoria, i suoi valori vanno da -128 a 127
short
numero intero (con segno), occupa 16 bit in memoria, i suoi valori vanno da -32768 a 32767
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
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, "14456L" è un valore long valido.

Tipi numerici in virgola mobile

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, "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, "14.456" è un valore double valido.

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

byte float short double

I tipi numerici vengono utilizzati anche per fare calcoli, quindi per scrivere espressioni, insieme agli operatori.

Un operatore è un simbolo (formato da uno o più caratteri) che serve a produrre un risultato combinando il valore di uno o più operandi.

Operatori numerici

+
è il solito operatore per l'addizione: 4 + 7 è una espressione ammissibile, anche k + 7 se k è una variabile di tipo numerico
-
sottrazione, usato nel modo usuale.
*
moltiplicazione, k * m è una espressione valida se k e m sono due variabili numeriche
/
quoziente, il risultato della divisione. Se si usano variabili in virgola mobile è il risultato che ci si aspetta: 15.0 / 4.0 dà come risultato 3.75. Se si usano valori interi il risultato è quello delle divisioni che si facevano alle elementari! (quelle con il resto) quindi: 10 / 3 fa 3.
%
resto della divisione, anche chiamato modulo. 10 / 3 fa 1

Quanto vale 6 + 4 / 2 ?

8esatto 5no, viene fatta prima la divisione

conversione di tipo

Non è possibile assegnare un valore più preciso ad un tipo meno preciso... sarebbe a dire che non posso mettere un valore in virgola mobile (ad esempio un double) in una variabile di tipo intero perché si rischierebbe di perdere informazioni.

È possibile però forzare questa operazione 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), 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, qui ci siamo limitati a trattarla tra tipi base

operatori di pre/post incremento

++
se posto prima di una variabile incrementa di uno il suo valore e poi la usa per eseguire il calcolo dell'espressione, se posto dopo i nome della variabile prima usa il valore della variabile stessa per calcolare il resto dell'espressione e poi ne incrementa il valore
--
se posto prima di una variabile decrementa di uno il suo valore e poi la usa per eseguire il calcolo dell'espressione, se posto dopo i nome della variabile prima usa il valore della variabile stessa per calcolare il resto dell'espressione e poi ne decrementa il valore
Gli operatori di pre (post incremento possono comparire all'interno di operazioni che come istruzioni a se).

Quanto vale x dopo il seguente frammento di programma?

x=18
x++;
18no, c'era un incremento 19

Quanto vale y dopo il seguente frammento di programma?

x=3
y = x++ * 2;
6esatto, prima calcola l'espressione e poi fa l'incremento 8no, l'incremento viene fatto dopo il calcolo

Quanto valgono x e y dopo il seguente frammento di programma?

x=3
y = --x * 3;
x=2 e y=6giusto x=3 e y=6no, x viene decrementata x=2 e y=9no, prima viene fatto il decremento della x e poi calcolata l'espressione x=3 e y=9no, va decrementata la x e poi calcolata l'espressione

Considerazioni generali

È possibile utilizzare soltanto le parentesi tonde per modificare la precedenza degli operatori.

Se in una espressione vengono mescolati valori (o variabili) di più tipi il tipo del risultato sarà quello più preciso possibile, questo tipo di conversione viene fatta un operatore alla volta. Nell'espressione (45 / 10) * 2.5 prima viene eseguito 45/10 che fa 4 e poi la moltiplicazione per 2.5 che fa 10.0, un valore double.

Quanto vale [6 + (2 * 2) ] / 2 ?

5no, le parentesi quadre non posso essere usate 4no, le parentesi quadre non posso essere usate erroregiusto, le parentesi quadre non posso essere usate

Quanto vale 8 / 3 ?

2giusto! è una divisione tra interi 2.66666no, le divisioni tra interi non hanno una parte decimale 3no, le divisioni tra interi non vengono arrotondate