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



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

Oblig4 - forklaringer. Arne og Ole Christian

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

Oblig4 - forklaringer. Arne og Ole Christian

Oblig4 - forklaringer

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

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

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

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

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

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

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

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

UNIVERSITETET I OSLO

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

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

INF Uke 10. Ukesoppgaver oktober 2012

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

UNIVERSITETET I OSLO

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

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

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

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Utførelse av programmer, metoder og synlighet av variabler i JSP

UNIVERSITETET I OSLO

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

Oblig 4Hybelhus litt mer tips enn i oppgaven

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

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

Ordliste. Obligatorisk oppgave 1 - Inf 1020

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

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

UNIVERSITETET I OSLO

Enkle generiske klasser i Java

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

Endret litt som ukeoppgave i INF1010 våren 2004

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

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

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

UNIVERSITETET I OSLO

INF1000 Metoder. Marit Nybakken 16. februar 2004

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

UNIVERSITETET I OSLO

2 Om statiske variable/konstanter og statiske metoder.

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

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

INF1000 Prøveeksamen Oppgave 7 og 9

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

INF1010 Arv. Marit Nybakken 2. februar 2004

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

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

TOD063 Datastrukturer og algoritmer

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

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

MAT-INF 1100: Obligatorisk oppgave 1

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Antall sider (inkl. forsiden): 7. Alle trykte og håndskrevne

Bruk av oppgaver og grupper i

INF1000 HashMap. Marit Nybakken 2. november 2003

UNIVERSITETET I OSLO

Obligatorisk oppgave 4 i INF1010, våren 2014: "Leger og resepter" Versjon 1.1

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000 : Forelesning 4

Repetisjon. INF gruppe 13

