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.