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

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

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å

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

  1. Fråga användaren efter två heltal (int QuestionInt("Mata in ett tal:") ) och beräkna summan, produkten och kvoten.
  2. 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

  1. 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?

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

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