EKSAMEN Emnekode: ITF 10609 Dato: 13.mai 2009 Emne: Objektorientert programmering Eksamenstid: kl 09.00 til kl 12.00 Hjelpemidler: 2 A4-ark med valgfritt innhold på begge sider. Faglærere: Tom Heine Nätt Mari-Ann Akerjord Eksamensoppgaven: Oppgavesettet består av 6 sider, denne forsiden er ikke inkludert. Oppgavesettet består av 3 oppgaver og i alt 11 deloppgaver. Alle skal besvares. Ved sensur teller hver deloppgave omtrent like mye Oppgavesettet har 7 vedlegg: Vedlegg : Utdrag av javadokumentasjon av java.net.url java.lang.comparable java.util.comparator java.io.bufferedreader java.util.scanner java.util.arraylist java.util.collections Kontroller at oppgaven er komplett før du begynner å besvare spørsmålene! Sensurdato: 5. juni 2009 Karakterene er tilgjengelige for studenter på studentweb senest 2 virkedager etter oppgitt sensurfrist. Følg instruksjoner gitt på: www.hiof.no/studentweb
Oppgave 1 Nedenfor ser du et utkast til en klasse Hovedstad. Foreløpig inneholder klassen bare deklarasjon av diverse objektvariabler. Denne oppgaven går ut på å ferdigstille klassen etter beskrivelse i deloppgavene som følger. public class Hovedstad { private String navn; private String land; private long innbyggertall; private double lengdegrad; private double breddegrad; Oppgave 1a Lag to konstruktører til klassen: Den ene konstruktøren skal initialisere alle objektvariablene. Den andre skal initialisere variablene navn, land og innbyggertall, og gi variablene bredde- og lengdegrad følgende standardverdier: breddegrad=58, lengdegrad=11. Oppgave 1b Lag en sett-metode for innbyggertall og en hent-metode for land. Oppgave 1c Lag en tostring-metode i klassen. Metoden skal returnere en kolon-separert streng med innhholdet i alle objektvariablene. Dersom standardverdiene for bredde- og lengdegrad er brukt, skal ikke disse vises. Eksempel på teksten som kommer ut fra tostring-metoden: Oslo:Norge:590000:59.9:10.7 Oppgave 1d Wikipedia-sidene til en hovedstad finnes på følgende URL: http://en.wikipedia.org/wiki/<hovedstad>, der <hovedstad> erstattes av navnet til den aktuelle hovedstaden. For eksempel finner vi Wikipediasidene til Oslo og Stockholm på følgende URL-er: http://en.wikipedia.org/wiki/oslo http://en.wikipedia.org/wiki/stockholm Lag en metode
public URL finnwiki() som finner og returnerer en URL til hovedstadens wikipedia-sider. Oppgave 1e Gjør om klassen Hovedstad slik at den blir Comparable. Den naturlige ordningen skal være på stigende innbyggertall, altså laveste innbyggertall først. Oppgave 1f Lag en Comparator med navn BreddegradComparator, som sorterer hovedstedene stigende etter breddegrad. 2
Oppgave 2 Nedenfor ser du et utdrag fra filen hovedsteder.txt. Hvert linje på filen inneholder følgende informasjon om en hovedstad: navn:land:innbyggertall:breddegrad:lengdegrad Oslo:Norway:580000:59.9:10.7 Stockholm:Sweden:1253309:59.3:18.1 Copenhagen:Denmark:1153615:55.7:12.6 Helsinki:Finland:558457:60.2:24.9 Berlin:Germany:3426354:52.5:13.4 London:United Kingdom:7421209:51.5:-0.1 Warsaw:Poland:1702139:52.2:21 Gaborone:Botswana:208411:-24.6:25.9 Antananarivo:Madagascar:1391433:-18.9:47.5 Lag et klientprogram hvor du: 1. For hver linje på filen hovedsteder.txt oppretter et Hovedstad-objekt og legger dette inn i en ArrayList. 2. Sorterer listen på innbyggertall. 3. Skriver ut all informasjon om hovedstaden som ligger på første posisjon i listen. 4. Sorterer listen på breddegrad 5. Skriver ut URL til hovedstaden som ligger på siste posisjon i listen nå 6. Itererer over alle elementene i listen og skriver ut navnet på landet til hver hovedstad. 3
Oppgave 3 For å gjennomføre resultatberegning for kurs med ulike evalueringsformer, er klassene Kurs, KursMedKarakter, KursUtenKarakter, KursMedBokstavKarakter og KursMedBestattIkkeBestatt laget. En skisse til disse er vist nedenfor: /** * Klassen Kurs representerer et generelt kurs med emnekode public abstract class Kurs { protected String emnekode; public String hentemnekode(){ return emnekode; public abstract String beregnresultat(); /** * For kurs uten karakter er resultatet "Deltatt" eller "Ikke deltatt", * avhengig av andel kursdager studenten har møtt. public class KursUtenKarakter extends Kurs{ private int antallkursdager; // Kursets varighet public String beregnresultat( ) { throw new UnsupportedOperationException("Not supported yet."); /** * Kurs hvor studenten får en karakter som beregnes ut fra prosentvis score * av antall mulige poeng. public abstract class KursMedKarakter extends Kurs{ protected int antallmuligepoeng; public abstract String beregnresultat( ); /** * Kurs med bokstavkarakter A-F. Karakter beregnes fra * prosentvis score. public class KursMedBokstavKarakter extends KursMedKarakter{ public String beregnresultat( ) { throw new UnsupportedOperationException("Not supported yet."); 4
/** * Kurs med karakter "Bestått" eller "Ikke bestått". Karakter beregnes fra * prosentvis score. public class KursMedBestattIkkeBestatt extends KursMedKarakter{ public String beregnresultat() { throw new UnsupportedOperationException("Not supported yet."); Det er lurt å lese hele oppgaveteksten før du går i gang med denne oppgaven. Særlig oppgave 3b og 3c bør sees i sammenheng. Oppgave 3b går ut på å legge til konstruktører til klassene, mens oppgave 3c går ut på å implementere metoden som gjennomfører resultatberegningen. Du må selv selv tenke gjennom hvilke objektvariabler du eventuelt trenger i tillegg til de som allerede er deklarert for å løse oppgaven. Du står altså fritt til å legge til innhold etter eget ønske i alle klassene. Oppgave 3a Lag et klassediagram (UML-diagram uten metoder og egenskaper) som illustrerer klassene slik de står nå, og hvor du tydelig får frem arverelasjonene mellom klassene. Oppgave 3b Ingen av klassene har så langt noen konstruktør. Legg til konstruktør i den/de klassene der du finner det hensiktsmessig. Oppgave 3c Metoden beregnresultat er definert i klassen Kurs. Hensikten med metoden er at den skal returnere en students resultat for et bestemt kurs basert på egenskaper i klassen. Implementer metoden beregnresultat i subklassene. Følgende regler gjelder: For kurs uten karakter er resultatet "DELTATT" eller "IKKE DELTATT", avhengig av andel kursdager studenten har møtt. Andel dager studentene må møte for å få "DELTATT" varierer fra kurs til kurs. For kurs med "BESTÅTT" eller "IKKE BESTÅTT" gis "BESTÅTT" hvis studenten oppnår mer enn en prosentvis andel av poengene. Poenggrensen varierer fra kurs til kurs. For kurs med bokstavkarakter gis en karakter fra A-F etter en skala som kan variere fra kurs til kurs. Oppgave 3d Denne deloppgaven kan besvares selv om du ikke har fått til de to foregående oppgavene. Anta at du i et program har en opprettet og fyllt opp en tabell med referanser av typen Kurs, dvs. du har følgende situasjon: Kurs [] minekurs = new Kurs[100]; // fyller opp tabellen. IKKE en del av denne oppgaven Referansene i tabellen kan referere til objekter av alle de konkrete klassene, det vil si at den inneholder referanser til objekter av typen KursMedBokstavKarakter, KursMedBestattIkkeBestatt og KursUtenKarakter. 5
Skriv kode som itererer over tabellen og som for hvert kurs skriver emnekode og kursresultat til skjerm. Hva kalles de objektorienterte prinsippene som er i sving her? 6
7