Kungliga Tekniska Högskolan Nada Tentamen i Objektorientering och Java Ämneskod 2D4134 Tentamensdag 00 - aug - 26 Skrivtid 5h Antalet uppgifter : 4 (14p + 6p + 14p + 6p = 40 p) ) Lärare, jourhavande lärare : Leif Kusoffsky -----------------------------------------------------------------------------------------------------------------Tillåtna hjälpmedel: Läroboken: Ericsson : Programutveckling med Java. ----------------------------------------------------------------------------------------------------------------1 a). Antag att länder kan vara antingen monarkier eller republiker. Statschefen i en monarki är en regent (dvs en kung eller regerande drottning), statschefen i en republik är en president. Alla monarkier och vissa republiker har ett parlamentariskt system med en regeringschef med titeln premiärminister, men i vissa republiker som ej har ett parlametariskt system (t ex USA) är presidenten även regeringschef. Modellera i Java med fyra klasser denna situation, som den dessutom beskrivs med nedanstående UML-liknade klassdiagram: Land String namn String statschef() String regeringschef() Monarki String regent String premiärminister String toString() Republik String president String toString() ParlamentariskRepublik String premiärminister String toString() 9p) b) Skriv en klass med ett huvudprogram som skapar en array med tre länder och som skriver ut information om länderna. Utskriften skall bli så här: Sverige (monarki) Statchef : Kung Karl XVI Gustav. Regeringschef : Göran Persson USA (republik) Statchef och regeringschef : President William Clinton Frankrike (parlametarisk republik) Statchef : President Jaques Chirac. Regeringschef : Lionel Jospin Utskiften av uppgifterna om de tre länderna skall ske utan användning av instanceof och med metoderna toString(). 3p) c) 2 a) b) Arrayen i uppgift b) kan skapas och instansieras på två sätt. Hur ser det sätt ut som du inte använde i uppgift b)? 2p) Ge ett exempel på dynamisk bindning av metoder i Java. 2p) Antag att vi har deklarationerna int i; int [] myarr; MyClass myclass; Kan anropen dosomething1(i); dosomething2(myarr); dosomething3(myclass); ändra på värdet av i respektive ändra innehållet i myarr och myclass? Förklara! 4p) 3. En tärning är som bekant en kub med sex sidor märkta med prickar, en sida märkt med en prick, en sida med två prickar osv. a) Skriv med hjälp av Javas awt.paket en klass Dice. Klassen skall innehålla en konstruerare som gör att man får en bild på skärmen av en tärningssida när man instansierar ett Dice-objekt. Bilden får byggas upp på lämpligt sätt, t ex med en textArea i en Frame, en Canvas i en Frame eller på något annat sätt. Min lösning med en TextArea med asterisker är enkel men ger fula rullningslister utan funktion. När man "klickar" på ett Dice-objekt skall man få en ny slumpmässigt vald sida, dvs man "kastar" tärningen. För full poäng skall stängningsrutan avsluta körningen av ett program som använder ett Dice-objekt. Tips: Man kan ha användning för klassen Random, se Erisson sid 246. Frame-objekt har en operation pack() som automatiskt ger en Frame rätt storlek. 10p) b) Skriv en klass PlayDices med ett huvudprogram som gör att man får två tärningar på skärmen. 4p) 4 a). Skriv en "applet" som i appletytan visar två tärningar. Ange vilka ändringar som måste göras i klassen Dices för att den skall kunna användas i en applet. 4p) b) Skriv .html-filen som behövs för att man skall kunna provköra en applet. 1p) c) Hur provkör man enklast en applet? Hur är en färdig applet tänkt att användas? 1p) Förslag till svar tentamen 2D4134 2000 augusti 26. public abstract class Land { protected String namn; public abstract String statschef(); public abstract String regeringschef(); } // 1 a) public class Monarki extends Land{ private String regent; private String premiärminister; public Monarki(String inamn, String iregent, String iPM) { namn = inamn; regent = iregent; premiärminister = iPM; } public String statschef(){ return regent; } public String regeringschef() { return premiärminister; } public String toString() { return namn + " (monarki) \n Statchef : " + regent + ". Regeringschef : " + premiärminister; } } public class Republik extends Land{ protected String president; public Republik(String inamn, String ipresident) { namn = inamn; president = ipresident; } public String statschef(){ return president; } public String regeringschef() { return president; } public String toString() { return namn + " (republik) \n president; } } Statchef och regeringschef : " + public class ParlamentariskRepublik extends Republik { private String premiärminister; public ParlamentariskRepublik(String inamn, String ipresident, String iPM) { super(inamn, ipresident); premiärminister = iPM; } public String statschef(){ return president; } public String regeringschef() { return premiärminister; } public String toString() { return namn + " (pralmetarisk republik) \n Statchef : " + president + ". Regeringschef : " + premiärminister; } } public class Lander { // 1 b) public static void main(String [] args) { Land [] land = {new Monarki("Sverige", "Kung Carl XVI Gustav", "Göran Persson"), new Republik("USA", "President William Clinton"), new ParlamentariskRepublik("Frankrike", "President Jaques Chirac", "Lionel Jospin")}; for (int i = 0; i < land.length; i = i+1) { System.out.println(land[i]); } } } Land [] land = new Land[3]; // 1c) land[0] = new Monarki("Sverige", "Kung Karl XVI Gustav", "Göran Persson"); land[1] = new Republik("USA", "President William Clinton"); land[2] = new ParlamentariskRepublik("Frankrike", "President Jaques Chirac", "Lionel Jospin"); // 2 a) Metoden toString() i snurra i 1 b) är den metod som "hör ihop med" just den typ av objekt som är aktuellt just då. Värdet av i kopieras till första parametern i dosomething1 och därför påverkas ej i. Pekarvärden myarr och myclass kopieras till första parametern i dosomething2 respektive dosomething3 och påverkas i och för sig ej heller, men objekten som de pekar på kan påverkas. I välskrivna Javaprogram bör detta i regel ske med void-metoder, och det är vanligt att man låter objkten påverkas på detta sätt (det är därför de kallas objekt). import import import public java.util.*; java.awt.*; java.awt.event.*;; class Dice extends Frame { // 3 a) private TextArea face = new TextArea(3, 3); private Random r = new Random(); private int n = 5; public Dice(String itext) { setLayout(new FlowLayout()); add(face); showDice(5); pack(); setTitle(itext); face.addMouseListener(new myListener(this)); addWindowListener(new WListener()); showDice(n); setVisible(true); } public void thr() { n = r.nextInt() % 6 + 1; showDice(n); } private void showDice(int i) { switch(i) { case 1: face.setText("\n *");break; case 2: face.setText(" *\n\n *");break; case 3: face.setText(" *\n *\n *");break; case 4: face.setText(" * *\n\n * *");break; case 5: face.setText(" * *\n *\n * *");break; case 6: face.setText(" * *\n * *\n * *");break; default: } } } class myListener Dice myd; extends MouseAdapter{ public myListener(Dice id) { myd = id; } public void mouseClicked(MouseEvent e) { myd.thr(); } } class WListener extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } public class PlayDices { // 3 b) public static void main(String [] args) { Dice d1 = new Dice("A"); Dice d2 = new Dice("B"); } } import java.awt.*; import java.applet.*; public class PlayDices // 4 a) extends Applet { public void init() { setLayout(new FlowLayout()); Dice d1 = new Dice(); Dice d2 = new Dice(); add(d1); add(d2); setVisible(true); } public void destroy() { removeAll(); } } public class Dice extends Panel { // Applets kan ej innehåll Frame .... public Dice() { //setTitle skallbort, därför även parametern ... setSize(100, 50) //pack finns ej i Panel // Ta bort setTitle, ta bort lyssnare till stängningsrutan // Panel har ingen ram, därför ej heller tiielruta // och ej tängningsruta <html> <head> <title> PlayDices </title> // 4 b) </head> <body> <applet code=PlayDices.class width=900 height = 400> </applet> </body> Provkör lämpligen med programmet // 4 c) appletviewer <.htmlfil enligt ovan> Färdig "applets" är tänkta att köra med program som Nescape eller Explorer på Internet, varvid klassfiler sänds över nätet.