Luigi Arlotta
a- a+

Ciclo For

Un'altra istruzione utile per il controllo del flusso delprogramma è l'istruzione for. Questa cipermette di richiedere più volte l'esecuzione diuna o più istruzioni fin quando una particolarecondizione, detta condizione di uscita (o dicontrollo) del ciclo, risulta vera. La sintassi Java delcostrutto è la seguente:

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

dove v è la variabile di controllo delciclo. v viene inizializzata sul valorestartValue prima dell'inizio del ciclo.Condizione_su_v è la condizione di controllodel ciclo. Il ciclo termina quando Condizione_su_vrestituisce il valore false (cioè quando lacondizione su v non è più verificata, quindifalsa). Il primo controllo sulla condizione viene effettuatoall'ingresso nel ciclo, prima della prima iterazione,è quindi possibile che le istruzioni appartenenti aCorpoDelCiclo non vengano mai eseguite. Ciòavviene quando condizione_su_v restituisceimmediatamente il valore false. Istruzione_su_vè un'istruzione che modifica il valore dellavariabile di controllo v. Tale istruzione generalmentefa si che v tenda ad un valore che rende falsacondizione_su_v dopo un certo numero di iterazioni. Secosì non fosse il rischio sarebbe quello di mandare ilprocesso in loop, cioè creare un cicloinfinito, senza uscita.

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

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


Il primo esempio stampa semplicemente i numeri da uno adieci.

La variabile di controllo del ciclo, in questo caso, èk. k viene dichiarata di tipo intero edinizializzata all'inizio del ciclo sul valore 0. Lacondizione di controllo sul ciclo risulta vera fin quando kè minore di 10. L'istruzione su k consiste nel suoincremento ad ogni iterazione. Il corpo del ciclo ècostituito da un'istruzione di stampa. Alla primaiterazione k è stata appena inizializzata equindi contiene il valore 0. L'output della primaiterazione sarà (k+1), cioè 1. Nellaseconda iterazione, k ha assunto valore 1, quindil'output dell'istruzione di stampa contenuta corpodel ciclo sarà 2. Il ciclo si ripete fin quandok non assume valore 10. A questo punto la condizionedi controllo (k<10) risulta falsa ed il ciclotermina. Complessivamente l'output del programmasarà:


1
2
3
4
5
6
7
8
9
10

Se avessimo voluto scrivere gli stessi numeri su una singolariga avremmo potuto far uso del metodo print() invecedi println() che differisce da quest'ultimo per ilsemplice fatto che dopo aver scritto il parametro indicatonon 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 cicloha lo scopo di posizionare correttamente le virgole perseparare i numeri visualizzati. Al termine del ciclo vieneinserito un punto e viene terminata la riga con un ritorno acapo.

Avevamo accennato alla possibilità di scrivere unciclo le cui istruzioni non sarebbero mai state eseguite. Unesempio 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 questociclo non verrà mai eseguita in quanto la condizionesulla variabile di controllo è stata sostituita da unvalore costante paria a false. I campi diinizializzazione e incremento della variabile di controllo inquesto caso sono ininfluenti, tanto che sarebbe statoequivalente 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 ilvalore false. Ovviamente non ha molto senso scrivereun ciclo for come quello appena descritto, egeneralmente viene segnalato in fase di compilazione con unmessaggio del tipo "Statement notreached".
In maniera del tutto analoga è possibile definire unciclo infinito, ovvero un ciclo che manda il processoin 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 unciclo infinito. A differenza dei cicli che non vengono maieseguiti a volte si fa uso dei cicli infiniti, per ilsemplice motivo che in realtà... non sono infiniti!Esiste infatti la possibilità di interromperel'esecuzione di un ciclo dall'interno inserendo uncomando nel corpo del ciclo. Osservate l'esempio diseguito il cui output è analogo a quello di uno degliesempi 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 è presentel'istruzione break, il cui scopo è quellodi interrompere l'esecuzione del un ciclo. Taleistruzione combinata con l'istruzione if... fa siche il ciclo termini quando la variabile k raggiungeil valore 10. Certamente quest'ultimo è un modo unpo' contorto di impostare un ciclo, tuttavia a volte siai cicli infiniti che le istruzioni break possonorisultare molto utili. Quest'ultima in particolare vieneutilizzata quando al seguito del verificarsi di una certacondizione all'interno del corpo del ciclo, non hapiù senso proseguire nelle iterazioni.

Un'altra istruzione che può essere utilizzataall'interno del corpo di un ciclo èl'istruzione continue. continue sospendel'iterazione corrente passando immediatamente allasuccessiva. 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 adieci su una riga separati da virgole. L'unica differenzaè la riga

if (k==4) continue;

il cui effetto è quello di sospendere la quinta (inquanto k parte da 0) iterazione del ciclo passandoimmediatamente alla sesta. L'output del programmarisulta:


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

Come avrete osservato manca il numero 5 che sarebbe dovutoessere stampato dalla quinta iterazione che invece èstata saltata per effetto dell'istruzionecontinue.

Spesso risulta utile far uso di quelli che vengono definiticicli annidati, cioè di cicli inseritiall'interno del corpo di un altro ciclo. L'esempioriportato di seguito, ad esempio, fa uso di un ciclo forannidato 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 ilsecondo ciclo. Nel nostro esempio quindi per ogni iterazionedel primo ciclo vengono eseguite tutte e dieci le iterazionidel secondo. Ogni esecuzione completa del secondo ciclocomporta la compilazione di una riga dell'output.



Ti potrebbe interessare anche

commenta la notizia