Oblig4 - forklaringer



Like dokumenter
Oblig4 - forklaringer. Arne og Ole Christian

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

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 - obligatorisk oppgave nr. 4 (av 4) i INF1000

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

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

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

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

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

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

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

UNIVERSITETET I OSLO

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

Endret litt som ukeoppgave i INF1010 våren 2004

INF Uke 10. Ukesoppgaver oktober 2012

UNIVERSITETET I OSLO

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

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

Inf1000 (Uke 10) Oppgaveløsning. Hashmap

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

Oblig 4Hybelhus litt mer tips enn i oppgaven

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

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

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

Emnekode: LV121A Dato: Alle skrevne og trykte hjelpemidler

INF1000: noen avsluttende ord

PRØVEEKSAMEN (rettet versjon 27/11)

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

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

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?

UNIVERSITETET I OSLO

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

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 Variable. Marit Nybakken 27. januar 2004

UNIVERSITETET I OSLO

INF1000 : Forelesning 4

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

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

1. Separatorer (skilletegn) i easyio

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

UNIVERSITETET I OSLO

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 10) HashMap og ArrayList

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

UNIVERSITETET I OSLO

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

ALGORITMER OG DATASTRUKTURER

UNIVERSITETET I OSLO

Oppgave 1 (Programtolkning) INF1000 Eksamen V06. Oppgave 1 (Programtolkning) Oppgave 1 (Programtolkning)

2 Om statiske variable/konstanter og statiske metoder.

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

INF1010 Arv. Marit Nybakken 2. februar 2004

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

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

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

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

UNIVERSITETET I OSLO

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

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

Oblig 3 tips litt mer tips enn i oppgaven

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

UNIVERSITETET I OSLO

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 7

Forelesning inf Java 4

UNIVERSITETET I OSLO

INF 1010, vår 2005 Løsningsforslag uke 11

Beregning av med svært mange desimaler

UNIVERSITETET I OSLO

INF1000: Forelesning 4. Mer om arrayer Metoder

Repetisjon. INF gruppe 13

INF1000 (Uke 6) Mer om metoder, tekster

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

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 Metoder. Marit Nybakken 16. februar 2004

Løsningsforslag, inf101, våren 2001

INF1000 (Uke 11) Programmering

INF Notat om I/O i Java

Forelesning inf Java 5

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

Forelesning inf Java 5

Transkript:

