Java. INF1000 : Forelesning 2. Ulike varianter for ulike behov. Java Standard Edition (Java SE) Java:



Like dokumenter
INF1000 : Forelesning 1 (del 2)

Litt Java-historikk. Litt Java-historikk. Ulike varianter for ulike behov. Litt Java-historikk. The Green Team

Forelesning inf Java 1

Forelesning inf Java 1

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

Forelesning inf Java 1

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

Forelesning inf Java 2

Java. Java 3. Ulike varianter for ulike behov

Forelesning inf Java 2

Oversikt. INF1000 Uke 3. Repetisjon Program. Repetisjon Program. Litt repetisjon Program Variabler og Uttrykk Presedens Matematiske funksjoner

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

INF1000 (Uke 4) Mer om forgreninger, While-løkker

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Repetisjon. Mer om forgrening While-løkker

I dag skal vi se på. INF 1000 (uke 2) Variabler, tilordninger og uttrykk. Gruppene starter denne uken! Klart for første oblig

MAT-INF 1100: Obligatorisk oppgave 1

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

Repetisjon Program. INF1000 Uke 2. Repetisjon Program Prosedyren main Alt inne i klasser. Repetisjon Variable og uttrykk

Litt om Javas håndtering av tall MAT-INF 1100 høsten 2004

Oversikt. Uke 2, INF 1000, 30 aug Variable, tilordninger og uttrykk. Repetisjon: Java programmering

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

MAT-INF 1100: Obligatorisk oppgave 1

Forelesning inf Java 4

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Innlesning fra tastatur med easyio. INF1000 høst Vi må først skrive i toppen av programmet: import easyio.*;

2 Om statiske variable/konstanter og statiske metoder.

Hvordan installere Java og easyio på Windows

Jentetreff INF1000 Debugging i Java

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

INF1000 Metoder. Marit Nybakken 16. februar 2004

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Kapittel 1. Datamaskiner og programmeringsspråk. 1.1 Programmering

Forelesning inf Java 5

Forelesning inf Java 5

Løsningsforslag ukeoppg. 2: 31. aug - 6. sep (INF Høst 2011)

Hvordan laste ned og installere Java på Windowsplattformen

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Programmeringsspråket C

Eksempel: Body Mass Index (BMI) Forelesning inf Java 3. Ferdig program (første del) Ferdig program (siste del)

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

Leksjon 2. Setninger og uttrykk

Repetisjon: operatorene ++ og -- Java 5. Nøtt. Oppgave 1 (fra forrige gang) 0 udefinert udefinert. Alternativ 1 Prefiks-operator

Kapittel 1: Datamaskiner og programmeringsspråk

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

