Forelesning inf Java 3

Like dokumenter
Eksempel: Body Mass Index (BMI)

Forelesning inf Java 3

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

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

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

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

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

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

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

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

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

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

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

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

INF1000 oppgaver til uke 38 (17 sep 23 sep)

Forelesning inf Java 2

Forelesning inf Java 4

Forelesning inf Java 2

Forelesning inf Java 5

INF1000 undervisningen INF 1000 høsten 2011 Uke september

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();

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Java. Java 3. Ulike varianter for ulike behov

Programmering Høst 2017

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

INF1000: Forelesning 11. Oppgave 2. Oppgave 1. Husk å melde deg på prøveeksamen i INF1000! Ole Christian Lingjærde 7.november 2006

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

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

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

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

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

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

løsningsforslag-uke5.txt

INF Uke 10. Ukesoppgaver oktober 2012

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

INF1000: Forelesning 4. Mer om arrayer Metoder

Repetisjon INF 1000 våren 2006

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

Blokker og metoder INF1000 (Uke 6) Metoder

De neste ukene. INF1000 Uke 12. Prøveeksamen. Nå - Prøveeksamen. Forelesning om IT og samfunn neste uke (13/11).

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 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

INF1000 : Forelesning 1 (del 2)

UNIVERSITETET I OSLO

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Grunnkurs i objektorientert programmering Hjelpehefte for studenter som tar INF101,

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

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

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

UNIVERSITETET I OSLO

Feilmeldinger, brukerinput og kontrollflyt

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

INF1000 (Uke 6) Mer om metoder, tekster

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

Transkript:

Forelesning inf1000 - Java 3 Tema: Forgreninger Løkker Arrayer Ole Christian Lingjærde, 5. september 2013 Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 1

Eksempel: Body Mass Index (BMI) Vi skal lage et program som beregner BMI ut fra høyde og vekt og gir melding om hvilken vektstatus det tilsvarer: BMI Under 18.5 Vektstatus Undervekt 18.5 24.9 Normalvekt 25.0 29.9 Overvekt 30.0 eller høyere Ekstrem overvekt 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, 5. september 2013 2

