Uke 11 noen tips og råd + eksempel. Noen muligheter. Valg av datamodell: eksempel. Valg av datamodell: oblig 4

Like dokumenter
To måter å programmere på. Java 12. Objektvariable. Objektvariablenes levetid. Statisk programmering: Programmering med objekter: Dagens forelesning:

Oblig4 - forklaringer. Arne og Ole Christian

Oblig4 - forklaringer. Arne og Ole Christian

Inf1000 (Uke 10) Oppgaveløsning. Hashmap

To måter å programmere på. INF1000 : Forelesning 9. Programmering uten objekter. Programmering med objekter: Eksempel på programmering uten objekter

Innhold. INF1000 (Uke 11) Programmering. Rep: Metoder. Rep: Hva er en metode? Litt repetisjon. To måter å programmere på

INF1000 (Uke 11) Programmering

Råd 1: Programmer ovenfra ned. INF1000 Uke 10. Gruppering etter eier. Velg datastruktur etter hva som skal gjøres!

INF1000 Uke 10. Hvordan gripe an et stort problem? 5 råd Noen eksempler du kan overføre til Oblig 4 Oblig 4 kort oversikt Et større programeksempel

INF1000: Forelesning 10

Oblig4 - forklaringer

Kom forberedt til tirsdag. INF1000 Tips til obligatorisk oppgave 4. Noen generelle tips. Oblig4: Komme igang

1. Separatorer (skilletegn) i easyio

INF1000 Forelesning 8. Litt repetisjon: Metoder og klasser Innkapsling av variable og metoder Hvordan gripe an et stort problem?

Oblig4 - obligatorisk oppgave nr. 4 (av 4) i INF1000

Hva er en metode? INF1000 Forelesning 8. Hva skjer når vi kaller en metode? Hvorfor bruke metoder?

INF1000: Forelesning 11

Framgangsmåte for å løse oblig 4 i INF1000

Oblig4 - obligatorisk oppgave nr. 4 (av 4) i INF1000

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

UNIVERSITETET I OSLO

s 678 * Hvordan designe og programmere objektorientert * Støtte til oppstart på Oblig 4: Jobbe frem eget forslag til datastruktur

INF 1000 høsten 2011 Uke 10: 25. november

Oblig4: Komme igang. INF1000 Uke 11. Filer Vi skal lese data fra to filer og analysere dem (Stasjoner-1.txt, Vaerdata-1.txt) Noen generelle tips

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

INF Uke 10. Ukesoppgaver oktober 2012

Oversikt. En del repetisjon. Noen generelle råd INF1000 Uke 10 Gjennomgang av et eksempel. Kunstig intelligens? INF1000-seminar

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

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

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

Uke 9 INF okt 2012 Om separatorer I easyio, Eliza (bruk av HashMap), + mer om metoder og klasser. Arne Maus OMS, Ifi, UiO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

HashMap. INF1000 Forelesning 9. Ulike versjoner i Java 1.4 (gammel) og Java 1.5/1.6 av HashMap. Objekter lagres med en søkenøkkel

INF1000 Forelesning 9. Hashmap Eksempel: Flyreservasjon

UNIVERSITETET I OSLO

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

Løsningsforslag ukeoppg. 4: sep (INF Høst 2011)

(MVC - Model, View, Control)

UNIVERSITETET I OSLO

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

INF1000: Forelesning 4. Mer om arrayer Metoder

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

INF 1000 Prøveeksamen. 23. november Ole Christian og Arne. Oppgave 1 (10 poeng) Er disse programsetningene lovlige i Java? Oppgave 2 (10 poeng)

INF1000 : Forelesning 4

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Inf1000 (Uke 8) Mer om objekter og filbehandling

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

UNIVERSITETET I OSLO

Dagens plan. Inf1000 (Uke 8) Mer om objekter og filbehandling. Hva er en metode. Mer om metoder/klasser/objekter. Tilslutt noen råd til oblig 3

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

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

Gjennomgang av eksamen H99

Forelesning inf Java 5

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

Forelesning inf Java 5

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

