Eksamen Objektorientert Programmering 2012 Høgskolen i Østfold 2012-05-09 Emnekode Emne ITF10611 Dato 2012-05-09 Eksamenstid 09:00-13:00 Hjelpemidler Faglærer Objektorientert Programmering To A4-ark (fire sider) med egne notater Børre Stenseth Oppgavesettet består av 5 sider inklusive denne forsiden pluss ett vedlegg på 11 sider. Oppgavesettet er delt på 3 oppgaver. Vedlegget er relevante for oppgave 3. For hver oppgave er det angitt hvor stor vekt den blir tillagt i vurdering av besvarelsen. Den endelige karakteren blir satt på bakgrunn av denne vektleggingen kombinert med en helhetlig vurdering av besvarelsen. Du er selv ansvarlig for å kontrollere at oppgavesettet er komplett. Les gjennom alle oppgavene før du begynner å løse dem. Husk å bruke enkle kommentarer i den koden du skriver. Dette kan gi uttelling dersom koden inneholder feil, men at du har tenkt riktig. Lykke til og god sommer 1
1. Begreper (20%) I denne oppgaven skal du bruke dine egne ord og beskrive kort hva du du forstår med de aktuelle begrepene. Du må gjerne bruke korte eksempler hvis det hjelper. 1.a) Hva forstår vi med begrepet immutable? String-objekter er eksempel på en objekter som er immutable. Nevn noen konsekvenser dette har når vi programmerer. 1.b) Forklar bruken av nøkkelordene: try, catch, finally 1.c) Hva er en jar-fil? Hva er hensikten med en jar-fil, hva inneholder den og hvordan kjøres den fra kommandolinja 1.d) Forklar bruken av Java nøkkelordet: instanceof 2
2. Javakode (20%) 2.a) Hva blir utskriften når denne metoden kalles med parameter 9 public void doa(int n){ if(n >= 0){ if(n%2 == 0){ System.out.print(n+" "); doa(n-2); else doa(n-1); 2.b) Hva blir utskriften når denne metoden kalles med parameter 9 public void dob(int n){ if(n >= 0){ dob(n-1); if(n%2 == 0) System.out.print(n+" "); 2.c) Hva er grunnen til at denne koden ikke kompilerer List<String> p=new List<String>(); 2.d) Hva må endres for at denne koden skal kompilere: package apackage; public class test { public int doit(int i){return 2*i; public static void main(string[] args) { int v=doit(2); 2.e) Hva foregår her: jbutton1 = new javax.swing.jbutton(); jbutton1.settext("klikk meg"); jbutton1.addactionlistener(new java.awt.event.actionlistener() { public void actionperformed(java.awt.event.actionevent evt){ jbutton1hasbeenclicked(evt); ); Forklar de involverte komponentene og metodene. 3
3. Konstruksjon (60%) Oppgaven går ut på og implementer deler av et trafikkovervåkingssystem. Langs en veistrekning er det montert n fotobokser, der n >=1. Fotoboksene er orienterte slik at de bare fotograferer i en retning. Hver gang det passerer en bil i den aktuelle retningen blir det gjort en observasjon. Fotoboksen lagrer slike observasjoner på fil. En observasjon inneholder, foruten et fotografi, en rekke verdier som er nærmere beskrevet som del av vedlegg. Fotografiet kan du glemme med tanke på den oppgaven du skal løse. Periodisk leses filene fra hver fotoboks og legges i en felles filkatalog. Noen av fotoboksene leverer data som tekst-filer (.txt) med en observasjon pr linje, mens andre leverer observasjonene som XML-filer (.xml) med et observasjon - element for hver observasjon. Du finner eksempel på to slike filer i vedlegg. En bilfører kan bøtelegges dersom kjøretøyet passerer en fotoboks med for høy hastighet eller dersom kjøretøyet har brukt for kort tid mellom to fotobokser (for høy gjennomsnittshastighet). Lovlig hastighet ved alle fotoboksene på veistrekningen er den samme. Det er mange parkeringsplasser og av/på kjøringer langs strekningen så det er ikke sikkert at en bil registreres ved alle fotobokser. Det foreligger et foreløpig forslag til design for en løsning. Dette forslaget består av følgende komponenter: ivegstrekning som er et interface som beskriver den vegstrekningen vi skal kontrollere, med beskrivelse av alle fotoboksene. Observasjon som er en klasse som beskriver en observasjon (en kjøretøypassering). Klassen implementerer Comparable. ikontroll som er et interface som beskriver grensenittet som skal brukes av en framtidig GUI. Kontroll som er et skjelett til en klasse som implementerer ikontroll. FileLoader er en abstract klasse som beskriver hvordan vi kan laste observasjonsfiler XMLFileLoader bygger på (extends) FileLoader og opererer på XML-filer TextFileLoader bygger på (extends) FileLoader og opererer på tekst-filer. Vedlegget viser Java-kode for alle ovenfor nevnte komponenter samt en side som viser dataformatet for de filene en fotoboks legger ut, hhv.txt og.xml filer. Du må lese dette vedlegget før du begynner å programmere for å få med deg alle nødvendige detaljer. Din oppgave er å bygge ut noen av komponentene. Det er beskrevet 12 deloppgaver. Du må løse minst 6 av disse for å få full uttelling i evaluering av oppgaven. Du velger selv hvilke deloppgaver du vil løse. Alle deloppgavene kan løses uavhengig av hverandre. I vedlegget er det markert hvor hver av de aktuelle metodene hører hjemme og det er laget kommentarer som beskriver dem nærmere. Dersom du av en eller annen grunn finner det tjenlig å introdusere noen hjelpemetoder så viser du implementasjonen av disse, som metoder med tilgang private. 4
3.a) Konstruktør for tekst i klassen Observasjon Lag konstruktøren i Observasjon som bygger et objektet fra en tekstlinje. 3.b) Konstruktør for XML i klassen Observasjon Lag konstruktøren i Observasjon som bygger et objekt fra et XML-element. 3.c) Metoden compareto i klassen Observasjon Implementer compareto slik at vi får alle observasjoner i kronologisk rekkefølge når de sorteres. Med kronologisk mener vi altså med stigende registreringstidspunkt. 3.d) Metoden getobservasjoner i klassen XMLFileLoader Implementer denne slik at den laster en XML-fil og konstruerer en liste Observasjoner 3.e) Metoden getobservasjoner i klassen TextFileLoader Implementer denne slik at den laster en Text-fil og konstruerer en liste Observasjoner 3.f) Konstruktør i klassen Kontroll Implementer denne slik at den bruker subklasser av FileLoader og samler sammen alle Observasjoner fra alle filer. 3.g) Metoden alleobservasjonersortert i klassen Kontroll Implementer denne slik at den returnerer en kronologisk liste av Observasjoner 3.h) Metoden observasjonerforenfotoboks i klassen Kontroll Implementer denne slik at den leverer alle Observasjoner fra en bestemt fotoboks, sortert kronologisk 3.i) Metoden snitthastighetvedenfotoboks i klassen Kontroll. Implementer denne slik at den returnerer gjennomsnittsfarten for biler i km/t forbi en fotoboks. 3.j) Metoden bilersompassererforfort i klassen Kontroll Implementer denne slik at den returnerer en liste av biler (registreringsnummere) som passerer en eller flere av fotoboksene med for høy hastighet. 3.k) Metoden bilersomharbruktforkorttid i klassen Kontroll Implementer denne slik at den returnerer en liste av biler (registreringsnummere) som bruker for kort tid mellom to fotobokser. 3.l) Metoden alleobservasjoneravenbil i klassen Kontroll. Implementer denne slik at den returnerer en liste av observasjoner som er gjort av en bil. Lista skal være sortert etter fotoboks id. 5
2. Vedlegg Vedlegg til oppgave 3 ivegstrekning.java Observasjon.java ikontroll.java Kontroll.java FileLoader.java TextFileLoader.java XMLFileLoader.java Dataformater Vedlegget er på 11 sider inklusive denne forsiden 6
ivegstrekning.java package Trafikk; * Interface for implementasjon av en vegstrekning med fotobokser * Fotoboksene har id i stigende rekkefølge i kjøreretningen * Første boks har id 1, neste 2 osv. * @author Administrator public interface ivegstrekning { * Beregner og returnerer minstetiden i sekunder et kjøretøy * kan bruke mellom to fotobokser for en gitt fartsgrense * @param frafotoboksid1 Den ene fotoboksen * @param tilfotoboksid2 Den andre fotoboksen * @param fartsgrense Fartsgrense i km/t * @return Minste lovlige antall sekunder mellom de to fotoboksene. * @throws Exception dersom frafotoboksid1 >= tilfotoboksid2 * eller en av FotoBoxID'ene * er større en antall bokser eller mindre enn 1 public int minstelovligetidisekunder( int frafotoboksid1, int tilfotoboksid2, int fartsgrense) throws Exception; * Returnerer antall fotobokser på strekningen * @return public int antallfotobokser(); 7
Observasjon.java package Trafikk; import org.w3c.dom.element; * En observasjon av en passering av en fotoboks * @author Administrator public class Observasjon implements Comparable{ Fotoboksen der observasjonen er gjort private int fotoboksid; Passeringstid, millisekunder talt fra 1.1.1970 private long passeringstid; Målt hastighet i km/t, avrundet til nærmeste hele verdi private int hastighetkmprtime; Registreringsnummer som er lest av bilen som passerer private String bilid; * Konstruktør for en linje fra en tekstfil * @param enlinje En string som beskriver en observasjon public Observasjon(String enlinje) { Se vedlegg Dataformater for formatet på en tekstlinje -------------skal løses som oppgave A ----------------- * Konstruktør for et element fra en XML-fil * @param E Et XMLElement som beskriver en observasjon public Observasjon(org.w3c.dom.Element E) { Se vedlegg Dataformater for en beskrivelse av et observasjon- element -------------skal løses som oppgave B ----------------- public int getfotoboksid(){return fotoboksid; public long getpasseringstid(){return passeringstid; public int gethastighetkmprtime(){return hastighetkmprtime; public String getregistreringsnummer(){return bilid; * Implementerer kronologisk rekkefølge ( observasjosntidspunkt) * @param obj Object som representerer en Observasjon * @return 1, -1 eller 0 public int compareto(object obj) { -------------skal løses som oppgave C ----------------- * Sjekker om passeringshastigheten i km/t er lovlig * @param fartsgrense Fartsgrensen det måles mot angitt i hele km/t * @return false hvis hastigheten er høyere enn fartsgrensen, * true ellers 8
public boolean lovlighastighet(int fartsgrense){ return hastighetkmprtime <= fartsgrense; public String tostring(){ return bilid+" passerer fotoboks "+fotoboksid+ ":("+ passeringstid+ ") med hastighet "+hastighetkmprtime+"km/t"; 9
ikontroll.java package Trafikk; import java.util.list; * Interface for implementasjoner av kontroll * @author Administrator public interface ikontroll{ * En liste av alle Observasjoner sortert etter observasjonstidspunkt * @return En liste av Observasjoner public List<Observasjon> alleobservasjonersortert(); * En liste av alle Observasjoner for en fotoboks sortert etter * observasjonstidspunkt * @param boksid Fotoboksen vi er interesserte i * @return En liste av Observasjoner public List<Observasjon> observasjonerforenfotoboks(int boksid); * En liste av alle biler som har passert en av fotoboksene * i for høy hastighet * @return En liste av bilid'er public List<String> bilersompassererforfort(); * En liste av alle biler som har brukt for kort tid * mellom to fotobokser * @return En liste av bilid'er public List<String> bilersomharbruktforkorttid(); * Alle observasjoner som er registrert for en bestemt bil * @param bilid for bilen * @return En liste av observasjoner public List<Observasjon> alleobservasjoneravenbil(string bilid ); * Gjennomsnittshastighet i km/t for en fotoboks * @param boksid Identifikasjon av fotoboksen * @return Gjennomsnittshastigheten for alle passeringer public double snitthastighetvedenfotoboks(int boksid); 10
Kontroll.java package Trafikk; import java.io.file; import java.util.arraylist; import java.util.collections; import java.util.comparator; import java.util.list; * Implementsajon av ikontroll * @author Administrator public class Kontroll implements ikontroll{ Alle observasjoner for en vegstrekning i en periode List<Observasjon> Obs; Den aktuelle vegstrekningen ivegstrekning vegstrekning; Den fartsgrensen som skal brukes som bøteleggingsgrense int fartsgrense; * Konstruktør som leser alle.xml og.txt filer * @param catalog Katalogen der alle filene fra fotoboksene ligger * @param vegstrekning Den vegstrekningen vi skal kontrollere * @param fartsgrense Fartsgrense i km/t. Bøtegrense. public Kontroll(File catalog, ivegstrekning vegstrekning,int fartsgrense){ Obs=new ArrayList<>(); this.vegstrekning=vegstrekning; this.fartsgrense=fartsgrense; ------------- skal ferdiggjøres som oppgave F ----------------- alle filer i katalogen catalog skal leses og det skal opprettes Observasjon-objekter som skal legges inn i Obs public List<Observasjon> alleobservasjonersortert() { -------------skal implementeres som oppgave G ----------------- public List<Observasjon> observasjonerforenfotoboks(int boksid) { -------------skal implementeres som oppgave H ----------------- public double snitthastighetvedenfotoboks(int boksid) { -------------skal implementeres som oppgave I ----------------- public List<String> bilersompassererforfort() { -------------skal implementeres som oppgave J ----------------- 11
public List<String> bilersomharbruktforkorttid() { -------------skal implementeres som oppgave K ----------------- public List<Observasjon> alleobservasjoneravenbil(string bilid) { -------------skal implementeres som oppgave L ----------------- 12
FileLoader.java package Trafikk; import java.io.file; import java.util.list; * * @author Administrator public abstract class FileLoader { * Bygg en liste av alle observasjonene som finnes på en fil * @return En liste med observasjoner abstract List<Observasjon> getobservasjoner(file file); 13
TextFileLoader.java package Trafikk; import java.io.bufferedreader; import java.io.file; import java.io.filereader; import java.util.arraylist; import java.util.list; * Arbeider mot en tekstfil med en observasjon pr linje * Tekstfila er kontrollert slik at hver linje inneholder korrekt format * @author Administrator public class TextFileLoader extends FileLoader{ * Bygger en liste med observasjoner. Se vedlegg Dataformater. * @return en liste med observasjoner public List<Observasjon> getobservasjoner(file file) { -------------skal løses som oppgave E ----------------- * Leser tekst fra en fil * @param file Fila som skal leses * @return Teksten som er lest, null hvis noe går galt private String gettextfile(file file){ BufferedReader BR= null; StringBuilder result=new StringBuilder(); try{ BR= new BufferedReader(new FileReader(file)); String line; while((line=br.readline())!= null){ result.append(line);result.append("\n"); BR.close(); catch(exception ex){return null; return result.tostring(); 14
XMLFileLoader.java package Trafikk; import java.io.file; import java.net.url; import java.util.arraylist; import java.util.list; import javax.xml.parsers.documentbuilder; import javax.xml.parsers.documentbuilderfactory; import org.w3c.dom.document; import org.w3c.dom.element; import org.w3c.dom.nodelist; * Arbeider mot en XML-fil med ett observasjons - element * for hver observasjon * XML-fila er kontrollert slik at alle elementene finnes i riktig format * @author Administrator public class XMLFileLoader extends FileLoader{ * Bygger en liste med observasjoner. Se vedlegg Dataformater. * XML-fila inneholder elementer med navn: observasjon * @return En liste med observasjoner public List<Observasjon> getobservasjoner(file file) { -------------skal løses som oppgave D ----------------- * Bygger et XML-dokument (DOM) fra en fil * @param file XML-fila * @return Documentet eller null dersom vi får feil private Document getdomfromfile(file file){ try{ URL url=new URL("file:/"+file.toString()); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder dbuilder=factory.newdocumentbuilder(); return dbuilder.parse(url.tostring()); catch(exception se){return null; 15
Dataformater Eksempel på XML-fil <?xml version="1.0"?> <root> <observasjon fotoboksid="1"> <passeringstid>1335421321264</passeringstid> <hastighet>85</hastighet> <regnummer>aa52347</regnummer> </observasjon> <observasjon fotoboksid="1"> <passeringstid>1335422161261</passeringstid> <hastighet>79</hastighet> <regnummer>aa46702</regnummer> </observasjon> </root> Eksempel på textfil Hver linje er ordnet slik: fotoboksid:passeringstid:hastighet:regnummer 2:1335421861264:67:AD23415 2:1335422881262:90:AD53417 16