Argomenti trattati: il ciclo do... while.
Prima di trattare nei dettagli il ciclo do... while è opportuno soffermarci su un altro criterio con cui è possibile classificare le strutture iterative. Oltre a quella già esaminata riguardante il tipo di controllo che un ciclo è capace di effettuare per regolare la propria esecuzione, i cicli possono anche essere a entrata controllata e a uscita controllata. Tale classificazione si basa su quando un ciclo effettua il controllo della propria condizione di fine, se prima o dopo aver eseguito delle istruzioni. Sia il ciclo for che quello while sono a entrata controllata il che significa, in poche parole, che se la condizione di fine dovesse rivelarsi subito falsa il ciclo non compirebbe neanche un'iterazione. Semplicemente, tutte le istruzioni in esso contenute verrebbero "saltate" e il flusso del programma continuerebbe oltre. Il ciclo do... while, invece, è l'unica struttura iterativa di JavaScript ad essere a uscita controllata. Da ciò ne consegue che, anche se la condizione di fine ciclo dovesse rivelarsi falsa fin dall'inizio, comunque le istruzioni presenti all'interno di esso verrebbero eseguite una volta perché il controllo della condizione avverrebbe solo dopo averle eseguite. A parte questa particolarità, il funzionamento di do... while è identico a quello di while; anch'esso accetta come condizione di fine il risultato di una qualunque espressione logica, rientrando pertanto nella categoria dei cicli condizionati, e continua l'esecuzione delle istruzioni fino a quando la condizione rimane vera. La sintassi di do... while, leggermente diversa da quella degli altri due cicli, è la seguente:
do {
istruzioni;
} while(condizione);
La particolarità sintattica piú evidente di do... while è che la parentesi graffa di chiusura non termina la sintassi del ciclo, che dopo di essa prevede la parola chiave while, seguita dalle parentesi tonde che racchiudono la condizione, e dal punto e virgola. Come si può notare, la condizione viene scritta per ultima e verrà dunque valutata dopo aver eseguito una prima volta le istruzioni racchiuse tra le due parentesi graffe. Per comprendere meglio la differenza concettuale tra do... while e while si osservi il seguente esempio, realizzato sia nell'uno che nell'altro costrutto.
<html>
<title>Il ciclo do... while</title>
<head>
<script language="JavaScript">
<!--
var cont=10;
alert('Prima del ciclo cont vale: ' + cont);
do {
cont++;
} while(cont<10);
alert('Alla fine del ciclo cont vale: ' + cont);
-->
</script>
</head>
// Il listato d'esempio mostra un errato utilizzo del ciclo do... while, errato solamente dal punto di vista logico. Poiché, come detto, la condizione di fine viene valutata solo dopo avere eseguito una prima volta le istruzioni, è necessario sincerarsi che all'inizio del ciclo do... while tale condizione non sia già soddisfatta. Se cosí fosse, il programma andrebbe ad eseguire inutilmente delle istruzioni che potrebbero anche comprometterne il buon funzionamento. Nel caso dell'esempio, la variabile cont viene impostata a 10 prima del ciclo; il ciclo è strutturato in modo tale da incrementare il valore di cont fino a che questo è minore di 10. Ma avvenendo il controllo solo alla fine, la variabile viene ugualmente incrementata di una unità e alla fine del ciclo avrà il valore di 11. Appare chiaro come l'utilizzo di do... while in un caso come questo sia del tutto errato concettualmente.
Per provare questo codice cliccare il pulsante qui sotto.
Il listato che segue mostra invece lo stesso codice scritto con while.
<html>
<title>Il ciclo do... while</title>
<head>
<script language="JavaScript">
<!--
var cont=10;
alert('Prima del ciclo cont vale: ' + cont);
while(cont<10) {
cont++;
}
alert('Alla fine del ciclo cont vale: ' + cont);
-->
</script>
</head>
// In questo caso la variabile cont non subisce alcun incremento perché il controllo sulla condizione di fine ciclo avviene prima di eseguire le istruzioni. Dunque il flusso del programma non entra neanche nel ciclo perché la condizione si presenta subito come falsa e il programma continua l'esecuzione del codice dopo il blocco del ciclo. Questo significa che quando si ha la necessità, durante l'esecuzione di un programma, di controllare il valore di una variabile che non si può conoscere a priori, bisogna utilizzare un ciclo a entrata controllata perché, come abbiamo visto, un ciclo come do.. while potrebbe compiere delle operazioni non necessarie e generare degli errori.
Provando il codice d'esempio si avrà la dimostrazione di quanto detto.
I cicli ad uscita controllata sono meno utilizzati degli altri, tuttavia si possono presentare delle occasioni in cui sono senz'altro i piú indicati. Poniamo il caso di dover richiedere delle informazioni all'utente. Se si impostasse il programma in modo da farlo una volta sola, ci si potrebbe ritrovare con dei dati errati. Non è per niente sicuro, infatti, che l'utente digiti tutto correttamente; potrebbero esserci degli errori di battitura o imprecisioni di vario genere. In tali casi, per effettuare un controllo sui dati digitati dall'utente, è quasi obbligato il ricorso a un ciclo a uscita controllata. Un ciclo cosí strutturato può eseguire subito l'istruzione di richiesta informazioni, controllarla una volta che l'utente ha digitato i dati e, nel caso ci sia qualche errore, tornare a chiedere le informazioni all'utente dopo aver visualizzato un messaggio di errore. Il listato che segue mostra un caso del genere:
<html>
<title>Il ciclo do... while</title>
<head>
<script language="JavaScript">
<!--
var dati='';
do {
dati=prompt('Scrivere \'fine\' per uscire dal ciclo','');
if (dati.toLowerCase()!='fine') alert('Non hai digitato \'fine\'');
} while(dati.toLowerCase()!='fine');
-->
</script>
</head>
// Nell'esempio il ciclo do... while è utilizzato per continuare a mostrare una finestra di dialogo all'utente fino a che quest'ultimo non digita la parola "fine". Nel codice d'esempio si fa ricorso a un metodo particolare chiamato toLowerCase che serve per convertire in minuscolo le lettere eventualmente digitate maiuscole. toLowerCase è un metodo dell'oggetto String e verrà trattato nel dettaglio nella parte riguardante gli oggetti. Non ci si deve quindi preoccupare se qualcosa risultasse poco chiaro nel listato presentato. prompt, invece, visualizza una finestra di dialogo in cui è possibile digitare del testo.
Abbiamo visto nel dettaglio i tre cicli principali del linguaggio JavaScript, le loro caratteristiche specifiche e i casi in cui è necessario o consigliabile l'utilizzo di ciascuno piuttosto che degli altri. JavaScript dispone anche di altre due istruzioni di controllo a carattere iterativo: for... in di cui si è già accennato, e with. Di questi si tratterà in seguito, perché entrambi vengono utilizzati con gli oggetti del linguaggio. Prima di concludere la trattazione dei cicli, però, è necessario soffermarci ancora su due importanti istruzioni che vengono usate spesso all'interno di essi: le istruzioni break e continue. È quanto vedremo nel prossimo capitolo sul controllo del flusso di un ciclo.