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>");
    }
}