INF1000 Variable Marit Nybakken marnybak@ifi.uio.no 27. januar 2004 Hva er en variabel Datamaskinens minne (eller hurtiglager) består av en masse celler som kan inneholde verdier. Hver av cellene har en adresse. En variabel i et program refererer til en eller flere slike celler. I programmet kan vi legge inn verdier eller hente ut verdier av disse cellene. Siden det er svært upraktisk å måtte gå rundt å huske på minneadresser, gir vi i stedet variablene navn. Når vi lager variablene, må vi samtidig si hva de skal inneholde, f.eks. heltall, flyttall eller bokstaver. Typen sier hva slags verdier vi har lov til å legge inn i variabelen, og bestemmer samtidig hvor stor variabelen skal være. Et flyttall tar for eksempel større plass i minnet enn et heltall. Ok, men hva skal vi med dem? Tor skal spare taxiregning og går hjem fra byen. Han ønsker å finne ut hva ganghastigheten hans er i beruset tilstand. Han finner ut at det er 4.23 km fra sentrum og hjem, og han bruker i alt 48 minutter. Han tok seg imidlertidig en tur innom 7-11 for å kjøpe løkpølse med ekstra løk, og brukte 4 minutter på dette. 1
Figur 1: En int-, en double- og en char-variabel class TorPaaTur { public static void main(string [ ] args) { double avstand; // veien hjem int totaltid; // tid brukt i alt int tidpå711; // tid brukt på 7-11 avstand = 4.23; totaltid = 48; 10 tidpå711 = 4; int tid = totaltid tidpå711; double snitthastighet = avstand / ((double)tid / 60); System.out.println("Tor har en hastighet på " + snitthastighet + " km/t"); Her får vi det samme svaret hver gang vi kjører programmet. Kunne vi ikke bare gjort det slik? class TorPaaTur { public static void main(string [ ] args) { double snitthastighet = 4.23 / ((double) 44 / 60); 2
System.out.println("Tor har en hastighet på " + snitthastighet + " km/t"); Programmet fungerer jo helt likt, og vi slipper å tøyse med en masse variable. Det er flere grunner til at den første løsningen er bedre. For det første så forteller det mer om selve problemet, fordi variabelnavnene sier litt om hva vi prøver å regne ut. Et annet, og viktigere poeng, er at vi snart skal lære hvordan vi kan variere verdiene for avstand, total tid og tid brukt på 7-11 for hver gang programmet kjører, ved å lese inn disse verdiene fra tastatur. Deklarasjon, initialisering og bruk Deklarere variable Før vi kan bruke en variabel i programmet må vi lage den, eller deklarere den. Å deklarere en variabel er å si hvilket navn variabelen skal ha og hva slags type verdier den skal kunne inneholde. Generelt sett foregår dette slik: type variabelnavn; For eksempel boolean fortsett; double a, b; int antkjeksiskuffen; Det blir da satt av plass til variabelen i minnet og navnet brukes for å aksessere denne plassen. Variablene kan egentlig deklareres hvor som helst i programmet, men deklarasjonen må komme før vi tar den i bruk. Hvis ikke, får vi en slik feil når vi prøver å kompilere programmet: class Feil { 3
public static void main(string [ ] args) { variabelsomikkeerdeklarert = 10; D:\komp\variable>javac Feil.java Feil.java:3: cannot resolve symbol symbol : variable variabelsomikkeerdeklarert 10 location: class Feil variabelsomikkeerdeklarert = 10; ^ 1 error Vi har mange forskjellige typer variable, her følger noen av de vanligste: int heltall short heltall, ikke så store long heltall, veldig store float flyttall double flyttall, større presisjon char enkeltbokstaver boolean true eller false Variablnavn skal alltid ha liten forbokstav. Består navnet av flere ord (IKKE stavelser), kan forbokstaven i hvert påfølgende ord være stor. Orddelingsfeil på denne måten slås hardt ned på. Det heter f.eks. ikke sirkelareal, men sirkelareal. I min verden. Initialisere variable Hvis vi skal bruke en variabel i et regnestykke, skrive den ut på skjerm eller gjøre noe som helst annet med den må den ha fått en verdi først. Det å gi en variabel en startverdi kalles å initialisere variabelen. 4
Se hva som skjer når vi prøver å kompilere dette programmet, der en variabel skrives ut på skjerm uten å ha fått en verdi først: class Feil2 { public static void main(string [ ] args) { int variabelsomikkeharenverdi; System.out.println(variabelSomIkkeHarEnVerdi); D:\komp\variable>javac Feil2.java Feil2.java:4: variable variabelsomikkeharenverdi might not have been initialized 1 error System.out.println(variabelSomIkkeHarEnVerdi); ^ 10 Vi kan deklarere og initialisere på samme linje: double a = 0, b = 2, c; int p = 55; String s = Tjoho ; Bruk av variable Vi tilordner en variabel en verdi når vi setter variabelnavnet lik en verdi eller et uttrykk. Da legger vi verdier inn i variabelen. variabelnavn = uttrykk; antallelefanter = 1 + (3-1); teksten = antallelefanter + elefanter kom marsjerende ; marsjhastighet = 3.1 * 10.2; veienvarsjarmerende = true; Når variabelen står på andre siden av likhetstegnet eller blir skrevet ut på skjermen, hentes verdien fra variabelen ut og settes inn i stedet for variabelen. System.out.println( Antall elefanter er nå + antallelefanter); 5
antallelefanter = antallelefanter + 1; System.out.println(antallElefanter + kom marsjerende ); Hver gang variabelen nevnes, hentes verdien ut av minnet og settes inn i uttrykket. Kommentarer Kommentarer kan settes inn på to måter /* Jeg er en kommentar * som går over flere linjer * < denne er ikke nødvendig, men det ser fint ut */ // Jeg kan bare bruke en linje Vi kommenterer for å gjøre programmene lettere å lese, og for å forklare kompliserte deler der det kanskje ikke er helt åpenbart hva som skjer. Slik gjør man det ikke: int a; // Deklarerer en variabel a (NEI, det kan vi godt se) // Skriver ut variabelen resultat på skjerm (NEI, helt åpenbart) System.out.println("Resultat: " + resultat); /* Deler her variabelen totalnedbør på antalldager fordi gjennomsnittlig * nedbør hver dag gis av denne formelen. I variabelen totalnedbør har jeg * tidligere summert totalt regn for mai og totalt regn for juni, slik at 10 * totalnedbør kan inneholde summen av alt regnet i både mai og juni. * antalldager er summen av alle dagene som det regnet på forsommeren, altså * i mai og juni. Lissom. * NEI! Dette gjør det ikke akkurat lettere å lese programmet */ double gjsnitt = totalnedbør / antalldager; 6
Man kommenterer heller for noen som kan lese programmer noenlunde greit fra før av, og som ønsker å kjapt se hvor de forskjellige delene av programmet starter og hva de gjør. Mer om dette senere (når vi lager store nok programmer til at det faktisk gir mening å kommentere) Typekonvertering I blant har vi bruk for å konvertere en type til en annen type. Konverter flyttall til heltall double flyttall = 1.23456; int strykdesimaler = (int) flyttall; int rundav = (int) (Math.round(flyttall)); Konvertere tekst til tall String s = 114323 ; int tall = Integer.parseInt(s); double tall = Double.parseDouble(s); Konvertere tall til tekst int nokettall = 904582; String teksttall = + nokettall; Konvertere tekst til store eller små bokstaver String tekst = Gud og Fedrelandet ; String stortekst = tekst.touppercase(); String litentekst = tekst.tolowercase(); Konvertere enkeltbokstaver til store og små bokstaver 7
char c = P ; char liten = Character.toLowerCase(c); char stor = Character.toUpperCase(liten); Boolske verdier Variabeltypen boolean er litt spesiell, den kan bare inneholde verdiene true eller false og brukes når vi har situasjonen sant eller usant, eller enten-eller. Vi har foreløpig ikke veldig mye bruk for denne variabeltypen, men den blir svært nyttig når vi etterhvert skal få programmene til å gjøre en ting i det ene tilfellet og en annen ting i et annet tilfelle. Vi kan sette en boolsk variabel til true eller false direkte, eller vi kan gi den verdi ved å sette den lik et boolsk uttrykk. Et boolsk uttrykk er som oftest en sammenligning mellom to verdier som evaluerer til enten true eller false. Verdiene kan være variable eller tall som vi setter direkte inn. Her er en liste over sammenligningsoperatorer med eksempler. == x == y lik!= x!= y ulik < x < y mindre enn > x > y større enn <= x <= y mindre enn eller lik >= x >= y større enn eller lik && (x < y) && (y < 1) OG (begge ledd må være sanne) (x < y) (x < z) ELLER (en av leddene må være sanne)!!(x < y) IKKE (snur sannhetsverdi til uttrykket) 10 Vi kan sette en boolsk variabel lik hvert av uttrykkene i den midterste kolonnen. Avhengig av hva x, y og z er, får den boolske variabelen verdien true eller false. boolean erxstørreenny = x > y; boolean erantallkatterfærreennti = antallkatter < 10; boolean harjegtikronerilomma = antallpengerilomma == 10; boolean harjegnokpengertilbanen = (antallpengerilomma >= 10) && (minalder < 16); 8