Oblig4 - forklaringer. Arne og Ole Christian

Like dokumenter
Oblig4 - forklaringer. Arne og Ole Christian

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

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

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

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

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

INF1000: Forelesning 10

Oblig4 - forklaringer

INF1000: Forelesning 11

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

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

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

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å

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

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

UNIVERSITETET I OSLO

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

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

UNIVERSITETET I OSLO

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

INF1000 (Uke 11) Programmering

UNIVERSITETET I OSLO

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

INF1000: noen avsluttende ord

INF Uke 10. Ukesoppgaver oktober 2012

UNIVERSITETET I OSLO

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000: noen avsluttende ord

UNIVERSITETET I OSLO

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; }

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

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

Repetisjon. INF gruppe 13

UNIVERSITETET I OSLO

Endret litt som ukeoppgave i INF1010 våren 2004

1. Separatorer (skilletegn) i easyio

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

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:

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.

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

(MVC - Model, View, Control)

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

UNIVERSITETET I OSLO

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

INF1000 Prøveeksamen Oppgave 7 og 9

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

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

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

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

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Oblig 4Hybelhus litt mer tips enn i oppgaven

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

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

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

INF1000 : Forelesning 4

UNIVERSITETET I OSLO

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

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

Dagens tema Kapittel 8: Objekter og klasser

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

Gjennomgang av eksamen H99

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

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

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

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

UNIVERSITETET I OSLO

løsningsforslag-uke5.txt

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

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

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 h2006

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

INF1000: Forelesning 6. Klasser og objekter del 1

Forelesning inf Java 4

Løsningsforslag til eksamen i INF1000

INF 1000 høsten 2011 Uke 3 6. september

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

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

Introduksjon til objektorientert programmering

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

Løsningsforslag, inf101, våren 2001

UNIVERSITETET I OSLO

Transkript:

Oblig4 - forklaringer Arne og Ole Christian

Stasjonsdata-1.txt NR NAVN MOH KOMMUNE FYLKE 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 27500 FÆRDER_FYR 6 TJØME VESTFOLD 42160 LISTA_FYR 14 FARSUND VEST-AGDER 50540 BERGEN-FLORIDA 12 BERGEN HORDALAND 93700 KAUTOKEINO 307 GUOVDAGEAIDNU-KAUTOKEINO FINNMARK 99950 JAN_MAYEN 10 JAN_MAYEN JAN_MAYEN

Meteorologidata-1.txt NR DATO VÆRDATA 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 4780 07 01 3.1 0.0-19.7-2.4 4780 08 01 4.1 0.0-17.5-3.3 4780 09 01 2.6 0.0-16.7-4.3 4780 10 01 2.6 0.0-18.1-4.5 4780 11 01 6.2 0.3-10.2 0.0 4780 12 01 5.7 0.0-11.8 2.3 4780 13 01 7.2 0.0-4.7 1.0...... max vind, nedbør, mintemp, maxtemp

Hva programmet skal gjøre Programoppførsel sett fra brukerens side: Det skriver ut på skjerm hvilke kommandoer brukeren kan gi. Deretter ber programmet om og leser inn en kommando fra brukeren. Programmet utfører den valgte kommandoen. Programmet skal gjenta de tre trinnene ovenfor helt til brukeren gir kommando om å avslutte (se nedenfor).

Ordrer som brukeren skal kunne gi 1. Lag stasjonsliste 2. Lag stasjonsliste for fylke 3. Lag månedsoversikt 4. Sammenlikne nedbør kyst/innland 5. Finn antall uværsdager 6. Sammenlikne været Øst/Nord-Norge 7. Avslutt

Klassene class Oblig4 Inneholder kun main-metoden. class Analyse Inneholder ordreløkke og andre metoder + HashMap'er class Stasjon Hvert objekt inneholder info + data for en værstasjon class Maaned Hvert objekt inneholder data for en måned class Dag Hvert objekt inneholder data for en enkelt dag

Klassene i nesten-uml Analyse Stasjon Maaned Dag Oblig4 NB: det mangler endel info her navn på forhold, antall på hver side av forhold, metoder

