Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag 2001 - aug - 23 Tentamen i Objektorientering och Java Skrivtid 5 h Antalet uppgifter : 3 (15p + 20p + 5p = 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 kärlväxter har ett latinskt namn som består av två delar: ett släktnamn (gemensamt för alla arter i en viss släkt) och ett artnamn. Svenska växter har dessutom ett svenskt namn. Hybrider är korsningar mellan 2 arter, de är i regel sterila. Några hybrider med större utbredning behandlas som arter med eget namn, men har då ett x före sitt artnamn. (Källa: Bo Mossberg, Lennart Stenberg, Stefan Ericsson: Den nordiska floran) Modellera i Java med tre klasser denna situation, som den dessutom beskrivs med nedanstående UML-liknade klassdiagram. Klasserna skall dessutom ha lämplig konstruktor som ger instanvariablerna lämpliga värden. Metoden tostring() skall skriva ut en arts svenska namn och fulltständiga latinska namn. För hybrider med eget namn skall dessutom skrivas ut att växten är en hybid och mellan vilka växter den är hybrid och om den är steril.(se även uppgift 1b) 12p) Släkte String namn //släktes latinska namn Klassen Hybrid används för att instansiera hybrider med eget namn. Hybrider har två instansvariber för de arter den hybridiserar. Art Hybrid - Art art1 // - Art art2 - boolean steril Vänd!
b) Skriv ett huvudprogram som instansierar två arter och en hybrid och skriver ut denna text om hybriden: 2p) Strandfräken Equisetum x litorale, steril hybrid mellan Åkerfräken Equisetum arvense och Åkerfräken Equisetum arvense c) Skulle situationen istället kunna modelleras på ett sätt som illustreras med nedanstående UML-liknade diagram? Sämre/ bättre? 1p) Släkte String namn //släktes latinska namn Art Hybrid - Art art2 // - boolean steril Klassen Hybrid används för att instansiera hybrider med eget namn. Hybrider mellan två arter med eget namn ärver den ena arten och har en instansvaribel för den andra arten.
2) När man beställer biljetter till finare biografer och teatrar skall man säga vilken plats i salongen man vill ha och uppge sitt namn. a) Skriv en klass Bioplatser som visar en bild över salongen. På denna bild skall man kunna markera en plats och därefter uppmanas man att skriva in sitt namn. När man i textfönstret sedan ger vagnretur (return) så skrivs biljetten ut (vi simulerar detta med att skriva i terminalfönstret). 15p) Vi förenklar problemet på följande sätt: Platserna bildar en matris. Varje person kan bara markera en plats och köpa en biljett för varje gång hon/han skriver in sitt namn. b) Skriv en Java-applikation som instansierar två objekt av typen Bioplatser. (programmet kan t ex tänkas som arbetsredskap för någon som tar emot telefonbeställningar till de två biograferna) 2p) c) Skulle vi kunna använda vår klass för att kunna boka platser via Internet? Hur? Skriv några rader om hur klassen används/eller ändras för att kunna användas för att kunna boka plats på en biograf. 3p) 3) Beskriv kortfattat vad som menas med dynamiskt bindning i Objekt-inriktade språk. 5p)
Förslag till svar tentamen 2D4134 2001 aug 23. public abstract class Släkte { -- 1a) protected String namn; // latinskt släktnamn public class Art extends Släkte { private String namn; // latinskt artnamn private String svnamn; // svenb skt namn public Art(String isnamn, String ianamn, String isvnamn) { super.namn = isnamn; namn = ianamn; svnamn = isvnamn; public String tostring() { return svnamn + " " + super.namn + " " + namn; public class Hybrid extends Släkte { private String namn; // latinskt artnamn private String svnamn; // svenskt namn private Art art1; // Hybrid mellan ärvd art1 och art 2 private Art art2; // Hybrid mellan ärvd art1 och art 2 private boolean steril; public Hybrid(String isnamn, String ianamn, String isvnamn, boolean isteril, Art iart1, Art iart2) { super.namn = isnamn; namn = ianamn; svnamn = isvnamn; steril = isteril; art1 = iart1; art2 = iart2; public String tostring() { return svnamn + " " + super.namn + " x " + namn + ", " + (steril?" steril ":"") + " hybrid mellan " + art2.tostring() + " och " + art2.tostring(); public class Flora { -- 1b) public static void main(string [] arg) { Art art1 = new Art("Equisetum", "fluviatile", "Sjöfräken"); Art art2 = new Art("Equisetum", "arvense", "Åkerfräken"); Hybrid hybrid = new Hybrid("Equisetum", "litorale", "Strandfräken", true, art1, art2); System.out.println(hybrid.toString()); Jo, det går men är nog lite sämre. -- 1c)
import java.awt.*; import java.awt.event.*; public class Bioplatser extends Frame { private Button [] [] button; private int istorlek; private int jstorlek; String ledig = "0"; String reserverad = "X"; Panel platser = new Panel(); TextField besokare = new TextField(" "); Label info = new Label(" Tryck på en bioplats"); private boolean vantaknapp = true; private int resi; private int resj; -- 2 a public Bioplatser(int irader, int ikolumner) { setlayout(new FlowLayout()); int bredd = ikolumner*23; int hojd = irader*30; setsize(bredd, hojd+70); platser.setsize(bredd, hojd); istorlek = irader; jstorlek = ikolumner; button = new Button [istorlek][jstorlek]; platser.setlayout(new GridLayout(istorlek, jstorlek)); for (int i = 0; i <istorlek; i = i+1) { for (int j = 0; j <jstorlek; j = j+1) { button[i][j] = new Button(ledig); button[i][j].addactionlistener(new ButtonListener(i, j, this)); platser.add(button[i][j]); add(platser); add(new Label("Namn :")); besokare.addactionlistener(new TextFieldListener(besokare, this)); add(besokare); add(info); setvisible(true); public void klickpa(int ii, int ij, String namn) { if (vantaknapp) { if (ii == -1) { info.settext("obs! Tryck på en bioplats"); else { resi = ii; resj = ij; button[ii][ij].setlabel(reserverad); info.settext("skriv in ett namn"); vantaknapp = false; else { if (ii == -1) { System.out.println("Rad "+ (resi+1) + " plats " + ((resi+1)*jstorlek + resj +1) + " reserverad för " + namn); besokare.settext(""); info.settext("tryck på en bioplats"); vantaknapp = true; else { info.settext("skriv in ett namn");
class ButtonListener implements ActionListener { private int i; private int j; private Bioplatser biop; public ButtonListener(int ii, int ij, Bioplatser ib) { i = ii; j = ij; biop = ib; public void actionperformed(actionevent e) { biop.klickpa(i, j, ""); class TextFieldListener implements ActionListener { private TextField besokare; private Bioplatser biop; public TextFieldListener(TextField itf, Bioplatser ib) { besokare = itf; biop = ib; public void actionperformed(actionevent e) { biop.klickpa(-1, -1, besokare.gettext()); public class Sandrews { public static void main(string [] iarg) { Bioplatser astoria = new Bioplatser(30, 20); Bioplatser skandia = new Bioplatser(10, 10); -- 2b <html> -- 2c <body> <applet code = BioApplet.class width = 100 height = 150> </applet> </body> </html> import java.applet.*; public class BioApplet extends Applet{ public void init() { Bioplatser astoria = new Bioplatser(30, 20); Se boken -- 3.