Dagens plan. Inf1000 (Uke 8) Mer om objekter og filbehandling. Hva er en metode. Mer om metoder/klasser/objekter. Tilslutt noen råd til oblig 3

INF1000: noen avsluttende ord

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

UNIVERSITETET I OSLO

Blokker og metoder INF1000 (Uke 6) Metoder

Dagens tema Kapittel 8: Objekter og klasser

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

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

Repetisjon. INF gruppe 13

Forelesning inf Java 4

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Hva er en metode. Hva skjer når vi kaller en metode

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 (Uke 4) Mer om forgreninger, While-løkker

UNIVERSITETET I OSLO

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

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

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

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

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

Oblig 4Hybelhus litt mer tips enn i oppgaven

Læreboken på 45 minutter

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

INF1000 (Uke 6) Mer om metoder, tekster

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

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

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

Ole Christian Lingjærde, 12. september 2013

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

Forelesning inf Java 4

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

UNIVERSITETET I OSLO

INF 1000 høsten 2011 Uke 3 6. september

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

UNIVERSITETET I OSLO

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

Løsningsforslag, inf101, våren 2001

En klasse er noe - en metode gjør noe (! / # <= (! * +!! ",-' %. "- -/ %.!#) )! " 0'%! * *$! "1-)) '' % '. 22!'( 7/ /! * 2 2! "*"% 8"%% 9 - -!

INF1000 oppgaver til uke 38 (17 sep 23 sep)

Inf1000 uke 5 18.sept. 2007

Transkript:

Valg av datamodell: eksempel Uke 11 noen tips og råd + eksempel Eksempel: Du har gitt en fil med opplysninger om hvor mange registrerte tilfeller det var av tre ulike sykdommer i Norge hvert av årene 19502000: Noen generelle råd vedrørende oppgaveløsing Noen råd i forbindelse med oblig 4 Vi utvider eksempelet i avsnitt 9.9 side 186 i læreboka 1. november 2005 INFLUENSA KYSSESYKE MENINGITT 1950 1951 1952.. 2000 Hvordan er det naturlig å modellere dette? 1 2 Noen muligheter Valg av datamodell: oblig 4 Forslag 1: Gruppere tellinger relatert til samme sykdom class Sykdom { String navn; int[] antalltilfeller = new int[51]; Forslag 2: Gruppere tellinger foretatt samtidig class Aarsdata { int antinfluensa; int antkyssesyke; int antmeningitt; Forslag 3: Ingen gruppering - tre arrayer int[] influensatilfeller = new int[51]; int[] kyssesyketilfeller = new int[51]; int[] meningittilfeller = new int[51]; Forslag 4: Ingen gruppering en 2D-array int[][] sykdomstilfeller = new int[3][51]; Beste datastruktur avhenger av hva du skal bruke dataene til. 3 Anta at du har gitt en fil med opplysninger om en rekke værstasjoner: 4780 GARDERMOEN 202 ULLENSAKER AKERSHUS 10400 RØROS 628 RØROS SØR-TRØNDELAG 18700 OSLO-BLINDERN 94 OSLO OSLO 25590 GEILO-GEILOSTØLEN 810 HOL BUSKERUD.. Her virker det naturlig å gruppere dataene stasjonsvis: String nummer; String navn; double høyde; String kommune; String fylke; 4

Valg av datamodell: oblig 4 For hver værstasjon har du gitt daglige værmålinger for et halvt år: stasjon dag mnd maxvind nedbør mintemp maxtemp 4780 01 01 1.5 0.0-23.6-13.3 4780 02 01 2.6 0.8-13.7-10.0 4780 03 01 4.6 1.3-17.9-11.7 4780 04 01 4.6 0.1-23.3-16.7 4780 05 01 5.7 0.0-22.9-15.7 4780 06 01 3.1 1.0-22.9-16.0.. Hvordan modellerer vi disse dataene? Svaret er mindre opplagt. Forslag 1: Ingen gruppering double[] maxvind; double[] nedbør; double[] mintemp; double[] maxtemp; Valg av datamodell: oblig 4 Forslag 2: Gruppere målinger utført samtidig (dvs gruppere etter dag) class Dagdata { double maxvind; double nedbør; double mintemp; double maxtemp; 5 Dagdata[] dagdata; 6 Forslag 3: gruppere etter både måned og dag class Dagdata { double maxvind; double nedbør; double mintemp; double maxtemp; Valg av datamodell: oblig 4 class Maanedsdata { Dagdata[] dagdata = new Dagdata[31]; int antdager; // Antall dager i måneden Maanedsdata[] mdata = new Maanedsdata[6]; Dette er den varianten som blir anbefalt i hjelpenotatet for oblig 4. 7 Organisering av veldig små programmer I veldig små programmer (noen få linjer) med en enkelt klasse og ingen objekter av egne klasser, kan all programkode ligge i main-metoden: import easyio.*; import java.io.*; class VeldigLiteProgram { In tast = new In(); System.out.print("Gi et filnavn: "); String fnavn = tast.inline(); if (new File(fnavn).exists()) { System.out.println("Filen fins"); else { System.out.println("Filen fins ikke"); 8

Organisering av alle andre programmer I alle andre programmer bør main-metoden kun brukes til å få igang programmet. Eksempel: class MittProgram { Flyreservasjon fr = new Flyreservasjon(); fr.ordreløkke(); class Flyreservasjon { void ordreløkke() { 9 Variant 1 Det er mulig å slå sammen de to klassene på forrige foil til en klasse: class MittProgram { MittProgram mp = new MittProgram(); mp.ordreløkke(); void ordreløkke() { Det blir en smakssak om man velger å gjøre det slik, eller slik som på forrige foil. I undervisningen vil du hovedsakelig se eksempler på den varianten som bruker to klasser. 10 Variant 2 Rollefordeling i større programmer Istedet for å lage en egen ordreløkke-metode, kan koden for ordreløkken ligge i konstruktøren: class MittProgram { Flyreservasjon fr = new Flyreservasjon(); class Flyreservasjon { Flyreservasjon() { ordreløkken Dette blir også en smakssak, men varianten ovenfor bruker konstruktøren til noe annet enn initialisering av objektvariable og er mindre gjennomsiktig/selvforklarende enn å bruke en egen ordreløkke-metode. En klasse som inneholder alt Klasse med main-metode Inneholder main-metoden. Gjør stort sett ikke annet enn å få programmet igang. Klasse med ordreløkke Holder på data-strukturen. Inneholder evt ordreløkke, og metoder som kalles fra denne. Øvrige klasser som inngår som del av datastrukturen 11 12

Oppsummering Råd 1: Skriv programmer "ovenfra og ned" Legg ikke annen programkode i main enn det som skal til for å få igang programmet (typisk: lage et objekt og kalle på en metode i dette), unntatt i bittesmå programmer. I main kan du velge å lage et objekt av klassen som main ligger i - eller et objekt av en annen klasse. I kurset bruker vi stort sett siste variant. Metoden som kalles fra main er typisk den som er ansvarlig for programkontrollen (f.eks. en ordreløkke), eller en del av den. Programkontrollen kan ligge i en konstruktør eller i en annen metode (f.eks. void ordreløkke()). I kurset gjør vi stort sett det siste. Råd: bestem deg for hvilken organisering du foretrekker (f.eks. den på foil 3) og hold deg til den når du skriver dine egne programmer - så slipper du å bruke tid på å velge hver gang du skal lage et nytt program. Bestem først hvilke klasser som skal være med (og deres rolle) Fyll inn de mest sentrale variablene (de som utgjør datastrukturen), og skriv eventuelle nye klasser som trengs i datastrukturen Skriv metodene på toppnivå (dvs de som styrer den overordnede programflyten, f.eks. en kommandoløkke). Kall på metoder ved behov, selv om disse ennå ikke er skrevet. Skriv metodene du kaller på ovenfor, og fortsett til programmet er ferdig. 13 14 Eksempel: oblig 4 Oblig 4: trinn 1 class Oblig4 Inneholder kun main-metoden. Lager objekt av klassen under og kaller på ordreløkke-metode. class VaerAnalyse Inneholder ordreløkke og andre metoder + HashMap-tabeller for å holde orden på værstasjonene. class Stasjon Hvert objekt inneholder info om en værstasjon + alle data fra stasjonen class Maanedsdata Hvert objekt inneholder info om en måned med værdata fra en stasjon class Dagdata Hvert objekt inneholder info om dagsmålinger foretatt ved en stasjon import easyio.*; import java.util.*; class Oblig4 { public static void main (String[] args) { String s1 = "Stasjoner-1.txt"; String s2 = "Vaerdata-1.txt"; if (args.length >= 2) { s1 = args[0]; s2 = args[1]; VaerAnalyse va = new VaerAnalyse(s1, s2); va.ordreløkke(); Programmet kan startes som java Oblig4 eller java Oblig4 filnavn1 filnavn2 15 16

Oblig 4: trinn 2 De to HashMap ene class VaerAnalyse { HashMap<String,Stasjon> stasjonfranavn = new HashMap<String,Stasjon> (); HashMap<String,Stasjon> stasjonfranr = new HashMap<String,Stasjon> (); VaerAnalyse(String s1, String s2) { lesstasjonerfrafil(s1); lesvaerdatafrafil(s2); void lesstasjonerfrafil(string fnavn) { void lesvaerdatafrafil(string fnavn) { void ordreløkke() { NB: Dette er kode for Java 1.5! Konstruktør som gjør initialisering (her: lese data fra fil) Metoder for å lese fra fil og for å lese inn kommando fra bruker Her kommer det metoder som skal kalles fra ordreløkken 17 HashMap<String,Stasjon> stasjonfranavn = new HashMap<String,Stasjon> (); Brukes for å holde orden på værstasjoner, med stasjonsnavn som nøkkel. HashMap<String,Stasjon> stasjonfranr = new HashMap<String,Stasjon> (); Brukes for å holde orden på værstasjoner, med stasjonsnummer som nøkkel. Eksempel på å sette inn i de to HashMap ene: // Anta at opplysninger om en stasjon er lest fra fil Stasjon st = new Stasjon(stNr, stnavn, sthøyde, stkommune, stfylke); stasjonfranr.put(stnr, st); stasjonfranavn.put(stnavn, st); Viktig: det er samme stasjonsobjekt som skal settes inn i begge 18 HashMap er! Oblig 4: trinn 3 Oblig 4: trinn 4 void lesstasjonerfrafil(string filnavn) Skal lese fil med data om værstasjoner. Gå i løkke, hvor hvert gjennomløp leser en linje fra fila, lager et objekt av klassen Stasjon og fyller med innleste verdier, og legger objektet inn i de to HashMap ene. void lesvaerdatafrafil(string filnavn) Skal lese fil med værdata. Mulig løsning 1: gå i løkke, hvor hvert gjennomløp leser en linje fra fila, får tak i riktig Stasjons-objekt (ikke lag nytt Stasjons-objekt, bruk HashMap ene) og oppdaterer dette objektet med de nye værdataene ved å kalle på en passende metode i Stasjonsobjektet (f.eks. registrermåling(.)). Stasjonsobjektet må så finne ut hvilket Maanedsdata-objekt som skal oppdateres, og delegerer oppdraget videre til dette objektet ved å kalle på en passende metode i dette Maanedsdata-objektet (f.eks. nymåling()). Mulig løsning 2: i stedet for at fila leses sentralt (i VaerAnalyse-objektet) kan selve jobben med å lese data om en gitt stasjon delegeres til Stasjonsobjektet. Verken mer eller mindre objektorientert, men noen liker dette bedre. 19 Programmer ordreløkken For hver kommando som skal utføres, skal ordreløkken kalle på en passende metode i klassen VaerAnalyse. Du skal altså ikke legge programkode for å utføre kommandoer i løkka, bare delegere oppdraget videre. For at programmet skal kompilere, sørg for å deklarere alle de metodene som du kaller på fra ordreløkke-metoden. Du kan vente med å fylle inn innholdet i disse metodene, dvs bare fyll inn en utskriftssetning i hver av metodene. Eksempel: hvis ordreløkken kaller på metoden lagstasjonsliste(), så deklarerer du samtidig denne dummy-metoden i klassen VaerAnalyse: void lagstasjonsliste() { System.out.println( Metoden lagstasjonsliste utført ); 20

Oblig 4: trinn 5 Oblig 4: trinn 6 Programmer metodene som kalles fra ordreløkken Eksempel (i klassen VaerAnalyse): void finnantuværsdager() { <Løp gjennom en av HashMap ene og skriv ut liste over alle stasjoner, med stasjonsnr og stasjonsnavn for hver av dem> System.out.println( Stasjonsnummer: ); String stasjonsnr = tast.inword( \n ); System.out.println( Måned (1-6): ); int mnd = tast.inint(); Skriv de metodene som kalles fra metodene i trinn 5. Eksempel (i klassen Stasjon): int finnantuværsdager(int mnd) { Maanedsdata md = mdata[mnd-1]; int antdager = md.finnantuværsdager(); return antdager; Oppdraget delegeres videre til en metode i Maanedsdataobjektet som er berørt. Stasjon st = <finn stasjonen ved oppslag i stasjonfranr>; int antdager = st.finnantuværsdager(mnd); <Skriv ut resultatet> Oppdraget delegeres videre til en metode i Stasjons-objektet som er berørt. 21 22 Oblig 4: trinn 7 Råd 2: skriv metoder "utenfra og inn" Skriv de metodene som kalles fra metodene i trinn 6. Eksempel (i klassen Maanedsdata): int finnantuværsdager() { <gå gjennom data for alle dager i måneden og tell opp hvor mange som oppfyller kravet til uværsdag> <returner med antallet uværsdager> Når du skal skrive en metode, bestem først av alt hva som er input og output til metoden: Input: Eventuelle parametre til metoden Kan også være klassevariable/objektvariable (eksempel: de to HashMap ene skal brukes i mange av metodene i klassen VaerAnalyse, selv om de ikke er parametre til metodene). Output: Eventuell returverdi fra metoden Kan også være modifikasjoner av klassevariable/objektvariable (f.eks. endring av innholdet i de to HashMap ene). 23 24

Råd 3: Deleger oppgaver Råd 4: formater alltid programkoden underveis Et viktig kjennetegn ved god programmering er at man delegerer oppgaver når det er naturlig - dvs kaller på metoder for å utføre deloppgaver. Dermed blir hver enkelt del av programmet oversiktlig, og faren for feil minimeres. Det blir også lettere å finne feil senere. Eksempel: Hvert case i en kommandoløkke kaller på en metode som utfører den ønskede kommandoen, i stedet for at alt gjøres inni selve kommandoløkken. NB: ikke overdriv delegering. Det er f.eks. ofte ikke naturlig at hvert eneste objekt har metoder for å lese fra terminal - det kan i mange tilfeller være bedre å gjøre slike ting sentralt (og heller kalle på metoder i objektene for å oppdatere deres variable). 25 Dårlig: Bra: class Eksempel { int x = 0; for (int i=0; i<10; i++) { x = x + 1; if (x < 0) { System.out.println("Det var rart"); class Eksempel { int x = 0; for (int i=0; i<10; i++) { x = x + 1; if (x < 0) { System.out.println("Det var rart"); 26 Råd 5: ikke endre på forutsetningene i oppgaven Selv om mange oppgaver tar utgangspunkt i problemer fra virkeligheten, er de ikke nødvendigvis laget for å være særlig realistiske. Ikke endre på forutsetningene i slike tilfeller - uansett hvor fristende det måtte være. Løs oppgaven slik den er formulert. Hvis du mener oppgaven gir rom for flere tolkninger på et punkt: gjør dine egne (rimelige) forutsetninger - og skriv i oppgaven hva disse er. 27