Maaned Hver måned med meteorologiske data for en gitt stasjon representeres ved et eget objekt av klassen Maaned. I denne klassen deklarerer du de nødvendige arrayer for å holde på de fire værmålingene (maksimal vindhastighet, nedbørsmengde, minimumstemperatur og maksimumstemperatur) for hver av dagene i måneden. Siden antall dager i en måned kan variere, kan du enten la arrayene i alle slike objekter ha en fast lengde (= 31, siden dette alltid er stort nok) og ha en egen heltallsvariabel i objektene som holder rede på hvor mange dager den aktuelle måneden har, eller du kan la arrayene i slike objekter være akkurat store nok (dadumåduviteantalldageri den aktuellemånedenførduoppretter arrayene)

Maaned forts. Klassen Maaned kan struktureres på flere måter. En mulighet er å deklarere fire like lange double-arrayer, en for hver av de fire værmålingene som gjøres. En annen mulighet er å lage en ny klasse Dag med fire double-variable, slik at hvert objekt av denne klassen holder på de fire værmålingene som gjøres en bestemt dag ved en bestemt stasjon. De fire arrayene i klassen Maaned kan da erstattes av en enkelt array med peker til Dag-objekter. Begge løsninger er akseptable, og hvilken man velger blir en smakssak. Selv foretrekker vi løsningen med Dag-objekter. Sistnevnte løsning med Dag-objekter kan sies å være mer i en objektorientert ånd. På den annen side vil Dag-objektene ikke inneholde vesentlig med metoder, så vi oppnår bare samling av relevante variable og ikke innkapsling (skjuling av detaljer).

