If- og switch-setninger

If- og switch-setninger

I dette kapittelet skal vi undersøke hvordan if, else og switch kan brukes til å la forskjellige ting skje i et program.

If-setning

If-setningen brukes hyppig i Arduino-skisser. Den lar programmereren bestemme hva som skal skje hvis en bestemt betingelse er oppfylt.

Her følger et eksempel på hva som ofte sammenlignes ved hjelp av if-setninger:

  • om en int-variabel er høyere/lavere enn en bestemt verdi
  • om en boolean-variabel er sann eller usann
  • om en char-variabel er et bestemt tegn.

Sammenligningsoperatorer

For å utføre sammenligningene brukes forhåndsbestemte tegn (sammenligningsoperatorer). Hvis variabelen x skal sammenlignes med variabelen y, kan følgende operatorer benyttes.

KodeBetydning
x==y x er lik y
x!=y x er ikke lik y
x<y x er mindre enn y
x<=y x er mindre enn eller lik y
x>y x er større enn y
x>=y x er større enn eller lik y

Legg merke til at dobbelt likhetstegn brukes for å sammenligne om x er lik y. Bare ett enkeltstående likhetstegn brukes i APL for å tilordne verdier til variabler. Hvis bare ett likhetstegn brukes i en if-setning, blir ikke x sammenlignet med y. Da blir i stedet x gitt samme verdi som y har.

I følgende eksempel skal vi undersøke om vi har flest epler eller bananer. Vi lager derfor en ny skisse (QuantityFruit) og deklarerer to nye int-konstanter: quantityApples og quantityBananas. Vi initierer dem også ved å gi dem valgfrie verdier.

Del 1/3 av QuantityFruit.ino

I setup-funksjonen starter vi en seriell kommunikasjon for å få svar fra Arduinoen vår.

Del 2/3 av QuantityFruit.ino

I loop-funksjonen vil vi sammenligne antall epler og bananer. Deretter skal Arduinoen skrive i Seriell overvåker hvilken frukt vi har flest av. For dette skriver vi tre if-setninger siden det er tre mulige scenarier.

void loop() {
  
  // Compare amounts of apples and bananas and print info
  if(quantityApples > quantityBananas) {
    Serial.println("We've got more apples than bananas.");
  }
if(quantityApples < quantityBananas) {    Serial.println("We’ve got less apples than bananas."); }
if( quantityApples == quantityBananas) {    Serial.println("We've got the same amount of apples and bananas.");  }  delay(1000); }

Del 3/3 av QuantityFruit.ino

Else-if-setning

Koden som er delt opp i tre if-setninger fungerer, men det finnes en mer elegant måte å skrive den på. "Else-if" gjør det mulig å la forskjellige ting skje avhengig av hvilke betingelser som er oppfylt.

For å gjøre koden enklere skriver vi den slik:

// Declare global constants for quantities
const int quantityApples = 1337;
const int quantityBananas = 42;

void setup() {
  
  // Open serial connection at 9600 Bd.
  Serial.begin(9600);
}

void loop() {
  
  // Compare amounts of apples and bananas and print info
  if(quantityApples > quantityBananas) {
    Serial.println("We've got more apples than bananas.");
  }
  else if(quantityApples < quantityBananas) {
    Serial.println("We’ve got less apples than bananas.");
  }
  else {
    Serial.println("We've got the same amount of apples and bananas.");
  }

  delay(1000);
}

QuantityFruit2.ino

Programmet sjekker først om vi har flere epler enn bananer. Hvis vi har det, skriver programmet den tilhørende teksten og hopper deretter ut av if-setningen (dvs. at neste setning som utføres blir "delay(1000)"). Hvis vi derimot ikke har flere epler enn bananer, hopper programmet over den første teksten og sjekker i stedet om vi har færre epler enn bananer. Hvis vi har det, skriver programmet den tilhørende teksten og hopper deretter ut av if-setningen.

Hvis vi verken har flere epler eller flere bananer, kjører programmet instruksjonen som hører sammen med else.

