Luigi Arlotta
a- a+

Ciclo For

Un'altra istruzione utile per il controllo del flusso del programma è l'istruzione for. Questa ci permette di richiedere più volte l'esecuzione di una o più istruzioni fin quando una particolare condizione, detta condizione di uscita (o di controllo) del ciclo, risulta vera. La sintassi Java del costrutto è la seguente:

for (v=startValue; condizione_su_v; istruzione_su_v)
{
CorpoDelCiclo; }

dove v è la variabile di controllo del ciclo. v viene inizializzata sul valore startValue prima dell'inizio del ciclo. Condizione_su_v è la condizione di controllo del ciclo. Il ciclo termina quando Condizione_su_v restituisce il valore false (cioè quando la condizione su v non è più verificata, quindi falsa). Il primo controllo sulla condizione viene effettuato all'ingresso nel ciclo, prima della prima iterazione, è quindi possibile che le istruzioni appartenenti a CorpoDelCiclo non vengano mai eseguite. Ciò avviene quando condizione_su_v restituisce immediatamente il valore false. Istruzione_su_v è un'istruzione che modifica il valore della variabile di controllo v. Tale istruzione generalmente fa si che v tenda ad un valore che rende falsa condizione_su_v dopo un certo numero di iterazioni. Se così non fosse il rischio sarebbe quello di mandare il processo in loop, cioè creare un ciclo infinito, senza uscita.

Di seguito sono riportati alcuni esempi cui viene utilizzata l'istruzione for.

int k;


for (k=0;k<10;k++)
System.out.println (k+1); 


Il primo esempio stampa semplicemente i numeri da uno a dieci.

La variabile di controllo del ciclo, in questo caso, è k. k viene dichiarata di tipo intero ed inizializzata all'inizio del ciclo sul valore 0. La condizione di controllo sul ciclo risulta vera fin quando k è minore di 10. L'istruzione su k consiste nel suo incremento ad ogni iterazione. Il corpo del ciclo è costituito da un'istruzione di stampa. Alla prima iterazione k è stata appena inizializzata e quindi contiene il valore 0. L'output della prima iterazione sarà (k+1), cioè 1. Nella seconda iterazione, k ha assunto valore 1, quindi l'output dell'istruzione di stampa contenuta corpo del ciclo sarà 2. Il ciclo si ripete fin quando k non assume valore 10. A questo punto la condizione di controllo (k<10) risulta falsa ed il ciclo termina. Complessivamente l'output del programma sarà:


1
2
3
4
5
6
7
8
9
10

Se avessimo voluto scrivere gli stessi numeri su una singola riga avremmo potuto far uso del metodo print() invece di println() che differisce da quest'ultimo per il semplice fatto che dopo aver scritto il parametro indicato non ritorna a capo. Il codice sarebbe stato:

int k;
for (k=0;k<10;k++) {
System.out.print (k+1);


if (k<9) System.out.print(" , "); }
System.out.println(".");

Il cui output è:


1, 2, 3, 4, 5, 6, 7, 8, 9, 10.

L'istruzione if... contenuta nel corpo del ciclo ha lo scopo di posizionare correttamente le virgole per separare i numeri visualizzati. Al termine del ciclo viene inserito un punto e viene terminata la riga con un ritorno a capo.

Avevamo accennato alla possibilità di scrivere un ciclo le cui istruzioni non sarebbero mai state eseguite. Un esempio di ciclo di questo genere è il seguente:

int k;
for (k=0;false;k++)
System.out.println("Questa istruzione non verrà mai eseguita");

L'istruzione di stampa contenuta nel corpo di questo ciclo non verrà mai eseguita in quanto la condizione sulla variabile di controllo è stata sostituita da un valore costante paria a false. I campi di inizializzazione e incremento della variabile di controllo in questo caso sono ininfluenti, tanto che sarebbe stato equivalente ometterli come mostrato di seguito.