Klassen Oblig4 import easyio.*; import java.util.*; class Oblig4 { public static void main (String[] args) { String s1 = "Stasjonsdata-1.txt"; String s2 = "Meteorologidata-1.txt"; Analyse a = new Analyse(s1, s2); a.ordreløkke();

Klassen Analyse : skisse class Analyse { HashMap hashnavnstasjon = new HashMap(); HashMap hashnummstasjon = new HashMap(); Analyse(String s1, String s2) { lesstasjonsdata(s1); lesmeteorologidata(s2); Konstruktør som gjør initialisering void lesstasjonsdata(string fnavn) {.. void lesmeteorologidata(string fnavn) {.. void ordreløkke() {... Datastruktur Metoder for å lese fra fil og for å lese inn ordre fra bruker... Her kommer det metoder som skal kalles fra ordreløkken

De to HashMap ene HashMap hashnavnstasjon = new HashMap(); Brukes for å holde orden på værstasjoner, med stasjonsnavn som nøkkel. HashMap hashnummstasjon = new HashMap(); Brukes for å holde orden på værstasjoner, med stasjonsnummer som nøkkel.

Konstruktøren i Analyse Analyse(String s1, String s2) { lesstasjonsdata(s1); lesmeteorologidata(s2); Konstrukturøren blir utført en enkelt gang under eksekveringen av programmet: idet vi lager vårt Analyse-objekt i klassen Oblig4 med setningen Analyse a = new Analyse(s1, s2); Etter at setningen over er utført, er altså alle data (forhåpentlig) lest inn fra fil og vi er klar til å motta ordre fra bruker.

Lesing av de to filene (stasjoner og vaerdata) Da opprettes objekter av de klassene du har definert etter hvert som du leser filenes. Alle klassene (med unntak den som inneholder mainmetoden) skal ha en konstruktør som du har skrevet selv og som initierer objektet med de data du leser inn om vedkommende objekt. Sjekk så nøye du kan at innlesningen fra fil og oppretting av datastruktur fungerer før du går videre med resten av programmeringen - Legg gjerne inn ekstra skjermutskrift i programmet slik at du kan sjekke hva som faktisk skjer ulike steder (slik skjermutskrift må du naturligvis fjerne før du leverer oppgaven).

Innlesing av stasjonsdata De første dataene vi leser fra fil er stasjonsdataene som ligger på filen "Stasjonsdata-1.txt". Kan gjøres slik: Åpne fil for lesing og gå i løkke: Les info om en stasjon (stasjonsnr, stasjonsnavn,...) Opprett stasjonsobjekt og fyll inn med info (bruk konstruktør) Legg stasjonsobjektet inn i de to HashMap'ene Gjenta så lenge det er mer igjen på fila NB: sørg for at når stasjonsobjektet opprettes så blir også Maaned-arrayen inni stasjonsobjektet opprettet. Vi trenger denne arrayen i det vi skal gjøre innlesningen nedenfor.

Innlesing av meteorologidata Det neste vi leser fra fil er meteorologidata fra filen "Meteorologidata-1.txt". Kan f.eks. gjøres slik: Åpne fil for lesing og gå i løkke: Les en linje med værdata (stasjonsnr,...) Lag et Dag-objekt og fyll inn med værdataene du nettopp leste (bruk konstruktør) Få tak i riktig stasjonsobjekt ved å slå opp i den ene HashMap'en, med stasjonnummer som nøkkel Send Dag-objektet til stasjonsobjektet (ved å kalle på en passende metode i stasjonsobjektet og sende med Dag-objektet og aktuell måned som parametre).

Hvordan behandle manglende data En måte å behandle manglende data på, er at alle -99 ene leses inn som om dette er virkelige data. De metoder som regner ut gjennomsnitt ol, må da hver gang sjekke om det er verdier!= -99 de finner og bare tar med dataverdier som ikke er -99. Slike metoder kan også selv returnere -99 dersom det ikke finnes noen data å gjøre beregningene på (enten f.eks for at brukeren spesifiserer en måned vi ikke har data for - f.eks. måned: 8 august, eller at alle data for vedkommende måned mangler). Husk at du samtidig må telle opp hvor mange dager du har virkelige observasjoner for, slik at gjennomsnittet blir riktig.

Norske eller engelske navn Når du skal regne ut f.eks. gjennomsnittlig nedbør over alle måneder for en bestemt stasjon, så kan du gå i løkke gjennom de ulike månedene og summere sammen gjennomsnittlig nedbør for hver av månedene. Til slutt deler du denne summen på antall måneder. (Selv om resultatet du da får ikke er eksakt likt det virkelige gjennomsnittet av alle målingene over alle måneder, vil forskjellen typisk være svært liten).

Ordreløkken For hver kommando som skal utføres, skal ordreløkken kalle på en passende metode i klassen Analyse. 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 dummymetoden i klassen Analyse: void lagstasjonsliste() { System.out.println( kall: lagstasjonsliste() );

Andre metoder i Analyse-klassen Programmer metodene som kalles fra ordreløkken Eksempel (i klassen Analyse): void finnantalluvæ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.inline(); System.out.println( Måned (1-6): ); int mnd = tast.inint(); Stasjon st = <finn stasjonen ved oppslag i hashnummstasjon>; int antdager = st.finnantuværsdager(mnd); <Skriv ut resultatet>

Metoder i Stasjon-klassen Analyse-klassen kaller på metoder i klassen Stasjon (= kommer med forespørsler overfor en gitt stasjon) Metodene i klassen Stasjon vil typisk kalle videre på metoder i klassen Maaned (= sende forespørsler overfor en gitt måned) Eksempel (i klassen Stasjon): int finnantuværsdager(int mnd) { Maaned md = mdata[mnd-1]; int antdager = md.finnantuværsdager(); return antdager;

Metoder i Maaned-klassen Stasjon-klassen kaller på metoder i klassen Maaned (= kommer med forespørsler overfor en gitt måned) Metodene i klassen Maaned vil få behov for å aksessere variable i Dag-objekter (= hente værdata for en bestemt dag i den gitte måneden). Variable i Dag-objekter kan du godt aksessere direkte, uten bruk av finn- og sett-metoder.

class Analyse { 1 void ordreløkke() {... finnantalluværsdager();... void finnantalluværsdager() {... int antdager = st.finnantuværsdager(mnd);... class Stasjon { int finnantuværsdager(int mnd) { Maaned md = mdata[mnd-1]; int antdager = md.finnantuværsdager(); return antdager; 3 2 class Maaned { int finnantuværsdager() {...