Un approccio a Java: Le variabili - caso d'uso

Partiamo da un esempio pratico

by Alessio Mungelli Date: 22-10-2020 java jdk jre variabili tutorial spiegazione pensiero esempi

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 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 wink

 
by Alessio Mungelli Date: 22-10-2020 java jdk jre variabili tutorial spiegazione pensiero esempi visite : 1910  
 
Alessio Mungelli

Alessio Mungelli

Computer Science student at UniTo (University of Turin), Network specializtion, blogger and writer. I am a kind of expert in Java desktop developement with interests in AI and web developement. Unix lover (but not Windows hater). I am interested in Linux scripting. I am very inquisitive and I love learning new stuffs.

 
 
 

Articoli correlati

Come scaricare un'e-mail in formato PDF in Gmail per Android

Ora scoprirete quanto sia facile salvare un'e-mail ricevuta o inviata tramite Gmail in formato PDF, il tutto con il vostro smartphone Android. Gmail è una delle applicazioni di posta elettronica più…

Un approccio a Java: switch statement

Ciao a tutti e bentornati! Dopo una pausa, torniamo oggi con un'altra parte del corso introduttivo alla programmazione, parlando di switch statement, conosciuto anche come costrutto di selezione multipla.  Intuizione L'idea dello switch statement…

Un approccio a Java: Il ciclo while

Ciao a tutti e bentornati! Dopo aver fatto una breve, ma corposa, introduzione sui cicli, andiamo oggi a vedere finalmente le prime implementazioni che utilizzano quello che abbiamo definito ciclo precondizionale. In Java, come…

Un approccio a Java: I cicli - Introduzione

Ciao a tutti e bentornati! Sino ad ora, abbiamo parlato di variabili e di strutture di selezione, andando a considerare alcuni degli aspetti fondamentali di questi due concetti. Teoricamente, per…

Un approccio a Java: strutture di selezione - casi d'uso

Ciao a tutti e bentornati! Sino ad ora ci siamo preoccupati di fare una carrellata quanto più completa riguardo i concetti fondamentali di cui abbiamo bisogno per approcciarci all'utilizzo delle…

Un approccio a Java: operatori booleani

La volta precedente, abbiamo ampiamente parlato delle variabili booleane, cercando di delineare quali siano le principali operazioni che si possono effettuare proprio a livello pratico.  Di tutti i casi esaminati, non abbiamo…

Un approccio a Java: le variabili booleane

Ciao a tutti e bentornati! La volta precedente, ho fatto un'introduzione alle strutture condizionali, definendo il loro funzionamento. Prima di poter dare qualche esempio pratico, è necessario chiarire in che modo ci…

Un approccio a Java: strutture condizionali

Ciao a tutti e bentornati! Le volte precedenti abbiamo introdotto il concetto di variabile, tentando di definire alcuni concetti basilari a riguardo.  Alcune situazioni fanno però intuire come il solo concetto…

Un approccio a Java: Le variabili

Ciao a tutti e bentornati! Quest'oggi inizieremo un percorso che ci porterà a studiare, ed eventualmente ripassare, quelle che sono le basi della programmazione. Inizieremo parlando di variaibli. Introduzione Chiunque voglia approcciarsi al…

Hashmap con Concatenamento: hashing, collisioni e prime funzioni

Oggi andremo a vedere dei concetti strettamente legati alle hashmap. I concetti che andremo a vedere sono quelli di hashing e collisioni. Hashing L'idea dell'hashing con concatenamento è quella di creare una sorta di array di…

Hashmap con concatenamento: liste di trabocco

In questa breve serie di articoli andremo a vedere com'è possibile realizzare in C la struttura dati Hashmap. Nell'implementazione andremo ad usare le liste doppiamente concatenate come strutture dati ausiliarie. Andiamo…

Facebook: come rimuovere i dati nascosti e le informazioni personali

Facebook è un fantastico social network che ci permette di essere sempre aggiornati su tutte le notizie dei nostri amici o della nostra famiglia o anche sulle notizie più rilevanti…

Clicky