Struktur og alle (?) klassene Oblig4 - forklaringer Arne og Ole Christian 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(); class VaerAnalyse { HashMap stasjonfranavn = new HashMap(); HashMap stasjonfranr = new HashMap(); VaerAnalyse(String stasjonsfilnavn, String vaerfilnavn) { lesstasjonerfrafil(stasjonsfilnavn); lesvaerdatafrafil(vaerfilnavn); void lesstasjonerfrafil(string fnavn) {... void lesvaerdatafrafil(string fnavn) {... void ordreløkke() {... void lagstasjonsliste() {... void finnantuværsdager() {... void finnregnkystinnland() {... void sammenlignøstnord() {... class Stasjon {... // Ett objekt for hver stasjon class Maanedsdata {... // Seks objekter for hver stasjon... eventuelt flere klasser... Datafilene Klassen Oblig4 inneholder main-metoden og gjør ikke stort annet enn å få programmet i gang. Når programmet skal kjøres gir du en av kommandoene java Oblig4 eller java Oblig4 <stasjonsdatafil> <værdatafil> I første tilfellet vil programmet benytte de to filene "Stasjoner-1.txt" og "Vaerdata-1.txt". I siste tilfellet vil programmet benytte de to filene som oppgis. Setningen VaerAnalyse va = new VaerAnalyse(s1, s2); kaller så på konstruktøren i klassen VaerAnalyse og overfører de to filnavnene til denne konstruktøren, slik at filene kan åpnes for lesing. Når du senere vil prøve å lese de større filene, gir du kommandoen java Oblig4 Stasjoner-2.txt Vaerdata-2.txt

Klassen Stasjon Maanedsdata Hver værstasjon representeres ved et eget objekt av klassen Stasjon. I denne klassen deklarerer du objektvariable for alle opplysningene om en stasjon: stasjonsnummer, stasjonsnavn, høyde, osv. I tillegg må hvert stasjonsobjekt holde rede på "sine" værdata. Hver måned med Værdata for en gitt stasjon representeres ved et eget objekt av klassen Maanedsdata. 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 (da du må du vite antall dager i den aktuelle måneden før du oppretter arrayene) Array for Maanedsdata i Stasjon Klassene i nesten-uml Klassen Maanedsdata kan struktureres på flere måter. En mulighet er å deklarere fire like lange double-arrayer i Månedsdata, en for hver av de fire værmålingene som gjøres. VaerData Stasjon Maanedsdata Dag?? En annen mulighet er å lage en ny klasse Dagdata 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 Maaedsdata kan da erstattes av en enkelt Dagdataarray. Begge løsninger er akseptable, og hvilken man velger blir en smakssak. Oblig4 Sistnevnte løsning med Dagdata kan sies å være mer i en objektorientert ånd, menpå den annen side vil Dagdata-objektene ikke inneholde stort andre metoder enn å regne ut gjennomsnittstemperaturen.

Hvordan vite om alle Stasjonene (to HashMap er?) Hvert stasjonsobjekt må holde rede på nøyaktig seks objekter av klassen Månedsdata (ett objekt forjanuar-målingene, ett objekt for februar-målingene, osv). Dette kan hensiktsmessig gjøres ved hjelp av en array Maanedsdata mdata = new Maanedsdata[6]; Alternativt kan du gjerne bruke Maanedsdata mdata = new Maanedsdata[12]; Spørsmålet er hvordan fange opp at det er ikke data for juli-desember? Hvis du bare har 6 elementer i arrayen, eller 12? For å holde orden på alle objektene av klassen Stasjon kunne du i prinsippet benyttet en array i klassen VaerAnalyse. 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, stnavn er en String-variabel med stasjonsnavnet, og stnummer er en String-variabel med stasjonsnummeret, så kan du legge stasjonen inn i HashMap ene stasjonfranavn og stasjonfranr ved å skrive: stasjonfranavn.put(stnavn, st); stasjonfranr.put(stnummer, st); Hva hvis du fikk data for 12 mnd i filene? Mer om to HashMap er Disse legger stasjonsobjektet (egentlig en peker til objektet) inn i de to HashMap ene, med henholdsvis stasjonsnavn og stasjonsnummer som nøkkel. 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 vi 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. For å få tak i stasjonsobjektet svarende til stasjonsnavnet stnavn, kanduskrive Mer om to HashMap er Hvis du forsøker å få tak i et stasjonsobjekt og oppgir et stasjonsnavn som ikke finnes i HashMap en, så vil du få returnert verdien null, dvs vi vil da ha st == null etter at setningen ovenfor er utført. Det kan være lurt å sjekke spesielt på dette i programmet, slik at du unngår rare feilmeldinger (NullPointerException s) senere under programeksekveringen. Tilsvarende gjelder naturligvis for den andre HashMap en, dvs hvis du forsøker å hente et stasjonsobjekt fra stasjonfranr og oppgir et stasjonsnummer som ikke er registrert i HashMap en så får du returnert verdien null. Stasjon st = (Stasjon) stasjonfranavn.get(stnavn); og tilsvarende for den andre HashMap en hvis du kjenner stasjonsnummeret.

Mer om å søke Tegne UML-diagram Hvorfor er det to HashMap er og ikke en? Årsaken er at det av og til er ønskelig å søke etter en stasjonen ut fra stasjonsnummer og av og til ut fra stasjonsnavn (selv om det ikke står eksplisitt i oppgaveteksten, kan du anta at stasjonsnavnet også entydig identifiserer en værstasjon). 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. Klasse eller objekt-diagram? 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. Oblig4 VaerData Stasjon Maanedsdata Dag?? Ordreløkka Metodene uten parametere 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 langt mer oversiktlig at ordreløkken delegerer (overfører) oppdrag til andre metoder enn at alt skal foregå i selve løkken. Metodene som kalles fra ordreløkken skal ikke ha parametre, og de skal heller ikke returnere noen verdi. Å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 parametre eller returverdi). 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 finnantuværsdager().

Metodene spør selv brukeren Lesing av de to filene (stasjoner og vaerdata) Metodene som kalles fra ordreløkken (f.eks. finnantuværsdager() ), 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 parametre og med returverdi) som utfører selve operasjonen og returnerer resultatet; (3) de skriver ut resultatet på skjermen. Det betyr at metoden finnantuværsdager() kan inneholde et kall på en metode i VaerAnalyse som du f.eks. kan kalle int antuværsdager(string stasjonsnr, int måned) {... som du også må skrive (evt kan du slå sammen de to metodene over til en enkelt metode; se forelesningen 2/11). Denne må slå opp i HashMap'en for å finne riktig stasjonsobjekt, og kalle på en metode int antuværsdager(int mnd) {... i dette objektet. 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. 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). Tre hjelpemetoder i klassen for en maaned eller dag Hvordan behandle manglende data Lag tre hjelpemetoder i den klassen som representerer måledata for en måned for en stasjon: Den første regner ut gjennomsnittlig nedbør per dag den måneden Den andre metoden regner ut gjennomsnittlig temperatur for måneden ut fra max- og min-temperaturene for hver dag, eller kaller gjennomsnittmetoden i klassen Dag Densistemetodenteller oppantalluværsdøgn. 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 Javadoc 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). Når du skal lage javadoc av systemet ditt, så husk at du kan lage korte javadockommentarer på en linje som f.eks: /** Skriver ut bruker-menyvalg */ void meny (Out ut) {... Javadoc-kommentarer for en objektvariabel plasseres like over deklarasjonen, som f.eks: /** Stasjonenes høyde over havet(meter) */ int høyde Spørsmål? Mønster -løsning?