Tentamen 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Torsdagen den 3 juni 2004 kl 9.00 14.00, sal D31 Tentan har en teoridel och en problemdel. På teoridelen är inga hjälpmedel tillåtna och på problemdelen är alla skriftliga hjälpmedel tillåtna. Man löser teoridelen först, lämnar in den, hämtar problemdelen och tar sen fram sina böcker m.m. Använd absolut inte mer än 2 timmar till teoridelen! Teoridelen har 20 poäng och problemdelen har 32 poäng. Dessutom kan man få tentapoäng för avklarade laborationer. 1-2 labmoment klara ger 1 bonuspoäng, 3-4 labmoment klara ger 2 bonuspoäng och om man gjort samtliga labmoment så får man 4 bonuspoäng som läggs till det man erhåller på tentan. Preliminära betygsgränser: För godkänt krävs 25 poäng varav minst 10 poäng från problemdelen, för betyg 4 krävs 35 poäng och för betyg 5 krävs 45 poäng. Problemdel Uppgifterna är inte ordnade efter svårighetsgrad. Delvis riktiga lösningar kan alltid ge poäng. Försök därför lösa uppgifter även om du inte förstår till 100%. Om en uppgift ser ut att bygga på en annan är det alltid tillåtet att försöka lösa den även om man inte löst den föregående. Poängavdrag kan göras för klumpiga lösningar, även om de fungerar. Poängavdrag görs inte för små syntaxfel eller skrivfel. P1) (4p) Ett gränssnitt för en kö kan se ut så här: interface IQueue { public boolean isempty(); public void put(object o); public Object get (); Kön kan förstås implementeras på flera olika sätt men vi tänker oss här att den implementeras som en enkellänkad lista. Köobjektet har referenser till sitt första och sitt sista element (first och last) och varje element har en referens till nästa i kön. Varje element (eller nod) i kön har dessutom en referens (info) till det som skall stå i kön. I denna kö ska endast stå objekt av klassen Person, varje person har ett förnamn och ett efternamn, båda av typ String. Rita ett UML-klassdigram över kön inklusive IQueue. Metodnamn behöver inte vara med i diagrammet. 1
P2) (16p) Designmönstret Composite skall användas i ett program som hanterar geometriska figurer och grupper av sådana figurer. En grupp kan som medlem ha både grupper och enkla figurer så att en hierarkisk struktur kan åstadkommas, allt enligt mönstret Composite. I uppgiften beaktar vi bara klasserna Figure, Rectangle, Square och Group och vi implementerar dem inte fullständigt. Följande är givet: abstract class Figure { int x1, y1; // övre vänstra hörnet int x2, y2; // nedre högra hörnet Figure owner; // sätts om figuren tillhör en grupp Figure () { Figure (int x1, int y1, int x2, int y2) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; void setowner (Figure f) { owner = f; void add (Figure f) { void remove(figure f) { void ungroup () { void ungroupr () { class Rectangle extends Figure { Rectangle (int x1, int y1, int x2, int y2) { super(x1,y1,x2,y2); void setwidth (int w) { x2 = x1 + w; void setheight (int h) { y2 = y1 + h; // fler metoder class Square extends Rectangle { Square (int x1, int y1, int x2) { super(x1,y1,x2,y1 + (x2-x1)); // fler metoder 2
Variablerna x1, y1, x2, y2 antas innehålla koordinater för figurens övre vänstra och nedre högra hörn. Kontroller av dessa variabler behöver inte göras, antag att de ges riktiga värden! Uppgifterna a och b kan lösas helt utan kunskaper om designmönster. P2a) (2p) Metoderna setwidth och setheight definieras i klassen Rectangle och ärvs av klassen Square. Metoderna gör det möjligt att oberoende ändra bredd och höjd på rektangeln vilket är rimligt för en rektangel men inte för en kvadrat. Definiera om dessa metoder i klassen Square så att de kan anropas för Square objekt men säkerställer att de två sidorna hos ett Square objekt alltid är lika långa. P2b) (svår)(2p)dendefinitionavsquare som vi gjort i uppgift a kan ge problem i vissa situationer. Kan du beskriva någon sådan situation och hur problemet kan åtgärdas? Svara helst med mer resonemang än programkod! P2c) (9p)VarjeFigure objekt som är med i en grupp skall ha en referens till sin ägare, instansvariabeln owner. Denna är null så länge objektet inte tillhör någon grupp. Se till att denna sätts riktigt i uppgifterna nedan! Skriv klassen Group enligt Composite-mönstret. Den skall ha följande metoder: add för att lägga till ett Figure objekt(2p) remove för att ta bort ett visst element ur gruppen (1p) ungroup (avgruppera) för att lösa upp gruppen och lägga alla dess medlemmar på den nivå där själva gruppobjektet låg. Gruppobjektet ska bort och inte ligga kvar som en tom grupp. Gör metoden så att den endast avgrupperar i ett steg, ev grupper i gruppen ska inte avgrupperas. Se exempel på nästa sida! För en grupp utan owner ska metoden inte göra något alls. (4p) ungroupr utvidga ungroup så att den avgrupperar alla grupper i gruppen, dvs en grupp som är komplicerad hierarkisk struktur av figurer ska bli en grupp med bara icke-grupp-medlemmar som alla är på samma nivå, se exempel på nästa sida! (1p) För klassen Group utöver metoderna ovan ges 1p. P2d) (3p) Skriv satser som skapar en grupp sammansatt som G2 nedan. Uppgiften går utmärkt att lösa även om man inte löst P2c alls! G2 Rec Rec _ G3 Sq Sq Rec 3
G1 G1 _ G2 Sq Rec Rec Rec Sq Rec _ G3 Rec Rec _ G3 Sq Sq Rec Sq Sq Rec Avgruppering i ett steg med ungroup av G2 i strukturen ovan till vänster skall ge det som visas ovan till höger. Figurobjekten får hamna i en annan ordning efter avgruppering, det väsentliga är att de ligger på rätt nivå. Avgruppering av G1 på någon av strukturerna skall inte ge någon ändring alls. Avgruppering med ungroupr av G2 ovan skall ge strukturen nedan: Ordningen mellan objekten i gruppen G1 får vara en annan än den som visas här. G1 _ Rec Rec Sq Sq Rec Sq Rec 4
P3) (12p) Skriv ett fristående program (application) som simulerar ett vanligt trafikljus med en röd, en gul och en grön lampa som tänds och släcks. Tänd först den röda, efter en stund den gula (båda ska vara tända ett tag), släck därefter både röd och gul och tänd den gröna. Efter en tid med grönt, börja om igen med röd lampa och upprepa detta så länge programmet är igång. Man skall kunna starta simuleringen med en knapp med det krävs inte att den går att stoppa. Se figuren! Skriv först en klass Lampa som används för tre lampobjekt med olika färg. En startknapp under de tre lamporna skall starta simuleringen. Använd lämpliga Layoutmanagers för att få den struktur som bilden visar. En eller flera trådar skapade av användaren skall användas för simuleringen. Uppgiften går att lösa genom att ge varje lampobjekt en egen tråd som sköter dess simulering eller låta en enda tråd sköta simulering av alla tre. Med en tråd per lampobjekt så bör man egentligen se till att trådarna väntar in varandra så att t.ex. den röda och den gröna lampan inte råkar vara tända samtidigt. Detta krävs dock inte för full poäng. Utan tråd, halva poängen För ett program som inte simulerar trafikljuset men ritar upp en svart rektangel med en start-knapp under, och efter tryck på startknappen visar en röd, en gul och en grön lampa som alla är objekt av klassen Lampa, ges maximalt 6p. 5