INF1000 : Forelesning 2

Like dokumenter
Fullstendige programeksempler. INF1000 : Forelesning 2. Eksempel 1. Eksempel 2. Vi skal nå se på endel programeksempler.

De numeriske datatypene. INF1000 : Forelesning 2. Sannhetsverdier. Desimaltall. int og double er eksempler på numeriske datatyper

INF1000 : Forelesning 2

Mer om uttrykk, terminal I/O, forgreninger. Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo

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

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

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

Java 3. Litt om Java-teknologien. Fortsette innføringen i språket Java Idag: variable, uttrykk, lese fra terminal, forgreninger. 31.

Java. Java 3. Ulike varianter for ulike behov

Oversikt. INF1000 Uke 3. Underveisevaluering. Spørsmål

Forelesning inf Java 2

INF 1000 høsten 2011 Uke 3 6. september

Innhold uke 3. INF 1000 høsten 2011 Uke 3 6. september. Uttrykk. Variabel: En plass i hukommelsen

Forelesning inf Java 2

Forelesning inf Java 2

Java. INF1000- uke 3. Ulike varianter for ulike behov

Java 4. Mer om easyio Mer om forgreninger Løkker. 7. september 2004

Når du løser oppgaver. INF1000 : Forelesning 3. Eksempel: Celcius og Fahrenheit. Hvilke data beskriver problemet?

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

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

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

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

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

INF1000 høst Forelesning 2: Innlesning fra terminal Boolean-variable if-setninger Løkker Litt mer om heltall: divisjon og modulo Arrayer

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

INF1000 Uke 3. Innlesning fra terminal. Uttrykk og presedens. Oversikt. Litt repetisjon Blokker og forgreininger

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

INF1000 Uke 4. Innlesning fra terminal. Uttrykk og presedens. Oversikt

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

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

Eksempel: Body Mass Index (BMI)

INF1000 : Forelesning 3

Body Mass Index (BMI) INF1000 : Forelesning 3. Ferdig program (forts.) Ferdig program

Oversikt. INF1000 Forelesning 6. Variable Deklarasjon. Variabel en plass i lageret int radius;

Forelesning inf Java 3

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

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

MER OM ARRAYER. INF1000: Forelesning 4. Anta at vi ønsker å lagre en liste med navnene på alle INF1000-studentene:

INF1000: Forelesning 4. Mer om arrayer Metoder

Blokker. Uke 4, INF 1000, 13 sept Løkker og arrayer. Eksempel. Deklarasjoner inne i blokker. Institutt for Informatikk Universitet i Oslo

Datatyper vi kommer til å benytte. Forelesning inf Java 2. Vi kan ha mange variable. Ting å passe på

Ole Christian Lingjærde, 12. september 2013

Forelesning inf Java 4

INF1000 : Forelesning 5

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

INF1000 : Forelesning 4

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

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

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

Forelesning inf Java 3

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

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. 3: sep (INF Høst 2011)

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

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

Forelesning inf Java 5

Forelesning inf Java 5

INF1000 : Forelesning 1 (del 2)

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

Jentetreff INF1000 Debugging i Java

Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder

Forelesning inf Java 5

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

Praktisk informasjon. Repetisjon: While-løkker. I dag. INF1000 (Uke 5) Mer om løkker, arrayer og metoder. Oblig 2 er lagt ut

Java 6. Eksempel med to-dimensjonal array Filbehandling Tekster

Repetisjon INF 1000 våren 2006

Oversikt. INF1000 Uke 6. Objekter, pekere og null. Lese og skrive fra/til fil. Litt om objekter, pekere og null Filer og easyio. Litt mer om tekster

Java-program. INF1000 høst Numeriske typer. long og float

INF1000 høst 2010 Forelesning 3: Avrunding av elementær innføring

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

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Praktisk informasjon. I dag. Repetisjon: While-løkker. INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Blokker og metoder INF1000 (Uke 6) Metoder

Oversikt. INF1000 Uke 4. Logisk uttrykk Beregne uttrykk. Eksempel (Feil sist) Logisk uttrykk. Litt repetisjon En feil i forrige forelesning

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

som jobbet nærmest døgnet rundt i 18 måneder i Menlo Park i California for å forberede den neste bølgen innen computing.

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

