Il ciclo While
Il ciclo While è utile per ripetere l'esecuzione di un blocco di codice per un numero variabile di volte. Per determinare se eseguire il blocco di codice si usa una condizione booleana, proprio come fa un If. Il costrutto del ciclo While è il seguente:
- While [CondizioneBooleana]
- ...
- EndWhile
Nel ciclo While suddetto il blocco di codice viene eseguito se la condizione booleana è True. Dopo che il blocco di codice è stato eseguito, il ciclo While rivaluta la condizione e, se è ancora True, riesegue il blocco, e questa ripetizione continua fino a che la condizione diventa False. Quando la condizione è False, il flusso dell'esecuzione prosegue con l'istruzione immediatamente successiva alla relativa istruzione EndWhile.
Per esempio:
- a = 0
- While a <= 10
- a = a + 1
- EndWhile
Nell'esempio il ciclo viene eseguito fino a che la variabile "a" superi il valore 10. La condizione iniziale infatti ritorna True se "a" è minore o uguale a 10.
È responsabilità del programmatore garantire che la condizione booleana prima o poi diventi False. Se ciò non si verifica, il corpo del ciclo tenderà ad essere eseguito un numero infinito di volte. Per prevenire questo pericolo, è stato imposto un limite di circa 250.000 iterazioni, dopodiché il ciclo While scatena un errore. Poiché i cicli infiniti sono uno dei più comuni errori di programmazione, si consiglia sempre di fare molta attenzione quando si costruisce un ciclo While.
Per esempio:
- a = 0
- While a <= 10
- a = a - 1
- EndWhile
Nell'esempio la condizione sarà sempre True, poiché la variabile "a" essendo decrementata nonsupererà mai il valore 10. Pertanto il ciclo tenderà ad essere eseguito un numero infinito di volte. Dopo circa 250.000 iterazioni l'esecuzione terminerà con un errore.
Abbiamo visto il ciclo While classico, in cui la condizione booleana viene espressa ed eseguita all'inizio. La condizione booleana iniziale consente di evitare di eseguire il blocco di codice se non è necessario farlo. Per eseguire almeno una volta il blocco di codice, è disponibile un costrutto While in cui la condizione booleana è posta alla fine.
- While
- ...
- EndWhile [CondizioneBooleana]
A differenza della condizione posta all'inizio, se la condizione booleana alla fine è True il ciclo termina. La parola chiave EndWhile viene utilizzata sempre per delimitare la fine di un ciclo While. Quindi la fine del While (End of While) si verificherà se la condizione sarà True.
Per esempio:
- a = 0
- While
- a = a + 1
- EndWhile a > 10
In questo caso il blocco del ciclo While viene eseguito almeno una volta. L'iterazione del ciclo termina quando la variabile "a" è maggiore di 10.
La condizione booleana può essere posta all'inizio del ciclo While, quindi il blocco di codice viene eseguito se la condizione è True. Oppure la condizione può essere posta alla fine del ciclo, e in questo caso il ciclo termina se la condizione è True. Una caratteristica particolare è quella che la condizione può essere posta contemporaneamente all'inizio e alla fine, ottenendo due controlli condizionali all'inizio e alla fine del ciclo. Questa situazione speciale ha un vero senso se le due condizioni controllano variabili diverse.
Per esempio:
- a = 0
- b = 0
- While a <= 10
- a = a + 1
- b = Random(10)
- EndWhile b >= 5
L'esempio precedente illustra l'uso della doppia condizione. Il blocco While viene eseguito se la variabile "a" è minore o uguale a 10, oppure termina se la variabile "b" è maggiore o uguale a 5. Nella variabile "b" ad ogni iterazione viene assegnato un valore casuale che può andare da 0 a 9.
Il corpo di un ciclo While può contenere un altro ciclo: in tal caso si parla di cicli annidati.
Per esempio:
- a = 0
- While a <= 10
- b = Random(10)
- While b < 5
- // Fai qualcosa
- EndWhile
- a = a + 1
- EndWhile
Il ciclo secondario viene eseguito solo se la variabile "b" è minore di 5. Nella variabile "b" ad ogni iterazione del ciclo primario viene assegnato un valore casuale da 0 a 9.
L'iterazione di un ciclo While può essere interrotta utilizzando l'istruzione Break. Quando si incontra l'istruzione Break l'esecuzione passa a eseguire l'istruzione subito dopo il corpo del ciclo.
Per esempio:
- a = 0
- While a <= 10
- b = Random(10)
- If b = 5
- Break
- EndIf
- a = a + 1
- EndWhile
Nell'esempio precedente se la variabile "b" sarà uguale a 5 il ciclo terminerà, altrimenti continuerà con tutte le iterazioni. L'istruzione Break solitamente non dovrebbe essere utilizzata, avendo strumenti più idonei per scrivere un ciclo. Tuttavia, in caso di necessità, se ne può tollerare l'uso.
L'istruzione Continue ha un effetto simile al Break sull'esecuzione del ciclo. Esso viene interrotto ma, diversamente dal Break, l'esecuzione ritorna all'inizio o alla fine (a seconda di dov'è la condizione booleana) e se necessario il corpo del ciclo viene rieseguito.
Per esempio:
- a = 0
- While a <= 10
- b = Random(10)
- If b = 5
- Continue
- EndIf
- a = a + 1
- EndWhile
Nell'esempio precedente se la variabile "b" è uguale a 5 il ciclo viene rieseguito, pertanto la variabile "a" non viene incrementata. Invece, nell'esempio successivo, la condizione di controllo è posta alla fine, quindi l'istruzione Continue fa saltare l'esecuzione alla fine del ciclo.
- a = 0
- While
- b = Random(10)
- If b = 5
- Continue
- EndIf
- a = a + 1
- EndWhile a > 10
Se il ciclo While ha una doppia condizione di controllo, l'istruzione Continue farà saltare l'esecuzione sempre alla condizione di inizio. Così come l'istruzione Break, Continue può essere sostituita da istruzioni più performanti che rendano il codice più leggibile.