Partiamo da un esempio pratico
Ciao a tutti amici e bentornati!
Dopo l'introduzione fatta sulle variabili, cerchiamo di analizzare alcune criticità che si possono presentare in situazioni alquanto comuni. Partiamo quindi analizzando degli esempi pratici.
Esempio 1: divisione che restituisce un risultato non intero
Il primo caso critico che si potrebbe presentare per chi si approccia al coding è un problema relativo al seguente codice.
public class Main {
public static void main(String[] args){
int a = 1;
int b = 2;
System.out.println("a/b = "+a/b);
}
}
Eseguendo questo codice, l'output che otterrremo è: a/b = 0. Chiaramente questo non è il risultato che ci aspettiamo di ottenere. Prima di vedere la soluzione, analizziamo il codice.
In questo caso vengono create due variabili a e b assegnando rispettivamente i valori 1 e 2. Vi è poi l'istruzione di stampa su terminale che è System.out.println(). All'interno delle parentesi tonde dovremo inserire il contenuto che vogliamo stampare. Possiamo concatenare una stringa fissa, inserita tra doppi apici ad un numero utilizzando l'operatore +. Vedremo in seguito alcune comuni funzioni utilizzabili.
Rimane il fatto che questo breve e semplice codice non funziona correttamente. Quello che dobbiamo fare è ragionare sui tipi di dato che abbiamo scelto.
Quello che ci dobbiamo chiedere è: siamo sicuri che il risultato di una divisione sia sempre un numero intero? La risposta è alquanto semplice: no.
Giunti a questo punto vi starete chiedendo come risolvere questa situazione. Vediamo un paio di soluzioni possibili.
public class Main {
public static void main(String[] args){
int a = 1;
int b = 2;
System.out.println("a/b = "+(float)a/b);
}
}
Ad un occhio poco attento, questa soluzione potrebbe sembrare identica a quella che abbiamo visto essere problematica. In realtà vi è una piccola differenza nell'istruzione di stampa. Infatti ho aggiunto (float) di fianco al numero da stampare, che in questo caso è a/b.
Questa operazione, che analizzeremo in seguito, è detta cast o casting. Per dare una prima infarinatura, non fa nient'altro che convertire un valore da un tipo ad un altro. Questo è necessario perchè le due variabili sono di tipo int e di conseguenza, anche la loro divisione restituirà un quoziente int. Ma in realtà, come abbiamo detto il quoziente deve essere un numero decimale, quindi float o double. Da qui la necessità di effettuare una "conversione".
É doveroso ribadire che questa definizione di cast non è precisa nè completa. Serve solo per dare un primo strumento pratico per risolvere un problema alquanto comune. Vedremo più avanti il suo utilizzo.
Una seconda soluzione, molto più banale ma efficace in ugual misura, è quella di rendere una delle due variabili un numero decimale.
public class Main {
public static void main(String[] args){
float a = 1;
int b = 2;
System.out.println("a/b = "+(a/b));
}
}
Questa cosa funziona perchè, in generale, un'operazione tra un numero decimale e un numero intero, restituisce un numero decimale, dove per decimale intendiamo anche un numero del tipo 4.0000.
Per entrambe le soluzioni, l'output in uscita del programma sarà a/b = 0.5, che è esattamente il risultato che ci aspettiamo di ottenere. Ovviamente, cambiando i valori assegnati ad a e b, tutto continua a funzionare correttamente. Vedremo in seguito come rimuovere eventuali zeri indesiderati dall'espansione decimale.
Esempio 2: assegnazione di valori di tipo diverso rispetto alla variabile
Un errore che si tende a fare spesso alle prime armi è quello di sbagliare i valori da assegnare alle variabili. Cerchiamo di capire meglio.
Può succedere, a volte, di tentare di assegnare un numero decimale ad una variabile intera o un numero intero ad una variabile float. Vediamo un esempio.
public class Main {
public static void main(String[] args){
float a = 1;
int b = 2.5;
System.out.println("a="+a);
System.out.println("b="+b);
}
}
Questo programma, non funziona. Analizziamo le motivazioni. Il primo assegnamento funziona, siccome 1 può essere interpretato come 1.0000 e quindi come numero float. Il secondo è quello problematico. Quello che dobbiamo chiederci è: 2.5 è un numero intero? Beh, chiaramente no. Infatti, eseguendo il programma, otteniamo questo messaggio di errore: Error:(6, 17) java: incompatible types: possible lossy conversion from double to int. Al lettore più attento, sorgerà almeno una domanda. Come mai il messaggio di errore cita double, quando di double non c'è nemmeno l'ombra nel mio codice?
La motivazione risiede nel fatto che, un numero decimale viene interpretato di default come double. Per segnalare al compilatore che quel valore è un float, allora dovremmo scrivere una riga come la seguente.
int b = 2.5f;
In questa maniera, 2.5 verrà riconosciuto e trattato come float e non come double. Lo dimostra il messaggio di errore che compare: Error:(6, 17) java: incompatible types: possible lossy conversion from float to int.
Bisogna ora capire cosa significhi quel messaggio di errore. Banalmente, ci sta dicendo che nella conversione da float a int, potremmo perdere informazione. Motivo per cui il secondo assegnamento non ci viene permesso. Ricordiamoci quindi che, a meno di situazioni particolari che vedremo, non è consentito assegnare valori che non siano dello stesso tipo della variabile.
Entry point: il main
L'ultimo concetto che vale la pena sviscerare per questa volta è quello di main.
In tutti gli esempi presentati oggi, abbiamo scritto tutto il nostro codice all'interno di un'entità che abbiamo definito come:
public class Main {
public static void main(String[] args){
//scrivi qui il codice
}
}
Quello che abbiamo fatto, definendo quel public static void main(String[] args) è definire quello che viene detto entry point, cioè il punto da cui il programma inizia la sua esecuzione.
Nel momento in cui mandiamo in esecuzione il nostro programma, la sua esecuzione inizierà dalle istruzioni contenute nel main. Per gli esempi che svilupperemo in queste prime volte, tutto il codice verrà scritto all'interno del main.
Una cosa che tengo particolarmente a ribadire è proprio il significato di all'interno del main. E' un concetto scontato per tante persone, ma non banale per chi si approccia alla programmazione. Quando diciamo "all'interno del main" intendiamo che il codice si deve trovare all'interno delle parentesi graffe aperte e chiuse dopo la definizione.
public class Main {
public static void main(String[] args){
//scrivi il codice qui
}
}
Il codice andrà quindi scritto all'interno delle parentesi graffe evidenziate in rosso.
Anche per questa volta è tutto. Vi invito a sperimentare parecchio. Sperimentare è l'unico modo per imparare a programmare. Bisogna provare e buttarsi. Altrimenti, sarebbe come provare ad imparare a nuotare leggendo un libro in biblioteca ![]()