Nella descrizione di un algoritmo può capitare che alcune operazioni debbano essere eseguite più di una volta, cioè ripetute in modo identico.

Se dobbiamo effettuare il conto alla rovescia da 10 a 1, dobbiamo ripetere per 10 volte l'operazione "sottrai 1", mentre se dobbiamo riempire d'acqua una vasca da bagno utilizzando un bicchiere è necessario versare ripetutamente il contenuto del bicchiere finché la vasca non risulti piena.

La ripetizione di un insieme di istruzioni prende il nome di iterazione o ciclo (in inglese, loop); con questa istruzione indichiamo al calcolatore di ripetere un gruppo di istruzioni:

  • un numero di volte ben determinato, come nel primo esempio;
  • finché non si verifica una situazione, come nel secondo esempio.

Il gruppo di istruzioni ripetute prende il nome di corpo del ciclo. L'istruzione di iterazione viene classificata proprio per la caratteristica di conoscere o meno a priori il numero di ripetizioni (del corpo del ciclo) che deve effettuare:

  • quando il numero di ripetizioni è noto a priori, cioè sai quante volte le istruzioni devono essere ripetute, il ciclo prende il nome di iterazione definita;
  • quando invece il ciclo viene ripetuto un numero di volte sconosciuto a priori e termina quando si verifica una particolare condizione, l'iterazione si dice indefinita.

Vediamo alcuni esempi dei due diversi tipi di istruzione di iterazione.

 

ITERAZIONI DEFINITE ITERAZIONI INDEFINITE 
Fai 10 giorni di ferie Mescola la pasta finché è cotta
Leggi 20 pagine Innaffia le piante finché basta
Per 10 volte scrivi "devo studiare di più" Mangia finché sei sazio
Attacca 30 figurine sull'album Mentre piove fatti una dormita
Invia 100 sms alla zia Mentre non sei stanco, studia
Imbianca con 3 mani la parete Finché c'è vita c'è speranza
Tra 210 giorni è finita la scuola Mentre il serbatoio non è pieno metti benzina
Per 210 giorni devi andare a scuola Dormi finché hai sonno

Osservando attentamente i due gruppi di istruzioni possiamo affermare che nelle iterazioni definite è sempre presente un numero, cioè viene sempre indicato chiaramente quante volte deve essere eseguita un'operazione, mentre in quelle indefinite non si sa a priori per quante volte questa debba essere ripetuta.

Codifichiamo l'iterazione

Lo schema generale di un'istruzione iterativa è riportato nelle figure seguenti, dove possiamo osservare come il percorso di un ramo formi un "anello" con l'istruzione di test.

 

 

 

 

Il test controlla se deve essere ripetuto il blocco di istruzioni, oppure se la ripetizione del ciclo termina e quindi si deve "uscire" dalla parte di destra dove prosegue il programma.

Possiamo osservare che gli schemi sono identici, cambia solamente il tipo di test:

  • nel primo caso il controllo viene fatto sul valore del contatore che contiene il numero di volte che il ciclo è stato eseguito confrontandolo con il valore totale predefinito;
  • nel secondo caso come test che ci "fa entrare in loop" abbiamo una qualunque condizione logica.

 

Iterazione indefinita

Esistono due diverse istruzioni di iterazione indefinita iniziamo con quella che prende il nome di iterazione precondizionata detta anche "ciclo a condizione iniziale" o "a controllo di testa".

In tutti e tre i nomi sopra riportati possiamo sottolineare come venga indicato il momento in cui viene fatto il test, cioè quando viene eseguito il controllo che permette di stabilire se bisogna entrare nel ramo di sinistra ed eseguire (o ripetere) le istruzioni del ciclo oppure si esce dal ramo di destra e si prosegue con il resto del programma.

I programmatori la chiamano "ciclo while" facendo riferimento alla parola riservata con la quale viene codificata.

Con un pulsante e un LED, si progetti un sistema in cui:

  • con il pulsante rilasciato il LED è OFF;
  • con il pulsante premuto il LED lampeggia alla frequenza di 2 Hz (ON per 0,25 s e OFF per 0,25 s).

Soluzione

il codice dello sketch


bool puls; 
const int pinPuls=7;
const int pinLed=13;

void setup()
{
pinMode(pinPuls, INPUT_PULLUP);
pinMode(pinLed, OUTPUT); 
}

void loop()
{

digitalWrite(pinLed, LOW);
puls = digitalRead(pinPuls);

while(puls==0)

digitalWrite(pinLed, HIGH);
delay(250);
digitalWrite(pinLed, LOW); 
delay(250); 
puls = digitalRead(pinPuls);s
}
}

 

Nello sketch puoi notare che:

è utilizzata l'istruzione WHILE che ha la seguente sintassi:

while(espressione) {

// blocco di istruzioni

}

dove il blocco di istruzioni viene ripetuto finché espressione (booleana) è VERA; appena diventa FALSA, il programma procede con le istruzioni dopo la graffa di chiusura del while.
L'espressione viene testata prima dell'esecuzione del blocco di istruzioni.

È  fondamentale che nel blocco di istruzioni del while sia prevista la possibilità di uscita dal ciclo: in questo caso l'ultima istruzione del blocco:

puls - digitalRead(pinPuls)

effettua la lettura del pin del pulsante (pinPuls) e aggiorna la variabile puls, in modo che, se il pulsante viene rilasciato, al prossimo test l'espressione del while risulta FALSA e si esce dal ciclo.

Esiste anche l'istruzione DO...WHILE, la cui sintassi

do
{

// blocco di istruzioni } while (espressione);

è analoga a quella del WHILE, ma l'espressione è testata dopo aver eseguito il blocco di istruzioni, quindi il blocco viene eseguito almeno una volta.