In questo articolo dedicata a Java, vedremo i costrutti iterativi For e While.
Il problema che ci permettono di risolvere questi costrutti, è molto semplice: prova ad eseguire questo esercizio per capirlo:
Esercizio Guidato
[blockquote]Crea un metodo che, preso in input un numero, stampi a video tutti i numeri compresi fra 0 e quel numero (sia se è negativo, sia se è positivo).[/blockquote]
Come fare?
Nella precedente lezione, abbiamo visto i costrutti condizionali: se avessimo solo quelli, potremmo usare uno switch (come abbiamo visto nella lezione) e fare una cosa di questo tipo:
switch(risultato) { case 1: System.out.print(1); break; case 2: System.out.print(1); System.out.print(2); break; case 3: System.out.print(1); System.out.print(2); System.out.print(3); break; ................... default: System.out.print(0); break; }
Si vede subito che:
Non è un modo facile: dobbiamo prevedere tutti i numeri che potrebbe inserire l’utente
Non è corto: potenzialmente dovremmo riempire tutta la memoria del computer e ancora non ci basterebbe
In sostanza: non è fattibile.
Per farlo quindi, ci vengono in aiuto i costrutti for e while che in sostanza permettono entrambe di contare quante volte eseguire un’azione, solo che lo fanno in modo leggermente diverso.
Cominciamo col risolvere questo problema vedendo il For:
For
For (per -inteso come per quante volte) è un costrutto iterativo, formato da:
- un valore iniziale, di solito si usa int i = 0
- una condizione da verificare, ovvero quando dobbiamo interrompere l’esecuzione del for
- una azione da effettuare dopo ogni iterazione.
Poi il for ha un blocco di istruzioni compreso fra parentesi graffe, che verrà eseguito ad ogni iterazione. Vediamo un esempio che chiarificherà subito le idee:
for(int i = 0; i < 100; i++) { System.out.print(i); }
Ecco quello che succede: viene inizializzata la variabile i con 0. Dopo di che, verifica che i sia minore di 100. Ovviamente, al primo “giro” i è 0 quindi la condizione è verificata.
Comincerà quindi ad eseguire le istruzioni contenute nel blocco (in questo caso, la stampa a video del valore di i).
Finite tutte le istruzioni, con i++ (che è come dire i= i+1 oppure ancora i+=1) incrementiamo il valore di i da zero, a uno.
Continuerà così finchè i è minore di 100: quindi, in sostanza, stamperà tutti i numeri compresi fra 0 e 99 (100 non è minore di 100!).
Cominciamo quindi a realizzare una parte del nostro metodo:
public class Prova { public void conta(int intero) { if (intero > 0) { for (int i = 0; i <= intero; i++) { System.out.print(i + ", "); } } } }
Nota: come tipo di ritorno per il metodo, abbiamo messo void in quanto non ritorna nessun tipo di oggetto
In questo modo, verifichiamo se intero è maggiore di zero, se lo è facciamo partire il conteggio da zero fino a 100. Per realizzare la conta al ” contrario”, vediamo il while.
While
While( mentre) è un costrutto iterativo simile al for, che è però formato solamente da una condizione che deve essere verificata perchè il ciclo venga eseguito.
Ovvero:
int i = 0; while(i < 100) { System.out.println(i); i++; }
Questo è praticamente lo stesso esempio che abbiamo visto per il for: il while stamperà il valore di i finchè è minore di 100.
Una cosa da notare però, è che siamo noi a dover “modificare” lo stato di i: se non lo facessimo si genererebbe un while infinito.
Vediamo quindi come concludere l’esercizio facendo la conta al contrario:
public class Prova { public void conta(int intero) { if (intero > 0) { for (int i = 0; i <= intero; i++) { System.out.print(i + ", "); } } else { while(intero <= 0) { System.out.println(intero); intero++; } } } }
Come esercizio, prova a rifarlo utilizzando solo o il for o solo il while (posta la tua versione nei commenti no-pastandola su un sito di nopaste :))
Break e continue
Due istruzioni utili sono break e continue: queste ci permettono rispettivamente di interrompere un ciclo, e di saltare un’iterazione.
Ecco un piccolo esercizio per chiare il tutto:
Esercizio
[blockquote]Creare un metodo che, presi in input un intero n e una stringa contenente lettere e numeri, stampi le prime n lettere (ma non i numeri). Realizzarlo sapendo che stringa.charAt(i) ci permette di avere l’ i-esimo carattere e Character.isAlphabetic(c) ritorna true se c è un carattere che fa parte dell’alfabeto.[/blockquote]
[toggle title=”Soluzione”]
public class Prova { public void stampaLettere(int intero, String testo) { int conteggio = 0; for (int i = 0; i < testo.length(); i++) { char c = testo.charAt(i); if(!Character.isAlphabetic(c)) continue; System.out.print(c); conteggio++; if(conteggio == intero) break; } } }
[/toggle]