UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i INF1010 Objektorientert programmering Eksamensdag: 9. juni 2011 Tid for eksamen: 09.00 15.00 Oppgavesettet er på 5 sider. Vedlegg: 4 (en stift, 23 sider) Tillatte hjelpemidler: Alle trykte og skrevne Kontroller at oppgavesettet er komplett før du begynner å besvare spørsmålene. Les alle oppgavene før du begynner å skrive. Noter deg hva som er uklart i oppgaven, slik at du er klar til å spørre når faglærer kommer rundt. (Runden starter en time etter at eksamen begynner.) Hvis du synes oppgaven er uklar eller ufullstendig på noe punkt, lag og skriv ned i besvarelsen din, dine egne fornuftige forutsetninger og presiseringer. Eksamenssettet består av 3 deler. Del A og B kan løses uavhengig av hverandre. Del C løses naturlig etter A og B. I del A skal du lage en beholder for objekter. Beholderen inneholder en tabell som har visse likhetstrekk med Javas HashMap. I del B skal du lage et program som lager en modell for et hierarki av transportmidler. I del C skal du lage objekter av klasser fra del B til å legge inn i/hente ut fra beholderen fra del A. Sluttkarakteren er et veiet gjennomsnitt av karakterene på alle oppgavene når man tar hensyn til oppgavenes prosentmessige vekt. Del A Du skal i denne delen lage en klasse som skal beskrive en beholder (også kalt en container eller en mengde) som kan ta vare på mange objekter. Klassen skal hete EksamensHash og skal implementere grensesnittet Collection (se vedlegget), og ingen andre grensesnitt. Du skal bruke generiske typer. Av metodene i Collection skal du bare implemente add, clear, remove contains, isempty, iterator og size (de andre kan du utelate eller la være tomme). Klassen EksamensHash skal inneholde en hashtabell (en array), og konstruktøren til klassen skal ha nøyaktig en parameter som er lengden på denne tabellen. I det etterfølgende beskrives det hva en hashtabell er. Klassen EksamensHash skal bruke metodene hashcode og equals fra klassen (Fortsettes på side 2.)
Eksamen i INF1010, 9. juni 2011 Side 2 Object for å lagre og finne igjen objekter. Du skal regne med at to objekter som lagres er like om metoden equals returnerer true. Når klassen EksamensHash skal lagre et objekt regner den ut objektets hashverdi ved først å kalle objektets hashcode-metode. Ut fra den verdien som da returneres skal det regnes ut en ny verdi i intervallet 0 til lengden på hashtabellen minus en (f.eks. ved å regne modulo tabellengden (f.eks. slik: nyverdi = verdi % tabellengde)). I det følgende kaller vi denne nye verdien for objektets hashverdi. Elementene i hashtabellen skal være pekere til første objekt i en lenket liste. Når beholderen er tom vil hele hashtabellen innholde null. Når programmet skal legge inn et nytt objekt finner det først objektets hashverdi, og bruker denne som indeks i hashtabellen. Er hashtabellen tom (peker på null) på dette stedet, legges objektet som skal lagres inn som det første objektet i en lenket liste ut fra dette stedet i tabellen. Hvis det allerede er lagt inn et eller flere objekter med den samme hashverdien, vil det allerede finnes en liste av objekter ut fra dette stedet i tabellen. Programmet skal da legge objektet inn i denne listen (på et vilkårlig sted). Du skal ikke bruke noen av de ferdiglagde klassene i Javabiblioteket, men selv programmere dette ved hjelp av en eller flere arrayer og pekere. Å bruke arrayer sammen med generiske typer i Java er litt fiklete, men det skal du ikke ta hensyn til i denne oppgaven. (Man kan bl.a. bruke reflection, men dette er ikke pensum i INF1010). Du skal derfor bruke arrayer i denne oppgaven som om det er mulig å lage alle slags arrayer inne i en generisk klasse. Oppgave 1 (vekt 10%) Bestem deg for den datastrukturen som trengs i klassen EksamensHash, og programmer denne, konstruktøren til klassen og metodene size, isempty og clear. Før du besvarer denne oppgaven bør du se på hvilken datastruktur som egner seg best når du skal implementere alle metodene i klassen. Beskriv kort hvilke invariante tilstandspåstander (invarianter) som gjelder for datastrukturen. Tegn opp datastrukturen slik den vil være etter at du har lagt inn noen objekter (f.eks. 7). Noen objekter i tegningen din bør ha samme hashverdi, mens andre bør ha forskjellige verdier. I oppgavene 2, 3, 4 og 5 skal du bare behandle unntak der det eksplisitt er bedt om det. Oppgave 2 (vekt 5%) Skriv metoden add i klassen EksamensHash. Du kan anta at det er lov å ha flere like objekter i beholderen, men det er ikke tillatt å lagre verdien null. Om verdien på parameteren til add er null skal metoden kaste et unntak slik det er definert i grensesnittet Collection. (Fortsettes på side 3.)
Eksamen i INF1010, 9. juni 2011 Side 3 Oppgave 3 (vekt 5%) Skriv metoden contains i klassen EksamensHash. Oppgave 4 (vekt 10%) Skriv metoden remove i klassen EksamensHash. Oppgave 5 (vekt 25%) Skriv metoden iterator i klassen EksamensHash og alt du trenger i den forbindelse. Du skal bare programmere metodene hasnext og next i iteratoren, ikke metoden remove. Beskriv hvilke invariante tilstandspåstander (invarianter) som gjelder for den datastrukturen du lager for å iterere gjennom beholderen. Del B Transportselskapet Hjerter har mange transportmidler, bl.a. tog, busser, biler, drosjer, trikker, T-baner, pasasjerbåter og ferjer. Du skal i denne delen lage et javaprogram som modellerer transportmiddelhierarkiet. Transportmidlene deles naturlig i tre hovedgrupper etter hvor de kjører: på skinner (navn i programmet: skinnetmdl) på vannet (navn i programmet: vanntmdl) på vei (navn i programmet: veitmdl) Alle transportmidler har en entydig identifikator (tmid) av datatypen String. To transportmiddelobjekter er like (metoden equals skal returnere true) hvis objektene er av samme samme hovedgruppe og objektene har samme tmid. Alle transportmidler har også en bestemt vekt og maksfart. De skinnegående transportmidlene deles igjen i to: trikk Tbanetog Et skinnegående transportmiddel består av en eller flere vogner koblet sammen, et vognsett. Hver vogn har en unik tretegns vognid, og en bestemt vekt. Et slikt sammenkoblet sett vogner skal regnes som ett transportmiddel, dvs. skal ha kun en tmid. Denne er sammensetningen av vognumrene i samme rekkefølge som vognene som utgjør vognsettet. Summen av vognenes samlede vekt er transportmiddelets vekt. I Hjerter brukes de samme vognene til trikker og Tbanetog. En trikk har enten to eller tre vogner. Et Tbanetog har enten tre eller seks vogner. (Fortsettes på side 4.)
Eksamen i INF1010, 9. juni 2011 Side 4 For trikker varierer maksfarten avhengig av vognsettets samlede vekt. Nærmere bestemt 50 km/t minus en km/t pr tonn over 8 tonn. For Tbanetog er maksfarten 55 km/t. Noen, men ikke alle, trikker og Tbanetog kan leies ut (chartres). For chartertrikker (og -tog) finnes mange metoder som setter og henter informasjon om chartringen. I programmet her skal du for enkelhets skyld bare lage en metode som gjør det mulig å hente ut informasjon om hvor vognsettet er parkert (en String). Oppgave 6 (vekt 25%) Skriv et klassehierarki/javaprogram som imøtekommer disse kravene. Det skal være mulig å lage objekter som representerer trikk, Tbanetog, chartertrikk og chartertog. Bortsett fra skinnegående transportmidler holder det å lage klasser kun for hovedgruppene vanntmdl og veitmdl. Det skal ikke være mulig å endre en tmid. Alle attributter som evt. trengs skal manipuleres ved hjelp av hente- og settmetoder. Bruk subklasser, abstrakte klasser, grensesnitt og virtuelle metoder slik at klassedefinisjonene gjør at den underliggende modellen for Tbanetog og trikker blir mest mulig hensiktsmessig. Implementer equals (fra class Object) slik beskrevet over. Implementer også metoden hashcode (fra class Object) slik at den for to objekter med samme identifikator returnerer samme verdi (Klassen String har en metode int hashcode() som gir akkurat det vi er ute etter). Alle transportmiddelobjekter skal kunne pekes på av en variabel av type Transportmiddel (jf. del C). Oppgave 7 (vekt 5%) Skriv metoden Del C EksamensHash<Transportmiddel > legginnieh ( Object [ ] o b j e k t l i s t e, EksamensHash<Transportmiddel> eh ) { } Parameteren objektliste er en peker til en array av objekter, noen av dem representerer transportmidler, noen kan være null. Metoden skal løpe gjennom arrayen og legge alle transportmiddelobjektene inn i beholderen pekt på av parameteren eh. Metoden skal returnere beholderen etter at transportmiddelobjektene er lagt inn. Objekter som ikke representerer transportmidler skal neglisjeres. Oppgave 8 (vekt 5%) Skriv metoden void skrivutnoeinfo ( EksamensHash<Transportmiddel> eh ) { } (Fortsettes på side 5.)
Eksamen i INF1010, 9. juni 2011 Side 5 Metoden skal inneholde en for-løkke som går igjennom eh og skriver ut identifikatoren, vekt og maksfart til de transportmidlene som er i beholderen. Hvis transportmiddelet går på vann skal maksfarten skrives i knop ved å multiplisere farten med 0,54. For transportmidler som kan chartres skal info om hvor det er parkert (en String) skrives ut. Oppgave 9 (vekt 10%) Skriv en klasse Testprogram som har en konstruktør og en main-metode. Denne klassen skal sammen med programmene fra del A og B og de to metodene over utgjøre et fullstendig program. I konstruktøren opprettes 6 vognobjekter (fra del B) med identifikatorer/vekt lik a45/8745, a78/9450, k45/9456, c74/10307, q89/9890 og x03/8990. Videre skal konstruktøren lage 2 trikkeobjekter, 1 Tbanetogobjekt, 1 chartertrikkobjekt og 1 chartertogobjekt satt sammen av noen av disse vognene. For enkelhets skyld kan du forutsette at samme vogn kan brukes i flere vognsett. Lag en Object array av lengde 9 og sett pekerne i indeks 0 til 4 i arrayen til å peke på de 5 objektene. La indeks 5 ha en peker som er null og la de tre siste peke på objekter som ikke er transportmidler. Lag en EksamensHash-beholder for transportmidler med parameteren 100. Kall til slutt metodene fra oppgave 7 og 8 med arrayen og beholderen som parametre. Oppgavesett slutt. Lykke til! Stein Gjessing og Stein Michael Storleer 4 vedlegg: 1. Interface Collection fra Javas API, 10 sider 2. Interface Iterator fra Javas API, 2 sider 3. class Object fra Javas API, 10 sider 4. litt mer om hashtabeller og modulofunksjonen, 1 side