23 – ciclo for
Quando si tratta di codificare un ciclo enumerativo, c’è un campione che non ha rivali : il ciclo for
for(let contatore=1; contatore<=10; contatore++) { document.write(contatore + "<br />"); }
Già confrontandolo col while si capisce che il for è più snello e compatto
let conta=1; while (conta<=10) { document.write(conta + "<br />"); conta++; }
Potrei commettere errori nel while, tipo dimenticarmi l’inizializzazione del contatore, l’incremento. Nel for ciò non avviene, in quanto inizializzazione, condizione e incremento sono nella stessa riga, separate dal punto e virgola
(let contatore=1; contatore<=10; contatore++)
Al primo ingresso, il programma inizializza in contatore (let contatore=1), verifica la condizione (contatore<=10) e prosegue nel codice document.write(contatore + “<br />”). Solo al secondo passaggio viene eseguito anche l’incremento, al primo passaggio non viene eseguito.
Vediamo un particolare valido per tutti i cicli, anche se in questa istanza lo esemplifichiamo per il ciclo for
var y=0, z=0; for(var x=1; x<=10; x++) { //calcoli //... if(x>20) { //... if (y<100) { if(x+y<0) { continue; } //.. if (z!=x+y) { //dobbiamo interrompere il ciclo break; } } else { //... } } }
Quando si è in presenza di cicli complessi, con livelli annidati e cicli interni, potremmo aver l’esigenza di dover interrompere il ciclo, ci viene in aiuto l’istruzione break
if (z!=x+y) { //dobbiamo interrompere il ciclo break; }
Quando eseguita fa uscire dal ciclo ed il flusso continuerebbe dalla prima riga che sussegue il ciclo stesso senza nessuna ripetizione .
if(x+y<0) { continue; }
In questo caso si interrompe l’iterazione del ciclo e tutte le istruzioni successive all’interno del ciclo non sarebbero eseguite, ma, con continue , il flusso riprende dall’inizio del ciclo, ripetendolo (fino a quando non è soddisfatta la condizione).
Vediamo cosa succede con 2 cicli annidati e il break è in quello più interno
for (var i=0; i<10; i++) { document.write("ciclo esterno" + "<br>"); for(var j=0; j<4; j++) { if (j%2==0) break; document.write("ciclo interno" + "<br>"); } }
il break vale solo sul ciclo interno, per cui il messaggio ciclo interno non verrà mai stimato, mentre ciclo esterno verrà stampato 10 volte.
Mettendo invece la condizione (j%2=1) ricordo che % è il resto, quindi il resto della divisione di j / 2 è uguale a 1
for (var i=0; i<10; i++) { document.write("ciclo esterno" + "<br>"); for(var j=0; j<4; j++) { if (j%2==1) break; document.write("ciclo interno" + "<br>"); } }
il resto sarà = 1, una volta quindi l’istruzione sarà stampata ad ogni ripetizione del ciclo esterno (quindi 10 volte). Se lo sostituiamo col continue avremo una stampa del ciclo esterno e 2 stampe del ciclo interno.
for (var i=0; i<10; i++) { document.write("ciclo esterno" + "<br>"); for(var j=0; j<4; j++) { if (j%2==1) break; document.write("ciclo interno" + "<br>"); } }
Una domanda che può nascere è : esiste un modo per uscire da tutti i cicli? La risposta è si e lo si può fare mettendo un’etichetta al ciclo più esterno
ciclo_esterno: for (var i=0; i<10; i++) { document.write("ciclo esterno" + "<br>"); for(var j=0; j<4; j++) { if (j%2==1) break ciclo_esterno ; document.write("<h1>" + "ciclo interno" + "</h1>" + "<br>"); } }