Løkker / Loops

I C/C++ er det 3 forskjellige løkkestrukturer: for-løkker, while-løkker og do-while-løkker.

Den mest brukte er for-løkker, så vi starter der:

for-løkke

for-løkken består av 3 deler:

  -startverdi
  -logisk test (sann eller usann, 1 eller 0, HØY eller LAV)
  -oppdatering av teller

Et eksempel:

for(teller=0;teller<20;teller++){
  //Koden som skal utføres
  Serial.println(teller);
  delay(200);
}

Først settes teller-variabelen til 0. Deretter tas den logiske testen: er teller mindre enn 20?

Er den det, utføres koden i kodeblokken (innenfor { og } ). Til slutt oppdateres telleren (teller++ betyr at teller økes med 1 i dette tilfellet) og den logiske testen gjøres på nytt.

For å lage en uendelig loop kan vi skrive:

for ( ; ; ) { /*koden her */ }

while-løkke

while-løkken har tilsynelatende en enklere oppbygging, og består bare av en logisk test:

teller=0;

while(teller<20){
  //Koden som skal utføres
  Serial.println(teller);
  teller++;
  delay(200);
}

Selv om strukturen her er enklere, er det kanskje mer å passe på. Før loopen starter, må en sette start-verdien. Testen gjøres deretter, og hvis testen er «sann» kjøres koden. Hvis løkken skal fungere må telleren oppdateres inne i løkken. Deretter kjøres testen på nytt.

Den logiske testen må nødvendigvis ikke bestå av en test av en tellevariabel; den kan like gjerne være en test av om en knapp tilkoblet mikrokontrolleren er trykt inn, som vi kommer tilbake til senere.

For å lage en uendelig loop med while skriver vi: 

while(1){ /*kode her */ }

1 vil naturlig nok aldri bli noe annet enn «sant», så koden vil kjøre for evig.

 

do-while-løkke

do-while-løkken er veldig lik while-løkken, men det er en viktig forskjell: den logiske testen gjøres etter kodeblokken, og dermed vil koden uansett kjøres minst en gang:

teller=0;

do {
  //Koden som skal utføres
  Serial.println(teller);
  delay(200);
  teller++;
} while(teller<20);

Også her kan vi lage en uendelig loop : 

do {/*kode her */ } while(1);

Som før vil 1 naturlig nok aldri bli noe annet enn «sant», så koden vil kjøre for evig.

 

Oppgaver:

1: Få Arduino først til å regne fra 50 til 100, og så ned fra 150 til 100. Skriv tallene til seriporten. (Tips: teller--  betyr teller=teller-1 ) 

2: Skriv et program med en teller-variabel som:

          -Bruker en for-loop til å telle fra 5 til 55, og viser verdiene på serieporten med ca. 5 verdier i sekundet.

          -Bruker en while-loop med samme teller-variabel og teller videre til 250. Vis 10 verdier i sekundet.

          -Bruker en do-while-loop til å telle ned igjen til 5, og viser 20 verdier pr sekund

          -Starter på nytt (uendelig loop)

 

 

Løsningsforslag

Oppgave 1

/* Få Arduino først til å regne fra 50 til 100, og så ned fra 150 til 100. 
* Skriv tallene til seriporten. (Tips: teller--  betyr teller=teller-1 )
*/

void setup() {
   // put your setup code here, to run once:
   Serial.begin(9600); //Setter opp serieporten til å kommunisere på 9600 baud
}

void loop() {
   int teller; // Definerer en tellevariabel
   for (teller=50;teller<=100;teller++){ // Teller fra 50 til og med 100
      Serial.println(teller); //Skriver telleren ut på serieporten
   }
   delay(1000); //Pause 1 sekund
   for (teller=150;teller>=100;teller--){ // Teller fra 150 ned til og med 100
      Serial.println(teller); //Skriver telleren ut på serieporten
   }
   delay(1000); //Pause 1 sekund
}

Oppgave 2

/*Oppgave 2: Skriv et program med en teller-variabel som:
-Bruker en for-loop til å telle fra 5 til 55, og viser verdiene på serieporten med ca. 5 verdier i sekundet.
-Bruker en while-loop med samme teller-variabel og teller videre til 250. Vis 10 verdier i sekundet.
-Bruker en do-while-loop til å telle ned igjen til 5, og viser 20 verdier pr sekund
-Starter på nytt (uendelig loop)
*/
void setup() {
Serial.begin(115200); //Setter hastigheten på serieporten til 115200 baud
}

void loop() {
   int teller; // Lager en tellevariabel som brukes i hele programmet
   for (teller=5;teller<=55;teller++){
      Serial.println(teller); //Skriver ut telleren til serieporten
      delay(200); // Pause på 200 millisekunder gir ca 5 verdier i sekundet
   }
   while(teller<250){
      teller++; // Øker telleren med 1
      Serial.println(teller); //Skriver ut telleren til serieporten
      delay(100); // Pause på 100 millisekunder gir ca 10 verdier i sekundet
   }
   do {
      teller--; //Reduserer telleren med 1
      Serial.println(teller);
      delay(50); // Pause på 50 millisekunder gir ca 20 verdier i sekundet
   } while(teller>5);
}



 

Neste artikkel -->