UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i Eksamensdag: 6. juni 2006 Tid for eksamen: 1430 1730 Oppgavesettet er på 6 sider. Vedlegg: INF1010 Objektorientert programmering ingen Tillatte hjelpemidler: 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 når man tar hensyn til deloppgavenes prosentmessige vekt. Det er antagelig lurt å lese hele oppgaveteksten (på hver del) 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. Del A Kjøretøy og båter (60%) Anta at vi har klassene Bat (båt) og Kjoretoy (kjøretøy) som beskrevet under. Legg merke til at en båt er kjennetegnet av et båtnummer (batnr) som er et heltall, mens et kjøretøy er kjennetegnet av et kjøretøynummer (kjnr) som er en tekst (String). class Bat { private int batnr; Bat (int nr) {batnr = nr; public int hentbatnr() {return batnr; class Kjoretoy { private String kjnr; Kjoretoy (String nr) {kjnr = nr; public String hentkjnr() {return kjnr; (Fortsettes på side 2.)
Eksamen i INF1010, 6. juni 2006 Side 2 Oppgave 1 (vekt 5%) Skriv subklassen SeilBat (seilbåt). En seilbåt er i tillegg til at det er en båt, kjennetegnet av en størrelse på seilet (seilareal). Når en seilbåt opprettes skal (i tillegg til nummeret) seilarealet være parameter. På samme måte som f.eks. nummeret kan hentes ut av objekter av klassene Bat og Kjoretoy, skal seilarealet kunne hentes ut av seilbåter. Oppgave 2 (vekt 5%) Skriv grensesnittet (interface) Motorisert. Noe som er motorisert er kjennetegnet av et antall hestekrefter (anthk). Oppgave 3 (vekt 5%) Skriv subklassene MotorKjoretoy og MotorBat med de opplagte betydningene (motorisert kjøretøy og motorisert båt). Når et motorkjøretøy eller en motorbåt opprettes, skal også (i tillegg til nummeret) antall hestekrefter være parameter. Oppgave 4 (vekt 5%) Lag et grensesnitt (interface) Element, som gjør at objekter kan settes inn i en enkelkjedet liste. Husk: For å sette ting inn i en enkeltkjedte liste trengs bare en peker til neste objekt i listen. Husk også at et grensesnitt (interface) bare kan ha metoder. Les gjerne de neste oppgavene (5, 6 og 7) før du svarer på denne oppgaven. Oppgave 5 (vekt 10%) Skriv en klasse FIFO med metoder med navn settinn og taut, som setter inn og tar ut objekter av en enkel liste i FIFO-rekkefølge (FIFO: First Inn, First out, dvs. at det elementet som tas ut er det som har ligget lengst i listen). Alle objekter som spiller rollen Element skal kunne settes inn og tas ut (dvs. alle objekter som implementerer grensesnittet Element). Klassen skal inneholde en peker som heter forste som peker på det objektet i listen som har ligget der lengst, og en peker som heter siste som peker på det objektet i listen som ble satt inn sist. Når både forste og siste peker på null er listen tom. Ta ut av en tom liste returnerer null. Oppgave 6 (vekt 5%) Skriv subklassen ListbarMK (Listbart MotorKjøretøy) som beskriver motorkjøretøyer som kan settes inn i FIFO-listen over, og subklassen ListbarMB (Fortsettes på side 3.)
Eksamen i INF1010, 6. juni 2006 Side 3 (Listbar MotorBåt) som beskriver motorbåter som kan settes inn i en FIFOliste. Oppgave 7 (vekt 10%) Skriv klassen MotorFIFO som en subklasse av klassen FIFO. Klassen MotorFIFO skal bare kunne inneholde objekter som både spiller rollene Element og Motorisert. Du skal redefinere metoden settinn på enkleste måte for å sikre dette. Dvs. hvis metoden settinn prøver å sette inn noe som ikke spiller rollen Motor, skal ingen ting skje (objektet blir ikke satt inn). Du skal også skrive metoden finnstorst som går gjennom listen og finner objektet med flest hestekrefter. Metoden skal returnere en peker (av typen Motorisert) til dette objektet. Oppgave 8 (vekt 5%) De som bruker klassen MotorFIFO liker ikke at settinn ikke gir noen beskjed når man prøver å sette inn et objekt som ikke er motorisert. Du skal derfor skrive en subklasse til klassen MotorFIFO som skal hete GodMotorFIFO. Klassen GodMotorFIFO skal inneholde metoden settinnmotorisert med en parameter av typen Motorisert. Metoden settinnmotorisert skal kaste et egendefinert unntak hvis det objektet som forsøkes settes inn ikke også spiller rollen Element. Deklarer det egendefinerte unntaket, og skriv klassen GodMotorFIFO med metoden settinnmotorisert. Oppgave 9 (vekt 10%) Lag et hovedprogram (main) som oppretter et listbart motorisert kjøretøy med nummer DE12345 og 150 hestekrefter, og en listbar motorbåt med nummer 654321 og 100 hestkrefter. Legg disse to objektene inn i en FIFOliste av typen GodMotorFIFO. Resten av programmet du skriver under skal virke uansett i hvilken rekkefølge du setter de to objektene inn i FIFO-listen. Skriv koden som setter inn, slik at om objekter som settes inn ikke er av typen Element så vil unntaksbehandlingen skrive Ikke element (ved hjelp av System.out.println). Kall så på metoden finnstorst, og skriv ut maksimalt antall hestekrefter i listen, også ved hjelp av System.out.println. Ta til slutt ut et element av listen og skriv ut nummeret (et heltall hvis det er en båt og en String hvis det er et kjøretøy), også ved hjelp av System.out.println. Slutt på del A om kjøretøy og båter (Fortsettes på side 4.)
Eksamen i INF1010, 6. juni 2006 Side 4 Del B Mosaikk og mønstre (40%) Mønsteret for en flislagt flate, m x n kvadratiske fliser er representert i en 2-dimensjonal array int [][] mosaikk. Verdien 0 representerer en hvit flis/rute, mens en annen verdi står for en svart flis/rute. Rutene skal tegnes svart eller hvit, med en synlig linje rundt hver rute (flis). Nedenfor finner du et ufullstendig program som tegner ut mosaikken på skjermen ved hjelp av de grafiske pakkene awt og swing. Du skal lage en konstruktør og en metode i dette programmet. k er antall kolonner i mosaikken r er antall rader i mosaikken bpf bredden og høyden (i bildpunkter) for en flis (rute) i mosaikken. Fra vinduskanten til flismosaikken skal det være en avstand på rm bildepunkter. Det vil si at øverste venstre hjørne av øverste venstre flis tegnes i punktet (rm, rm), og vinduet blir 2rm bredere og 2rm høyere enn flismosaikken. Metoden lagmosaikk (som du ikke skal programmere) fyller mosaikkmønsteret inn i mosaikk[][]. Her er det ufullstendige programmet: class Flate extends JPanel { final int SVART = 1, HVIT = 0; int k, r, bpf, rm; int [][] mosaikk; Flate(... ) { <oppretter vindu og mosaikk-array med bare svarte fliser> public void paintcomponent(graphics g) { <tegner mosaikk ut i vindu> void lagmosaikk(); // Her legges mønsteret inn i mosaikk... // NB! Denne skal du ikke lage class VisMosaikk extends JFrame { VisMosaikk() { settitle("vis mosaikk"); JPanel panel = new Flate(... ); panel.lagmosaikk(); Container lerret = getcontentpane(); lerret.add(panel); (Fortsettes på side 5.)
Eksamen i INF1010, 6. juni 2006 Side 5 setdefaultcloseoperation(jframe.exit_on_close); pack( ); setvisible(true); public static void main(string[] args) { new VisMosaikk(); Oppgave 10 (vekt 15%) Skriv konstruktøren Flate med parametre, og metoden paintcomponent (se kommentaren i programskissen). Oppgave 11 (vekt 25%) Lag en metode void vertpattern(int i, int e1, int e2) som skriver ut et vertikalt mønster etter følgende oppskrift: skriv ut i -er på en ny linje lag et (indre) verikalt mønster (eventuelt tomt) med et rekursivt kall på vertpattern. skriv ut i -er på en ny linje For å skrive ut en linje med -er er metoden skrivstjerner (int antall) gitt. vertpattern skal skrive ut ved å kalle på denne. Parametrene (i, e1 og e2) skal ha følgende effekt: Når i er forskjellig fra e1 (fase 1), skal i økes/minkes med 1 (for hvert kall) til i blir lik e1. Hvis i er lik e1, men forskjellig fra e2 (fase 2), skal vi fortsette å endre verdien av i med 1 (for hvert kall) til i blir lik e2. Hvis i er lik e1 er lik e2, er rekursjonsbunnen nådd. Legg merke til at rekursjonen har to faser: Først forandres i til i blir lik e1. I den andre fasen blir i forandret til i er lik e2. Metoden må skille mellom fasene ved å bruke verdien i parametrene. Hint: En måte å skille mellom de to fasene, er å la i og e1 fortsette å ha samme verdi i den andre fasen. Det kan forutsettes at verdiene for parametrene (i, e1 og e2) aldri er negative. Resultatet skal bli en vertikal bord. For vertpattern(2, 5, 1) (se eksempler nedenfor) skal metoden starte med 2 stjerner, øke til 5 stjerner og så minke til 1 stjerne. Tilslutt gjentas det hele baklengs, slik at det blir symmetrisk. (Fortsettes på side 6.)
Eksamen i INF1010, 6. juni 2006 Side 6 vertpattern(2, 5, 1) skal gi: vertpattern(3, 3, 3) skal gi: vertpattern (3, 0, 0) skal gi: og vertpattern (1, 1, 3) skal gi Kommentar: Kun eksemplet med parametre (3, 0, 0) skal ha (to) blanke linjer. Oppgavesett slutt. Lykke til! Stein Michael Storleer og Stein Gjessing