UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet



Like dokumenter
BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

BOKMÅL Side 1 av 5. KONTERINGSEKSAMEN I FAG TDT4102 Prosedyre og objektorientert programmering. Onsdag 6. august 2008 Kl

UNIVERSITETET I OSLO

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

Tillatte hjelpemidler: alle skrevne og trykte. Antall sider: 2 (+ 1 side vedlegg, bakerst). Oppgave 1 [25%]

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

TDT4100 Objektorientert programmering

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

TOD063 Datastrukturer og algoritmer

BOKMÅL Side 1 av 6. EKSAMEN I FAG TDT4102 Prosedyre og objektorientert programmering. Fredag 6. juni 2008 Kl

Obligatorisk oppgave 4: Lege/Resept

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Kapittel 9: Sortering og søking Kort versjon

UNIVERSITETET I OSLO

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Læringsmål for forelesningen

Algoritmer og Datastrukturer

HØGSKOLEN I SØR-TRØNDELAG

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Repitisjonskurs. Arv, Subklasser og Grensesnitt

Norges Informasjonsteknologiske Høgskole

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

UNIVERSITETET I OSLO

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

TDT4100 Objektorientert programmering

INF Løsning på seminaropppgaver til uke 8

EKSAMEN I FAG TDT4100 Objektorientert programmering. Fredag 6. juni 2008 Kl

Algoritmer og Datastrukturer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

BOKMÅL Side 1 av 12. Fakultet for informasjonsteknologi,

EKSAMEN. Algoritmer og datastrukturer

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

UNIVERSITETET I OSLO

EKSAMEN med løsningsforslag

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 11 sider inklusiv vedlegg og denne forsiden.

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Faglærerne prøver å besøker eksamenslokalet mellom klokka 15 og 16 for å oppklare eventuelle uklarheter og feil i oppgaveteksten.

LO191D/LC191D Videregående programmering

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

UNIVERSITETET I OSLO

EKSAMEN. Objektorientert programmering

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

INF Seminaroppgaver til uke 3

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

MED TIDESTIMATER Løsningsforslag

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

København 20 Stockholm

Eksamen. Objektorientert Programmering IGR 1372

Kapittel 8: Sortering og søking

Å lese tall fra en fil, klassen Scanner

TDT4100 Objektorientert programmering

UNIVERSITETET I OSLO

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

UNIVERSITETET I OSLO

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

Løsningsforslag Test 2

UNIVERSITETET I OSLO

Eksamensoppgave i IFUD1025 Programmering i Java

IN1010 V19, Obligatorisk oppgave 2

UNIVERSITETET I OSLO

INF1010 Sortering. Marit Nybakken 1. mars 2004

UNIVERSITETET I OSLO

Kapittel 7: Mer om arv

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

UNIVERSITETET I OSLO

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

INF1000 Prøveeksamen Oppgave 7 og 9

Det finnes ingenting. som kan gjøres med interface. men som ikke kan gjøres uten

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

Sortering med Comparable og Comparator

2 Om statiske variable/konstanter og statiske metoder.

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

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

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

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring AITeL

Hittil har programmene kommunisert med omverden via tastatur og skjerm Ønskelig at data kan leve fra en kjøring til neste

LC191D/LO191D Videregående programmering mai 2010

Eksamen Objektorientert Programmering 2012

Kap.8 Sortering og søking sist oppdatert 16.03

UNIVERSITETET I OSLO

EKSAMEN OBJEKTORIENTERT PROGRAMMERING Alle trykte og skrevne. Java API dokumentasjon er tilgjengelig lokalt på hver maskin.

Kapittel 9: Sortering og søking Kort versjon

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Liste som abstrakt konsept/datatype

Oppgave 3 a. Antagelser i oppgaveteksten. INF1020 Algoritmer og datastrukturer. Oppgave 3. Eksempelgraf

Eksamen Objektorientert Programmering 2013

Eksamen IN1010/INF1010 våren 2018

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