Ferdig program (første del) import java.util.*; class BodyMassIndex { public static void main(string[] args) { Scanner tast = new Scanner(System.in); System.out.print("Høyde (i cm): "); double høyde = tast.nextint() / 100.0; System.out.print("Vekt (i kg): "); double vekt = tast.nextdouble(); double bmi = vekt / (høyde*høyde); Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 3

Ferdig program (siste del) if (bmi < 18.5) { System.out.println("Undervekt"); else if (bmi <= 24.9) { System.out.println("Normalvekt"); else if (bmi <= 29.9) { System.out.println("Overvekt"); else { System.out.println("Ekstrem overvekt"); // end of main // end of class Test programmet Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 4

Eksempel: beregne pulssoner Det har vært mye fokus på at fysisk trening bør foregår med riktig intensitet. Ett hjelpemiddel er å vite sine egne pulssoner. Sone Prosent av maxpuls Pulsregion 1 50-60% 2 60-70% min max 3 70-80% 4 80-90% 5 90-100% Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013

Utregningen Hvilken puls svarer til f.eks. 60% av makspuls? double svar = min + (max-min) * 0.60; Hvis vi ønsker svaret som et heltall: int svar = (int) (min + (max-min)*0.60); Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 6

import java.util.*; class Pulssoner { public static void main (String[] args) { Scanner tast = new Scanner(System.in); System.out.print("Oppgi hvilepuls: "); int min = tast.nextint(); System.out.print("Oppgi makspuls: "); int max = tast.nextint(); Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 7

System.out.println("Sone\tStart(%)\tPuls"); // Sone 1 int puls = (int) (min + (max-min)*0.50); System.out.print(1); // Sone System.out.print("\t50%"); // Prosent System.out.println("\t" + puls); // Puls... Tilsvarende for sone 2-5... // Slutt på main-metoden // Slutt på class Pulssoner Test programmet Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 8

Programmer med forgreninger Nyttig programmeringsteknikk: ulike instruksjoner utføres i ulike situasjoner. Vi kan få til dette med en if-setning: if (logisk uttrykk){ <instruksjoner> else { <instruksjoner> Eksempel: f.eks. x < y eller et annet uttrykk 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, 29. august 2013 9

Programmer med forgreninger Else-delen kan utelates, slik som her: if (pris > 1500) { System.out.println( Det er for dyrt ); Ole Chr. Lingjærde Institutt for informatikk, 29. august 2013 10

Programmer med forgreninger Vi kan legge if-setninger inni andre if-setninger: if (lønn < 500000) { if (ferieuker < 8) { System.out.println( Ikke søk på jobb ); Ole Chr. Lingjærde Institutt for informatikk, 29. august 2013 11

Programmer med forgreninger Vi kan sette sammen flere if-setninger: 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, 29. august 2013 12

Eksempel på bruk av if-setning Program som avgjør hvem som er høyest av to personer: import java.util.*; class Hoyde { public static void main (String[] args) { Scanner tastatur = new Scanner(System.in); double høyde1, høyde2; System.out.print("Høyden til Per: "); høyde1 = tastatur.nextdouble(); System.out.print("Høyden til Kari: "); høyde2 = tastatur.nextdouble(); 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"); Ole Chr. Lingjærde Institutt for informatikk, 29. august 2013 13

Alternativ til if-else: switch En sammensetning av flere if-setninger kan i noen tilfeller erstattes med en switch-setning: switch (uttrykk) { case verdi1:... <instruksjoner> break; case verdin: <instruksjoner> break; default: <instruksjoner> Et uttrykk som gir en verdi som er av en av typene char eller int (evt. byte eller short). I nyere versjoner av Java (Java 7) også String. Nøkkelordet break avbryter utførelsen av switch-setningen. Når break mangler, fortsetter utførelsen på neste linje (det er sjelden ønskelig). Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 14

Eksempel 1 class BrukAvSwitch { public static void main (String [] args) { char c = 'b'; switch(c) { case 'a': System.out.println("Tegnet var en a"); break; case 'b': System.out.println("Tegnet var en b"); break; default : System.out.println("Tegnet var ikke a eller b"); Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 15

Eksempel 2 Dette virker ikke generelt (men i Java 7): class FeilBrukAvSwitch { public static void main (String [] args) { String s = "Kathmandu"; switch(s) { case "Paris": System.out.println("Vi er i Frankrike"); break; case "Moskva": System.out.println("Vi er i Russland"); break; case "Kathmandu" : System.out.println("Vi er i Nepal"); Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 16

Oppgave 1 Hva blir skrevet ut av dette programmet? class IfTest { public static void main (String [] args) { String s = "Petter"; if (s.equals("jens")); { System.out.println("Ordet var " + s); Ordet var Petter Her er s.equals("jens") en test på om teksten s er lik Jens. Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 17

Hva blir skrevet ut av dette programmet? class IfTest2 { public static void main (String [] args) { double x = -0.5; double y = 0.5; Oppgave 2 if (Math.ceil(x) == Math.ceil(y)) { System.out.println("A"); if ((int) x == (int) y) { System.out.println("B"); if (x < y) { if (x < 0) { if (y < 0) { System.out.println("C"); else { System.out.println("D"); Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 B 18

Oppgave 3 Hva blir skrevet ut av dette programmet? class Divisjon { public static void main (String [] args) { if (1/2 > 0) { System.out.println("A"); else { System.out.println("B"); B Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 19

Litt mer om uttrykk: ++ og -- Instruksjon Alternativ 1 Alternativ 2 Prefiks-operator Postfiks-operator i = i + 1 ++i i++ i = i - 1 --i i-- ++i, i++, --i og i-- endrer ikke bare på verdien til i, de er dessuten uttrykk som selv har en verdi. Dermed kan vi f.eks. skrive: System.out.println(i++); // Skriv ut i og øk deretter i med 1 System.out.println(++i); // Øk i med 1 og skriv deretter ut i Prefiks-operatorene endrer verdien til variabelen før uttrykket er evaluert. Postfiks-operatorene endrer verdien etter at uttrykket er evaluert. Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 20

Oppgave Fyll ut de tomme feltene i tabellen: Programkode Verdien til k Verdien til m Verdien til n int k = 0; int m; int n; k = k + 1; m = ++k; n = k++; 0 - - 3 2 2 Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 21

Blokker En blokk er en samling instruksjoner omgitt av krøllparenteser: { instruksjon 1; instruksjon 2;... instruksjon n; Alle steder i et Java-program hvor det kan stå en instruksjon, kan vi om ønskelig i stedet sette en blokk. Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 22

Deklarasjoner inne i blokker Vi har lov til å deklarere variabler inne i en blokk, forutsatt at de ikke allerede er deklarert utenfor blokken. Eksempel: double x = 0.3; if (x < 0) { double y; y = -x; // Her er y deklarert inne i en blokk Variabler deklarert inne i en blokk eksisterer ikke utenfor blokken. double x = 0.3; if (x < 0) { double y; y = -x; x = y; // Ulovlig, siden y ikke eksisterer her Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 23

while-løkker Vi kan utføre en instruksjon/blokk flere ganger ved hjelp av en while-løkke: while (logisk uttrykk) { setning 1; setning 2;... setning n; Hvis det logiske uttrykket er true, utføres setningene i while-løkka. Dette gjentas inntil det logiske uttrykket er false. Da avsluttes løkka. Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 24

Eksempel class SkrivLinjer { public static void main (String [] args) { int k = 1; while (k <= 5) { System.out.println("Nå har k verdien " + k); k = k + 1; System.out.println("Nå er k lik " + k); Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 25

Kompilering og kjøring > javac SkrivLinjer.java > java SkrivLinjer Nå har k verdien 1 Nå har k verdien 2 Nå har k verdien 3 Nå har k verdien 4 Nå har k verdien 5 Nå er k lik 6 Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 26

Oppgave Hva blir utskriften fra dette programmet? class LokkeTest { public static void main (String [] args) { int k = 3; while (k > 0) { System.out.print("Nå er k = "); System.out.println(k); k = k - 1; Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 27

Oppgave 2 Hva blir utskriften fra dette programmet? class LokkeTest2 { public static void main (String [] args) { int i = 1; int j = 6; while (i < j) { System.out.println("i = " + i); System.out.println("j = " + j); System.out.println(); i = i + 1; j = j 1; i j 1 6 2 5 3 4 4 3 Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 28

Eksempel: innlesning med sjekk Problem: Lag et program som leser et heltall mellom 1 og 100 fra terminal. Hvis det innleste tallet ikke ligger i det lovlige intervallet, skal programmet be om nytt tall. Dette gjentas inntil brukeren skriver et lovlig tall. Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 29

Ferdig program import java.util.*; class LesVerdi { public static void main (String[] args) { Scanner tast = new Scanner(System.in); System.out.print("Oppgi verdi (1,2,...,100): "); int verdi = tast.nextint(); while (!(verdi >= 1 && verdi <= 100)) { System.out.println("Ulovlig verdi!"); System.out.print("Prøv igjen: "); verdi = tast.nextint(); System.out.println("Du oppga verdien " + verdi); Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 30

Evig løkke Dersom testen i while-løkka aldri blir usann (false), vil utførelsen av while-løkka aldri stoppe. Dette kalles en evig løkke. To eksempler: class EvigLokke1 { public static void main (String [] args) { while (true) { System.out.println("INF 1000"); class EvigLokke2 { public static void main (String [] args) { int i = 1, j = 2; while (i < j) { System.out.println("Nå er i < j"); Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 31

Kompilering og kjøring > javac EvigLokke1.java > java EvigLokke1 INF 1000 INF 1000 INF 1000 INF 1000 INF 1000 INF 1000......... (osv) > javac EvigLokke2.java > java EvigLokke2 Nå er i < j Nå er i < j Nå er i < j Nå er i < j Nå er i < j Nå er i < j......... (osv) Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 32

for-løkker En annen måte å få utført en instruksjon (eller blokk) mange ganger er ved hjelp av en for-løkke: initialisering løkketest løkkeoppdatering for (int i=1; i<=antall; i++) { <setning 1> <setning 2>... <setning n> Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 33

Hvordan for-løkka virker - flytdiagram int i = 1 i++ i <= antall? NEI avslutt for-løkka JA <setning 1> <setning 2>... <setning n> Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 34

Nesting av løkker Det er ofte behov for å neste løkke-setninger inne i hverandre; vi kommer til å se mange eksempler etterhvert. Eksempel på nestet for-løkke: for (int i=0; i<10; i++) { for (int j=0; j<10; j++) { int produkt = i * j; System.out.println( i * j = + produkt); Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 35

Arrayer Hittil har vi sett på variable som kan holde en enkelt verdi: en int-variabel har plass til ett heltall en String-variabel har plass til en enkelt tekststreng osv. Arrayer er "variable" som kan holde på mange verdier: en int-array har plass til mange heltall en String-array har plass til mange tekststrenger osv. Verdiene som ligger i en array har hver sin posisjon (= indeks): 0, 1, 2,..., K-1 hvor K = lengden til arrayen En array x med lengde 4 kan visualiseres slik: 0 1 2 3 x[0] x[1] x[2] x[3] i hver av disse boksene er det plass til en verdi Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 36

Eksempel på bruk av arrayer Anta at vi ønsker å lagre navn, adresse og telefonnr for de som følger et bestemt kurs med maksimalt 600 studenter: String[] navn = new String[600]; String[] adresse = new String[600]; int[] telefonnr = new int[600]; Resultatet kan visualiseres slik: 0 1 2 navn adresse telefonnr 0 1 2 0 1 2 599 599 599 Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 37

Trinn 1: deklarere og opprette arrayer Deklarere en array (gi den et navn): datatype[] arraynavn; f.eks. int, double, boolean eller String Opprette en array (sette av plass i hukommelsen): arraynavn = new datatype[k]; // K er ønsket lengde Deklarere og opprette i en operasjon: Eksempler: datatype[] arraynavn = new datatype[k]; int[] a = new int[10]; double[] x = new double[100]; String[] s = new String[1000]; Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 38

Trinn 2: verdiene i en array Anta at vi har deklarert og opprettet følgende array: int[] tlf = new int[600]; For å få tak i de enkelte verdiene i arrayen: tlf[0], tlf[1], tlf[2],..., tlf[599] For å få tak i lengden på arrayen: tlf.length // NB: ingen parenteser til slutt For å sortere elementene i en array (i stigende rekkefølge): java.util.arrays.sort(tlf); Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 39

Eksempel: lese og skrive ut Program som leser tre ord fra terminal og skriver dem ut igjen: import java.util.*; class LesOgSkriv { public static void main (String [] args) { Scanner tastatur = new Scanner(System.in); String[] s = new String[3]; for (int i=0; i<3; i++) { System.out.print("Ord: "); s[i] = tastatur.next(); System.out.println(); for (int i=0; i<3; i++) { System.out.println(s[i]); Test programmet Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 40

Resultat Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 41

Men vær klar over denne Brukeren skriver inn alle tre ordene før returtasten trykkes Hva skjedde her? Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 42

for (int i=0; i<3; i++) { System.out.print("Ord: "); s[i] = tastatur.next(); next() blokkerer programeksekveringen når den venter på videre input. Det skjer i første gjennomløp før bruker har skrevet noe, men ikke i de to neste gjennomløp, fordi det da ligger noe igjen i inputbufferet. Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 Utskrift Input Innlesing Ord: En to tre en Ord: to Ord: tre 43

Eksempel: lese og skrive ut sortert Program som leser tre navn fra terminal og skriver dem ut i sortert rekkefølge: import java.util.*; class LesOgSorter { public static void main (String [] args) { Scanner tastatur = new Scanner(System.in); String[] s = new String[3]; for (int i=0; i<3; i++) { System.out.print("Navn: "); s[i] = tastatur.nextline(); // Leser hele linja java.util.arrays.sort(s); for (int i=0; i<3; i++) { System.out.println(s[i]); Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 44

Resultat Ole Chr. Lingjærde Institutt for informatikk, 5. september 2013 45