Mål for INF1000. Repetisjon INF 1000 våren Representasjon av data. Programvareutvikling - oversikt

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

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

MAT-INF 1100: Obligatorisk oppgave 1

løsningsforslag-uke5.txt

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

Ukeoppgaver 2: sep (INF Høst 2010)

INF1000 (Uke 6) Mer om metoder, tekster

MAT-INF 1100: Obligatorisk oppgave 1

UNIVERSITETET I OSLO

INF1000 Uke 5. Litt om objekter, filer med easyio, tekst

Rep: Metoder. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. 3 typer variable: Klassevariable. Java-programmene så langt i kurset:

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

Eksamensrelevant repetisjonsstoff. Deklarasjoner og variabeltyper. Konstanter

Bruk av class Scanner, split(), FileWriter og Formatter som alternativ til easyio i INF1000.

Forelesning inf Java 1

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Velkommen til INF1000 høst 2010

Første forelesning! Mål for INF1000. Kursevaluering. Velkommen til INF1000 høst 2010

Transkript:

INF1000 : Forelesning 2 Enkle feilsituasjoner Beregning av matematiske og logiske uttrykk Terminal I/O Forgreninger Ole Christian Lingjærde Biomedisinsk forskningsgruppe Institutt for informatikk Universitetet i Oslo 1

Fullstendige programeksempler 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. Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 2

