TDT4100 Objektorientert programmering

Like dokumenter
TDT4100 Objektorientert programmering

TDT4100 Objektorientert programmering

TDT4100 Objektorientert programmering

UNIVERSITETET I OSLO

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

TDT4100 Objektorientert programmering

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

TDT4100 Objektorientert programmering

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

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

TDT Prosedyre- og objektorientert programmering

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

TDT Prosedyre- og objektorientert programmering

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Arv. Book book1 = new Book(); book1. title = "Sofies verden" class Book { String title; } class Dictiona ry extends Book {

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

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

En algoritme for permutasjonsgenerering

Introduksjon til objektorientert programmering

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

Eksamen. Objektorientert Programmering IGR 1372

Algoritmer og Datastrukturer

UNIVERSITETET I OSLO

Kapittel 8: Programutvikling

Forelesning inf Java 4

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

UNIVERSITETET I OSLO

Forelesning inf Java 5

UNIVERSITETET I OSLO

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

LO191D/LC191D Videregående programmering

Forelesning inf Java 5

Eksamensoppgave i IFUD1025 Programmering i Java

Eksamen IN1010/INF1010 våren 2018

ANTDAGER = 358; I Ifra nyttår 08 til 08 1ed julaften

Fakultet for informasjonsteknologi, Institutt for datateknikk og informasjonsvitenskap

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

Eksamen Objektorientert Programmering 2013

GJØVIK INGENIØRHØGSKOLE

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

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

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

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

Algoritmer og Datastrukturer

Eksamensoppgave i TDT4100 Objektorientert programmering

Algoritmer og Datastrukturer

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

LC191D/LO191D Videregående programmering mai 2010

TDT Prosedyre- og objektorientert programmering

INF Uke 10. Ukesoppgaver oktober 2012

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

lfæ~~~~:::j~~:~l -.~=:~-t::-d I Alle trykte og håndskrevne EKSAMENSOPPGA VE Side l av 5 Eksamenstid:

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

Løsningsforslag til eksamen i INF1000 våren 2006

Algoritmer og datastrukturer Eksamen

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Kapittel 9: Sortering og søking Kort versjon

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

Eksamen Oppgave a) public class DayTime { public final int hours, minutes;

Informasjon Eksamen i IN1000 høsten 2017

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

Eksamensoppgave i TDT Prosedyre- og objektorientert programmering

HØGSKOLEN I SØR-TRØNDELAG

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

TDT Prosedyre- og objektorientert programmering

Kapittel 7: Mer om arv

TDT4100 Objektorientert programmering

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

EKSAMEN med løsningsforslag

Transkript:

Eksamensoppgave i TDT4100 Objektorientert programmering Lørdag 8. august 2009, kl. 09:00-13:00 Oppgaven er utarbeidet av faglærer Hallvard Trætteberg og kvalitetssikrer Guttorm Sindre. Kontaktperson under eksamen er Hallvard Trætteberg (mobil 918 97263) Språkform: Bokmål Tillatte hjelpemidler: C Én valgfri lærebok i Java er tillatt. Trykt kompendium er ikke tillatt. Sensurfrist: Mandag 31. august 2009. Les oppgaveteksten nøye. Finn ut hva det spørres etter i hver oppgave. Dersom du mener at opplysninger mangler i en oppgaveformulering gjør kort rede for de antagelser og forutsetninger som du finner det nødvendig å gjøre. Vær oppmerksom på fordelingen av prosentpoeng mellom oppgavene, så du disponerer tiden riktig. Husk at det ofte er bedre å samle poeng på mange oppgaver, enn å gjøre én av dem helt riktig. 1. Småplukk (20%) a) Et palindrom er en tekst som blir lik selv om den er reversert. F.eks. er ada et palindrom. Skriv en metode boolean ispalindrome(string s, boolean ignorecase), som returnerer om Stringparameteret er et palindrom ved å reversere det og teste mot originalen. ignorecase-parameteret skal styre om forskjellen på store og små bokstaver (hhv. upper og lower case) skal spille noen rolle. Dersom ignorecase er true, skal Ada være et palindrom, ellers ikke. Merk at det var spesifisert at String en skulle reverseres, så det trekkes om en ikke bruker denne teknikken, f.eks. sammenligner tegn for tegn i hver ende. Her er to varianter: public static boolean ispalindrome(string s, boolean ignorecase) { String reversed = ""; for (int i = s.length() - 1; i >= 0; i--) { reversed += s.charat(i); Side 1 av 10

return (ignorecase? s.equalsignorecase(reversed) : s.equals(reversed)); public static boolean ispalindrome(string s, boolean ignorecase) { if (ignorecase) { s = s.tolowercase(); StringBuffer reversed = new StringBuffer(s).reverse(); return reversed.tostring().equals(s); b) Skriv en metode som tester om ispalindrome-metoden fra a) virker. Du trenger ikke bruke JUnitrammeverket, men testeteknikken må være den samme. Her er poenget å teste resultatet av å kalle metoden med ulike parametre, slik at en sjekker alle relevante kombinasjoner. public void testispalindrome1() { assertfalse(palindrome.ispalindrome("java", false)); assertfalse(palindrome.ispalindrome("java", false)); assertfalse(palindrome.ispalindrome("agnes i senga", false)); asserttrue(palindrome.ispalindrome("agnes i senga", false)); assertfalse(palindrome.ispalindrome("agnes i senga", false)); asserttrue(palindrome.ispalindrome("agnes i senga", true)); asserttrue(palindrome.ispalindrome("agnes i senga", false)); assertfalse(palindrome.ispalindrome("agnes i senga", false)); asserttrue(palindrome.ispalindrome("agnes i senga", true)); asserttrue(palindrome.ispalindrome("agnes i senga", false)); asserttrue(palindrome.ispalindrome(" ", false)); asserttrue(palindrome.ispalindrome(" ", true)); asserttrue(palindrome.ispalindrome("", false)); asserttrue(palindrome.ispalindrome("", true)); c) Skriv en metode double average(int[][] array2d, int x, int y, int dx, int dy) som returnerer gjennomsnittet av alle tallene i array2d fra og med array2d[y][x] i retningen angitt med dx, dy. Med retning menes her at sekvensen av tall en skal beregne gjennomsnitt for blir array2d[y][x], array2d[y+dy][x+dx], array2d[y+dy+dy][x+dx+dx], helt til en av indeksene havner utenfor sitt gyldige område. Merk at verdiområdet til dx og dy ikke er begrenset. Hallvard Trætteberg 4.8.09 11:33 Deleted: posisjon Her er det flere viktige momenter: indeksering i to-dimensjonal tabell, iterasjon med dx, dy, sjekke mot indeksgrenser i begge ender og bruk av double-aritmetikk (istedenfor int). public static double average(int[][] array2d, int x, int y, int dx, int dy) { double sum = 0.0; int count = 0; Side 2 av 10

while (y >= 0 && y < array2d.length && x >= 0 && x < array2d[y].length) { sum += array2d[y][x]; count++; x += dx; y += dy; return sum / count; Side 3 av 10

2. Fire på rad (45%) Fire på rad spilles av to spillere med et vertikalt stativ (logisk sett et rutenett) med 6 rader og 7 kolonner. Stativet er laget slik at brikker kan slippes ned kolonnene, og brikkene vil ramle nedover i kolonnen til den treffer bunnen av stativet eller en annen brikke. Hver spiller har hvert sitt sett med brikker, hhv. lyse og mørke og spilleren med de lyse brikkene begynner. Illustrasjonene nedenfor er tatt fra nettsiden http://www.donutgames.com/play/four_in_a_row. Hallvard Trætteberg 4.8.09 13:30 Formatted: Font:Italic Startposisjon, lys sin tur. Den halve brikken som vi ser øverst til venstre er ment å illustrere at den kan slippes ned i kolonnen. Lys og mørk har sluppet to brikker hver, i hhv. kolonnene d,e og e, f Spillerne veksler på å slippe ned én brikke om gangen på brettet. I figuren over til venstre vises startposisjonen. I figuren over til høyre er fire brikker sluppet, (nødvendigvis) i rekkefølgen kolonne d (lys), e (mørk), e (lys) og f (mørk). Spillet fortsetter til stativet/brettet er fullt eller én spiller får 4 på rad vertikalt, horisontalt eller diagonalt. Hallvard Trætteberg 4.8.09 12:21 Deleted: rød Både lys og mørk kan få 4 på rad ved å slippe brikke i kolonne f, lys på skrå og mørk oppover. Men det er lys sin tur Lys vinner med 4 på rad diagonalt fra bunnen av kolonne c på skrå oppover til kolonne f. I figuren over til venstre vises et kritisk punkt i et spill, hvor både lys og mørk kan få 4 på rad ved å slippe en brikke i kolonne f. Lys vil kunne få 4 på rad diagonal fra kolonne c til kolonne f, mens mørk vil kunne få 4 på rad vertikalt i kolonne f. Siden det er lys sin tur, så vinner hun, slik det er vist i figuren over til høyre. Side 4 av 10

I denne oppgaven skal en tekstversjon av spillet implementeres. Eksempel på interaksjon med brukeren, hvor øverst rad tilsvarer System.out og nederste System.in: 5... 4... 3... 2... 1... 0... LIGHT's turn LIGHT dropped in column 3 down to row 0 5... 4... 3... 2... 1... 0...o... DARK's turn 3 3 4 DARK dropped in column 3 down to row 1 5... 4... 3... 2... 1...x... 0...o... LIGHT's turn LIGHT dropped in column 4 down to row 0 5... 4... 3... 2... 1...x... 0...oo.. DARK's turn a) Forklar hvordan du vil representere brett og brikker med Java-klasser og hvordan du vil innkapsle brett-tilstanden med metoder. Hint: Brikkene trenger ikke vite hvor de er på brettet. Det er naturlig å bruke en to-dimensjonal tabell til brettet. Brikkene kan være en enkel tellbar type, som enum, char eller int. Der var overraskende mange som laget en enum-klasse, men som likevel brukte en char-tabell! Merk at det er ikke nødvendig å skille mellom ulike brikker av samme farge, slik en kan hvis en lager en vanlig klasse. public enum Piece { LIGHT, DARK; public Piece other() { switch (this) { case LIGHT: return DARK; case DARK: return LIGHT; return null; public class Board { private Piece[][] board; public ArrayBoard() { board = new Piece[BOARD_HEIGHT][BOARD_WIDTH]; public Piece getpiece(int x, int y) { if (x >= 0 && x < BOARD_WIDTH && y >= 0 && y < BOARD_HEIGHT) { return board[y][x]; Side 5 av 10

... else { return null; b) Gitt følgende enum-klasse og klassene du har beskrevet: public enum Direction { NORTH(0, 1), NORTHEAST(1, 1), EAST(1, 0), SOUTHEAST(1, -1), SOUTH(0, -1), SOUTHWEST(-1, -1), WEST(-1, 0), NORTHWEST(-1, 1); public final int dx, dy; private Direction(int dx, int dy) { this.dx = dx; this.dy = dy; // Returns the opposite direction, e.g. NORTH.opposite() returns SOUTH // Useful for testing for 4 in a row, by counting in opposite directions. public Direction opposite() {... Implementer følgende metoder i brettklassen din. Merk at den venstre kolonnen i brettet angis med 0 og den høyre med 6, mens den nederste raden angis med 0 og den øverste med 5. - int getdroprow(int column): Metoden returnerer hvilken rad (int) en brikke vil ramle ned til dersom den slippes i en bestemt kolonne (int). Dersom kolonnen som gis inn som parameter ikke er lovlig, f.eks. fordi kolonnen er full eller negativ, så skal -1 returneres. - boolean islegaldrop(int column): Returnerer true hvis det er lov å slippe en brikke i den angitte kolonnen (int), og false ellers. - int count(piece piece, int column, int row, Direction direction): Metoden returnerer antallet brikker av angitt type (Piece er her brukt som navn på brikke-klassen, bytt ut med den typen du bruker) som en får på rad i den angitt retningen (Direction) dersom en brikke av denne typen plasseres i posisjon kolonne (int), rad (int). Metoden skal ikke forutsette at brikken (Piece) allerede finnes på den angitte posisjonen. Merk at metoden nødvendigvis må returnere minst 1, siden brikken som er tenkt plassert skal telle med. Hallvard Trætteberg 4.8.09 12:36 Deleted: Deklarer og i Hallvard Trætteberg 4.8.09 12:38 Deleted: kolonne Hallvard Trætteberg 4.8.09 12:38 Deleted: kolonne Hallvard Trætteberg 4.8.09 12:39 Deleted: kolonne Hallvard Trætteberg 4.8.09 12:39 Deleted: rad Anta at brettet er som angitt i den tredje figuren i den innledende forklaringen på side 2 og at LIGHT og DARK refererer til hver av de to brikketypene. Da skal count(light, 5, 3, Direction.WEST) returnere 2 og count(light, 5, 3, Direction.SOUTHWEST) returnere 4 (seier!), mens metoden for samme brikketype og de andre retningene skal returnere 1. Tilsvarende vil count(dark, 5, 3, Direction.NORTHWEST) returnere 2 og count(dark, 5, 3, Direction.SOUTH) returnere 4 (seier!), mens den for de andre retningene returnerer 1. Du må gjerne kalle en metode fra en av de andre, for å gjøre implementasjonen enklere og ryddigere. Definer gjerne ekstra metoder for å gjøre implementasjonen enklere å skrive og forstå. Dersom en metode er vanskelig å skrive, så deklarer den og forklar med tekst hva den er ment å gjøre. public int getdroprow(int x) { if (x < 0 x >= BOARD_WIDTH) { return -1; Side 6 av 10

for (int y = 0; y < board.length; y++) { if (board[y][x] == null) { return y; return -1; public boolean islegaldrop(int x) { return getdroprow(x) >= 0; // hjelpemetode for deloppgave c) public int droppiece(piece piece, int x) { int y = getdroprow(x); if (y >= 0) { board[y][x] = piece; fireboardchanged(x, y); return y; public boolean islegal(int x, int y) { return x >= 0 && x < BOARD_WIDTH && y >= 0 && y < BOARD_HEIGHT; public int count(piece piece, int x, int y, Direction direction) { int count = 0; x += direction.dx; y += direction.dy; while (islegal(x, y) && getpiece(x, y) == piece) { count++; x += direction.dx; y += direction.dy; return count; c) Beskriv med tekst og kode hvordan du vil implementere et 4 på rad -spill som kommuniserer med spillerne vha. System.in og System.out, som styrer spillet iht. reglene angitt over og avslutter når en spiller har vunnet. Eksempel på interaksjon med brukeren finner du på side 3. Bruk metodene definert tidligere i oppgaven, også om du ikke har implementert dem. Det er mange ting å få med seg: referanser til brettet og hvem som har turen, metoder for å printe tilstanden og sjekke for seier, bruk av Scanner og/eller System.in for input, sjekke lovlighet av trekk og avslutte spillet ved seier. Merk at en ikke trenger komplett kode, som vist her, men det bør være pseudokode, slik at en viser at de fleste av elementene er med. public class FourInARow { Side 7 av 10

private Board board; private Piece turn; public FourInARow() { board = new Board(); turn = Piece.LIGHT; private void printstate() { System.out.println(" "); for (int y = Board.BOARD_HEIGHT - 1; y >= 0; y--) { System.out.print(y); for (int x = 0; x < Board.BOARD_WIDTH; x++) { Piece piece = board.getpiece(x, y); System.out.print(piece == null? '.' : (piece == Piece.LIGHT? 'o' : 'x')); System.out.println(); System.out.println(" "); System.out.println("It is " + turn + "'s turn"); private boolean haswon(piece piece, int x, int y) { for (Direction direction: Direction.values()) { if (board.count(piece, x, y, direction) + board.count(piece, x, y, direction.opposite()) >= 3) { return true; return false; private boolean droppiece(int x) { int y = board.droppiece(turn, x); if (y >= 0 && haswon(turn, x, y)) { return true; turn = turn.other(); return false; public static void main(string[] args) { FourInARow fourinarow = new FourInARow(); Scanner scanner = new Scanner(System.in); do { fourinarow.printstate(); if (! scanner.hasnextline()) { break; String line = scanner.nextline().trim(); Side 8 av 10

column"); won!"); if (line.length() == 0) { break; if (line.length() == 1) { int x = line.charat(0) - '0'; if (! fourinarow.board.islegaldrop(x)) { System.out.println(line + " is not a valid drop else { boolean haswon = fourinarow.droppiece(x); if (haswon) { System.out.println(fourInARow.turn + " has break; else { System.out.println(line + " is not a legal command"); while (true); Besvarelsen blir vurdert etter hvor logisk og strukturert løsningen er, om innkapsling er brukt, hvorvidt Java er godt og riktig brukt og om koden er logisk riktig. 3. Mobilbruk (35%) En mobiltelefon kan brukes til mange ting, f.eks. å snakke, sende SMS og MMS og surfe på nettet, og det meste av bruken koster penger. Du skal i denne oppgaven utforme klasser for å representere bruk av ulike typer mobiltjenester og nok informasjon til å kunne skrive ut en oversikt over bruken med beregnet pris og total kostnad. Målet er å gjøre det enkelt å legge til nye tjenester og endre priser, uten å måtte endre mye kode. Selv om tjenester er nokså ulike i bruk, så koker de for denne oppgaven ned til bruk av et antall enheter. F.eks. måles snakking i sekunder, SMS i sendte tegn, og MMS og internettbruk i byte overført. For hver type bruk har en altså en enhet og for hver bruk en mengde av denne enheten. Prisingen av en tjeneste er basert på en enkel formel, hvor en betaler et beløp pr. bruk + et beløp pr. påbegynt chunk brukt av enheten. En chunk er en mengde som må betales som et hele, f.eks. betales samtaler i minutter, SMS av 128-tegns grupper, MMS i kb (2^10) byte og nettbruk i mb (2^20 byte). a) Forklar med tekst og kode hvordan du vil implementere grensesnitt og/eller klasser for å representere bruken av hver av tjenestene. Tanken her var at det skal lages en ny instans av et bruk -objekt, hver gang en ringer, sender SMS eller MMS og bruker nettet. Det er forsåvidt mulig å kun ha en sum som økes, men da er det umulig i å skrive ut en liste over all bruk, slik det bes om i deloppgave c). For hver bruk, uavhengig av type tjeneste, må det registreres antall enheter som er brukt. Siden dette er data som er uavhengig av den konkrete tjenestetypen, så passer det å ha i en abstrakt superklasse, som hver tjenestetype arver fra. I tillegg har hver bruk en chunk-størrelse, som er spesifikk for tjenestetypen. Denne er konstant for en Side 9 av 10

tjenestetype, så den kan returneres av en metode (eller lagres i superklassen og initialiseres i konstruktøren). Her er forslag til kode, med Sms som eksempel på konkret tjenesteklasse. public abstract class ServiceUsage { private int unitcount; protected ServiceUsage(int unitcount) { this.unitcount = unitcount; public int getunitcount() { return unitcount; public abstract int getchunksize(); public int getprice(int priceprusage, int priceprchunk) { return priceprusage + priceprchunk * ((unitcount - 1) / getchunksize() + 1); public class Sms extends ServiceUsage { public Sms(String text) { super(text.length()); public int getchunksize() { return 128; b) Forklar med tekst og kode hvordan du vil implementere grensesnitt og/eller klasser for å representere prising av bruken av hver av tjenestene. c) Forklar med tekst og kode hvordan du vil implementere en klasse for å registrere/samle opp bruk av tjenestene, f.eks. for en abonnent, og som kan skrive ut en oversikt over hver bruk med beregnet pris og totalpris. Besvarelsen blir vurdert etter hvor logisk og strukturert løsningen er og om Java er godt og riktig brukt. I denne oppgaven er vi ikke interessert i innholdet i de enkelte metoden men om hvordan klasser, grensesnitt og metoder samhandler. Side 10 av 10