Oblig4 - forklaringer Arne og Ole Christian.

Slides:



Advertisements
Liknende presentasjoner
Repetisjon innkapsling static tabell av primitiv datatype LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring.
Advertisements

Hvordan skrive en vitenskapelig artikkel?
Tabeller av objekter Klassen ArrayList
14 okt. 2003, Arne Maus Inst. for informatikk, UiO
Ebus Management Center En liten bruksanvisning for de enkleste funksjonene.
Datafiler og serialisering Tekstfiler Scanner-klassen Binær overføring av data Direkte tilgang til filinnholdet Serialisering LC191D Videregående programmering.
Uke 10 - Sortering, og hvordan lage en klasse for et klassebibliotek 21 okt. 2003, Arne Maus Inst. for informatikk, UiO.
Uke 8 - Mer om: Objekter, klasser og pekere
1 Java 6 Mer om metoder Tekster Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo.
1 Litt om OO og programmering Arne Maus. 2 OO og Java (og C++, C#)  Arven fra Simula  Programstruktur i Java  Generering av objekter  Beskyttelse.
Gruppe 6 Gunnar Henrik Mathias Morten Ronny Svein Ivar.
Java 12 Mer filbehandling - skrive til fil HashMap Et større eksempel Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
Java 4 Mer om forgreninger While-løkker Ole Christian Lingjærde
Objekt, Instanser og referanser + litt til. Objekter  Instanser  En instans er et objekt av en bestemt klasse  Instanser blir laget ved å kalle klassens.
Objektorientert programmering i PHP del 2
Java 14 Et eksempel fra bioinformatikk: analyse av biologiske sekvenser Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
IS-102 Klassedefinisjoner
Eiendomregister mars 2002 Arne Maus. import java.util.*; import inf101.*; /* Klasse med main() som starter hele programmet */ class EiendomsregisterMain.
Eiendomsregister - eksempel
C# for javaprogrammerere
Generelt I/O if/else Funksjoner Lists Løkker Dictionaries Annet Listebehandling Klasser Python med noen algdat-anvendelser Åsmund Eldhuset asmunde *at*
En gang til!? .
Operativsystemer.  Tilstandsmaskiner kalles på engelsk Finite State Machines.  Tilstandsmaskiner er en metode til å beskrive systemer med logisk og.
Filer Finne minste Finne Største Beregne gjennomsnitt Variabler Tabeller – Arrays Lage frekvenstabell.
Feilhåndtering. Feil er uunngåelige! Erfaring viser at feil i dataprogrammer som består av mer enn noen få linjer ikke er til å unngå. For å få et godt.
Gjennomgang av prøven Tidsangivelse. Prøven deles ut Vi fyller ut øvelsen sammen.
INF150 Programmering mandag 11.9
Komplekse tall Naturlige tall
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Objektorientert programmering
1 Arrayer og form(ularer) (Kapittel 4). 2 Mål  Forstå assosiative og superglobale arrays  Kunne behandle webformularer (forms)  Kjenne forskjellen.
Dynamiske nettsider PHP Del 2 – Kontrollstrukturer.
Dynamiske nettsider PHP Del 1 – variable. PHP  PHP (Personal Home Page)  Fritt tilgjengelig programmeringsspråk  åpen kildekode  Plattformuavhengig.
Uke 7 - del I: Repetisjon del II: Objekter, klasser og pekere 30 sept. 2003, Arne Maus Inst. for informatikk, UiO.
Java 3 Mer om uttrykk Terminal I/O Forgreninger
Java 11 Programmering med og uten objekter: hva er forskjellen?
VI LAGER EN PLATEBUTIKK
INF 4130 Eksamen 2008 Gjennomgang.
Å lese tall fra en fil, klassen Scanner 1.Et Scanner-objekt kan knyttes til et strømobjekt eller til en streng. 2.Kan skanne teksten etter data av ulike.
Programmering sif8005. Praktisk informasjon  Innleveringsfrist øvinger: mandag kl  Alle øvinger er obligatoriske  Studass tilgjengelig 6 timer.
Tabeller Dette er en tabell, eller array. Den kan defineres sånn som dette: public int[] heltallsTabell = new int[11]; //Her er 11 tabellens lengde for.
INF1000 (Uke 14) Resten av eksamen H03 + del av V05 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Anja B.
INF1000 (Uke 13) Resten av eksamen H03 + del av V05 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild.
Objekt, Instanser og referanser + litt til. Objekter  Instanser  Kan sees på som det samme. Personen Per kan være både et objekt og en instans av klassen.
Main metoden n public static void main(String[] args){ } n Inni denne metoden skjer alt! n Det kan bare finnes en main metode per program. n Den kan ligge.
INF Objektorientert programmering
Object  Klassen i java  Alle klasser arver fra denne om ikke noe annet blir spesifisert  ArrayList.add(Object instans)  Alle elementer formes til Object.
Ekstra mange tips til Oblig 3! 12. mars 2007 Are Magnus Bruaset og Arild Waaler Inst. for informatikk, UiO.
INF1000 (Uke 14) Eksamen V06 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild Waaler.
Byggeklosser i java  Klassedefinisjon  Variabel deklarasjon  Metodedeklarasjoner  En ordentlig klasse  Spesielle/kryptiske skrivemåter  løkker og.
Jæger: Robuste og sikre systemer INF150 Programmering mandag 25.9 MER OM: Sub-prosedyrer og sub-funksjoner Kap 4.
1 Inf1000 (Uke 10) Oppgaveløsning. Hashmap Programmering med og uten objekter: hva er forskjellen? Noen generelle råd vedrørende oppgaveløsing HashMap.
Inf1000 (Uke 10) HashMap og ArrayList
INF1000 (Uke 4) Mer om forgreninger, While-løkker
Objektorientert utforming In 140 Forelesning Nr 11 Sommerville kap 12 – del 1.
Inf1000 (Uke 5) Arrayer, filer og tekst
INF1000 (Uke 11) Programmering
Kapittel 4 Skriving av klasser. 4.1 Anatomien til ein klasse Så langt har vi brukt ferdige klasser frå klassebiblioteket i Java Vi lagar objekt og brukar.
Kapittel 9 Polymorfi. 9.1 Sein binding Ofte er det perfekt match mellom typen til ein variabel og objektet han refererer til ChessPiece bishop;... bishop.
Objektorientert design In 140 Sommerville kap 12 – del 1.
Kapittel 7 Array (lister og tabellar). 7.1 Arrayelement Array (lister, tabellar) er kjent frå VB Blir brukt til å organisere data når vi har mange dataelement.
Lokale variable Hvis vi trenger å ta vare på en verdi, inne i en metode kan vi definere en lokal variabel: int amount = 0; vi må fortelle hvilken type.
Iterator i Java boolean hasNext() E next() void remove()
Kom i gang med Python Pål Hellesnes SYSTEMUTVIKLER
MAT0100V Sannsynlighetsregning og kombinatorikk
Eric Jul PSE, Inst. for informatikk
Begynnerkurs i Python Realfagskonferansen 2019 Henrik H. Løvold
IN3030 – Effektiv parallellprogrammering Uke 1 2. del, våren 2019
For, While, prosedyrer m/ parametere, funskjoner
Utskrift av presentasjonen:

Oblig4 - forklaringer Arne og Ole Christian

Struktur og alle (?) klassene 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 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.

Maanedsdata 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 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. 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 Dagdata-array. Begge løsninger er akseptable, og hvilken man velger blir en smakssak . 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.

Klassene i ”nesten-UML” VaerData Stasjon Maanedsdata Oblig4 Dag ??

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 ? Hva hvis du fikk data for 12 mnd i filene ?

Hvordan vite om alle Stasjonene (to HashMap’er?) 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);

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, kan du skrive Stasjon st = (Stasjon) stasjonFraNavn.get(stNavn); og tilsvarende for den andre HashMap’en hvis du kjenner stasjonsnummeret.

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.

Mer om å søke 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). 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.

Tegne UML-diagram 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? VaerData Stasjon Maanedsdata Oblig4 Dag ??

Ordreløkka 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 uten parametere 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 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.

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).

Tre hjelpemetoder i klassen for en maaned eller dag 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 Den siste metoden teller opp antall uværsdøgn.

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).

Javadoc Når du skal lage javadoc av systemet ditt, så husk at du kan lage korte javadoc-kommentarer 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 ?