Transkript:

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet Eksamen i emnet INF101/INF101-F - Programmering 2 Fredag 10. juni 2011, kl. 09-14 Bokmål Tillatte hjelpemidler: alle skrevne og trykte. Antall sider (inkludert vedlegg): 21. Les igjennom og skaff deg oversikt over hele eksamensettet før du begynner å løse det. Når du løser oppgavene kan du benytte resultater fra oppgaver og deloppgaver du ikke har lykkes i å løse. Prosentsatsene ved hver oppgave angir omtrentlig vekt ved sensur. Deloppgaver til en oppgave kan være ulikt vektet. I kodevedleggene er detaljer utelatt fra implementasjonen når disse ikke er relevante. Vedlagte klasser og kontrakter kan dekke flere sider. 1. (15%) Se vedlagt kode for IBrikke og Posisjon. Tårn er en sjakkbrikke som kan flyttes én eller flere ruter horisontalt (langs en rad) eller vertikalt (langs en linje), på sjakkbrettet. Anta at en klasse Taarn implements IBrikke er implementert for å representere slike brikker. Implementer en metode for å teste void Taarn.flytt(Posisjon nyposisjon) i en ny klasse, TaarnTest extends JUnit.TestCase. Identifiser minst fire aspekter som bør testes og sørg for at TaarnTest tester hver av dem minst én gang. I henhold metodespesifikasjoen funnet i kontrakten IBrikke er det naturlig å formulere følgende fire tester på void Taarn.flytt(): fungerer for horsiontale flytt. fungerer for vertikale flytt. kaster SjakkException for trekk som ikke er lovlige for tårn. kaster SjakkException for trekk til nåværende posisjon. import junit.framework.testcase; public class TestTaarn extends TestCase { private Taarn tårn; side 1 av 21

INF101(F) 10. juni 2011 Bokmål public void setup(){ this.tårn = new Taarn(new Posisjon(1,1)); public void testflytt(){ //test vertikal flytting tårn.flytt(new Posisjon(3,1)); asserttrue(tårn.hentposisjon().equals(new Posisjon(3,1))); //test horisontal flytting tårn.flytt(new Posisjon(3,3)); asserttrue(tårn.hentposisjon().equals(new Posisjon(3,3))); //test feil ved diagonalt trekk flyttmedunntak(new Posisjon(4,4)); //test feil ved trekk til samme posisjon flyttmedunntak(new Posisjon(3,3)); //feiler ekplisitt dersom ikke unntak kastes //når this.tårn flyttes til nyposisjon private void flyttmedunntak(posisjon nyposisjon){ try{ tårn.flytt(nyposisjon); catch(sjakkexception se){ return; fail(); 2. (20%) Se vedlagt kode for IRokadeBrikke og AbstraktBrikke. En del funksjonalitet er felles for alle brikker i et sjakkspill. Instruksjonene for å flytte en brikke er for eksempel lik for alle brikker, mens restriksjonene for hvilke trekk som er side 2 av 21

INF101(F) 10. juni 2011 Bokmål lovlig er forskjellig. Dette er utnyttet ved å lage en abstrakt klasse AbstraktBrikke som kan brukes som et utgangspunkt for å implementere spesifikke brikker, som for eksempel tårn. I tillegg til de vanlige flyttereglene for tårn i sjakk kan et spesialtrekk, rokade, utføres én gang av hver spiller i løpet av et spill. Trekket innebærer at et tårn og sjakkbrikken konge reposisjoneres samtidig. Brikker som kan inngå i en rokade skal implementere kontrakten IRokadeBrikke. En av betingelsene for rokade er at brikkene som skal inngå i rokaden ikke tidligere er flyttet, derfor har IRokadeBrikke en metode boolean flyttet() som angir om brikken har vært flyttet eller ikke. Implementer en klasse Taarn. Klassen skal: implementere kontrakten IRokadeBrikke. arve fra klassen AbstraktBrikke. Implementer konstruktøren og den abstrakte metoden, og overkjør andre metoder der det er nødvendig. public class Taarn extends AbstraktBrikke implements IRokadeBrikke { private boolean flyttet = false; public Taarn(Posisjon posisjon) { super(posisjon); public void flytt(posisjon posisjon) { super.flytt(posisjon); this.flyttet = true; public boolean flyttet() { return flyttet; public boolean gyldigtrekk(posisjon nyposisjon) { return!nyposisjon.equals(hentposisjon()) && (hentposisjon().hentlinje() == nyposisjon side 3 av 21

INF101(F) 10. juni 2011 Bokmål.hentLinje() hentposisjon().hentrad() == nyposisjon.hentrad()); 3. (10%) Se vedlagt klasse ObjektLagrer. (a) Vis hvordan du vil bruke klassen for å lagre et objekt av typen List<Integer> til en fil med navn heltallsliste.sjo. La interlist være en variabel bundet til et objekt av typen List<Integer>: ObjektLagrer<List<Integer>> lagrer = new ObjektLagrer<List<Integer>>(); lagrer.lagretilfil(integerlist, "heltallsliste.sjo"); (b) Hva er fordelene med å definere metodene void lagre(e objekt, OutputObjectStream utstrøm) og E last(objectinputstream innstrøm), fremfor å skrive de enkle metodekroppene på passende sted i void lagretilfil(e objekt, String filnavn) og E lastfrafil(string filnavn)? generelle strømmer som OutputObjectStream og ObjectInputStream kan kolbes til forskjellige målstrømmer ettersom man vil lese fra / skrive til f.eks. en fil, en nettverkstilkobling, en database eller et annet mål. Dersom logikken for å skrive til en strøm er adskilt fra logikken med å opprette strømmen, koble den til riktig mål, og lukke den igjen, er det lettere å gjenbruke lagre og last når de blir aktuelt å large til og lese fra andre mål. (c) Finnes det tilfeller hvor et unntak av typen ClassCastException kan oppstå under utføring av metoden E last(objectinputstream innstrøm)? Forklar. Et ClassCastException vil kastes av last dersom objektet returnert av innstrøm.readobject() ikke er av forventet type. Selv om koden garanterer for at objekter lagret med samme objekt som brukes til innlesing ikke vil forårsake et slikt unntak, garanterer den ikke i mot at objekter lagret med et annet ObjektLagrer-objekt (med en annen typeparameterisering) blir forsøkt lest. Så et ClassCastException kan oppstå. 4. (10%) Se vedlagte klasser Spillkort, Farge og Verdi. side 4 av 21

INF101(F) 10. juni 2011 Bokmål Klassen Spillkort representerer vanlige spillkort. Hvert kort har en farge (kløver, hjerte, spar eller ruter) og en verdi (tallene 2-10 eller knekt, dronning, konge eller ess). Farge og verdi er representert ved hver sin oppramstype. Jeg minner om at oppramstyper implementerer kontakten java.util.comparable og har en compareto-metode som definerer en naturlig ordning for oppramstypen som samsvarer med den rekkefølgen oppramskonstantene er deklarert i. For eksempel har oppramskonstantene til Farge følgende ordning: SPAR < KLØVER < RUTER < HJERTER. For klassen Spillkort skal det defineres en naturlig ordning som ordner kortene etter farge først, og etter verdi for kort med lik farge. (a) Skriv full metodesignatur og implementasjon for metoden som Spillkort må implementere for å oppfylle kontrakten Comparable<Spillkort>. (b) Implementer metodene boolean equals(object o) og int hashcode() for klassen Spillkort. Ferdig implementert klasse, Spillkort. Representerer et spillkort. public class Spillkort implements Comparable<Spillkort> { // kode gitt i vedlegg, ikke vist. public boolean equals(object o) { if (o instanceof Spillkort) { Spillkort kort = (Spillkort) o; return this.farge.equals(kort.farge) && this.verdi.equals(kort.verdi); return false; public int compareto(spillkort annetkort) { int fargeforskjell = this.farge.compareto(annetkort.farge); if (fargeforskjell!= 0) { return fargeforskjell; side 5 av 21

INF101(F) 10. juni 2011 Bokmål int verdiforskjell = this.verdi.compareto(annetkort.verdi); return verdiforskjell; public int hashcode() { return this.verdi.hashcode() + this.farge.hashcode(); public String tostring() { return farge.tostring() + ", " + verdi.tostring(); (c) Forklar forholdene som generelt skal holde mellom de tre metodene du har implementert i denne oppgaven. I henhold til kontrakten java.util.comparable er det sterkt anbefalt at compareto og equals skal være implementert i henhold til hverandre. Det vil si at a.compareto(b) = 0, hvis og bare hvis a.equals(b). I henhold til spesifikasjonene for equals og hashcode slik er beskrevet i dokumentasjonen for java.lang.object, skal hashcode alltid returnere samme verdi for objekter som er lik i henhold til equals. hashcode trenger ikke (og kan ofte ikke) returnere forskjellig verdi for alle objekter som er ulik i henhold til equals, men nytteverdin av hash-strukturer er avhengig av at dette vanligvis er tilfellet. 5. (10%) En kortstokk er en ordnet samling av kort. (a) Implementer en klasse, Kortstokk, for å representere en kortstokk. Kortstokk skal arve fra en av listene i java.util. Bruk generisk notasjon for å sikre at en kortstokk ikke kan inneholde andre elementer enn objekter av typen Spillkort. Lag en konstruktør som oppretter kortstokken med de 52 vanlige kortene (et kort for hver kombinasjon av farge og verdi). side 6 av 21

INF101(F) 10. juni 2011 Bokmål Representerer en kortstokk av vanlige spillkort public class Kortstokk extends ArrayList<Spillkort> { public Kortstokk(){ for (Farge f: Farge.values()){ for (Verdi v: Verdi.values()){ add(new Spillkort(f, v)); (b) Forklar hvorfor vi kan si at Kortstokk implementerer java.util.list og vis hvordan du vil opprette referanser av typen java.util.list for å referere til et Kortstokk-objekt. Kortstokk arver fra en klasse som implementerer java.util.list og er således garantert å ha en definisjon for alle metodene definert i denne kontrakten. Typesikre referanser kan defineres slik: List<Spillkort> stokk2 = new Kortstokk(); 6. (15%) For kortstokken du implementerte i oppgave 5, lag en metode void Kortstokk.stokk(), som stokker kortstokken ved å flette sammen første og andre halvdel av stokken. Dersom a i betegner kort nummer i i den første halvdel av stokken, og b i betegner kort nummer i i andre halvdel av stokken, skal kortene etter stokking være ordnet slik: a 0, b 0, a 1, b 1... a 25, b 25, eller slik: b 0, a 0, b 1, a 1... b 25, a 25. Denne stokkeprosedyren bør gjentas for å få en tilfredstillende stokking, men det trenger du ikke ta høyde for. To forslag: public void stokk(){ side 7 av 21

INF101(F) 10. juni 2011 Bokmål int halvstokk = this.size()/2; for (int i = halvstokk; i > 0; i--){ this.add(i, this.remove(this.size()-1)); og: public void stokk(){ int size = size(); List<Spillkort> andrehalvpart = new ArrayList<Spillkort>(subList(size()/2, size())); this.removeall(andrehalvpart); for (int i=0; i < size; i+=2){ add(i, andrehalvpart.remove(0)); 7. (20%) Se vedlagt klasse SortertSett. Klassen SortertSett implementerer et sett (kontrakten java.util.set) ved å lagre data i en privat liste som til enhver tid er sortert. Oppslag og innsetting gjøres ved å søke etter riktig posisjon for element som skal finnes eller settes inn. Ettersom listen alltid er sortert kan binærsøk benyttes. Kun én av metodene som må implementeres i henhold til kontrakten java.util.set er vist i vedlegget. Denne er tatt med for å illustrere bruken av den private metoden int finnindeks(e element). (a) Forklar den generiske typen spesifisert med <E extends Comparable<? super E>>. Hvilke betingelser må være oppfylt for typer som E skal parameteriseres til når det opprettes objekter av klassen SortertSett? E må implementere kontrakten Comparable<A>, hvor A er av samme type som E eller A er typen til en klasse som E arver i fra. Typen er spesifisert slik fordi E kan være definert av en klasse som arver sin Comparable-implementasjon. (b) Hva er fordelen med å benytte LinkedList fremfor for eksempel ArrayList i denne situasjonen? side 8 av 21

INF101(F) 10. juni 2011 Bokmål Anta at objektene blir lagt til settet i vilkårlig rekkefølge. Når oppdateringer ikke systematisk gjøres til enden av datastrukturen har LinkedList fordeler ved sletting og innsetting av data, da oppdateringer av indekser kun innebærer å oppdatere referanser i nabonodene til elementet som ble slettet, mens f.eks. ArrayList må oppdaterer alle indekser høyre enn elementet som ble slettet / satt inn. (c) Med hensyn på å sikre at datastrukturen forblir sortert til enhver tid, hva er fordelene med å organisere listen som et privat felt, fremfor å la SortertSett arve fra LinkedList og overkjøre relevante metoder? Dersom SortertSett arver fra LinkedList vil den ha metodedefinisjoner for innsetting til vilkårling indeks. Dette vil bryte med sorteringen. Om man velger å implementere en sortering eller kaste et unntak ved kall til disse metodene vil man bryte kontrakten List. Ved å kun tilby metoder som holder settet sorter kan man garantere at ikke klassen blir brukt feil. (d) Bruk binærsøk til å implementere metoden int finnindeks(e element) i klassen SortertSett. Legg til hjelpemetoder og private felter dersom det er nødvendig. Løsning ved hjelp av rekursiv privat metode. Kan også løses ved iterasjon: private int finnindeks(e element) { return finnindeks(element, 0, this.liste.size()); private int finnindeks(e element, int nedre, int øvre) { int str = øvre - nedre - 1; int midt = øvre - 1 - str / 2; if (øvre == nedre) { return nedre; else if (this.liste.get(midt).compareto(element) > 0) { return finnindeks(element, nedre, midt); else if (this.liste.get(midt).compareto(element) < 0) { return finnindeks(element, midt + 1, øvre); else { return midt; side 9 av 21

INF101(F) 10. juni 2011 Bokmål Lykke til. Edvin Fuglebakk side 10 av 21

Vedlegg - oppgave 1 public interface IBrikke { Henter brikkens posisjon på sjakkbrettet. @return Brikkens posisjon. public Posisjon hentposisjon(); Flytter brikken til ny posisjon. @param nyposisjon posisjonen brikken skal flyttes til. @throws SjakkException (ikke-kontrollert unntak) dersom - nyposisjon ikke kan nåes i henhold til flyttereglene for brikken. - nyposisjon er den samme som nåværende posisjon. public void flytt(posisjon nyposisjon); Finner ut om et trekk til angitt posisjon er lovlig i henhold til flyttereglene for brikken. @param nyposisjon posisjonen brikken skal flyttes til. @return true dersom trekket er lovlig, false ellers, false også dersom brikken allerede står på nyposisjon. public abstract boolean gyldigtrekk(posisjon nyposisjon); side 11 av 21

Representerer en posisjon på et sjakkbrett, angitt ved rad- og linjenummer. Rader er de horisontale rekkene vanligvis betegnet med heltallene 1-8. Linjer er de vertikale kolonnene vanligvis betegnet med bokstavene a-h (men her altså representert med heltallene 1-8). public class Posisjon { // private felter, ikke vist. Oppretter posisjonen for angitt rad og linje. @param rad raden for denne posisjonen. @param linje linjen for denne posisjonen. @throws SjakkException (ikke-kontrollert unntak) dersom rad eller linje ikke er i intervallet [1,8]. public Posisjon(int rad, int linje) { // kode for konstruktør, ikke vist. Henter raden til posisjonen. @return raden som heltall i intervallet [1,8]. public int hentrad() { //kode for hentrad, ikke vist. Henter linjen til posisjonen. @return linjen som heltall i intervallet [1,8]. public int hentlinje() { //kode for hentlinje, ikke vist. public boolean equals(object o) { // kode for equals, ikke vist. side 12 av 21

public int hashcode() { // kode for hashcode, ikke vist. side 13 av 21

Vedlegg - oppgave 2 Brikker som oppfyller kontrakten kan inngå i en rokade. public interface IRokadeBrikke extends IBrikke { Angir om brikken har vært flyttet. @return true dersom brikken har vært flyttet, false ellers. public boolean flyttet(); side 14 av 21

Representerer en sjakkbrikke. Implementerer funksjonalitet for å manipulere posisjonen til en brikke. Metoden som kontrollerer at reglene for flytting er fulgt må implementeres i subklasser. public abstract class AbstraktBrikke implements IBrikke { private Posisjon posisjon; Oppretter en brikke med angitt posisjon. @param posisjon brikkens posisjon på sjakkbrettet. public AbstraktBrikke(Posisjon posisjon) { this.posisjon = posisjon; public Posisjon hentposisjon() { return posisjon; public void flytt(posisjon nyposisjon) { if (!gyldigtrekk(nyposisjon)) { throw new SjakkException("Ulovlig trekk."); posisjon = nyposisjon; public abstract boolean gyldigtrekk(posisjon nyposisjon); side 15 av 21

Vedlegg - oppgave 3 import java.io.; En enkel serialiserer / deserialiserer. @param <E> typen til objekter som skal kunne serialiseres og deserialsieres. public class ObjektLagrer<E> { Serialiserer angitt objekt til angitt strøm. @param objekt objektet som skal serialiseres. @param utstrøm strømmen objektet skal skrives til. @throws IOException ved feil ved skriving til strøm. public void lagre(e objekt, ObjectOutputStream utstrøm) throws IOException { utstrøm.writeobject(objekt); Deserialiserer et objekt av typen <E> fra angitt strøm. @param innstrøm strømmen objektet skal lese fra. @return det deserialiserte objektet. @throws IOException ved feil ved lesing fra strøm. @throws ClassNotFoundException dersom klassedefinsjonen til det leste objektet ikke blir funnet. public E last(objectinputstream innstrøm) throws IOException, ClassNotFoundException { return (E) innstrøm.readobject(); side 16 av 21

Serialiserer angitt objekt til filen med angitt filnavn. Dersom filen finnes fra før vil tidligere innhold bli overskrevet. Skriver eventuelle feilmeldinger til System.err. @param objekt objektet som skal serialiseres. @param filnavn filnavnet på filen objektet skal skrives til. public void lagretilfil(e objekt, String filnavn) { // kode for lagretilfil, ikke vist. Deserialiserer et objekt av typen <E> fra filen med angitt navn. Skriver eventuelle feilmeldinger til System.err. @param filnavn navnet på filen som objektet skal leses i fra. @return det deserialiserte objektet, null dersom det har oppstått feil ved lesing fra fil. @throws ClassNotFoundException dersom klassedefinsjonen til det leste objektet ikke blir funnet. public E lastfrafil(string filnavn) throws ClassNotFoundException { // kode for lastfrafil, ikke vist. side 17 av 21

Vedlegg - oppgave 4 Representerer et spillkort. public class Spillkort implements Comparable<Spillkort> { private Farge farge; private Verdi verdi; Oppretter spillkort med angitt farge og verdi. @param farge spillkortets farge. @param verdi spillkortets verdi. public Spillkort(Farge farge, Verdi verdi) { this.farge = farge; this.verdi = verdi; Henter fargen til spillkortet. @return fargen til spillkortet. public Farge hentfarge() { return farge; Henter verdien til spillkortet. @return verdien til spillkortet. public Verdi hentverdi() { return verdi; //implementer Comparable<Spillkort>, se oppgavetekst. side 18 av 21

De fire "fargene" som vanlige spillkort kan ha (fransk kortstokk). public enum Farge { SPAR, KLØVER, RUTER, HJERTER Verdiene som vanlige spillkort kan ha. public enum Verdi { TO, TRE, FIRE, FEM, SEKS, SYV, ÅTTE, NI, TI, KNEKT, DRONNING, KONGE, ESS side 19 av 21

Vedlegg - oppgave 7 import java.util.; Sett som holder data sortert til envher tid. Binærsøk brukes for innsetting, oppslag og fjerning av data. @param <E> Forklar i eksamensbesvarelsen, se oppgavetekst. public class SortertSett<E extends Comparable<? super E>> implements Set<E> { private List<E> liste = new LinkedList<E>(); Definert i java.util.set<e>. Legger til angitt element dersom dette ikke allerede finnes i settet. @param element elementet som skal legges til settet. @return true dersom elementet ble lagt til, false dersom et identisk element allerede var i settet. public boolean add(e element) { int indeks = finnindeks(element); if (liste.size() > indeks && liste.get(indeks).equals(element)) { return false; else { liste.add(indeks, element); return true; side 20 av 21

Finner indeks i liste hvor element skal befinne seg. @param element elementet som skal finnes, eller settes inn, i settet. @return indeks til elementets posisjon i listen. private int finnindeks(e element) { // skriv koden for finnindeks, se oppgavetekst. // øvrige metoder av kontrakten Set, ikke vist. side 21 av 21