I cicli while sono utili per le situazioni dove voi volete compiere
un'azione fintantoché una condizione rimane true ma si adattano meno per
compiere un'azione un determinato numero di volte. Per esempio in un
precedente esercizio, quando volevamo muoverci passiTotali
volte indietro, abbiamo dovuto creare una nuova variabile, iniziallizarla e
muoverci indietro finché l'incremento di questa variabile non l'avrebbe resa
uguale a passiTotali
.
In situazioni simili i cicli for
diventano utili. La loro
sintassi è la seguente:
[!java|c]for (inizializzazione; condizione; incremento) { azione(); }[/!][!python]for variabile in sequenza di valori: azione()[/!][!scala] for (variabile <- primoValore to ultimoValore) { azione(); }[/!]
Per esempio per ripente il contenuto del ciclo n
volte[!python]
è utile usare l'istruzione range(n)
per generare una sequenza
di n valori interi da 0 fino ad n-1.[/!][!java|scala|c] dovreste
scrivere:[/!]
[!java]for (int stepper=0; stepper<n; stepper++) { action(); }[/!][!c]int stepper; for (stepper=0; stepper<n; stepper++) { action(); }[/!][!python]for stepper in range(n): action()[/!][!scala] for (stepper <- 1 to n) { action(); }[/!]
This code is then equivalent to the following one from the computer point of view. From the programmer point of view, one form or the other can make the source code easier to read, depending on the situation. You should chose wisely in each situation whether you want to use a for loop or a while loop. Your uttermost goal should remain to keep your code simple and easy to read, to ensure that your day remain pleasant and productive.
[!java|c]int stepper = 0; while (stepper < n) { action(); stepper++; }[/!][!python]stepper=0 while stepper < n: action() stepper = stepper + 1[/!][!scala] var stepper = 1 while (stepper <= n) { action() stepper = stepper + 1 }[/!]
In that case, the for
loop is easier to read, don't you think?
È possibile costruire cicli for più avanzati dato che qualsiasi istruzione valida può essere usata come inizializzazione, condizione ed incremento. Il seguente esempio è un po' estremo e mostra come non serva il contenuto di un ciclo per muovere i buggle in avanti fino ad arrivare al muro, ma funziona bene: tutto il lavoro viene svolto nelle istruzioni della condizione e dell'incremento.
for (; !isFacingWall() ; forward()) { /* niente nel contenuto del ciclo */ } /* ora i buggle fronteggiano il muro */[/!] [!scala]
se volete annidare diversi cicli in Scala potete farlo su una sola riga. Questo significa che i due seguenti spezzoni di codice sono equivalenti:
for (stepper1 <- 1 to n) { for (stepper2 <- 1 to m) { azioni() } }
for (stepper1 <- 1 to n; stepper2 <- 1 to m) { // Separare semplicemente le condizioni di entrambi i loop con un punto e virgola
azioni()
}
[/!]
Ora dovete rifare lo stesso vecchio esercizio (muoversi avanti fino a
sormontare un baggle, prenderlo, ritornare indietro alla posizione iniziale,
posare il baggle) ma usando un ciclo for
invece che un ciclo
while
per tornare indietro alla posizione iniziale.
Quando avrete finito potrete procedere al prossimo esercizio.