UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i Eksamensdag: 18. august 2005 Tid for eksamen: 0900 1500 Oppgavesettet er på 6 sider. Vedlegg: Tillatte hjelpemidler: INF1010 Objektorientert programmering ingen Alle trykte og skrevne Kontroller at oppgavesettet er komplett før du begynner å besvare spørsmålene. Sluttkarakteren er et veiet gjennomsnitt av karakterene på alle deloppgavene. For hver deloppgave kan man maksimalt få så mange poeng som vekten angir. Merk at summen av vektene på oppgavene i dette oppgavesettet er mer enn 100. Det er et uttrykk for at det er mye å gjøre, og at man ikke må løse alt korrekt for å oppnå beste karakter. Det holder å oppnå 100 poeng (av 130 mulige). Det er antagelig lurt å lese hele oppgaveteksten før du begynner å svare på oppgavene. Hvis du synes oppgaven er uklar eller ufullstendig på noe punkt, lag, og skriv ned i besvarelsen din, dine egne fornuftige forutsetninger og presiseringer. Biler og parkeringsplasser (vektsum 65) Oppgave 1 (vekt 5) En parkeringsplass har plass til en bil. Er parkeringshus inneholder mange parkeringsplasser som enten er ledige, eller så står det en bil der. Noen av bilene er handicapbiler, mens noen andre biler er busser. Basert på opplysningene gitt over, tegn et UML-klassediagram. Oppgave 2 (vekt 10) Klassen PHus (parkeringshus) skal inneholde en tabell (array) som peker ut alle parkeringsplassene i huset, og konstruktøren til klassen skal ha antall plasser som parameter. En parkeringsplass (klassen PPlass) er kjennetegnet av en lengde og en bredde (i hele centimeter), og disse skal være parametre til konstruktøren. Om plassen er opptatt skal en peker angi hvilken bil som står der. En bil er kjennetegnet av et registreringsnummer, en høyde, en lengde og (Fortsettes på side 2.)
Eksamen i INF1010, 18. august 2005 Side 2 en bredde, og alle fire skal være parametre til konstruktøren. En handicapbil er en bil som i tillegg inneholder en handicapidentifikasjon (et heltall), mens en buss er en bil som i tillegg inneholder et antall sitteplasser. Disse er også parametre til konstruktørene. Skriv først klassene PHus, PPlass og Bil. Skriv deretter subklassene HandicapBil og Buss. Inkluder i klassene den datastrukturen som er beskrevet så langt i oppgaven, men ikke skriv noen metoder ennå. Du kan anta at alle konstruktører alltid kalles med riktige parametre. Oppgave 3 (vekt 5) En minibuss er en buss med maksimalt 16 sitteplasser. Skriv subklassen Minibuss til klassen Buss. Lag et egendefinert unntak som kastes hvis det gjøres et forsøk på å lage en minibuss med mer enn 16 passasjerer. Du kan anta at de andre parametrene til konstruktøren er riktige. Oppgave 4 (vekt 15) Noen parkeringsplasser er spesiallaget for handicapbiler, andre for busser. En handicapparkeringplass (klassen HCPPlass) er en parkeringsplass kun for handicapbiler. En bussparkeringsplass (klassen BussPPlass) er en parkeringsplass kun for busser. Skriv klassene HCPPlass og BussPPlass og metoden boolean parker(bil bln) i klassen PPlass og alle dens subklasser. Metoden skal returnere true hvis det er lov og mulig å sette bilen der, false ellers. For at det skal være mulig å sette bilen der må plassen være ledig og stor nok. For busser og personbiler betyr det at kjøretøyets mål er 20 cm mindre enn parkeringsplassen både i bredde og lengde, mens for handicapbiler må plassen være 100 cm bredere enn bilen. På en bussparkeringsplass har bare busser lov å parkere. På vanlige parkeringsplasser har alle biler, unntatt busser, lov å parkere. Pass spesielt på å få konstruktørene riktig og at alle parker-metodene skal ha den samme parameteren Bil bln. Oppgave 5 (vekt 10) I klassen PHus skal du ikke skrive metoder for å opprette parkeringsplasser. Du kan anta at dette alt er gjort og at hele tabellen er full av pekere til (forskjellige) parkeringsplasser. Du skal i denne oppgaven skrive metoden int parker(bil bl) i klassen PHus. Denne metoden går gjennom tabellen og finner en ledig parkeringsplass som er stor nok, og der denne bilen har lov å parkere. Du skal deklarere et egendefinert unntak som skal kastes hvis det ikke finnes noen ledig plass. Er det plass skal metoden reservere plassen til denne bilen og returnere indeksen til parkeringsplassen i tabellen. (Fortsettes på side 3.)
Eksamen i INF1010, 18. august 2005 Side 3 Oppgave 6 (vekt 5) Skriv grensesnittene Reservert og HoydeBegrenset. En ting som er reservert må kunne gi navnet på den eller det som har reservert tingen (en String). En ting som er høydebegrenset må kunne fortelle om høyeste tillatte høyde (et heltall). Oppgave 7 (vekt 10) Noen parkeringsplasser er reservert og noen har en høydebegrensning (alle som er under tak). En reservert parkeringsplass er identifisert med registreringsnummeret til den bilen som har lov å stå der. En høydebegrenset parkeringsplass angir høyeste høyde (i cm) på biler som kan stå der. En kombinasjon av en eller flere av disse egenskapene med de typene parkeringsplasser vi allerede har definert, gir mange mulige subklasser. Du skal bare skrive en av disse subklassene her, nemlig klassen Hc_Hb_Res som er en reservert handicapplass med høydebegrensning. Lag konstruktøren til klassen slik at alle variable blir initialisert. Du skal ikke skrive metoden parker i denne klassen. Oppgave 8 (vekt 5) Hvis metoden parker er programmert riktig i alle parkeringsplassene, ville det ikke være mulig å feilparkere en bil. Du skal i denne oppgaven anta at det finnes andre metoder som også oppdaterer datastrukturen i klassen PHus, slik at det er mulig å feilparkere biler. Skriv metoden HashMap finnikkereservert() i klassen PHus som går gjennom alle parkeringsplassene og samler alle biler som står på en reservert plass, men ikke har lov å stå der. Slutt på oppgave om parkeringsplasser. (Fortsettes på side 4.)
Eksamen i INF1010, 18. august 2005 Side 4 Telefonnummer (vektsum 65) Resten av oppgavesettet kan løses helt uavhengig av oppgavene ovenfor. På telefontastene er det både siffer og bokstaver. Bokstavtastene har du sikkert brukt hvis du har skrevet SMS-meldinger. Uansett telefontype, vil man finne at det er samme tall og bokstaver som står sammen på en tast, f.eks. vil man alltid finne bokstavene t, u og v sammen med tallet 8. For å identifisere denne tasten, snakker vi vanligvis om 8-tasten, men det er like presist å snakke om t-tasten, u-tasten eller v-tasten. Slik knyttes de tre bokstavene t, u og v til sifferet 8. For de andre bokstavene er det tilsvarende: ABC 2 DEF 3 GHI 4 JKL 5 MNO 6 P QRS 7 T UV 8 W XY Z 9 Legg merke til at det fra bokstav til tall finnes kun én mulighet, mens det til et tall knyttes flere (3 eller 4) bokstaver. Dette systemet kan brukes for lettere å huske telefonnummer. I stedet for nummeret kan man huske et ord med like mange bokstaver som nummeret har siffer, og som er slik at ordet svarer til nummeret. Et eksempel: Firmaet Skohuset vil gjerne ha telefonnummeret 75648738, fordi s 7, k 5, o 6, h 4, u 8, s 7, e 3, t 8 Da kan man taste S K O H U S E T istedet for 7 5 6 4 8 7 3 8. For de fleste av oss er ord lettere å huske enn nummer. Merk at til et ord svarer bare ett tall, mens et tall svarer til mange tekststrenger, hvorav noen kan være ord i et språk. F.eks. svarer tekstsrengen pil til tallet 745, mens nummeret 745 svarer til 36 forskjellige tekststrenger: sil, sik, sij, shl, shk, shj, sgl, sgk, sgj, ril, rik, rij, rhl, rhk, rhj, rgl, rgk, rgj, qil, qik, qij, qhl, qhk, qhj, qgl, qgk, qgj, pil, pik, pij, phl, phk, phj, pgl, pgk og pgj. Bare noen av disse tekststrengene er ord. I eksemplet over er sil, sik, rik og pil norske ord. For flere siffer i nummeret, blir kombinasjonene mange fler. Selskapet Teleuqb har bedt deg som java-programmerer om å lage et program som lager en oversikt over hvilke telefonnummer som svarer til virkelige ord. Problemet er i første omgang: Gitt et telefonnummer, svarer nummeret til et eller flere uqbarske ord? Til hjelp for å vite hva som er ord på uqbarsk, har selskapet allerede laget en klasse Uqbarsk som bl.a. inneholder metoden erord. Denne metoden returnerer true hvis parameteren tkststr er et ord på uqbarsk. Se programskissen lenger ned. (Fortsettes på side 5.)
Eksamen i INF1010, 18. august 2005 Side 5 Du skal lage klassen Nummer, som gitt et telefunnummer med fra 1 til 14 siffer, lager en liste over uqbarske ord som nummeret svarer til. I Nummer skal det være en metode genererord som lager alle tekststrenger som svarer til dette nummeret. Metoden skal sjekke om en generert tekststreng er et ord. Hvis tekststrengen er et ord, skal den legge ordet i en enkel enveis pekerliste. Resultatet av et kall på genererord er at nummeroblektet skal ha en (mulig tom) liste over alle ord som svarer til nummeret. class Ord { String ordet; Ord neste; // Ord som kan kjedes i en enkel // liste vha pekeren neste. Denne // klassen skal du bruke som den er } Ord (String s){ ordet = s; neste = null; } class Nummer { char [] ordkand; // array for å generere ordkandidater <andre deklarasjoner> Nummer (String tlfnr) {...} void leggordtilliste(string nyttord) {...} void genererord(...) {...} } // end class Nummer class Uqbarsk { // Denne klassen // skal du ikke lage... public boolean erord (char [] tkststr) {... }; public boolean erstartpaaord (char [] tkststr) {... };... } Oppgave 9 Figur, datastruktur og konstruktør i Nummer (vekt 15) Tegn en figur av datastrukturen i et objekt av klassen Nummer. Ta også med datastruktur som du får bruk for i senere oppgaver. Lag konstruktøren i Nummer. Den skal programmeres slik at uttrykket new Nummer(tlfnr), der tlfnr bare består av tegnene {0,1,2,3,4,5,6,7,8,9}, lager et nummerobjekt og (Fortsettes på side 6.)
Eksamen i INF1010, 18. august 2005 Side 6 oppretter og eventuelt initialiserer datastrukturen. Konstruktøren skal ikke generere tekststrengene som svarer til telefonnummeret. Oppgave 10 leggordtilliste (vekt 10) Lag metoden leggordtilliste (String ord) {...} som legger teksstrengen ord inn i en enkeltkjedet pekerliste. Rekkefølgen i listen er uvesentlig. Hint: String har en konstruktør String( char[] tekst ). Oppgave 11 Rekursiv generering av ord (vekt 25) Lag den rekursive metoden genererord som genererer alle mulige teksstrenger som svarer til nummeret. Bruk metoden erord gitt i klassen Uqbarsk til å bestemme om en generert tekststreng er er et uqbarsk ord. Hvis den er det brukes medtoden leggordtilliste for å legge ordet inn i ordlisten. Det spiller ingen rolle i hvilken rekkefølge ordene genereres og legges i listen. Men rekkefølgen har betydning for hvor lett neste oppgave lar seg løse. Oppgave 12 Avskjæring (vekt 15) Gitt metoden erstartpaaord i klassen Uqbarsk som returnerer verdien true hvis parameteren er en teksstreng som representerer starten på et ord, og false hvis ikke. F.eks. vil metoden returnere true hvis ordet objekt er et ord på uqbarsk og ord har verdien, o, ob, obj, obje, objek eller objekt. Bruk dette til å foreta avskjæringer slik at genererord ikke fortsetter å bygge opp teksstrenger der vi kan fastslå at ingen ord starter med den tekstsekvensen som er bygget opp så langt. Programmer på nytt eller vis tydelig hvordan du må forandre genererord for å få til dette. Skriv ut de delene av metoden som blir endret. Det holder og skissere de delene som forblir uendret. Oppgavesett slutt. Lykke til! Stein Michael Storleer og Stein Gjessing