5.1
Istruzioni condizionali in Java
Nel mondo della programmazione informatica, la capacità di controllare il flusso di esecuzione di un programma è fondamentale per costruire applicazioni dinamiche e interattive. Le istruzioni condizionali permettono ai programmatori di specificare blocchi di codice che dovrebbero essere eseguiti solo quando certe condizioni sono soddisfatte. In Java, come in molti altri linguaggi di programmazione, le istruzioni condizionali principali sono if, else e switch-case. In questa lezione, esploreremo queste istruzioni condizionali e vedremo come possono essere utilizzate per dirigere il flusso di controllo all'interno di un programma.
If in Java
L'istruzione ‘if’ rappresenta il blocco condizionale più elementare ed essenziale. Esso verifica una condizione e, se questa risulta vera, il blocco di codice all'interno dell'istruzione ‘if’ viene eseguito. Se la condizione è falsa, il blocco di codice viene ignorato. Per gestire anche il caso in cui la condizione è falsa, si può estendere la struttura condizionale utilizzando l'istruzione ‘else’. In questo modo, si può specificare un blocco di codice da eseguire quando la condizione è falsa.
if (a > 5) {
System.out.println("a è maggiore di 5");
} else {
System.out.println("a non è maggiore di 5");
}
In questo scenario, il programma esamina se la variabile ‘a’ è maggiore di 5. Se la condizione è soddisfatta, il programma restituirà la frase "a è maggiore di 5"; in caso contrario, verrà visualizzata la frase "a non è maggiore di 5".
Esercizio con operatori e if in Java
Supponiamo di avere un negozio e di voler applicare sconti ai clienti in base all'importo totale della loro spesa. Gli sconti saranno applicati come segue:
Se la spesa è inferiore a €50, non viene applicato alcuno sconto.
Se la spesa è uguale o superiore a €50, viene applicato uno sconto del 20%.
public class CalcolatoreSconto {
public static void main(String[] args) {
float spesaTotale = 120; // Imposta l'importo totale della spesa
float sconto = 0;
float spesaDopoSconto = 0;
if (spesaTotale < 50) {
sconto = 0;
}
else{
sconto = spesaTotale * 0.20f; // Sconto del 20%
}
spesaDopoSconto = spesaTotale - sconto;
System.out.println("Importo sconto: €" + sconto);
System.out.println("Importo dopo sconto: €" + spesaDopoSconto);
}
}
Suggerimento: per il momento, stiamo mettendo da parte l'interpretazione di 'public class' e 'public static void main', focalizzandoci esclusivamente sul resto del codice. È importante notare, tuttavia, che l'esecuzione del programma prende il via dal metodo main, proseguendo, riga per riga, dall'alto verso il basso a meno che il flusso non venga deviato da, per esempio, errori nel codice. Questo implica che operazioni quali la dichiarazione delle variabili debbano essere effettuate obbligatoriamente prima del loro utilizzo nel codice.
Spiegazione: nella prima fase del codice abbiamo dichiarato tre variabili utilizzando il tipo float in modo da rendere ammissibili anche risultati con la virgola e abbiamo assegnato loro dei valori, tra cui anche l’importo della spesa effettuata.
float spesaTotale = 120; // Imposta l'importo totale della spesa
float sconto = 0;
float spesaDopoSconto = 0;
Nella seconda fase abbiamo verificato lo sconto spettante per la nostra spesa; nella prima condizione ‘if’ verifichiamo che la spesa sia minore di 50 e, se questa affermazione si dimostra vera, lo sconto applicato sarà di 0; se questo, però, non dovesse essere vero - come nel nostro caso, - il programma passerà al ‘else’ il quale calcolerà lo sconto facendo facendo l’operazione ‘sconto = 120 * 0.20’.
if (spesaTotale < 50) {
sconto = 0;
}
else{
sconto = spesaTotale * 0.20f; // Sconto del 20% (se facciamo calcoli con i float dobbiamo ricordarci di inserire la f alla fine del numero)
}
Nella parte conclusiva del codice, calcoliamo l'importo della variabile ‘spesaDopoSconto’ sottraendo l'importo dello sconto determinato in precedenza, dall'importo totale della spesa. Successivamente, vengono visualizzati sia l'importo dello sconto (che in questo caso ammonta a €24) sia l'importo finale da pagare dopo l'applicazione dello sconto (che in questo caso è di €96).
spesaDopoSconto = spesaTotale - sconto;
System.out.println("Importo sconto: €" + sconto);
System.out.println("Importo dopo sconto: €" + spesaDopoSconto);
Attraverso questo esercizio, abbiamo esplorato come gli operatori aritmetici e le strutture di controllo come if e else possano essere utilizzati in un contesto pratico per risolvere problemi reali. In particolare, abbiamo visto come calcolare sconti in base all'importo speso, una situazione comune che potrebbe presentarsi in molti ambiti, non solo nel contesto di un negozio.
Switch-case in Java
L'istruzione switch-case è un'alternativa all'uso di molteplici istruzioni if-else quando si hanno diverse condizioni da verificare che dipendono dal valore di una singola variabile. Mentre l'if-else è più flessibile e può valutare una vasta gamma di condizioni, lo switch-case è generalmente più leggibile e organizzato quando si confrontano le stesse variabili con valori specifici e definiti.
public class Main {
public static void main(String[] args) {
int day = 3;
switch (day) {
case 1:
System.out.println("Monday");
break;
case 2:
System.out.println("Tuesday");
break;
case 3:
System.out.println("Wednesday");
break;
case 4:
System.out.println("Thursday");
break;
case 5:
System.out.println("Friday");
break;
case 6:
System.out.println("Saturday");
break;
case 7:
System.out.println("Sunday");
break;
}
}
}
Quando ‘giorno’ è impostato a 3, il codice passerà attraverso lo switch e raggiungerà il ‘case 3’, dove stamperà "Wednesday" e, poi, uscirà dallo switch a causa del break (che verrà trattato in seguito in modo più dettagliato). Non raggiungerà gli atri case o il default perché il break impedisce di continuare nell'esecuzione dei casi successivi .Nel linguaggio Java, l'operatore switch è stato migliorato nelle versioni più recenti per supportare i tipi String rendendo lo strumento più potente e flessibile.
5.2
Cicli in Java
I cicli sono strumenti potenti nella programmazione informatica che permettono di eseguire un blocco di codice ripetutamente finché una certa condizione è verificata. Nel linguaggio Java, i cicli sono implementati attraverso tre principali costrutti: for, while e do-while. Questi cicli sono fondamentali per lavorare con collezioni di dati, eseguire operazioni ripetitive e gestire flussi di controllo complessi. Vediamo ciascuno di essi più nel dettaglio.
Ciclo For in Java
Il ciclo ‘for’ è ideale quando sappiamo in anticipo quante volte vogliamo eseguire un certo blocco di codice. La sintassi del ciclo ‘for’ include l'inizializzazione, la condizione e l'incremento.
for (int i = 0; i < 10; i++) {
System.out.println("Il valore di i è: " + i);
}
Inizializzazione int i = 0: prima di entrare nel ciclo, viene creato un contatore i ed è inizializzato a 0. Questa inizializzazione avviene solo una volta, all'inizio del ciclo.
Condizione i < 10: ogni volta che il ciclo viene eseguito, il linguaggio Java controlla se la condizione i < 10 è vera. Se lo è, il ciclo continua; se non lo è, il ciclo si ferma e il programma procede con l'istruzione successiva al ciclo.
Incremento i++: dopo che il blocco di codice è stato eseguito, l'istruzione ‘i++’ incrementa il valore di ‘i’ di 1. Questo significa che ‘i’ aumenterà di 1 ad ogni iterazione del ciclo.
In questo esempio, quando si avvia il programma, il ciclo for inizierà e compirà dieci iterazioni, stampando il messaggio contenuto nella funzione ‘System.out.println’ ad ogni giro. Ogni volta, verrà visualizzato il testo "Il valore di i è: " seguito dal valore corrente di i, che cambierà ad ogni iterazione incrementandosi di 1, partendo da 0 fino a 9. Al termine delle dieci iterazioni, il ciclo for si concluderà, ed il programma proseguirà con l'esecuzione del resto del codice che segue il blocco del ciclo for.
Ciclo foreach in Java
Il foreach in Java è una forma semplificata di iterazione utilizzata per attraversare gli elementi di una collezione, come array, liste o insiemi. Questo costrutto è particolarmente utile quando si desidera esaminare ogni elemento senza preoccuparsi degli indici o dell'accesso diretto agli elementi stessi. Ecco un esempio di come si utilizza il foreach in Java:
String[] colors = {"Red", "Green", "Blue", "Yellow"};
for (String color : colors) {
System.out.println(color);
}
In questo esempio, colors è un array di stringhe. Il costrutto for each viene utilizzato nella forma for (tipo elemento : collezione) dove tipo è il tipo di dati degli elementi nell'array (String in questo caso), elemento è il nome della variabile che rappresenta ogni elemento durante l'iterazione e collezione è l'array o la collezione attraverso cui si desidera iterare.
Ad ogni iterazione del ciclo, la variabile color assume il valore dell'elemento corrente nell'array. Quindi, nel nostro esempio, color assumerà i valori "Red", "Green", "Blue" e "Yellow" durante le quattro iterazioni del ciclo. All'interno del blocco del ciclo, possiamo utilizzare color per accedere all'elemento corrente e eseguire le operazioni necessarie su di esso.
L'uso del foreach in Java rende il codice più leggibile e meno soggetto a errori rispetto ai tradizionali cicli for o while quando si lavora con collezioni di dati.
Ciclo while in Java
Il ciclo ‘while’ esegue un blocco di codice finché una certa condizione è vera. È utile quando non sappiamo quante volte il ciclo dovrà essere eseguito.
int j = 0;
while (j < 10) {
System.out.println("Il valore di j è: " + j);
j++;
}
In questo esempio, il ciclo continuerà finché ‘j’ è minore di 10, incrementando ‘j’ di 1 ad ogni iterazione.
Ciclo do-while in Java
Il ciclo ‘do-while’ in Java è simile al ciclo ‘while’, ma esegue il blocco di codice almeno una volta prima di controllare la condizione.
int k = 0;
do {
System.out.println("Il valore di k è: " + k);
k++;
} while (k < 10);
Anche qui, il ciclo continuerà finché ‘k’ è minore di 10, ma a differenza del ciclo ‘while’, il blocco di codice verrà eseguito almeno una volta anche se la condizione iniziale non è verificata.
Esercizio con cicli Java
Scrivere un programma in Java che stampi i numeri pari tra 0 e 20.
public class NumeriPari {
public static void main(String[] args) {
// Utilizziamo un ciclo for per iterare attraverso i numeri da 0 a 20
for (int i = 0; i <= 20; i++) {
// Usiamo l'operatore modulo (%) per verificare se un numero è pari
if (i % 2 == 0) {
System.out.println(i); // Stampa il numero se è pari
}
}
}
}
Nel primo pezzo di codice, incontriamo un ciclo ‘for’ che ci permette di esaminare tutti i numeri da 0 a 20, uno per volta. Questa parte del codice è responsabile di generare i numeri che verranno poi valutati per determinare se sono pari o dispari. Il segmento di codice subito dopo, che contiene l'istruzione ‘if’, si occupa di effettuare questo controllo. Utilizza l'operatore modulo (‘%’) per verificare se il numero corrente è pari o dispari, controllando se il resto della divisione del numero per 2 è zero o no. In caso affermativo, il numero è identificato come pari e viene stampato su console.