Variabler
Innan vi går igång på variabler ska vi lägga till lite kod för att kunna kommunicera enklare med användaren.
Fråga användaren
I processing själv inga möjligheter att fråga användaren. Men kan lägga till en kodfil i mappen Java. Ladda ner (INTE ÖPPNA!) wnd.pde och flytta den till mappen Java i mappen templates. Nästa gång du starta processings IDE så får du en extra flik 'wnd'. I huvudprogrammet ( = första flik ) Har du nu tillgång till flera instruktioner. Exempel:
String namn = QuestionString("Vad heter du?");
double d = QuestionDouble("Hur långt är du?");
int i = QuestionInt("Hur gammal är du?");
float f = QuestionFloat("Vad väger du?");
enkel utskrift
Under utvecklingsfasen har man ibland behov att skriva ut ett värde för att se hur en variabel ändrar sig. Att visa text eller tal på fönstret går naturligtvis med det kräver oftast lite programkod runt omkring. För att slippa det använder vi i början endast console-fönstret (svart ruta under kodfönstret). Vi använder instruktionen
- println() (med radbyte)
- print() (utan radbyte)
Vi kommer snart prata mer ingående om bokstäver och text, så här bara ett par exempel hur tal och text kan kombineras:
int a = 10, b = 5;
println("Det kostar är " + a + " SEK");
println(a +" ggr " + b + " är lika med " + (a*b) ); //testa utan parentes kring a*b);
för utskrift i detta fönster!.
Laboration 1
Starta en ny instans av processing via File --> New. Du borde ha en flik wnd till. Kopiera nedanstående i sin helhet till första fliken och kör. Går det och det kommer två PopUp-fönster så ligger allt rätt till.
void setup(){
String fnamn = QuestionString("Förnamn?");
String enamn = QuestionString("Efternamn?");
println("Du heter " + fnamn + " " + enamn + ".");
}
void draw(){
}
Digital lagring av data
Rent fysik kan man endast spara följder av nollor och ettor i datorns olika minnen (RAM, Hårddisk, USB-stick mm). Att det sedan blir heltal, decimaltal, text, bilder och ljud är hur man interpretera alla dessa nollor och ettor. Ett exempel hur fel det kan blir är tex email med konstiga tecken istället för ö, ä eller å.
I de flesta språk löser man det genom att man skapa olika typer av variabler för olika behov. Processing använda samma typer som Java. Det är fyra kategorier
- Heltal
- Decimaltal eller flyttal
- Text och bokstäver
- Sanningsvärde
Beteckning | Beskrivning | Exempel | Tänk på |
---|---|---|---|
Heltal | |||
int | 32-bit tal +/- 2,147,483,648 (2^31 -1). | int a = 10; | |
long | 64-bit tal +/- 9 x 10 ^18 | long maxAntal = 123456789012L; | Observera L |
Decimaltal |
|||
float | 32-bit +/- 3.4 x 10^38, 7 siffor | float dx = 0.002f; | f krävs för deklaration. |
double | 64-bit +/- 1.7 x 10^308 med 15 siffror | double diameter = 12.123456123456; | Decimaltal skriv med punkt inte komma. |
Text |
|||
char | 16-bit, ett tecken | char bokstav = 'A'; | Enkla citationstecken |
String | Teckenföljd. Minnesbehov antal tecken x 16 bit | String namn ="Peter Pan"; | Dubbel-citationstecken. |
Sanningsvärde | |||
boolean | Variabel som kan endast innehålla true eller false | boolean repeat = true; | Inga citationstecken. |
I början kan vi koncentrera oss på
- int
- double
- char
- String
- boolean
De andra nämndes för att kunna förstå exempel som finns ute på nätet. Det krävs inte heller att man ge ett startvärde från början.
Det är också OK att deklarea flera variabler på en gång. När vi prata om koden lättläsbarthet diskutera vi det mer detaljerad.
En variabeldeklaration har alltid samma mönster:
<TYP> <NAMN>
eller <TYP> <NAMN> = <VÄRDE>
När man tilldela ett värde beror det på typen hur deklarationen se utan`
int i = 10;
double d = 3.142459; // Punkt som decimaltecken
char bokstav = 'A' ; // Enkla citationstecken
String namn = "Kalle Anka"; // Dubbla citationtecken
// värdet för en variabel kan vara returnvärdet av en metod
double h = radius * Math.sin(1.5634);
// flera variabler på en gång
int a, b;
String namn;
float x, y = 0.5, z;
// Och på det här sättet kan vi fråga användaren efter tal eller text
String namn = QuestionString("Vad heter du?");
double d = QuestionDouble("Hur långt är du?");
int i = QuestionInt("Hur gammal är du?");
float f = QuestionFloat("Vad väger du?");
Typen anges bara första gången en variabel nämn. Om du använda variabeln en gång till i samma program så 'vet' datorn vad du menar.
Namngivning
Dessa regler gäller för namngivning av variabler:
- Skillnad mella stora och små bokstäver: Antal, antal, ANTAL är tre olika variabler
- ett ord, så inte `int antal elever` men `antal_elever` är OK.
- Tillåtna tecken: a - z, A-Z, 0 - 9, och _
- måste börja med bokstav eller _
- Good coding: Vi använder camelCase. variabelnamn börja men gemener, varje nytt ord `utan` mellan slag med versaler. Tex `antalElever, maxWidth, minBredd`
Räkna med variabler: Operatorer i processing
Beräkningar skrivs på samma sätt som du har lärt dig i matematik. först är det parentes, sedan
- multiplkation: *
- division: /
- plus: +
- minus: -
En beräkning kräver att man spara resultatet i en variabel eller använda resultatet direkt. Godkända instruktioner är text :
int a = 15, b = 4 , resultat;
resultat = 2 * a + 10;
resultat = a*a* b;
resultat = 2*(a +10); // 2(a+10) fungerar ej!!!
rect(100 + a, 200* b, 100, a+b );
= kallas i detta fall för en tilldelningsoperator. Andra raden ovan borde läsas sä här:
ta 2 gånger innehållet i a, addera 10 och spara det i variabeln 'resultat'
Tilldelningsoperatorn ( = ) utvärderas från höger till vänster. Först beräknas uttrycket till höger och sparas på vänstersidan. Mellan två tal eller variabler måste finnas en operator.
I sista raden beräknas först alla uttryckt innan de används för att rita en rektangel. Det ritas en rektangel på x = 115, y = 400, bredden = 100, höjden = 19.
Tilldelningsoperator är inget likehetstecken
Följande utryck är matematisk nonsens men helt OK i programmering:
a = a * 2 ;
Där står: Ta det som finns i a, multiplicera med 2 och spara igen i variabeln a .
Denna rad fördubblar innehållet i a.
Laboration 2
- Fråga användaren efter två heltal (int QuestionInt("Mata in ett tal:") ) och beräkna summan, produkten och kvoten.
- Fråga efter ett heltal och visa sedan det dubbla av värdet ( *2). Kolla sedan tabellen om de olika typer och mata in ett tal som är nära den övre gränsen. Vad händer när en variabel går över gränsen?
Vill man ändra ett värde i en variabel så används oftst dessa för kortningar
Longt uttryck | Förkortat uttryck | Longt uttryck | Förkortat uttryck | |
---|---|---|---|---|
a = a + 5 | a += 5 | a = a+1 | a++ | |
a = a - 2 | a-=2 | a = a -1 | a-- | |
a = a * 10 | a*=10 | a = a / 5 | a/=5 |
När vi räkna måste vi tänka på att framförallt heltalsvariabler kan inte innehålla ett decimalvärde. Andra raden kommer att kompilaras och köras med resultatet är inte som vi känner det:
//Exempel heltalsdivision
void setup(){
int a = 15, b = 4, resultat;
resultat = a / b; // resultat innehåller 3 !!!
println("15 delat på 4 är " + resultat );
}
Här ser vi en sk heltalsdivision. 4 passar 3 in i 15. Resten försumras. Man kan tänker så här: Det är som en vanlig division, men allt efter kommat klipps bort oavsätt hur mycket det är. Så ingen matematisk korrekt avrundning, alltid ner till nästa heltal. Så här räknas division om det är två heltal inblandad.
Det femte räknesätt
I samband med heltalsdivision finns ett femte räknesätt: modulus, tecknet är %. Medan heltalsdivision ge hur ofta ett tal passar in i ett annat ge modulus resten vid en sådan division.
Exempel
int i;
double d;
i = 20 % 6; // i blir 2 för att 20 = 3*6 + 2 <-- resten
i = 25 % 7; // i blir 4 för att 25 = 3*7 + 4
i = 30 % 6; // i blir 0 för att 30 = 5*6 + 0
i = 30 % 50; // i blir 0 för att 30 = 0*50 + 30
// fungera även för decimaltal
d = 3.7 % 1.5 // d blir 0.7
Laboration 3
-
Ta koden från Exempel heltalsdivision: Ändrå så att variabeln resultat är av typen float eller double och kör. Blir det bättre? Räknas nu rätt?
-
Starta en ny sketchbook 'eggkartong' (File --> New) . Användaren mata in antal ägg, datorn svarar med antal kartonger som behövs för att förpacka alla. (12-pack). Det kan set ur så här:
Hej bonde, hur många ägg var det i morse? 15
Du behöver 2 kartonger
Utöka med att också fråga efter kartongstorlek.
- Använd koden nedan.
- Testa vad händer när du tar bort background(100);
- Gör att rektangel rör sig snabbare
- Långsamare
- Lägg till en cirkel som rör sig samtidigt i y-led
//Variabler
int x = 100;
void setup(){
size(480,360);
}
void draw(){
background(100);
rect(x,200,50,50);
x++;
}
Sammanfattning
Du borde kunna/veta:
- Att det finns olika variabeltyper
- Att det finns fem räknesätt
- Hur du beräkna och överför beräkningar till en variabel
- Skillnad mellan likhetstecken i matematik och programmering
- Att det finns utryckt för att förändra värdet i en variabel
Du kan fortsätter med Selektion