81,9(56,7(7(7,26/2 'HWPDWHPDWLVNQDWXUYLWHQVNDSHOLJHIDNXOWHW

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

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

Projeksjoner av vektorer Analyse av værdata

MAT-INF 1100: Obligatorisk oppgave 1

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

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 10) Oppgaveløsning. Hashmap

Forelesning inf Java 4

Generelt om oblig 3. Oppgaveteksten kort sammendrag. Deloppgaver/menyvalg 15/03/2010. INF1000 Forelesning 9

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Høgskolen i Gjøvik Institutt for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

Dagens tema Kapittel 8: Objekter og klasser

UNIVERSITETET I OSLO

INF1000: noen avsluttende ord

Oppgaven består av to deler, del A og del B. Alle skal besvare både del A og del B, men det finnes noen valgmuligheter innenfor hver del.

Løse reelle problemer

INF Innleveringsoppgave 6

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

INF1000: noen avsluttende ord

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

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

Transkript:

Oblig4 - obligatorisk oppgave nr. 4 (av 4) i INF1000 Leveringsfrist Innleveringsfristen er fredag 14. november kl 16.00. Viktig: se side 4 for detaljerte leveringskrav. Formål Formålet med denne oppgaven er å gi trening i hele pensum og i å lage større programmer. Løsningen du lager skal være objektorientert. Det innebærer blant annet at datastrukturen (den delen av programmet som skal holde på dataene ) skal gjøre bruk av objekter av klasser som du selv definerer. For mer detaljert informasjon om hvordan du kan gå fram for å løse oppgaven, se avsnittet Tips & krav til løsningen. Oppgave Meteorologisk institutt har en rekke værstasjoner rundt i Norge. Ved hver stasjon gjøres det daglig en rekke værmålinger, og resultatene samles på store datafiler for senere analyser. Hensikten med denne oppgaven er å lage et program som kan lese slike meteorologiske data fra fil, legge dataene inn i en fornuftig datastruktur, gjøre noen enkle beregninger og skrive ut resultatene på skjerm. Programmet skal være kommandostyrt. Programmet skal gjøre bruk av data som ligger i filene Stasjonsdata-1.txt, Stasjonsdata-2.txt, Meteorologidata-1.txt og Meteorologidata-2.txt som du kan laste ned fra kursets nettsider http://www.ifi.uio.no/inf1000/h08/obliger til ditt eget filområde. Programmet skal holde rede på følgende opplysninger om hver værstasjon: stasjonsnavn, stasjonsnummer, fylke, kommune og høyde (over havet). Disse opplysningene skal programmet lese fra filen Stasjonsdata-1.txt. Første linje i filen er en overskrift. Øvrige linjer i filen inneholder opplysninger om den enkelte værstasjon. Hver opplysning er et ord eller et heltall, og opplysningene er atskilt med tabulatortegn. Her er et eksempel på en linje i filen (dette er værstasjonen på Gardermoen flyplass): Gardermoen 4780 Akershus Ullensaker 202 Her står det altså at det er en værstasjon med stasjonsnavn Gardermoen og stasjonsnummer 4780 som ligger i Ullensaker kommune i Akershus fylke, og stasjonens høyde over havet er 202 meter. Både stasjonsnummeret og stasjonsnavnet er entydige identifikatorer for en stasjon, dvs to forskjellige stasjoner har alltid ulikt stasjonsnummer og ulikt stasjonsnavn. I tillegg til opplysningene om værstasjoner skal programmet holde rede på daglige værmålinger som er gjort ved hver av stasjonene i tidsrommet 01.01.2003 30.06.2003 (altså de seks første måneder av 2003). De daglige målingene vi er interessert i er vindhastighet, nedbørsmengde, minimumstemperatur og maksimumstemperatur. Disse måledataene må programmet lese fra filen Meteorologidata-1.txt. Måledataene ligger stasjonsvis på filen, dvs først kommer alle data for en stasjon, deretter for en annen stasjon, osv. Første linje i filen er en overskrift. Øvrige linjer i filen inneholder følgende opplysninger for én bestemt stasjon og én bestemt dag: stasjonsnummer, måned, dag-i-måned, nedbørsmengde, minimumstemperatur, maksimumstemperatur og vindhastighet. Her er to av linjene i filen (de ulike opplysningene på en linje er separert av tabulatortegn): 4780 1 14 0.3-2.4 6.2 10.8 4780 1 15 0.0 1.4 5.0 8.7 1

Stasjonsnummeret er 4780 i begge linjer (fra den andre filen vet vi da at dette er stasjonen med navn Gardermoen). Ut fra den første linjen vet vi altså at det ved Gardermoen værstasjon den 14. januar var en nedbørsmengde på 0.3 mm, en minimumstemperatur på -2.4 C, en maksimumstemperatur på 6.2 C og en vindhastighet på 10.8 m/sek (vindhastigheten varierer naturligvis i løpet av dagen, og den oppgitte vindhastigheten er egentlig den høyeste vindhastigheten som er observert den akuelle dagen). Tilsvarende for neste linje. For noen av datafeltene i filen Meteorologidata-1.txt mangler det observasjoner, og da står verdien -999 der det skulle stått en måling. Du må sørge for at forekomstene av -999 ikke tas med i beregninger, f.eks. når du skal regne ut et gjennomsnitt. Når du er sikker på at programmet ditt virker, skal du erstatte filene ovenfor med de to filene Stasjonsdata-2.txt og Meteorologidata-2.txt. Disse er bygget opp på akkurat samme måte som de to første filene, men de inneholder data om mange flere værstasjoner, og du anbefales derfor å vente med å se på disse til du føler deg trygg på at programmet fungerer. Når programmet starter opp, skal det lese filen med stasjonsdata og filen med værdata, og dataene legges inn i den datastrukturen du har definert. De to datafilene bør du på forhånd ha kopiert over til ditt eget område, slik at de ligger på samme filområde som du kjører Java-programmet fra. Programmet skal deretter være kommandostyrt, dvs det skal kunne ta imot en kommando fra brukeren, utføre kommandoen, ta imot ny kommando, osv, helt til brukeren ønsker å avslutte. Mer konkret skal programmet oppføre seg slik 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). Brukeren skal kunne gi følgende kommandoer: Lag stasjonsoversikt. Programmet skal da skrive ut på skjermen en sortert liste over alle værstasjoner. Listen skal inneholde en linje for hver stasjon og denne linjen skal inneholde stasjonsnavnet, stasjonsnummeret, fylket, kommunen og høyden til stasjonen (i den rekkefølgen). Listen skal være sortert med hensyn på stasjonsnavnet. Lag stasjonsoversikt for fylke. Programmet skal da be om og lese inn navnet på et fylke (f.eks. Akershus) og deretter skrive ut på skjermen en sortert liste over alle stasjonene som ligger i dette fylket. Listen skal inneholde en linje for hver stasjon, og denne linjen skal inneholde stasjonsnavnet, stasjonsnummeret, kommunen og høyden til stasjonen (i den rekkefølgen). Listen skal være sortert med hensyn på stasjonsnavnet. Lag månedsoversikt. Programmet skal da be om å få oppgitt enten nummeret eller navnet til en stasjon (brukeren kan da f.eks. svare 4780 eller Gardermoen ). Svaret leses inn og deretter skal det skrives ut en månedsvis oppsummering av været ved denne stasjonen, med en passende overskrift øverst. Mer presist skal du for hver måned skrive ut en linje på skjermen som angir måned og deretter gjennomsnittlig minimumstemperatur, gjennomsnittlig maksimumstemperatur, gjennomsnittlig nedbør, høyeste målte nedbør, gjennomsnittlig vindhastighet og høyeste målte vindhastighet for den måneden. De to første linjene av utskriften kunne f.eks. være slik: Måned SnittMinTemp SnittMaxTemp SnittNedbør MaxNedbør SnittVind MaxVind Januar -5.2 2.4 0.2 1.2 5.6 14.2 2

Sammenlikne kystvær og innlandsvær. En kyststasjon er definert som en stasjon med høyde < 60, og en innlandsstasjon er en stasjon med høyde 60. Programmet skal, måned for måned, sammenlikne været ved kyststasjoner med været ved innlandsstasjoner. Mer presist skal du for hver måned beregne fire verdier som vi kan kalle vindkyst, vindinnland, nedbørkyst og nedbørinnland. Programmet skal skrive ut på skjerm først en overskrift og deretter en linje for hver måned som angir måned og de fire utregnede verdiene. Verdien til vindkyst skal du finne i to steg: (1) beregne for hver kyststasjon hva gjennomsnittlig vind var den gitte måneden; og (2) beregne gjennomsnittet av de verdiene du fant i punkt (1) og kalle dette gjennomsnittet for vindkyst. De tre andre verdiene finner du på helt analogt vis. Husk å bare telle med de dagene hvor det er gjort observasjoner, dvs ikke ta med de dagene hvor filen inneholdt verdien -999 i feltet for nedbør for den gitte stasjonen. Finn antall uværsdager. Programmet skal da spørre brukeren om å få oppgitt nummeret eller navnet til en stasjon. Så skal programmet gå gjennom alle observasjonsdata for den valgte værstasjonen og for hver måned telle opp antall uværsdager. En uværsdag er en dag hvor begge disse betingelsene er oppfylt: - nedbørsmengden er større enn eller lik 7 - vindhastigheten er større enn eller lik 10 Dvs du skal finne antall dager det både regner og blåser mye. Programmet skal skrive ut på skjerm en overskrift og deretter for hver måned en linje som angir måned og antall uværsdager. Sammenlikne været Østlandet/Nord-Norge. Programmet skal først spørre brukeren om en måned (et heltall mellom 1 og 6). Deretter skal du for Østlandet og for Nord-Norge hver for seg beregne gjennomsnittlig middeltemperatur og gjennomsnittlig nedbørsmengde. Mer presist skal du for Østlandet finne to størrelser tempøst og nedbørøst, og tilsvarende for Nord-Norge. Østlandet omfatter her alle værstasjoner i fylkene Akershus, Oslo, Oppland, Buskerud og Vestfold. Nord-Norge omfatter alle værstasjoner i Nordland, Troms og Finnmark. Du finner tempøst i to steg: (1) beregne for hver stasjon på Østlandet hva gjennomsnittlig middeltemperatur var den gitte måneden; og (2) beregne gjennomsnittet av de verdiene du fant i punkt (1). Gjennomsnittlig middeltemperatur for en gitt stasjon finner du ved å summere middeltemperaturen over alle dager den gitte måneden og dele på antallet dager (husk å korrigere for eventuelle manglende observasjoner). Middeltemperaturen for en gitt stasjon og dag er definert som (minimumstemperatur + maksimumstemperatur) / 2.0. Du finner nedbørøst på tilsvarende måte i to steg: (1) beregne for hver stasjon på Østlandet hva gjennomsnittlig nedbørsmengde var den gitte måneden; og (2) beregne gjennomsnittet av de verdiene du fant i punkt (1). For en gitt stasjon finner du gjennomsnittlig nedbørsmengde ved å summere opp nedbøren over alle dager den gitte måneden og dele på antallet dager (husk også her å korrigere for eventuelle manglende observasjoner). For å finne de tilsvarende størrelser tempnord og nedbørnord for Nord-Norge, gjør du akkurat som ovenfor, men nå basert på alle værstasjonene i Nord-Norge. Skriv til slutt ut resultatene på skjermen med en passende overskrift. Avslutt. Programmet skal da avslutte. 3

Leveringskrav Som for tidligere obligatoriske oppgaver må du følge de generelle krav til innleverte oppgaver ved institutt for informatikk: http://www.ifi.uio.no/studinf/skjemaer/erklaring.pdf. Viktig Oppgaven løses i grupper på en eller to personer. Når to personer løser oppgaven sammen, skal de levere en fellesbesvarelse (det er valgfritt hvem av de to som leverer), og det må gå tydelig fram i toppen av besvarelsen hvem som er med på leveringen og hvilke øvingsgrupper disse tilhører. Det regnes som fusk å utveksle programmer, deler av programmer eller utkast til programmer mellom samarbeidsgrupper, eller mer generelt å ta utgangspunkt i programkode man ikke har skrevet selv (med unntak av eventuell programkode som gis av forelesere og øvingslærere i kurset). Innen fristen skal hver gruppe ha levert: Det ferdige programmet ( Oblig4.java ). Kravet til programmet er i utgangspunktet at det (1) kompilerer uten feil, (2) gir en fullstendig løsning på oppgaven, og (3) er oversiktlig skrevet og med kommentarer, slik at det er lett å forstå programmets virkemåte. Mer detaljert informasjon kan fås ved henvendelse til din øvingslærer. UML-klassediagram over systemet ditt. Husk å sette navn på de forholdene du vil ha i systemet ditt. For også opp antall på begge sider av forholdene. UML-diagrammet kan leveres direkte til øvingslærer som en håndtegning, eller du kan lage tegningen med et tegneprogram og sende den på epost til øvingslærer som postscript-fil eller pdf-fil (hvis du ønsker å benytte et annet filformat må du isåfall avtale dette først med øvingslæreren). Uansett leveringsmåte må du huske å merke tegningen tydelig med ditt navn og brukernavn, og hvilken øvingsgruppe du tilhører. Resultatet av en testkjøring. Denne skal vise utskriften på skjermen når du starter opp programmet ditt og tester ut de forskjellige delene som du er spurt om å lage i oppgaven. Innlevering skal skje via Joly; legg da først inn programfilen og deretter kjøreeksemplet som tilleggsfil. UML-diagram leveres separat på e-post (også innen fristen) eller direkte til øvingslærer. Joly-systemet virker på Blindern-maskinene, og det virker som oftest også hjemmefra hvis du kjører VPN eller Remote Desktop. Hvis du har tungtveiende grunner til at du må levere via epost i stedet for via Joly, må du søke og få tillatelse til dette av øvingslærer i god tid på forhånd. Hvis du har spørsmål vedrørende leveringsmåte eller annet, kontakt øvingslæreren din i god tid før innleveringsfristen. Husk at det er ditt ansvar at oppgaven kommer frem til øvingslæreren på riktig måte innen fristen! 4

Tips & krav til løsningen Nedenfor finner du noen tips til hvordan du kan legge opp arbeidet med å løse oblig 4 i INF1000, samt ytterligere spesifisering av noen innleveringskrav (se spesielt punkt 7 nedenfor). Tipsene er organisert i to kategorier: ting som angår programmets struktur (inkludert datastrukturen) og ting som angår programmeringen av de enkelte kommandoene. Programmets struktur 1. Programmet du skal skrive kan for eksempel struktureres slik: 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(); class Analyse { HashMap <String,Stasjon> hashnavnstasjon = new HashMap<String,Stasjon>(); HashMap<String,Stasjon> hashnummstasjon = new HashMap<String,Stasjon>(); Analyse(String stasjonsfilnavn, String meteofilnavn) { lesstasjonsdata(stasjonfilnavn); lesmeteorologidata(meteofilnavn); void lesstasjonsdata (String fnavn) {... void lesmeteorologidata (String fnavn) {... void ordreløkke() {... void lagoversiktstasjoner() {... void lagoversiktstasjonerifylke() {... void lagmånedsoversikt () {... void sammenliknkystinnland() {... void finnantalluværsdager() {... void sammenliknøstnord() {... class Stasjon {... class Maaned {... // Ett objekt for hver stasjon // Seks objekter for hver stasjon class Dag {... 5

... eventuelt flere klasser... 2. Noe av det første du bør gjøre etter at du har lest og forstått oppgaven, er å tegne et UMLklassediagram slik at du ser for deg hvordan de ulike komponentene i programmet henger sammen. Ikke vent med denne jobben til programmeringen er ferdig. 3. Hver værstasjon representeres ved et eget objekt av klassen Stasjon. I denne klassen deklarerer du objektvariable for alle opplysningene om en stasjon: stasjonsnavn, stasjonsnummer, høyde, osv. I tillegg må hvert stasjonsobjekt holde rede på "sine" værdata. 4. Hver måned med værdata 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 (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 (da du må du vite antall dager i den aktuelle måneden før du oppretter arrayene). 5. Klassen Maaned kan struktureres på flere måter. En mulighet er å deklarere fire like lange doublearrayer i Maaned, 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 Dag-array. Begge løsninger er akseptable, og hvilken man velger blir en smakssak (sistnevnte løsning kan sies å være mer i en objektorientert ånd, men på den annen side vil Dag-objektene ikke inneholde stort andre metoder enn de som skal til for å ta ut og sette inn verdier, og løsningen medfører et ekstra nivå med pekere og objekter). 6. Hvert stasjonsobjekt må holde rede på nøyaktig seks objekter av klassen Maaned (ett objekt for januar-målingene, ett objekt for februar-målingene, osv). Dette kan hensiktsmessig gjøres ved hjelp av en array Maaned mdata = new Maaned[6]; som deklareres i klassen Stasjon. 7. For å holde orden på alle objektene av klassen Stasjon kunne du i prinsippet benyttet en array i klassen Analyse. En annen løsning er å benytte HashMap. Begge løsninger vil føre frem, men for å få trening i bruk av HashMap, er det dette du skal benytte i denne oppgaven. Hvis st er en peker til et stasjonsobjekt, navn er en String-variabel med stasjonsnavnet, og numm er en String-variabel med stasjonsnummeret, så kan du legge stasjonen inn i HashMap ene hashnavnstasjon og hashnummstasjon ved å skrive hashnavnstasjon.put(navn, st); hashnummstasjon.put(numm, st); 6

Disse legger stasjonsobjektet (egentlig en peker til objektet) inn i de to HashMap ene, med henholdsvis stasjonsnavnet og stasjonsnummeret som nøkkel. Vær klar over at nøkkelen i en HashMap skal være en String (det er egentlig mer generelt enn det, men det ser vi bort fra i INF1000). Vi vil aldri være interessert i å tenke på stasjonsnummere som tall (vi vil f.eks. aldri ønske å summere to stasjonsnummere). Du anbefales derfor å lese inn stasjonsnummere fra fil og terminal som tekststrenger og ikke som heltall. 8. Hvorfor benytte to HashMap er og ikke en? Årsaken er at det av og til er ønskelig å søke etter stasjonen ut fra stasjonsnummer og av og til ut fra stasjonsnavn. Med to HashMap er en hvor nøkkelen er stasjonsnavnet og en hvor nøkkelen er stasjonsnummeret, får vi både i pose og sekk. Det er de samme stasjonsobjektene du skal legge inn i de to HashMap ene, men nøklene vil være ulike. De enkelte kommandoene 1. De to første kommandoene (lag stasjonsliste og lag stasjonsliste for fylke) skal skrive ut sorterte lister over stasjoner. Siden stasjonene ligger lagret i HashMap er kan du få tak i alle stasjonene ved å løpe gjennom en av de to HashMap ene. Dette vil imidlertid ikke gi deg stasjonene i den rekkefølgen du ønsker (altså sortert med hensyn på stasjonsnavn). For å få laget en sortert liste, kan du gjøre følgende: (1) løp gjennom en av HashMap ene for å få tak i alle stasjonsnavnene, og legg disse stasjonsnavnene fortløpende inn i en String-array allenavn; (2) sorter listen av stasjonsnavn ved å utføre java.util.arrays.sort(allenavn); (3) løp gjennom alle navnene i allenavn og for hvert navn slå opp i HashMap en hashnavnstasjon for å finne tilhørende stasjon. Dette gir deg stasjonene sortert etter stasjonsnavn, og nå kan du for hver stasjon skrive ut de ønskede data på skjermen. Merk at når du skal deklarere arrayen allenavn så er det greit å vite hvor mange stasjoner man har. Det kan derfor være greit å ha en objektvariabel i klassen Analyse som heter antallstasjoner og som du finner verdien til idet du leser inn data fra filen Stasjonsdata-1.txt. En annen måte å finne antall stasjoner på er ved hjelp av HashMap-metoden size(), se side 189 i læreboka. 2. For to av kommandoene (lag månedsoversikt og finn antall uværsdager) skal programmet be brukeren om et stasjonsnummer eller et stasjonsnavn. Ideen er her at brukeren selv skal få bestemme om stasjonsnummer eller stasjonsnavn skal oppgis, og så skal programmet forstå av svaret som gis om det dreier seg om et nummer eller et navn. Anta at brukerens svar ligger i Stringvariabelen svar. Vi vet ikke om svaret er et stasjonsnavn eller et stasjonsnummer, så vi forsøker begge HashMap ene (i vilkårlig rekkefølge): Stasjon st = null; if (hashnummstasjon.containskey(svar)) { st = hashnummstasjon.get(svar); else if (hashnavnstasjon.containskey(svar)) { st = hashnavnstasjon.get(svar); else { // Feil oppstått: brukeren har svart noe som verken er // et gyldig stasjonsnummer eller et gyldig stasjonsnavn. // Gi brukeren beskjed om dette, og avslutt utførelsen // av kommandoen 7

3. Når du leser inn stasjonsnavn fra filen Stasjonsdata-1.txt eller Stasjonsdata-2.txt så er stasjonsnavnene skrevet med store bokstaver. Det betyr at når du senere skal søke etter en stasjon basert på stasjonsnavnet, så må du også da skrive stasjonsnavnet med store bokstaver (ellers vil vi ende opp i den siste else-grenen ( Feil oppstått ) i punkt 7 ovenfor. Alternativt kunne du ha konvertert brukerens svar til store bokstaver før du søker i HashMap en hashnavnstasjon (du trenger ikke å gjøre dette i denne obligen). 4. Det neste du bør gjøre er å skrive ordreløkken. Når programmet har funnet ut hvilken ordre som skal utføres, skal ordreløkken kalle på en metode som utfører ordren. Ordreløkken selv skal altså ikke inneholde selve programkoden som utfører kommandoen. Årsaken til dette er at det er mye mer oversiktlig at ordreløkken delegerer oppdrag (til andre metoder) enn at alt skal foregå i selve løkken. 5. Metodene som kalles fra ordreløkken skal ikke ha parametre, og de skal heller ikke returnere noen verdi (dvs. de skal være av typen void). Årsaken er enkel: siden ordreløkken delegerer videre alt ansvar for å utføre kommandoen, så skal også kommunikasjon med bruker foregå utenfor ordreløkken (og dermed er det ikke særlig poeng i parametere eller returverdier). Den eneste kommunikasjonen med bruker som ordreløkken skal stå for, er valg av neste kommando. Eksempel: hvis brukeren ønsker å utføre kommandoen Finn antall uværsdager, så skal ordreløkken kalle på metoden finnantalluværsdager(). 6. Metodene som kalles fra ordreløkken (f.eks. finnantalluværsdager() i eksemplet i punktet over), ihvertfall de som skal utføre beregninger, kan med fordel struktureres slik: (1) de henter inn nødvendig informasjon fra brukeren; (2) de kaller på en metode (med parametere og med returverdier) som utfører selve operasjonen og returnerer resultatet; (3) de skriver ut resultatet på skjermen. Det betyr at metoden finnantalluværsdager() vil inneholde et kall på en metode int antuværsdager(string stnumm, int måned) {... som du også må skrive. Nøyaktig hvordan arbeidsdelingen skal være mellom de to metodene er litt opp til deg, men forsøk å lage et naturlig skille mellom hva som er ansvarsområdet for de to metodene. 7. Skriv deretter de delene av programmet som leser de to filene. Opprett objekter av de klassene du har definert etter hvert som du leser fra filene. Alle klassene (med unntak av den som inneholder main-metoden) 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). 8. En måte å behandle manglende data på, er at alle -999 ene leses inn som om dette er virkelige data, og at metoder som regner ut gjennomsnitt ol, hver gang sjekker om det er verdier!= -999 de finner og bare tar med dataverdier som!= -999. Slike metoder kan også selv returnere -999 dersom det ikke finnes noen data å gjøre beregningene på (enten for eksempel 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). 8