Eksempel 1 class Eksempel1 { public static void main (String [] args) { double x; int y; x = 2; y = x; // Her prøver vi å sette y lik et desimaltall FEIL UNDER KOMPILERING Eksempel1.java:6: possible loss of precision found : double required: int y = x; ^ 1 error Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 3

Eksempel 2 class Eksempel2 { public static void main (String [] args) { boolean b; b = 2; // Her prøver vi å sette b lik et heltall FEIL UNDER KOMPILERING Eksempel2.java:4: incompatible types found : int required: boolean b = 2; ^ 1 error Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 4

Eksempel 3 class Eksempel3 { public static void main (String [] args) { int x, y; y = x; // Høyresiden inneholder en variabel som ikke er initialisert FEIL UNDER KOMPILERING Eksempel3.java:4: variable x might not have been initialized y = x; ^ 1 error Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 5

Eksempel 4 class Eksempel4 { public static void main (String [] args) { int x = 3; int y = 0; int z = x / y; // Heltallsdivisjon med null FEIL UNDER KJØRING Exception in thread "main" java.lang.arithmeticexception: / by zero at Eksempel4.main(Eksempel4.java:5) Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 6

Eksempel 5 class Eksempel5 { public static void main (String [] args) { double x = 3.0; double y = 0.0; double z = x / y; System.out.println(z); KOMPILERING OG KJØRING > javac Eksempel5.java > java Eksempel5 Infinity Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 7

Eksempel 6 class Areal { public static void main (String [] args) { double radius = 4.0; double areal = 3.14 * radius * radius; System.out.println(areal); KOMPILERING OG KJØRING System.out.println(areal) skriver her ut på skjermen verdien til variabelen areal > javac Areal.java > java Areal 50.24 Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 8

Eksempel 7 Anta at vi har utført disse instruksjonene: int første = 65; int andre = 77; Hvordan kan vi bytte om verdiene i de to variablene? Vi forsøker dette: første = andre; andre = første; Når vi har utført... Vil dette virke? første = 65; Se boksen til høyre så er verdien til: første: andre = 77; andre : første = andre; første: andre : 65 77 77 77 andre = første; første: andre : 77 77 Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 9

Løsning 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... første = 65; første: andre = 77; andre : hjelpevar: hjelpevar=første; første = andre; så er verdien til: første: andre: hjelpevar: andre = hjelpevar; første: andre : hjelpevar: Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 10 65 77 --- 77 77 65 77 65 65

Konvertering 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 26. august 2008 11

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? Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 12

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. 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 26. august 2008 13

Avrunding Konvertering fra desimaltall til heltall involverer normalt en avrunding. class Avrunding { public static void main (String [] args) { double x = 0.53; // Avrund nedover: System.out.println((int)Math.floor(x)); // Avrund oppover: System.out.println((int)Math.ceil(x)); // Avrund til nærmeste heltall: System.out.println((int)Math.round(x)); Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 14

Heltallsdivisjon 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: 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 26. august 2008 15

Konkatenering av tekst 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 { public static void main (String [] args) { 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 26. august 2008 16

Oppgave 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 26. august 2008 17

Aritmetiske og logiske 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 26. august 2008 18

Utregning av sammensatte uttrykk * og / binder sterkere enn + og -: 2 + 5 * 4-3 / 2 + 1 er lik 2 + (5*4) - (3/2) + 1 && 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 26. august 2008 19

Oppgave 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: b2: true true Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 20

Greit å vite 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 26. august 2008 21

Kommentarer i programmer For å lage programmene mer forståelige, kan vi legge inn kommentarer i programteksten. Disse ignoreres av kompilatoren. To typer kommentarer: // Her er en kommentar som varer ut linja /* Her er en kommentar som varer helt til hit */ 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. I obligatorisk oppgave 2, 3, og 4 må programmene du leverer være kommentert for å bli godkjent. Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 22

Når du løser oppgaver 1. Bestem programmets oppførsel sett utenfra: Hva skal være inndata (input) til programmet? Hvordan skal programmet få tak i inndataene? Hva skal være utdata (output) fra programmet? Hvordan skal utdataene presenteres for brukeren? 2. Avgjør hvordan du skal transformere inndata til utdata: Hvordan skal inn- og utdata representeres (lagres) i programmet? Reduser transformasjonen inndata -> utdata til en sekvens av trinn hvor hvert trinn gjør en enkel ting med dataene og hvor hvert trinn er enkelt å programmere. 3. Skriv programkode (og test løsningen). Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 23

Eksempel: Celcius og Fahrenheit Problem: I Norge angis vanligvis temperaturer i Celcius (C), mens man bl.a. i USA benytter Fahrenheit (F). F.eks. svarer 0 C til 32 F. Lag et program som lager en tabell som nedenfor (og med temperaturer i Fahrenheit fylt inn): Celcius Fahrenheit -10.0... 0.0... 37.0... 100.0... Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 24

Hvilke data beskriver problemet? Inndata: De fire Celcius-temperaturene -10, 0, 37 og 100 (desimaltall) Vi tenker oss at temperaturene er gitt når vi skriver programmet. Senere skal vi se hvordan programmet kunne ha lest inndata fra terminal (fra brukeren). Utdata: De tilsvarende (konverterte) Fahrenheit-temperaturene (desimaltall) Skal skrives ut på skjermen i en tabell Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 25

Transformere inndata til utdata Vi må kjenne formelen for å regne om fra Celcius til Fahrenheit. La TC = Temperatur i Celcius TF = Temperatur i Fahrenheit Vi finner i et oppslagsverk at omregningsformelen er TF = 9 * TC / 5 + 32 Dermed blir fremgangsmåten slik: TC (input) TF = 9*TC/5+32 (algoritme) TF (output) Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 26

Programskisse class TemperaturKonvertering { public static void main (String[] args) { <deklarasjoner> <Skriv overskrift> <sett TC lik -10> <regn ut TF> <skriv ut> <sett TC lik 0> <regn ut TF> <skriv ut> <sett TC lik 37> <regn ut TF> <skriv ut> <sett TC lik 100> <regn ut TF> <skriv ut> Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 27

Ferdig program class TemperaturKonvertering { public static void main (String[] args) { double TC, TF; System.out.println("Celcius Fahrenheit"); TC = -10; TF = 9 * TC / 5 + 32; System.out.println(TC + " " + TF); TC = 0; TF = 9 * TC / 5 + 32; System.out.println(TC + " " + TF); TC = 37; TF = 9 * TC / 5 + 32; System.out.println(TC + " " + TF); TC = 100; TF = 9 * TC / 5 + 32; System.out.println(TC + " " + TF); Test programmet Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 28

Innlesning fra terminal Innlesning fra terminal kan gjøres på flere måter i Java. I INF1000 bruker vi pakken easyio. Du må da skrive i toppen av programmet: import easyio.*; Inne i klassen skriver vi følgende før vi kan starte innlesning: In tastatur = new In(); Så kan vi lese inn fra terminal (=tastatur), f.eks. et heltall: int radius; System.out.print( Oppgi radiusen: ); radius = tastatur.inint(); Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 29

Eksempel import easyio.*; Vi må først importere pakken easyio Vi oppretter en verktøykasse for lesing fra terminal og lager en variabel tast som blir vårt håndtak til denne verktøykassen class LesFraTerminal { public static void main (String [] args) { In tast = new In(); System.out.print("Skriv et heltall: "); int k = tast.inint(); System.out.println("Du skrev: " + k); I verktøykassen ligger det bl.a. en metode for å lese et heltall fra terminal. Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 30

Lesemetoder // Opprette forbindelse med tastatur: In tastatur = new In(); // Lese et heltall: int k = tastatur.inint(); // Lese et desimaltall: double x = tastatur.indouble(); // Lese et enkelt tegn: char c = tastatur.inchar(); // Lese et enkelt ord: String s = tastatur.inword(); // Lese resten av linjen: String s = tastatur.inline(); Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 31

Hvilken lesemetode skal jeg velge? Først: importere easyio og åpne forbindelse til tastaturet Lese item for item: For å lese et heltall: inint() [egentlig: tastatur.inint()] For å lese et desimaltall: indouble() For å lese ett ord: inword() For å lese en hel linje (med minst ett tegn): inline() Lese linje for linje: Bruk readline() Lese tegn for tegn: For å lese neste tegn (også hvite tegn): inchar() Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 32

Hvordan lesemetodene virker Metodene inint(), indouble() og inword() virker slik: De hopper over eventuelle innledende blanke tegn. De leser så alt fram til neste blanke tegn eller linjeskift. Dersom det som leses ikke er et heltall når inint() brukes eller et desimaltall når indouble() brukes, gis det en feilmelding og man får en ny sjanse. Metoden inchar() virker slik: Den leser neste tegn, enten det er et blankt tegn eller ikke. Metoden inline() virker slik: Den leser alt fram til slutten av linjen (inkludert blanke tegn), men ignorerer linjer hvor det kun står (igjen) et linjeskift. Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 33

Hvordan lesemetodene virker Terminal-input: x y z _ 1 6 1 2 7 5 _ = blank String s1 = tast.inword(); String s2 = tast.inword(); String s1 = tast.inword(); int x = tast.inint(); String s = tast.inline(); char c1 = tast.inchar(); char c2 = tast.inchar(); char c3 = tast.inchar(); int x = tast.inint(); s1: "xyz" s2: "161275" s1: "xyz" x : 161275 s: " xyz 161275" c1: ' ' c2: ' ' c3: 'x' feilmelding Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 34

Eksempel: lese data om en person Problem: Lag et program som leser fra terminal disse dataene om en person: Navn Yrke Alder og som skriver ut dataene på skjermen etterpå. Framgangsmåte: Vi bruker inline() til å lese navn og yrke, og inint() til å lese alder. Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 35

Ferdig program import easyio.*; class LesDataOmPerson { public static void main (String [] args) { String navn, yrke; int alder; In tast = new In(); System.out.print("Navn: "); navn = tast.inline(); System.out.print("Yrke: "); yrke = tast.inline(); System.out.print("Alder: "); alder = tast.inint(); System.out.print("Hei " + navn + ", du er " + alder); System.out.println(" år gammel og jobber som " + yrke); Test programmet Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 36

Et eksempel til import easyio.*; class LesFraTerminal2 { public static void main (String [] args) { In tastatur = new In(); System.out.print("Skriv tre ord: "); String s1 = tastatur.inword(); String s2 = tastatur.inword(); String s3 = tastatur.inword(); System.out.println("Du skrev disse ordene:"); System.out.println(" " + s1); System.out.println(" " + s2); System.out.println(" " + s3); Test programmet Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 37

Formatert utskrift til skjerm Formatert utskrift vil si at vi angir nøyaktig hvordan utskriften skal se ut og plasseres på skjermen. Kan gjøres "manuelt" med System.out.print(...), men det er upraktisk. Bedre: bruke en ferdiglaget pakke for slikt. I INF1000 bruker vi pakken easyio. For å få tilgang til denne pakken må vi som før skrive helt i toppen av programmet vårt (før class): import easyio.*; Inne i klassen skriver vi følgende før vi kan starte formatert utskrift: Out skjerm = new Out(); Så kan vi skrive ut det vi ønsker, f.eks.: double pi = 3.1415926; skjerm.out(pi, 2, 6); // Skriv ut pi med 2 desimaler, høyrejustert på 6 plasser. Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 38

Eksempel Vi må først importere pakken easyio import easyio.*; class FormatertUtskrift { public static void main (String [] args) { Out skjerm = new Out(); int BREDDE1 = 15; int BREDDE2 = 30; skjerm.out("navn", BREDDE1); skjerm.outln("adresse", BREDDE2); Vi oppretter en verktøykasse for skriving til terminal skjerm.out("kristin Olsen", BREDDE1); skjerm.outln("vassfaret 14, 0773 Oslo", BREDDE2); I verktøykassen ligger det bl.a. verktøy (på java-språk: metoder) for å skrive til skjerm med og uten linjeskift til slutt. Test programmet Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 39

Tre måter å skrive ut på Uten formatering: skjerm.out("per Hansen"); skjerm.out(12345); skjerm.out(3.1415, 2); Angi utskriftsbredde: skjerm.out("per Hansen", 15); skjerm.out(12345, 15); skjerm.out(3.1415, 2, 15); // Bredde 15 tegn // Bredde 15 tegn // Bredde 15 tegn Angi utskriftsbredde og justering: skjerm.out("per Hansen", 15, Out.RIGHT); skjerm.out(12345, 15, Out.CENTER); skjerm.out(3.1415, 2, 15, Out.LEFT); // Høyrejuster // Senterjuster // Venstrejuster Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 40

Programmer med forgreninger En svært nyttig programmeringsteknikk er å bruke forgreninger, dvs forskjellige instruksjoner utføres i ulike situasjoner. Vi kan få til dette med en if-setning: f.eks. x < y eller et annet uttrykk if (logisk uttrykk) { <instruksjoner> else { <instruksjoner> Eksempel: som enten er true eller false denne blir utført når det logiske uttrykket er sant (true) denne blir utført når det logiske uttrykket er usant (false) if (x > 0) { System.out.println("Tallet er positivt"); else { System.out.println("Tallet er ikke positivt"); Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 41

Programmer med forgreninger Else-delen kan utelates, slik som her: if (pris > 1500) { System.out.println( Det er for dyrt ); Vi kan legge if-setninger inni if-setninger: if (lønn < 400000) { if (ferieuker < 8) { System.out.println( Ikke søk på jobben ); Vi kan lage sammensatte if-setninger av typen if (a < 10) { // a er positivt heltall System.out.println( Ett siffer ); else if (a < 100) { System.out.println( To siffer ); else { System.out.println( Mer enn to siffer ); Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 42

Eksempel på bruk av if-setning Program som avgjør hvem av to personer som er høyest: import easyio.*; class Hoyde { public static void main (String[] args) { In tastatur = new In(); double høyde1, høyde2; System.out.print("Høyden til Per: "); høyde1 = tastatur.indouble(); System.out.print("Høyden til Kari: "); høyde2 = tastatur.indouble(); if (høyde1 > høyde2) { System.out.println("Per er høyere enn Kari"); else if (høyde1 < høyde2) { System.out.println("Kari er høyere enn Per"); else { System.out.println("Kari og Per er like høye"); Test programmet Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 43

Eksempel: Body Mass Index Oppgave: Body Mass Index (BMI) er et mål som kan regnes ut fra høyden og vekten til en person. Ifølge verdens helseorganisasjon (WHO) 1 : BMI Under 18.5 18.5 24.9 25.0 29.9 30.0 eller høyere Vektstatus Undervekt Normal vekt Overvekt Fedme Vi skal lage et program som beregner BMI ut fra høyde og vekt og gir melding om hvilken vektstatus (se tabellen) det tilsvarer. 1 Se http://www.who.int/hpr/nph/docs/gs_obesity.pdf Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 44

Inndata og utdata Inndata: Personens høyde (i m) Personens vekt (i kg) Leses fra terminal Utdata: BMI Skrives ut på skjerm, sammen med en av beskjedene Undervekt (hvis BMI <= 18.4) Normal vekt (hvis 18.5 <= BMI <= 24.9) Overvekt (hvis 25.0 <= BMI <= 29.9) Fedme (hvis BMI >= 30.0) Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 45

Transformere inndata til utdata Vi må kjenne formelen for å regne ut BMI. La vekt hoyde = personens vekt i kg = personens høyde i m Da er BMI = vekt / (hoyde*hoyde) Ole Chr. Lingjærde Institutt for informatikk 26. august 2008 46