Valg-setninger

Utskrift

I de aller fleste C- og C++-programmer trenger i å gjøre valg og tester.

Til det kan vi bruke if- setinger. Vi har også strukturer med switch og case , men det vil vi ikke komme så mye inn på i forhold til mikrokontrollere. (I hvert fall i første omgang)

if - else - else if

En enkel if-setning bygges opp slik:

     if (logisk test) {
             //kode kjøres hvis testen er sann
    }

Konkret eksempel:

  if (teller>255){
      teller=0;
   }

Hvis variabelen «teller» er større enn 255, vil «teller» settes til 0.

Vi kan også angi hva som skal skje hvis testen ikke er sann:

  if (logisk test) {
     // kode kjøres hvis testen er sann
  } else {
     //  kode kjøres hvis testen er usann
  }

Konkret eksempel:

  if (teller>255){
      teller=0;
   } else {
      teller++;
   }

Hvis variabelen «teller» er større enn 255, vil «teller» settes til 0, hvis ikke vil telleren økes med 1.


En tredje mulighet er å bruke «nøstede» if-setninger. Da kan vi legge til en eller flere else if . Et eksempel:

  if (teller>100){
      teller+=10;
  } else if (teller>50){
      teller+=5;
  } else {
      teller++;
  }

Hvis variabelen «teller» her er større enn 100, vil «teller» økes med 10.

Neste ledd tester om teller enn 50, og øker i så fall telleren med 5. Denne testen vil ikke kjøres hvis den første testen er sann, selv om denne også selvsagt ville vært sann hvis den første var det.

Hvis ingen av de to første testene er sanne vil koden etter else kjøres, og telleren økes med 1.

Det er, så vidt jeg vet, ingen begrensing på hvor mange ledd en slik
if - else if – else struktur kan ha.

 

switch - case

Hvis en har mange forskjellige alternativer å sjekke, kan det for bli uoversiktelig og vanskelig å vedlikeholde en struktur med if - else. Da er det et alternativ å bruke switch og case.

Her er et enkelt eksempel:

int verdi = random (0,5);  //Verdi settes til en tilfeldig verdi mellom 0 og 5

switch(verdi){
   case 0:  
      Serial.println("Verdien er null");
      break;
   case 1:  
      Serial.println("Verdien er en");
      break;   
   case 2:  
      Serial.println("Verdien er to");
      break;   
   case 3:  
      Serial.println("Verdien er tre");
      break;   
   default:
      Serial.println("Kan ikke telle så langt...");
      break;
}
 

Oppgaver:

Oppgave 1:
Sett inn følgende i loop()-funksjonen din:

  for (int teller=0;teller <20;teller++){
//din kode her
delay(400);
}

Dette er en løkke som teller fra 0 til og med 19. (Mer om dette her: Løkker) Bruk valg-setninger, og skriv ut forskjellig tekst til Serial Monitor hvis teller er mindre enn 5, større enn 5 og større enn 15. Skriv også ut en egen tekst når når telleren er 16.

 

Løsningsforslag:

Oppgave 1:

 

/* Oppgave 1:  */
void setup() {
  Serial.begin(115200);  
}
void loop() {
  for (int teller=0;teller <20;teller++){
    if(teller<5){  //Sjekker om telleren er mindre enn 5
      Serial.println("Telleren er mindre enn 5");
    }
    if(teller>5){ //Sjekker om telleren er større enn 5
      Serial.println("Telleren er større enn 5");
    }
    if(teller>15){ //Sjekker om telleren er større enn 15
      Serial.println("Telleren er større enn 15");
    }
    if(teller==16){  //Sjekker om teller en er lik 16
      Serial.println("Nå er telleren 16!");
    }
    delay(400);
  }
}

Som du ser vil nå programmet skrive ut både "Telleren er større enn 5" og "Telleren er større enn 15" når telleren er 16, 17, 18 eller 19.

Dette kan vi ordne med å endre en av if-setningene fra
if(teller>5) til   if(teller>5 && teller<16)  

Da kjører vi to tester i samme setning, slik at teksten skrives ut hvis telleren er større enn 5 OG telleren er mindre enn 16.