Legg merket til at vi ikke trenger å ta med betingelsen quantityApples == quantityBananas til slutt. Hvis programmet kommer helt dit, er ingen av de andre to betingelsene oppfylt. Den eneste muligheten er da at vi har like mange epler som bananer.

Logiske operatorer

Noen ganger er det ikke nok at én betingelse oppfylles for at noe skal skje (og iblant er det tvert imot nok at én av flere betingelser oppfylles for at noe skal skje). Da kan logiske operatorer brukes for å kombinere to eller flere betingelser. Til det brukes følgende symboler:

Kodebetydning
&& og
|| eller
! ikke

Tips! De to vertikalstrekene skrives på Windows-tastaturer ved å trykke på tasten til venstre for 1 (under Esc). I Mac OS skrives de ved å holde nede Alt og trykke på 7.

I følgende eksempel vil vi vite hvilken frukt du foretrekker. Vi lager derfor en ny skisse og to konstanter av typen boolean, som vi kaller henholdsvis likeApples og likeBananas. Sett verdiene til true eller false avhengig av hvorvidt du liker fruktene.

Del 1/3 av FavouriteFruit.ino

I setup-funksjonen starter vi en seriell kommunikasjon for å få svar fra Arduinoen vår.

Del 2/3 av FavouriteFruit.ino

I loop-funksjonen skriver vi følgende if-setninger for å vite hvilken frukt vi bør servere:

Del 3/3 av FavouriteFruit.ino

Nestet if-setning

Iblant er det nyttig å ha if-setninger inni andre if-setninger. Det kalles å neste if-setninger. I det foregående eksempelet ble det foreslått fruktsalat til den som liker både epler og bananer. Enkelte fruktsalatelskere liker å ha rosiner i salaten, mens andre foretrekker å ikke ha det. For å sikre oss at vi foreslår riktig fruktsalat, legger vi til enda en konstant, boolean (likeRasins), øverst i skissen.

Deretter nester vi inn en if-setning i den eksisterende if-setningen, slik at den ferdige skissen ser slik ut:

Switch-sats

Med mange ulike alternativer blir det raskt uoversiktlig å bruke if- og else-setninger. Noen ganger er det mer praktisk å bruke en switch-setning. En switch-setning baserer seg på en variabel og kan utføre forskjellige instruksjoner avhengig av hvilken verdi variabelen har.

I følgende eksempel skal vi demonstrere bruken av switch-setningen og lage en skisse som tilfeldig velger hvilken frukt vi skal spise. Vi begynner derfor med å lage en ny skisse (PickAFruit) og starte en seriell kommunikasjon i setup-funksjonen.

Del 1/4 av PickAFruit.ino

I loop-funksjonen deklarerer vi en byte-variabel med navnet value. Deretter kaller vi opp funksjonen random for å få et pseudotilfeldig tall mellom 0 og 9. Med pseudotilfeldig mener vi at verdien egentlig ikke er helt tilfeldig (den er regnet ut), men for dette eksempelet er verdien tilstrekkelig tilfeldig valgt.

Del 2/4 av PickAFruit.ino

I loop-funksjonen lager vi også en streng (pickedFruit) som vi lagrer fruktnavnet i før det skal skrives på skjermen.

Del 3/4 av PickAFruit.ino

Til slutt lager vi switch-setningen. Den lagrer ulike fruktnavn i pickedFruit avhengig av hvilken verdi som blir valgt tilfeldig for value. Hvis verdien er 0, blir det en banan. Hvis den er 1, blir det en klementin osv. Legg merke til at switch-setningen avsluttes med default. Default er det som skjer hvis verdien ikke er en av de som vi har laget betingelser for. Siden det ikke er laget noen betingelser for 5-9, kommer tilfeldighetene til å gjøre at default blir valgt i ca. 50 % av tilfellene. Heldigvis er ananas godt.

Del 4/4 av PickAFruit.ino

Sist endret: 2017-09-08