int k;
for (;false;)
System.out.println("Questa istruzione non verrà mai eseguita");

Non possono essere invece omessi caratteri punto e virgola (;) che indicano all'interprete Java a quale campo (inizializzazione, controllo o incremento) si riferisce il valore false. Ovviamente non ha molto senso scrivere un ciclo for come quello appena descritto, e generalmente viene segnalato in fase di compilazione con un messaggio del tipo "Statement not reached".
In maniera del tutto analoga è possibile definire un ciclo infinito, ovvero un ciclo che manda il processo in loop. Osservate il codice che segue:

for (;true;)
System.out.println("Questo ciclo manda il processo in loop!");

Che per convenzione viene spesso utilizzato con la seguente sintassi:


for (;;)
System.out.println("Questo ciclo manda il processo in loop!");

ovvero un ciclo for in cui mancano tutti e tre i campi (inizializzazione, controllo, incremento) costituisce un ciclo infinito. A differenza dei cicli che non vengono mai eseguiti a volte si fa uso dei cicli infiniti, per il semplice motivo che in realtà... non sono infiniti! Esiste infatti la possibilità di interrompere l'esecuzione di un ciclo dall'interno inserendo un comando nel corpo del ciclo. Osservate l'esempio di seguito il cui output è analogo a quello di uno degli esempi presentati in precedenza:

int k=0;
for (;;) {
if (k==10) break;


System.out.print (k+1);
if (k<9) System.out.print(" , ");
k++; }
System.out.println(".");

fornisce l'output:


1, 2, 3, 4, 5, 6, 7, 8, 9, 10.

Nel corpo del ciclo infatti è presente l'istruzione break, il cui scopo è quello di interrompere l'esecuzione del un ciclo. Tale istruzione combinata con l'istruzione if... fa si che il ciclo termini quando la variabile k raggiunge il valore 10. Certamente quest'ultimo è un modo un po' contorto di impostare un ciclo, tuttavia a volte sia i cicli infiniti che le istruzioni break possono risultare molto utili. Quest'ultima in particolare viene utilizzata quando al seguito del verificarsi di una certa condizione all'interno del corpo del ciclo, non ha più senso proseguire nelle iterazioni.

Un'altra istruzione che può essere utilizzata all'interno del corpo di un ciclo è l'istruzione continue. continue sospende l'iterazione corrente passando immediatamente alla successiva. Osservate questo esempio:

int k;
for (k=0;k<10;k++) {
if (k==4) continue;


System.out.print (k+1);
if (k<9) System.out.print(" , "); }
System.out.println(".");

Si tratta del solito codice che scrive i numeri da uno a dieci su una riga separati da virgole. L'unica differenza è la riga

if (k==4) continue;

il cui effetto è quello di sospendere la quinta (in quanto k parte da 0) iterazione del ciclo passando immediatamente alla sesta. L'output del programma risulta:


1,2,3,4,6,7,8,9,10.

Come avrete osservato manca il numero 5 che sarebbe dovuto essere stampato dalla quinta iterazione che invece è stata saltata per effetto dell'istruzione continue.

Spesso risulta utile far uso di quelli che vengono definiti cicli annidati, cioè di cicli inseriti all'interno del corpo di un altro ciclo. L'esempio riportato di seguito, ad esempio, fa uso di un ciclo for annidato per generare una tavola pitagorica.

int k;
int j;
for (k=1;k<10;k++) {
for (j=1;j<=10;j++) {
System.out.print(j*k);


System.out.print (" "); }
System.out.println(); }

 

L'output del programma sarà:

1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 10 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90

Per ogni iterazione del primo ciclo, viene eseguito tutto il secondo ciclo. Nel nostro esempio quindi per ogni iterazione del primo ciclo vengono eseguite tutte e dieci le iterazioni del secondo. Ogni esecuzione completa del secondo ciclo comporta la compilazione di una riga dell'output.



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Redazione
Condividi le tue opinioni su questo articolo!