Arduino – Ciclo “while, do…while, for”
I linguaggi di programmazione forniscono varie strutture di controllo che consentono percorsi di esecuzione più complicati.
Una istruzione loop (ciclo) ci consente di eseguire una dichiarazione o un gruppo di istruzioni più volte e in seguito è la forma generale di un’istruzione loop nella maggior parte dei linguaggi di programmazione
Il linguaggio di programmazione C fornisce i seguenti tipi di loop per gestirne i requisiti.
1. Ciclo ” while “
while andrà in loop (ciclo) continuamente, ed infinitamente, fino a quando l’espressione all’interno delle parentesi, () diventa falsa. Qualcosa deve cambiare la variabile testata, o il ciclo while non uscirà mai.
Sintassi del ciclo ” while ”
while(espressione){ Blocco di dichiarazioni; }
Sequenza di esecuzione
Esempio
/* Definizione della variabile globale */ int Pulsante = 5; int LED = 13; Void setup () { pinMode(Pulsante, INPUT); pinMode(LED, OUTPUT); } Void loop () { while(digitalRead(Pulsante) == HIGH){ digitalWrite(LED,HIGH); delay(1000); digitalWrite(LED,LOW); delay(1000); } }
2. Ciclo ” do…while “
Il ciclo do…while è simile al ciclo while. Nel ciclo while, la condizione di continuazione del ciclo viene testata all’inizio, prima di eseguire il corpo del loop. L’istruzione do … while verifica la condizione di continuazione del ciclo dopo aver eseguito il corpo del loop. Pertanto, il corpo del loop verrà eseguito almeno una volta.
Quando un do…while termina, l’esecuzione continua con la proposizione dopo la clausola while. Non è necessario usare parentesi graffe nella dichiarazione do … while se c’è una sola istruzione nel corpo. Tuttavia, le parentesi graffe sono solitamente incluse per evitare confusione tra le dichiarazioni while e do … while.
Sintassi del ciclo ” do…while ”
do{ Blocco di dichiarazioni; } while(espressione);
Sequenza di esecuzione
Esempio
do { x=readSensor(); // assegna il valore di readSensor() a x delay(50); // pausa di 50 millisecondi } while (x < 100); // cicla fino a quando x < 100
3. Ciclo ” for “
Un ciclo for esegue le istruzioni un numero predeterminato di volte. L’espressione di controllo per il ciclo viene inizializzata, testata e manipolata interamente all’interno delle parentesi del ciclo for. È facile eseguire il debug del comportamento di loop della struttura in quanto è indipendente dall’attività all’interno del ciclo.
Ogni ciclo for ha fino a tre espressioni, che ne determinano l’operazione. L’esempio seguente mostra in generale la sintassi del ciclo. Si noti che le tre espressioni nelle parentesi di argomento ciclo for sono separate da punto e virgola.
Sintassi del ciclo ” for ”
for ( inizializza; controlla; incrementa o decrementa) { // blocco di istruzioni }
Sequenza di esecuzione
Esempio
void setup() { Serial.begin(9600); } void loop() { for (int counter=2;counter<9;counter++) //il blocco di istruzioni verrà eseguito 7 volte { Serial.println(counter); delay (500);} }
4. Ciclo ” for ” nidificato
Il linguaggio C consente di utilizzare un ciclo all’interno di un altro ciclo. Il seguente esempio illustra il concetto.
Sintassi del ciclo ” for ” nidificato
for ( inizializza; controlla; incrementa o decrementa) { // blocco di istruzioni for ( inizializza; controlla; incrementa o decrementa) { // blocco di istruzioni } }
Esempio
void setup() { Serial.begin(9600); } void loop() { for (int counter = 2;counter <= 9;counter++){ Serial.println(counter);//il blocco di istruzioni verrà eseguito 7 volte delay (500); for (int i = 0;i <= 99;i++){ Serial.println(i);//il blocco di istruzioni verrà eseguito 100 volte delay (250);} } }
5. Ciclo ” infinito “
È il ciclo che non ha condizione di terminazione, quindi il loop diventa infinito.
Sintassi del ciclo ” infinito “
Usando il ciclo ” for ”
for(;;){ // blocco di istruzioni }
Usando il ciclo ” while”
while(1){ // blocco di istruzioni }
Usando il ciclo ” do…while”
do{ // blocco di istruzioni } while(1);
Esempio
int counter = 0; void setup() { Serial.begin(9600); } void loop() { for(;;){ counter++; Serial.println(counter);//il blocco di istruzioni verrà eseguito all'infinito delay (500); } Serial.println("fine");//Noterete che la scritta "fine" non appare mai, perché //il ciclo for va all'infinito. }