for (int i=0; i<3; i++) { for (int j=0; j<5; j++) { System.out.print(i*j); System.out.println();

Beskrivelse av programmeringsspråket Simpila INF Kompilatorteknikk Våren 2012

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

TDT4102 Prosedyreog objektorientert programmering Vår 2016

INF1000: Forelesning 4. Mer om arrayer Metoder

Leksjon 3. Kontrollstrukturer

INF109 - Uke 1b

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab. Rune Sætre / Anders Christensen {satre, anders}@idi.ntnu.

Kom i gang med programmering i Java

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

Eksamensrelevant repetisjonsstoff. Deklarasjoner og variabeltyper. Konstanter

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Obligatorisk oppgave nr. 3 (av 4) i INF1000, våren 2006

Bruk av class Scanner, FileWriter og Formatter som alternativ til EasyIO i INF1000.

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

Programmeringsspråk for nybegynnere. Krav til språket. Krav til språket. Krav til språket

Kanter, kanter, mange mangekanter

Transkript:

Variable og tilordninger Heltall, desimaltall og sannhetsverdier Kompilering og kjøring Utskrift på skjerm Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo INF1000 : Forelesning 2 Java: programmeringsspråk med grammatiske regler, semantikk, osv programsystemet som må være installert for å kompilere og kjøre Java-programmer. Het opprinnelige Oak og skulle brukes for å styre digitale "dingser" som spillkonsoll, digital kabel-tv (video on demand), osv. Dette ble ingen suksess. På denne tiden kom Internett for fullt, og Java-teamet brukte Oak/Java teknologien til å lage en nettleser i 1994 som de kalte WebRunner (etter filmen Blade Runner), senere omdøpt til HotJava. Første nettleser med dynamisk innhold og animasjon! Java er gratis og kan lastes ned fra http://java.sun.com (og fra Ifi-CD en). Versjonen som brukes nå kalles Java 2 plattformen. Java James Gosling 1 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 2 Ulike varianter for ulike behov Java Standard Edition (Java SE) To sentrale begreper: Java SE Runtime Environment (JRE) System for å kjøre kompilerte Javaprogrammer. Java Card Java ME Micro Edition Java SE Standard Edition Java EE Enterprise Edition Java SE Development Kit (JDK) JRE + programmer for å kompilere, feilsøke ( debugge ) og dokumentere Java-programmer. Desktop environments Embedded environments Real-time environments I tillegg til dette kan man legge til egne pakker som gir økt funksjonalitet. I INF1000 brukes det en slik pakke, med navn easyio. INF 1000 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 3 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 4

Java Standard Edition (Java SE) JDK: Java SE Development Kit Installasjon av Java på egen maskin Hvis maskinen din mangler Java, må du gjennom to steg: JRE: Java SE Runtime Environment 1) Installere Java SE Development Kit Kan lastes ned fra Ifi-CD'en eller fra nettet. I siste tilfelle går du til siden http://java.sun.com/javase/downloads/index.jsp og velger nedlasting av JDK 5.0 Update N (N = versjonsnr). 2) Installere INF1000-pakken easyio Dette gir Java tilleggsfunksjonalitet som benyttes i undervisningen. Kan lastes ned fra Ifi-CD'en eller fra nettet. I siste tilfelle går du til siden http://www.universitetsforlaget.no/java Merk: varianten av easyio som ligger på Ifi-CD'en inneholder noen tillegg som du kan komme til å møte i undervisningen. Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 5 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 6 Anta at vi har skrevet et Java-program. Eksempel: Lagre, kompilere, kjøre class MittProgram { int u; u = 2; For å få datamaskinen til å utføre programmet for oss, må vi 1) Lagre programmet som MittProgram.java 2) Kompilere programmet: > javac MittProgram.java Sjekker du innholdet i filkatalogen etterpå, ser du at maskinen har laget en ny fil som heter MittProgram.class (det kompilerte programmet). 3) Kjøre programmet: > java MittProgram Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 7 class MittProgram { public static void main (String [ ] args) {... osv Filnavn: MittProgram.java Kompilert Javaprogram > javac MittProgram.java Java programtekst - filen må ha samme navn som den første klassen på filen Kompilere Êþº¾??-??????<init>?()V?Code?LineNumberTable?main?([Ljava/lang/String;)V? SourceFile?MittProgram.java??? MittProgram?java/lang/Object??????????????????????*?±????????????????????????<±??????????????????? Filnavn: MittProgram.class Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 8

Kjøre Kompilere og kjøre i Unix, Windows, MacOS Êþº¾??-??????<init>?()V?Code?LineNumberTable?main?([Ljava/lang/String;)V? SourceFile?MittProgram.java??? MittProgram?java/lang/Object??????????????????????*?±????????????????????????<±??????????????????? Filnavn: MittProgram.class > java MittProgram Det kompilerte programmet lastes inn i maskinens primærlager og eksekveres Programmet utføres Unix: Start et terminalvindu (xterm-vindu) Endre filområde (directory) til der programfilen ligger For å kompilere: javac MittProgram.java For å kjøre: java MittProgram Windows: Start et kommandovindu ved å gå inn i Start-menyen og velge MS-DOS Prompt (Window 95 og 98) Command Prompt (Windows NT, 2000 og XP) (hvis skjult, se under All Programs / Accessories eller tilsvarende) Resten som for Unix-baserte plattformer. Mac OS: Se nettsiden http://java.sun.com/docs/books/tutorial/getstarted/toc.html Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 9 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 10 Bestanddelene i et Java-program Eksempel Alle programmer må starte med class (det kan stå public foran) Dette er programmets navn og kan velges fritt av oss class MittProgram { public static void main (String[] args) { int u; u = 2; Her slutter innmaten i programmet Her er instruksjonene i programmet Her starter innmaten i programmet Forteller at programmet er kjørbart Mer om denne linjen senere - men merk at vi alltid trenger den Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 11 Instruksjon til en datamaskin (i programmeringsspråket Java): class Kalkulator { public static void main(string [] args) { System.out.println("Beløp: 500 NOK"); System.out.println("Kurs : 6.5"); System.out.println("Beløp: " + 500/6.5 + " USD"); Det er ikke meningen at du skal forstå Java-eksemplet i detalj nå, men merk at: setninger i Java har en helt annen utforming enn setninger i norsk instruksjoner i Java må følge en presis syntaks (=setningsbygning), og en eneste trykkfeil (f.eks. at det står clas i stedet for class) vil gjøre at det ikke blir forstått Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 12

Utskrift på skjermen Hva slags instruksjoner kan vi gi? Skrive ut verdien til en variabel u (int, double, boolean,...) på skjermen i det vinduet programmet startes fra: System.out.print(u); // Skriver ut verdien til u System.out.println(u); // Skriver ut verdien til u og starter ny linje Skrive ut tekst på skjermen: System.out.print("Velkommen til INF 1000"); System.out.println("Velkommen til INF 1000"); Skrive ut tekst i et eget vindu på skjermen: JOptionPane.showMessageDialog(null, "Velkommen til INF 1000"); Begrenset vokabular: Java har et høyst begrenset vokabular, og hver enkelt instruksjon får typisk datamaskinen til å gjøre en veldig enkel ting. Derfor: for å få datamaskinen til å løse komplekse oppgaver må vi i de fleste tilfeller gi veldig mange instruksjoner. Eksempel: en moderne kopimaskin kan inneholde programmer med hundretusener av instruksjoner I dette kurset kommer vi ikke så langt, men vi skal etterhvert lage programmer med mange hundre linjer Hva slags instruksjoner kan vi så gi? Denne krever at det i starten av programmet (før linjen med class) står import javax.swing.*; Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 13 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 14 Eksempel: ta vare på og regne med tall Variabler Sette av (reservere) plass i datamaskinens hukommelse til et heltall: int lengde; slutt på instruksjonen sett av plass til et heltall (engelsk: integer) Fylle plassen med en verdi (et tall): lengde = 14; Avlese/bruke verdien: gi plassen navnet "lengde" int svar; svar = lengde * 2; leses "settes lik" eller "gis verdien" Når vi har gitt instruksjonen int lengde; så kan vi endre verdien på denne plassen så mange ganger vi vil, f.eks.: lengde = 14; lengde = 434; lengde = lengde + 2; lengde = lengde; Siden verdien kan variere over tid, kalles lengde en variabel. Hva skjer egentlig når vi skriver lengde = lengde + 2;? I detalj: 1. Verdien som ligger i variabelen lengde hentes fram (f.eks. 434) 2. En ny verdi regnes ut ved å legge til 2 (434 + 2 = 436) 3. Variabelen lengde gis den nye verdien (436) Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 15 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 16

Variabel-deklarasjoner Variabeldeklarasjoner Instruksjoner av typen int alder; int vekt; int personnummer; kalles variabel-deklarasjoner. Vi kunne erstattet de tre instruksjonene ovenfor med: int alder, vekt, personnummer; (NB: komma mellom variablene) Normalt er det ryddigere å bruke den første varianten, men du møter begge i kurset. Variable kan deklareres hvor som helst i et program, og de kan endres hvor som helst etter at de er deklarert. Variable har ingen verdi rett etter en deklarasjon: int lengde; lengde = lengde + 1; // Ulovlig! Vi kan gi variable en verdi når vi deklarerer dem: int lengde = 4; lengde = lengde + 1; // Lovlig Vi kan også vente med å gi en variabel verdi: int lengde;... lengde = 4; lengde = lengde + 1; // Lovlig Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 17 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 18 Hvis du glemmer å initialisere en variabel Avsluttende om variable Forsøk på å kompilere et program med en slik feil: C:\Eksempel.java:4: variable lengde might not have been initialized lengde = lengde + 1; ^ 1 error Tool completed with exit code 1 Vanlig feil, så lær deg å kjenne igjen denne feilmeldingen. Unngå i størst mulig utstrekning å samle mange variabeldeklarasjoner på en linje: int år, måned, dag, alder; Uoversiktlig int år; // Fødselsår Oversiktlig int måned; // Fødselsmåned (1-12) int dag; // Fødselsdato (1-31) int alder; // Alder i antall år Deklarer variable først når du trenger dem ingen grunn til å samle alle variabeldeklarasjoner ett sted med mindre de naturlig hører sammen. Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 19 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 20

Fullstendige programeksempler Eksempel 1: kompileringsfeil Vi skal nå se på endel programeksempler. Noen av programmene gir kompileringsfeil, dvs vi får en feilmelding når vi forsøker å kompilere programmet med javac. Noen av programmene gir kjørefeil, dvs vi får en feilmelding når vi forsøker å kjøre programmet med java. Noen av programmene virker som de skal. NB: alle som programmerer opplever fra tid til annen å få kompileringsfeil og kjørefeil. Det er nyttig å lære seg å lese feilmeldingene man får, som ofte (men ikke alltid!) gir en klar pekepinn om hva man har gjort feil. class IkkeRiktig { double x; int y; x = 2; y = x; // Her prøver vi å sette y lik et desimaltall FEIL UNDER KOMPILERING IkkeRiktig.java:6: possible loss of precision found : double required: int y = x; ^ 1 error Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 21 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 22 Eksempel 2: kompileringsfeil Eksempel 3: kompileringsfeil class MerFeil { boolean b; b = 2; // Her prøver vi å sette b lik et heltall class EndaMerFeil { int x, y; y = x; // Her prøver vi å sette y lik en udefinert verdi FEIL UNDER KOMPILERING MerFeil.java:4: incompatible types found : int required: boolean b = 2; ^ 1 error Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 23 FEIL UNDER KOMPILERING EndaMerFeil.java:4: variable x might not have been initialized y = x; ^ 1 error Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 24

Eksempel 4: kjørefeil class Kjorefeil { int x = 3, y = 0, z; z = x / y; // Her prøver vi å dele på null FEIL UNDER KJØRING Exception in thread "main" java.lang.arithmeticexception: / by zero at Kjorefeil.main(Kjorefeil.java:4) Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 25 Instruksjoner av typen alder = 3; kalles variabel-tilordninger (eller bare tilordninger). Generell form: variabel = uttrykk; her må det stå navnet på en variabel som er deklarert Variabel-tilordninger her må det stå en verdi eller et regneuttrykk. To eksempler: 345 (56+36) * 14-3 + 53 Først utføres regnestykket på høyresiden av =, og deretter settes variabelen på venstre side av = lik den utregnede verdien Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 26 Vi kan ha mange variable Ting å passe på I et program kan vi deklarere så mange variable vi vil, f.eks. int alderkari; int alderper; int alderola; int sumalder; alderkari = 20; alderper = 10 + alderkari; alderola = 10 + alderkari + alderper; sumalder = alderkari + alderper + alderola; Hvilken verdi har de fire variablene når alle instruksjonene ovenfor er utført? alderkari: alderper: alderola: sumalder: 20 30 60 110 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 27 Vi kan ikke deklarere flere variable med samme navn. Dette er ulovlig: int alder; int alder; (Ulovlig - variabelen alder er allerede deklarert!) En variabel kan hete hva som helst, men bruk bare bokstaver og tall, og begynn alltid navnet med en bokstav. Eksempler: int etveldiglangtvariabelnavn; (Denne en lovlig) int år2001; (Denne er også lovlig) int 2001år; (Denne er ikke lovlig) Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 28

Eksempel: bytte om verdien til variable Løsning Anta at vi har disse instruksjonene: int første, andre; første = 65; andre = 77; Hvordan kan vi bytte om verdiene i de to variablene? Vi forsøker dette: første = andre; andre = første; Vil dette virke? Når vi har utført... første = 65; første: Se boksen til høyre andre = 77; andre : første = andre; første: andre : så er verdien til: andre = første; første: andre : 65 77 77 77 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 29 77 77 Problemet var at vi mistet den opprinnelige verdien til første når vi utførte første = andre; Vi kan løse problemet ved å ta vare på den opprinnelige verdien i en tredje variabel. Alle instruksjonene: int første, andre, hjelpevar; første = 65; andre = 77; hjelpevar = første; første = andre; andre = hjelpevar; Vi sjekker at det virker Når vi har utført... så er verdien til: første = 65; første: 65 andre = 77; andre : 77 hjelpevar: --- hjelpevar=første; første = andre; første: 77 andre: 77 hjelpevar: 65 andre = hjelpevar; første: andre : hjelpevar: Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 30 77 65 65 Desimaltall Variable av typen int kan bare holde heltallsverdier (...-2, -1, 0, 1, 2,...) Hvis vi ønsker å lagre desimaltall (også kalt flyttall) kan vi bruke double: double pi = 3.14; double radius = 0.332; double omkrets = 2 * pi * radius; Vi kan godt gi et heltall som verdi til en double-variabel: double radius = 2;...men inne i datamaskinen vil det bli lagret med desimaler: 2.0000... Eksempel: int radius = 2; double nyradius = radius; (Tallet 2 som heltall) (Tallet 2 som desimaltall) Datatyper vi kommer til å benytte Datatype Beskrivelse Eksempel int heltall int k = 3; double desimaltall double x = 3.14; boolean sannhetsverdi boolean b = true; char tegn char c = '@'; String tekst String s = "Hei på deg"; + noen flere (short, long, byte, float) Desimaltall kan angis på flere måter: -10.5.435 15. 1.23e5 1.23e+4 1.15e-3 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 31 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 32

De numeriske datatypene Sannhetsverdier int og double er eksempler på numeriske datatyper Java har ialt seks numeriske datatyper: Datatype byte short int long float double Lovlige verdier {-128, -127,..., 127 {-32768,..., 32767 {-2 31,..., 2 31-1 {-2 63,..., 2 63-1 (-3.4e38, 3.4e38) (-1.7e308, 1.7e308) Antall signifikante siffer er 6-7 med float og 14-15 med double. I praksis er det disse to du trenger i INF 1000 I programmering har vi ofte behov for å vite om noe er sant (= true) eller usant (= false), f.eks. om det er sant eller usant at x > 0. Derfor finnes det en egen variabeltype som bare kan holde de to verdiene true og false. Denne typen heter boolean: boolean b; boolean pos; b = true; int u = -3; pos = (u > 0); Hva skjer egentlig i siste linje i det høyre eksemplet ovenfor? I detalj: Datamaskinen "regner ut" verdien til (u > 0). Siden u > 0 er usant, blir verdien til (u > 0) lik false. Til slutt blir variabelen pos satt lik den utregnede verdien Derfor har pos verdien false når alle instruksjonene er utført. Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 33 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 34 Aritmetiske og logiske uttrykk Utregning av sammensatte uttrykk Aritmetiske uttrykk: 2 * (3+4) / 1.5 2 / (12 + 34-2.3) Logiske uttrykk: Uttrykket har verdien true hvis...og verdien false ellers x < y x mindre enn y x <= y x mindre enn eller lik y x = = y x lik y x!= y x ikke lik y x > y x større enn y x >= y x større enn eller lik y! (x < y) ikke x mindre enn y b1 && b2 både b1 og b2 sann b1 b2 b1 eller b2 (eller begge) sann Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 35 * og / binder sterkere enn + og -: 2 + 5 * 4-3 er lik 2 + (5*4) - 3 && binder sterkere enn : b1 b2 && b3 er lik b1 (b2 && b3) Både && og binder sterkere enn = = : b1 && b2 = = b3 b4 er lik (b1 && b2) = = (b3 b4) Punktene ovenfor er eksempler på presedensregler, dvs regler for hvilke operatorer som har presedens (fortrinn, førsterett) ved utregning av sammensatte uttrykk. F.eks. har * presedens over +. Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 36

Oppgave Greit å vite boolean b1, b2; double x, y; int z; x = 45.33; y = x + 1; z = 0; b1 = (x < y) && (z == 0); b2 = false b1; Hva er verdien til b1 og til b2 etter at setningene over er utført? b1: true b2: true Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 37 Multiplikasjon må alltid angis eksplisitt med *: int prod = 10 a; // feil!! int prod = 10 * a; // riktig Det er forskjell på = og = = : = brukes for å sette verdien til en variabel = = brukes for å sammenlikne to verdier Hvis vi har variabelen boolean b så er det ingen forskjell på b == true b Ekstra parenteser kan øke leseligheten for mennesker: b = x == y; betyr det samme som b = (x == y); Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 38 Kommentarer i programmer For å lage programmene mer forståelige, legger vi inn kommentarer i programteksten Kommentarer oversettes ikke: kompilatoren hopper over dem To typer kommentarer: // Her er en kommentar som varer ut linja Eksempel: arealberegning class Areal { int radius = 4; double areal = 3.14 * radius * radius; /* Her er en kommentar som varer helt til hit */ System.out.println(areal); Gode programmer har kommentarer, men ikke på hver linje bruk kommentarer når det er ting dere ønsker å rette oppmerksomheten mot, f.eks. sentrale punkter i programmet eller spesielt vanskelige ting. Det er en forutsetning at dere kommenterer programmene dere leverer som besvarelse på de obligatoriske oppgavene (oblig 2-4). System.out.println(areal) skriver her ut på skjermen verdien til variabelen areal KOMPILERING OG KJØRING > javac Areal.java > java Areal 50.24 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 39 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 40

Gangetabell Konvertering class Gangetabell { System.out.println(1 * 8); System.out.println(2 * 8); System.out.println(3 * 8); System.out.println(4 * 8); System.out.println(5 * 8); KOMPILERING OG KJØRING > javac Gangetabell.java > java Gangetabell 8 16 24 32 40 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 41 Når det er nødvendig vil Java automatisk (implisitt) konvertere heltall til desimaltall, som f.eks. i disse tre tilfellene: a) double x = 7; b) int a = 15; double x = a; c) double x = (7 + 14) * 3-12; Derimot vil Java ikke automatisk konvertere desimaltall til heltall, siden det generelt fører til en endring i verdien: a) int a = 7.15; // Ikke lov!! b) double x = 15.6; int a = x; // Ikke lov!! c) int a = 3.14 * 7 / 5; // Ikke lov!! Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 42 Konvertering forts. Dersom vi virkelig ønsker å konvertere et desimaltall til et heltall, må vi eksplisitt be om det: a) int a = (int) 7.15; // Lovlig! b) double x = 15.6; int a = (int) x; // Lovlig! c) int a = (int) 3.14 * 7 / 5; // Lovlig! I noen tilfeller - når tallene allikevel er hele - spiller det ingen rolle om man bruker int eller double. Så hvorfor ikke alltid bruke double? Hvorfor ikke alltid bruke double? Mens regning med heltall alltid er eksakt, er regning med desimaltall ikke det - maskinen kan gjøre avrundingsfeil, slik som her: double x = 0.1; double y = (x + 1) - 1; // Nå er verdien til x == y false! Verdiene til x og y er nesten like, men fordi det er en forskjell i et av desimalene langt ute blir x==y false. Slike avrundingsfeil betyr ofte veldig lite, men du kan ikke stole på at alle desimalene er korrekte når du regner med double. Det tar mer plass i hukommelsen å holde en double-verdi enn å holde en int-verdi. Det kan ta mer tid å gjøre beregninger med desimaltall enn med heltall. Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 43 Konklusjon: når det er naturlig å bruke heltall bruker du int og når det er naturlig å bruke desimaltall bruker du double! Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 44

Avrunding Heltallsdivisjon Konvertering fra desimaltall til heltall involverer normalt en avrunding. class Avrunding { double x = 0.53; // Avrund nedover: System.out.println((int)Math.floor(x)); // Avrund oppover: System.out.println((int)Math.ceil(x)); Java konverterer ikke fra heltall til desimaltall når to heltall adderes, subtraheres, multipliseres eller divideres: 234 + 63 : heltall (int) 235-23 : heltall (int) 631 * 367 : heltall (int) 7 / 2 : heltall (int) Legg spesielt merke til siste punkt ovenfor: // Avrund til nærmeste heltall: System.out.println((int)Math.round(x)); Test programmet Når to heltall divideres på hverandre i Java blir resultatet et heltall, selv om vanlige divisjonsregler tilsier noe annet. Dette kalles heltallsdivisjon, og resultatet er det samme som om vi fulgte vanlige divisjonsregler og så avrundet nedover til nærmeste heltall. Dvs (7/2) = = (int) (7.0/2.0) = = 3. Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 45 Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 46 Konkatenering av tekst Oppgave Det er ofte nyttig å slå sammen (=konkatenere) flere tekstbiter til en stor tekstbit før vi skriver ut på skjerm. Det kan vi gjøre i Java med + slik som i dette eksemplet: class SkrivPaaSkjerm { double hastighet = 90.5; double avstand = 360.2; System.out.println("Kjørelengde: " + avstand + " km"); System.out.println("Hastighet: " + hastighet + " km/t"); System.out.println("Kjøretid: " + avstand/hastighet + " timer"); NB: husk at + også brukes til å addere tall. Det er forskjell på System.out.println("2" + "3"); (utskriften blir: 23) System.out.println("2 + 3"); (utskriften blir: 2 + 3) System.out.println(2 + 3); (utskriften blir: 5) Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 47 Avgjør i hvert tilfelle hvilken datatype resultatet har: Uttrykk 2 + 6 * 3 14.2 + 6 3/2 + 4 "Vekt: " + 25 + " kg" "" + 17.4 (int) 5.3 + 3.25 Datatype int double int String String double Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 48

Hva er vitsen med class? En setning av typen class { <...masse rart...> kalles en klassedeklarasjon (eller bare klasse). Tenk på en klasse som en samling data (tall, tekst, bilder, osv) og operasjoner som vi ønsker å kunne utføre på dataene. Senere i kurset kommer hvert program til å bestå av mange klasser. Hver klasse har sitt ansvarsområde: å utføre visse oppgaver, håndtere visse typer data, eller begge deler. Dette gjør bl.a. programmene oversiktlige og gjør det lettere å bruke biter av programmet på nytt i andre sammenhenger. Ole Chr. Lingjærde Institutt for informatikk 29. september 2006 49