Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag 2001 - maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h Antalet uppgifter : 2 (20p + 20p = 40 p) ) Lärare, jourhavande lärare : Leif Kusoffsky ------------------------------------------------------------------------------------------------------------------ Tillåtna hjälpmedel: Läroboken: En Java-bok, t ex Skansholm: Java Direkt. ----------------------------------------------------------------------------------------------------------------- 1 a). Alla länder har ett namn och ett namn på sin valuta. Vissa länder är medlemmar i EU och blev medlemmar ett visst år. Vissa av EU-länderna har en gemensam valuta med namnet "euro". Vissa länder (t ex Sverige som är ett EU-land, Frankrike som är ett Euro-EU-Land och Norge som bara är ett Land, men inte Storbrittanien som är ett EU-land) är med i Shengen-samarbetet. Dessa länder har tillgång till ett polisregister register som dessa staters polismyndigheter kan söka i. Modellera i Java med sex klasser och ett gränsnitt denna situation, som den dessutom beskrivs med nedanstående UML-liknade klassdiagram. Samtliga klasser skall dessutom ha lämplig konstruktor som ger instanvariablerna lämpliga värden. 9p) Land - String namn //landets namn - String valuta //valutans namn Shengen public Object searchfor(string iperson) EULand - int inträdesår ShengenLand - Map register EuroEULand ShengenEULand - Map register ShengenEuroEULand - Map register Vänd!
Tips: Implementeringen av metoden searchfor(string iperson) görs med metoden get i Map, se t ex Skansholm sid 498. Metoden deklareras alltså i gränsnittet Shengen,och skall implementeras av "Shengen-klasserna". Konstruktorn för Shengenländer har en parameter för att instansiera registret av typen Map. Euroländer får valutanamnet "euro" automatiskt utan medverkan av konstruktorerna för dessa sorts länder. b). Kan man i Java förenkla problemet i 1 a) genom att använda multipelt arv? 1p) c). d). e). f). Vilka av namnen Land, EULand, EuroEULand, Shengen, ShengenLand, ShengenEULand, ShengenEuroEULand och Map kan användas som typnamn? 1p) Skulle man kunna ha en Vector där elementen skull kunna vara instanser av vilken som helst av de sex klasserna? Hur deklarerar man i så fall en sådan Vector, och hur tillfogas i så fall några länder, t ex Sverige och Frankrike och Norge till vektorn? 1p) Förse de av de sex klasserna där det behövs med en metod String tostring() som returnerar landets namn, namnet på valutan och i förekommande fall inträdesår i EU samt om landet är ett Shengenland. 3p) Skriv en metod void printinfo(vector länder) som med en slinga (snurra, loop) skriver ut information om alla länder i vectornländer med hjälp av tostring() i uppgift e. 3p) g) Förklara vad som menas med dynamisk bindning. 2p) 2) En Teknologtamagotchi är ett datorprogram som fungerar som ett lite gosedjur (en cirkel) som man skall försöka få så stort som möjligt. Genom att trycka på knapparna kan man tillfredställa dess behov och på så sätt få den att växa. Vissa sekvenser av knapptryckningar skall var bättre än andra. Till exempel är sekvensen sova - tenta - festa en kombination som premieras med extra stor tillväxt medan sekvensen festa - sova - tenta är en dålig kombination som leder till minskad storlek. Om samma sak händer tre gånger i rad blir tamagotchin uttråkad och minskar sin radie till hälften - Teknolog-tamagotchi. Tenta Festa Sova Plugga Vänd!
a) Skriv Teknolog-tamagotchin som en Java-applikation. 15p) Hjälp: För att det inte skall bli så mycket att skriva kan man använda följande klass om man vill. Tanken är att i ett sekvens-objekt kan man minnas de tre senaste knapptryckningarna. En ny tryckning tillfogas till ett sekvens-objekt med med add( s ) för sova, add( t ) för tenta, add( p ) för plugga, add( f ) för festa. Anrop av getfactor() returnerar med vilken faktor tamagotchins radie skall förändras. class Sequence { private char vold; private char old; private char act; public void add(char ib) { vold = old; old = act; act = ib; public double getfactor() { if (vold == old && vold ==act) { return 0.5; //Har tråkigt else if (vold == s && old == t && act == f ) { return 1.5; else if (vold == f && old == s && act == t ) { return 0.5; else if (vold == f && old == f && act == t ) { return 0.1; else if (vold == p && old == s && act == t ) { return 2.0; else { return 1.0; b) Gör så att tamagotchin blir uttråkad och drar ihop sig om inget händer inom 6 sekunder. 5p)
Förslag till svar tentamen 2D4134 2001 maj 19. public class Land { protected String valuta = ""; protected String namn = ""; public Land(String inamn, String ivaluta) { namn = inamn; valuta = ivaluta; return (namn + ": valuta " + valuta); //1a, 1e public interface Shengen { public Object searchfor(string iperson); import java.util.*; public class ShengenLand extends Land implements Shengen { private Map register; public ShengenLand(String inamn, String ivaluta, Map iregister) { super(inamn, ivaluta); register = iregister; public Object searchfor(string iperson){ return register.get(iperson); return super.tostring() + " i Shengen"; public class EULand extends Land { protected int inträdesår; public EULand(String inamn, String ivaluta, int iinträdesår) { super(inamn, ivaluta); inträdesår = iinträdesår; return super.tostring() + " i Eu år " + inträdesår; import java.util.*; public class ShengenEULand extends EULand implements Shengen { private Map register; public ShengenEULand(String inamn, String ivaluta,
int iinträdesår, Map iregister) { super(inamn, ivaluta, iinträdesår); register = iregister; public Object searchfor(string iperson){ return register.get(iperson); return super.tostring() + " i Shengen"; public class EuroEULand extends EULand { public EuroEULand(String inamn, int iinträdesår) { super(inamn, "euro", iinträdesår); import java.util.*; public class ShengenEuroEULand extends EuroEULand { private Map register; public ShengenEuroEULand(String inamn, int iordförandeår, Map iregister) { super(inamn, iordförandeår); register = iregister; public Object searchfor(string iperson){ return register.get(iperson); return super.tostring() + " i Shengen"; Multipelt arv är inte tillåtet i Java. Det vore bekvämt här Alla // 1b // 1c import java.util.*; // public class TestLander { public static void main(string [] args) { Vector lv = new Vector(); //1d Map m = new Hashtable(); lv.add(new ShengenEULand("Sverige", "krona", 1995, m)); lv.add(new ShengenEuroEULand("Frankrike", 1955, m)); lv.add(new EULand("Storbrittanien","pund", 1965)); lv.add(new Land("Norge","krona")); printinfo(lv);
public static void printinfo(vector v) { // 1f for(int i = 0; i < v.size(); i = i+1) { System.out.println(v.elementAt(i)); Beroende på objektets typ används korrekt version av en metod, t ex tostring() ovan. Detta fungerar eftersom metodrna hittas i minnet via objekten, som innehåller referenser till adekvat version //1g import java.awt.*; import java.awt.event.*; public class PlayTamagotchi { public static void main(string [] arg) { Tamagotchi t = new Tamagotchi(); TView tv = new TView(t); class Tamagotchi { private int radie = 40; private Sequence seq = new Sequence(); private CPanel cpanel; private LKClock clock; private int count = 0; public Tamagotchi() { clock = new LKClock(this); clock.aktivitet.start(); public void gets(char b) { if (b == c ) { count = count + 1; if (count == 6) { count = 0; radie = (int) (((double) radie)*0.3); cpanel.update(radie); else { count = 0; seq.add(b); radie = (int) (((double) radie)*seq.getfactor()); cpanel.update(radie); public void setview(cpanel icp) { cpanel = icp; class TView extends Frame implements ActionListener{ private Tamagotchi t; private CPanel cpanel;
private Button tenta = new Button("Tenta"); private Button festa= new Button("Festa"); private Button sova= new Button("Sova"); private Button plugga= new Button("Plugga"); public TView(Tamagotchi it) { t = it; setsize(400,400); setlayout(new BorderLayout()); cpanel = new CPanel(); add("center", cpanel); add("north", tenta); add("west", festa); add("east", sova); add("south", plugga); tenta.addactionlistener(this); festa.addactionlistener(this); sova.addactionlistener(this); plugga.addactionlistener(this); setvisible(true); t.setview(cpanel); t.gets( ); public void actionperformed(actionevent e) { if (e.getsource() == tenta) { t.gets( t ); else if (e.getsource() == festa) { t.gets( f ); else if (e.getsource() == sova) { t.gets( s ); else if (e.getsource() == plugga) { t.gets( p ); else { class CPanel extends Panel { private int r = 10; public CPanel() { setvisible(true); public void paint(graphics g) { g.setcolor(color.red); g.filloval(150-r, 150-r, 2*r, 2*r); public void update(int ir) { r = ir; repaint();
class LKClock implements Runnable { public Thread aktivitet = new Thread(this); private Tamagotchi t; public LKClock(Tamagotchi it) { t = it; public void run() { while (true) { try { Thread.sleep(1000); catch (InterruptedException e) { t.gets( c );