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
- 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.
- 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.
-
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. -
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!