Iteration

I processing finns möjlighet att upprepa kod med hjälp av draw() blocket. Men då upprepas ALLT tills vi stoppar hela programmet. Men det finns behov att att upprepa ett kodblock/kodsekvens bara ett fåtal gånger eller sålänge ett villkor är uppfyld. Det kallas för iteration. I processing( ~Java ) men i många andra språk finns två mögligheter

- while-satsen
- for satsen

while används för upprepningar sålänge ett villkor är uppfyll, medan for-satsen används om det är ett (nästan) fast antal upprepningar.

while-satsen

Liknar i skrivsättet if-satsen. Inleds med 'while' , i vanliga parentes ett sanningsvärde följd av ett måsvingepar. Observera att upprepningen bara kommer igång om sanningsvärdet utvärderas till true. om så fallet körs koden mellan måsvingarna. sedan utvärderas sanningsvärdet igen. om den är fortfarande 'true' upprepas en gång till annars fortsätter programmet

Syntax while-loop

while( sanningsvärde ) {
// kod som ska upprepas
}

// Kod som körs efter uppregningen/loopen är klar


Exempel

    //Variabler


    void setup(){
        size(480,360);
        fill(255,128,0);
    }

    void draw(){

        strokeWeight(2); //ram tjocklek,linjentjocklek

        int x = 80;
        while(x <= 400 ) {
            rect(x,80,20,100);
            x += 30;
        }

        strokeWeight(5);
        line(80,70,400,70);
    }

Pseudokoden som beskriver en while-sats ovan :

    sätt x = 80
    sålänge x är mindre eller lika med 400
        rita en rektangel på x, y=80, bredden 20 och höjden 100
        höj x med 30

De tre viktiga delar som får loopen att gå:

kod        betydelse
int x=80; Startvärde för x
x <= 400      villkor som måste utvärderas till sant (= true) för att det körs en omgång. Efter en körning av koden mellan måsvingarna utvärderas det igen.
x += 30; här påverkas x att den så småningom når 400. Gör man fel men sanningsvärdet eller ökning av x så kan det blir en evighetsloop.

Aktivitetsdigram för while-satser ser ut så här while-aktivitetsdiagram

Det kan så klart kombineras med allt annat vi har lärt oss. I en sådan while-loop kan det finnas hur många kodrader som helst och vad som helst.

Inna vi sätter igång med andra uppgifter borde vi titta närmare på koden för att förstå vad de olika tal och variabler gör.

Vad gör de olika parametrar?

Kopiera koden ovan. Sedan ska du fundera på följande frågor innan du testa det!

  • Hur får jag samma antal rutor men de ska ligga mer åt höger eller vänster?
  • Hur får jag en, två eller tre till?
  • Hur får jag en, två eller tre mindre?
  • Hur får jag samma antal men med större avstånd?
  • Hur får jag samma antal men som kolumn istället för rad?

Laboration 1

  1. Rita ett antal rektanglar bredvid varandra med hjälp av en while-sats. Antalet ska komma från användaren. Du kan ta exemplet ovan som utgångspunkt. Inför en räknare (int count) som ökar med 1 för varje gång du rita en rektangel. Villkoret för while är om räknaren är mindre än antalet som användaren önskar.
  2. Rita en måltavla. Ta cirklar med samma mittpunkt men växelvis röd-svart med minskade radius/diameter. Utökning: Måltavlan ska ritas efter en musklick. Muspositionen ska vara centrumet för tavlan.
  3. Rita ett schackbräde. Sätt rätt fönsterstorlek och backgrunden på vit så behöver du bara rita de svarta kvadrater. Det ska vara så få rect-instruktioner så möjligt. För att kunna byta mellan rita eller icke rita kan man skapar en räknare (count) och räkna mod 2: if( count % 2 == 0) { ... } Om count är också delbar med 8 läggs till en radbyte.
    Alternativ ansats: rita rad 1 3 5 7 och sedan 2 4 6 8 för att udda börja med svart, jämna med vit.

  4. Rita en tegelvägg. En tegelsten är såklart en rektangel. Varannan rad måste förskjutas med hälfen av tegelstenens bredd. det är ingen fara att rita med negativa koordianter, de syns bara inte.


for-satsen

for-satsen används för uppreppningar och har så samma syfte som while-satsen. Men med en for-sats kan man skriva kod som är mer kompakt än motsvarande while-sats. Här kommer kod som har samma funktion som ovan men annan formulering:


    //Variabler

    void setup(){
        size(480,360);
        fill(255,128,0);
    }

    void draw(){

        strokeWeight(2); //ram tjocklek,linjentjocklek

        for(int x = 80;  x<= 400;  x += 30 ) {
            rect(x,80,20,20 + x/2);

        }

        strokeWeight(5);
        line(80,70,400,70);
    }

Syntax for-loop

Inleds med nyckelordet for, sedan vanliga ()-parentes med tre instruktioner skiljas med ; . Efter det direkt ett måsvingepar för koden som ska upprepas.


    for( deklarera en variabel ; villkor för fortsättning ; ändra variabeln ) {

      // kod som upprepas

    }

Förklaring

for-satser används med fördel om man vet hur ofta något ska upprepas, särskild om det behövs en räknare som ändras med jämna steg.

Del i for-sats Förklaring
deklarera en variabel I första instruktion skapas räknaren med ett startvärde. Precis lika en vanlig variabeldeklaration. Jämför exemplen while och for: andra raden ( int x = 80 ) har flyttats in i for satsen. Denna instruktion körs en gång i början av loopen.
villkor för fortsättning Ett sanningsvärde som utvärderas i början av varje upprepning. Denna del är lika med while-satsen.
ändra variabeln Denna instruktion körs efter upprepning. Här är det x som höjs med 30.

De två skrivsätt i jämförelse:

Men for-satsen är så klart inte begränsat till fasta talgränser det kan så klart beror på variabler:

    //Variabler
    int antal;

    void setup(){
    size(500,500);

    antal = QuestionInt("Hur många bollar?");

    for(int i= 0; i < antal;i++){
        ellipse(100 + i * 30,250,20,20);
        }

    } 

laboration 2

Skapa liknade konstverk:

Strålar Hyperbel

  • Ett rutnät dvs horisontella och vågrätta linjer över hela fönstret. Användaren får välja rutans storlek/linjernas avstånd.

(challenge) På nästa problem krävs använgning av sin(), cos() och PI. Kolla Processing Reference --> Trigonometry för detaljer. OBS! Det räknas i radianer!