Selektion

Än så länge har vi endast haft instruktion som som bearbetas som en sk sekvens dvs en efter den andra till man kommer till slutet, om det var i draw-blocket så upprepades alla om och om igen. Men vi behöver även kunna styra det så att vissa delar av koden körs bara om vissa villkor är uppfyllda. Tänk på förra uppgifterna: Hur gör man om rektangeln ska ändra färg vid en viss position? Äggkartonger. Om vi har rest-ägg bhövs en kartong till. Vi måste ha en konstruktion som tillåter att vi kör vissa delar av programmet endast om visa villkor är uppfyllda.

Innan man börjar koda är det inte dumt att skissa sitt förslag. Det finns två välanvända sätt att göra det. Antingen med ett aktvitetsdiagram eller pseudokod:

Aktivitetsdiagram Pseudokod
aktivitetsdiagram om x är mindre än 300
   öka x med 1
aktivitetsdiagram om x är mindre än 300
   öka x med 1
annars
   skriv ut varning
aktivitetsdiagram om x är mindre än 300
   öka x med 1
annars
   skriv ut varning

( Ett mycket användbart aktivitetsdiagram finns här )

Och i kod ser det ut så här.Vi utöka exemplet från förra sidan:

    //Version 1 med bara 'om'

    //Variabler
    int x = 100; 

    void setup(){
      size(480,360);
    }

    void draw(){
        background(100);
        rect(x,200,50,50);

        if( x < 300) {  
          x++;
          }
    }

    //============================================================================
    // Version 2 med 'om'  och  'annars'

     //Variabler
    int x = 100; 

    void setup(){
      size(480,360);
    }

    void draw(){
    background(100);
    rect(x,200,50,50);


    if( x < 300) {  
      x++;
      } else {
        text("Du är för långt till höger!",10,340);
      }


    }

Syntax ( =skrivsätt )


    if( sanningsvärde ) {
    // koden mellan 'måsvingarna' körs endast om 
    // sanningsvärde utvärderas till true

    }


    ///Alternativt

    if( sanningsvärde ) {
    // koden mellan 'måsvingarna' körs endast om 
    // sanningsvärde utvärderas till true
    } 
    else {
    // det här blocket körs i andra fallet
    }

Exempel på sanningsvärden

Tecken som används för att jämföra två värden kallas för villkorsoperatorer. Ett uttryckt som a < 5 är antingen sant eller falskt (true/false) och därför ekvivalent ett sanningsvärde.

typ exempel
större än a > b , a > 5
större eller lika a >= b, a>= 5
mindre än b < a , 5 < a
precis lika a == b
olika a != b

Laboration 1

1. Gör om programmet (första exempel, version 1) så att rektangeln börjar om från x = 100;
2. Gör om programmet så att rektangeln byta färg istället för att stanna.
2. Fråga användaren efter gränsen istället för 300 som fast värde. 
3. Utöka programmet att rektangeln studsar fram och tillbaka. Tips: Definera en variabel 'steg = 1' för att sedan ändra rektangelns x-koordinat med ' x = x + steg' vid rätt tillfälle ändras  steg till -1.
4. Ta fram <a href="../variables#laboration-3">äggkartong</a> en gång till. lägg en if-sats konstruktion som avgör om det blir 'restägg' eller inte och använd det för att beräkna rät antal kartonger för alla tänkbara fall.

Flera sanningar samtidigt

Vi kan nu reagera om värdet av en variabel till exempel överstiga ett värde eller dylikt. Men hur kan man testa om en variabel är nu mellan två gränser? Det finns möjlighet att koppla ihop två sanningsvärden. Låt säg att rektangeln ha färgen blå för 100 < x < 300 annars röd. det gör genom att testa om x uppfyller kravet att den är större än 100 (100 < x) OCH samtidigt mindre än 300 ( x < 300). I kod ser det ut så här:

    int x = 10; 

    void setup(){
    size(480,360);
        }

    void draw(){
        background(100);
        rect(x,200,50,50);

        x++;

        if(100 < x &&  x < 300) {  
            fill(0,0,200); // blå
        }
        else {
            fill(200,0,0); // röd
        }
    }

Samma restultat kan nås om man formulerar if satsen med ELLER ( || ) istället för OCH ( && ):

int x = 10; 

    void setup(){
    size(480,360);
        }

    void draw(){
        background(100);
        rect(x,200,50,50);

        x++;

        if(100 > x ||  x > 300) {  
            fill(200,0,0);  //röd
        }
        else {
            fill(0,0,200);  //blå
        }
    }
Uttryck                                           läses Exempelvärde Utvärderas till
a < 100 a mindre 100 a = 50 true
a < 100 a mindre 100 a = 100 false
100 <= a a större eller lika 100 a = 100 true
a == 100 a (precis) lika med 100 a = 99,9999 false
a != 100 a inte like med 100 a = 99 true
100 < a && a < 300 a större än 100 OCH a mindre än 300 a = 200 true
100 < a && a < 300 a större än 100 OCH a mindre än 300 a = 400 (första villkor uppfylld men inte andra) false
a < 100 || a > 300 a mindre än 100 ELLER a större än 300 a = 400 (räcker med ett uppfyllt villkor ) true

Laboration 2

  1. Utöka koden nedan så att det frågas efter åldern för att sedan bestämma priset. Biljetter kostar
    • Barn 16kr, yngre än 18 år
    • Student 20kr, mellan 18 och 26 år
    • Vuxen 30kr, 26 till 64år
    • Pensionär 25kr, 65 och äldre

Kopiera koden nedan till en ny sketchbook och spara den under namnet bussbiljett. Ladda sedan ner guioche.jpg och kopiera det till mappen bussbiljett. Eller drar filen från download-mappen över processing och släpp den där. Då hamnar det också rätt. All kod borde hamnar i setup()-blocket.

//Variabler
PImage img;

void setup(){
    size(520, 370); // anpassad till bilden + 10px ram
    background(50);
    img = loadImage("guioche.jpg"); //ladda bilden in i programmet
    image(img,10,10); //visa bilden. 10:10 är övre vänstre hörn

    textSize(42);
    fill(0,0,0,50); 
    rect(64,100,386,67);
    fill(0,60,0);
    text("Bussbiljett Zone A",71,148);
}
  1. Ta fram övningen 'trafikljuset' Kapitel Grunder o Grafik. Utöka programmet så att det visas endast "röd" sedan "röd och gul" osv. Det kan göras med en räknare 'tid' som öka med 1 varje omgång av draw(). Sedan ska visas cirklar vissa om värdet är mellan 0 och sedan, andra om värdet är mellan 61 och 120, osv. Men välj gärna andra gränser för en 'långsamare' trafikljus. Efter ett viss värde borde räknaren sättas på noll igen.

Sammanfattning

Du borde kunna/veta:

  • Att man kan skriva kod så att den bara körs under vissa villkor
  • Vad ett sanningsvärde är.
  • Vad en villkorsoperator är.
  • Hur man jämför två värden så att det blir ett sanningsvärde.
  • Syntax (skrivsätt) för en if-sats.
  • Syntax för en if-else-sats.
  • Att man kan sätta en if-sats i en if-sats i en if-sats .....