3.2. Variable

Du kan vælge at give et område i computeren et navn - sætte en etiket på området. Området kan bruges til opbevaring af data. Da alle data ikke fylder lige meget i lageret, er det nødvendigt at definere, hvilken type data du vil bruge lageret til samtidig med erklæringen eller navngivningen af området.

Det er en god vane at give variablerne sigende navne. Navnene bør starte med et lille bogstav.

I det følgende gennemgår vi to af Javas variabeltyper: int (heltal) og double (kommatal).

3.2.1. Heltal

En variabel af typen int (et heltal, eng.: integer) erklæres med

 
int tal; 

Figur 3-2. Efter 1. tildeling

Nu er der reserveret plads i hukommelsen til et heltal. Man får fat i pladsen ved at bruge variabelnavnet 'tal'. Efter at variablen er erklæret kan den tildeles en værdi (der kan lagres en værdi på dens plads i computerens RAM), dvs. man kan skrive data ind i den:

 
tal = 22; 

Nu er værdien af tal 22 (vist på figuren til højre).

Vi kan bruge tal-variablen i stedet for at skrive 22, f.eks. til at skrive ud til skærmen:

 
System.out.println("Svaret på livet, universet og alt det der: " + tal); 

Her slår computeren op i hukommelsen, læser indholdet af tal-variablen og skriver det ud til skærmen (+'et vil blive forklaret om lidt).

Variabler kan, som navnet siger, ændre værdi. Det gør vi ved at tildele variablen en ny værdi (der kan gemmes en værdi på den plads i computerens lager, der er "markeret" med etiketten tal):

Figur 3-3. Efter 2. tildeling

 
tal = 42; 

Herefter er den gamle værdi fuldstændigt glemt og erstattet med den nye. Når programudførelsen når et punkt, hvor variablen læses, vil det være den nye værdi, 42, der gælder.

I en tildeling læses værdien på højre side og gemmes i variablen på venstre side

Herunder er eksemplet i sin helhed (den væsentlige del af koden er fremhævet):

 
// Eksempel på brug af en variabel 
// koden skal være i filen Variabler.java 
public class Variabler 
{ 
  public static void main (String[] args) 
  { 
    int tal; 
    tal = 22; 
    System.out.println("Svaret på livet, universet og alt det der: " + tal); 
 
    tal = 42; 
    System.out.println("Undskyld, svaret er: " + tal); 
  } 
} 
 
Svaret på livet, universet og alt det der: 22 
Undskyld, svaret er: 42 

3.2.2. Sammensætte strenge med +

Som det er vist i ovenstående eksempel, kan vi med tegnet + sætte strenge sammen med noget andet:

 
System.out.println("Svaret på livet, universet og alt det 
der: " + tal); 

Herunder sætter vi to strenge sammen:

 
// Sammensæt to strenge med + 
// koden skal være i filen HejVerden2.java 
public class HejVerden2 
{ 
  public static void main (String[] args) 
  { 
    System.out.println("Hej " + "Verden!"); 
  } 
} 

Resultatet bliver

 
Hej Verden! 

Herunder skriver vi en streng og tallet 42 ud:

 
public class HejVerden3 
{ 
  public static void main (String[] args) 
  { 
    System.out.println("Svaret på livet, universet og alt det der:" + 42); 
  } 
} 

Resultatet bliver

 
Svaret på livet, universet og alt det der: 42 

Det, der egentlig sker, er, at det hele bliver sat sammen til én streng, og den sendes til System.out.println().

En streng + noget andet sættes sammen til en samlet streng

3.2.3. Beregningsudtryk

Man kan erklære flere variabler på samme linje:

 
int antalHunde, antalKatte, antalDyr; 
antalHunde = 5; 
antalKatte = 8; 

Tildelinger kan indeholde regneudtryk på højre side af lighedstegnet. Udtrykket antalHunde + antalKatte udregnes, og resultatet lægges i variablen på venstre side (fordi variabelnavnet ene og alene er en etiket sat på en del af computerens lager, er det naturligvis ikke muligt at have beregningsudtryk på venstre side):

 
antalDyr = antalHunde + antalKatte; 

Beregningsudtrykkene undersøges af Java ved at indsætte de værdier, der er gemt i variablerne. Her indsætter Java 5 + 8 og får 13, som lægges i antalDyr.

 
public class Dyreinternat 
{ 
  public static void main(String[] args)  
  { 
    int antalHunde, antalKatte, antalDyr; 
    antalHunde = 5; 
    antalKatte = 8;  
 
    //udregn summen 
    antalDyr = antalHunde + antalKatte; 
 
    // udskriv resultatet 
    System.out.println("Antal dyr: " + antalDyr); 
 
    antalHunde  = 10; 
 
    // antalDyr er uændret 
    System.out.println("Antal dyr nu: " + antalDyr); 
  } 
} 

Resultatet bliver

 
Antal dyr: 13 
Antal dyr nu: 13 

Beregningen sker én gang på det tidspunkt, hvor kommandoen udføres Derfor er antalDyr's værdi ikke påvirket at af vi sætter antalHunde til noget andet efter udregningen.

Ligesom i almindelig matematik har * (multiplikation) og / (division) højere prioritet end + og -.

I Java skrives 9 divideret med 3 som 9/3 3 gange 3 som 3*3

Man kan ikke som i almindelig matematisk notation undlade at skrive gangetegn.

Resultatet af en heltalsudregning er også et heltal. Det skal man være opmærksom på ved division, hvor eventuelle decimaler efter kommaet smides væk. Heltalsudregningen 13 / 5 giver altså 2, fordi 5 går op i 13 to gange.

Et heltal divideret med et heltal giver et heltal 95 / 100 giver 0

Ønsker man at få et kommatal som resultat af divisionen skal et eller begge af tallene være kommatal. Eksempelvis giver 95.0 / 10 kommatallet 9.5.

3.2.4. Kommatal

Der findes mange andre variabeltyper end heltalstypen int. Hvis man vil regne med kommatal, bruger man typen double. En variabel af typen double erklæres med:

 
double højde; 

De følgende afsnit bruger noget matematik, mange lærer i gymnasiet. Hvis du ikke kender så meget til matematik, gør det ikke noget. Præcis, hvad der udregnes og formlerne bag det, er ikke så vigtigt i denne sammenhæng. Det vigtige er at forstå, hvordan man arbejder med tal i Java.

Her er et eksempel på beregning af en cylinders rumfang:

 
// 
// Beregning af rumfang for en cylinder 
// 
public class Cylinderberegning 
{ 
  public static void main(String[] args)  
  { 
    double radius; 
    radius = 5.0; 
    double højde = 12.5; 
    //beregn rumfang 
    double volumen = radius * radius * højde * 3.14159; 
 
    System.out.println("Cylinderens højde: " + højde); 
    System.out.println("Cylinderens radius: " + radius); 
    System.out.println("Cylinderens volumen: " + volumen); 
  } 
} 
 
Cylinderens højde: 12.5 
Cylinderens radius: 5.0 
Cylinderens volumen: 981.7468749999999 

Læg mærke til, at man godt kan erklære en variabel og tildele den værdi i samme linje:

 
double højde = 12.5; 

er altså det samme som:

 
double højde; 
højde = 12.5; 

Her er et eksempel på en skatteberegning, der viser nogle flere fif:

 
// 
// Skatteberegning (Inspireret af Hallenberg og Sestoft, IT-C, København) 
// 
public class Skatteberegning  
{ 
  public static void main(String[] args)  
  { 
    double indkomst = 300000; 
    double ambi, pension, bundskat; 
 
    ambi = indkomst * 0.08; 
    pension = indkomst * 0.01; 
    indkomst = indkomst - (ambi + pension); 
    bundskat = (indkomst - 33400) * 0.07; 
 
    System.out.println("AMBI: " + ambi); 
    System.out.println("Særlig pensionsopsparing: " + pension); 
    System.out.println("Bundskat: " + bundskat); 
  } 
} 
 
AMBI: 24000.0 
Særlig pensionsopsparing: 3000.0 
Bundskat: 16772.0 

Udregninger sker normalt fra venstre mod højre, men ligesom i den almindelige matematik kan man påvirke udregningsrækkefølgen ved at sætte parenteser:

 
    bundskat = (indkomst - 33400) * 0.07; 

3.2.5. Matematiske funktioner

De matematiske funktioner som sinus, cosinus, kvadratrod osv. kaldes i Java med Math.sin(x), Math.cos(x), Math.sqrt(x) osv., hvor x er en variabel, et fast tal eller et beregningsudtryk.

Vi kan f.eks. lave en tabel over værdierne af kvadratrod-funktionen Math.sqrt() for x=0 til x=10 med programmet (senere, i sektionen om løkker, vil vi se en smartere måde).

 
public class Kvadratrod 
{ 
  public static void main(String[] args)  
  { 
    System.out.println("kvadratroden af 0 er " + Math.sqrt(0)); 
    System.out.println("kvadratroden af 1 er " + Math.sqrt(1)); 
    System.out.println("kvadratroden af 2 er " + Math.sqrt(2)); 
    System.out.println("kvadratroden af 3 er " + Math.sqrt(3)); 
    System.out.println("kvadratroden af 4 er " + Math.sqrt(4)); 
    System.out.println("kvadratroden af 5 er " + Math.sqrt(5)); 
    System.out.println("kvadratroden af 6 er " + Math.sqrt(6)); 
    System.out.println("kvadratroden af 7 er " + Math.sqrt(7)); 
    System.out.println("kvadratroden af 8 er " + Math.sqrt(8)); 
    System.out.println("kvadratroden af 9 er " + Math.sqrt(9)); 
    System.out.println("kvadratroden af 10 er " + Math.sqrt(10)); 
  } 
} 

Resultatet bliver

 
kvadratroden af 0 er 0.0 
kvadratroden af 1 er 1.0 
kvadratroden af 2 er 1.4142135623730951 
kvadratroden af 3 er 1.7320508075688772 
kvadratroden af 4 er 2.0 
kvadratroden af 5 er 2.23606797749979 
kvadratroden af 6 er 2.449489742783178 
kvadratroden af 7 er 2.6457513110645907 
kvadratroden af 8 er 2.8284271247461903 
kvadratroden af 9 er 3.0 
kvadratroden af 10 er 3.1622776601683795 

Her er et program, der udregner længden af den skrå side (hypotenusen) af en retvinklet trekant ud fra længden af dens to lige sider (kateder): kvadratroden af a²+b², hvor a og b er længderne af de to sider:

 
public class Trekant 
{ 
  public static void main(String[] args)  
  { 
    double a, b, hypotenuse; 
    a = 3; 
    b = 4; 
    hypotenuse = Math.sqrt(a*a + b*b); 
    System.out.println("En retvinklet trekant med sider "+a+" og "+b); 
    System.out.println("har hypotenuse "+hypotenuse); 
  } 
} 

Resultatet bliver

 
En retvinklet trekant med sider 3.0 og 4.0 
har hypotenuse 5.0 

Her er et tilsvarende program, der udregner hypotenusen ud fra længden af en af de andre sider og den modstående vinkel. Det gøres ud fra formlen a/sin(v), hvor a er længden af siden, og v er vinklen (i radianer):

 
public class Trekant2 
{ 
  public static void main(String[] args)  
  { 
    double a, v, hypotenuse; 
    a = 10; 
    v = 0.3; // svarer til ca. 34 grader. 
    hypotenuse = a/Math.sin(v); 
    System.out.println("Hypotenusen har længden: "+hypotenuse); 
  } 
} 

Resultatet bliver

 
Hypotenusen har længden: 33.838633618241225 

Ud over de almindelige matematiske funktioner findes også Math.random(), der giver et tilfældigt tal mellem 0 og 0.999999...

3.2.6. Kald af metoder

Math.sqrt(), Math.sin() og de andre matematiske funktioner og andre kommandoer, f.eks. System.out.println(), kaldes under et metoder.

En metode er en navngiven programstump (i nogle computersprog taler man på dette sted om funktioner), der kan gøre et eller andet eller beregne en værdi. F.eks. gør System.out.println() det, at den skriver tekst på skærmen, og Math.sqrt() beregner en kvadratrod. Når en metode nævnes i teksten, skriver vi altid () bagefter, så man kan se, at det er en metode.

Nedenstående linje indeholder et metodekald:

 
hypotenuse = a/Math.sin(v); 

Math.sin er navnet på metoden, og man kalder det v, der står inde i (), for argumentet eller parameteren.

Et metodekald er en nævnelse af en metodes navn efterfulgt af de rigtige parametre. Parametrene er omgivet af parenteser.

Ved et kald uden parametre skal man stadig have parenteserne med. Math.random() skal kaldes uden parametre. Her er et eksempel på et metodekald af Math.random():

 
double tilfældigtTal;  
tilfældigtTal = Math.random(); 

Ved et metodekald kan man indsætte som parameter ethvert udtryk, der giver et resultat af den rigtige type.

Alt, der giver et resultat af den rigtige type, er altså tilladt: Konstanter, variabler, regneudtryk og resultatet af et andet metodekald:

 
double v,x; 
x = Math.sin(0.1);             // konstant som parameter 
x = Math.sin(v);               // variabel som parameter 
x = Math.sin(Math.sqrt(0.3));  // værdi af andet metodekald som parameter 

Vi vil i Kapitel 5 se, hvad der sker, når computeren udfører et metodekald, samt lære, hvordan man kan lave sine egne metoder.

3.2.7. Logiske variable

En boolsk variabel, også kaldet en logisk variabel, kan kun indeholde værdierne sand eller falsk. Den bruges oftest til at huske, om noget er sandt eller ej, men kan også bruges til at repræsentere noget, der kun har to tilstande, f.eks. om en lampe er tændt eller slukket.

Variabeltypen hedder boolean, og den erklæres med f.eks.:

 
boolean detErForSent; 

En boolesk variabel kan kun sættes til værdierne true eller false. F.eks.:

 
detErForSent = false; 

På højre side af lighedstegnet kan stå et logisk udtryk, dvs. et udsagn, der enten er sandt eller falsk, f.eks. "klokken er over 8" (her forestiller vi os, at vi har variablen klokken)

 
detErForSent = klokken > 8; 

Udtrykket klokken > 8 undersøges af Java ved at indsætte værdien af variablen i regneudtrykket og derefter afgøre om udsagnet er sandt. Hvis f.eks. klokken=7, står der 7>8, det er ikke sandt, og detErForSent får værdien false. Hvis klokken=10, står der 10>8, det er sandt, og detErForSent får værdien true.

3.2.8. Opgaver

  1. Skriv et program, som ud fra længde og bredde på et rektangel udskriver rektanglets areal.

  2. Skriv et program, som for ligningen y=3*x*x+6*x+9 udskriver værdierne af y for x=0, x=1 og x=10.

  3. Skriv et program, som omregner et beløb fra dollar til euro (f.eks. kurs 95).