Örebro universitet
Institutionen för teknik
Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se)







Omtentamen i

Programmering i Java

för Dataingenjörsprogrammet m fl

tisdag 17 augusti 2004 kl 14:00 - 19:00







Hjälpmedel: Inga hjälpmedel.
Poängkrav: Maximal poäng är 32.
För betyget 3 krävs 16 poäng.
För betyget 4 krävs 21 poäng.
För betyget 5 krävs 26 poäng.
Resultat och lösningar: Meddelas på kursens hemsida senast tisdag 31 augusti 2004.
Visning: Meddelas senare.
Efter visningen kan tentor hämtas på expeditionen.
Examinator och jourhavande: Thomas Padron-McCarthy, telefon 070-7347013.



LYCKA TILL!

Skriv inte svaren till uppgifterna direkt här, utan skriv på lösa blad och lämna in.

Uppgift 1 (5p)

Skriv en Java-applet som kan räkna upp och räkna ner ett tal. Det ska finnas en ruta för talet, och sen ska det finnas två knappar som man kan trycka på för att räkna upp och räkna ner talet:
Bild på appleten
Det ska gå att skriva in ett tal i rutan. Om man skriver in talet 17, och sen trycket på Plus, ska appleten skriva 18 i rutan. Om man matat in något som inte är ett tillåtet heltal (till exempel om man skriver Felix) ska appleten skriva ERROR i rutan:
Bild på appleten med utskriften ERROR

Det finns inga krav på att appleten ska se ut exakt som på bilderna. Den behöver inte vara vacker, bara knapparna och textfältet finns med.

Några tips:

Applet-klassen i Swing-paketet heter JApplet.

Knappklassen heter JButton, och den har en metod som heter addActionListener. Som argument tar den metoden ett objekt som uppfyller gränssnittet ActionListener. Gränssnittet ActionListener innehåller metoden actionPerformed, som tar ett argument av typen ActionEvent.

Klassen (JTextField) kan användas för inmatningen och presentationen. Klassen JTextField har metoderna getText och setText.

Uppgift 2 (5p)

a) (2p)

I uppgiften ovan skulle du skriva en Java-applet. En Java-applet är en speciell sorts Java-program. En annan sorts Java-program kallas Java-applikationer. Vad är skillnaderna mellan en applet och en applikation?

b) (2p)

Det är praktiskt att kunna köra en applet som en applikation. Förklara hur man gör för att skriva en applet som samtidigt kan köras som en applikation.

c) (1p)

Ovan skrev jag att det är praktiskt att kunna köra en applet som en applikation. Varför är det det?

Uppgift 3 (4p)

Vad skrivs ut när följande Java-program körs?
class Fordon {
    private int nummer;
    private int hjul;
    public Fordon(int hjul) {
        System.out.println("Skapar ett fordon...");
        this.hjul = hjul;
    }
    void kör() {
        System.out.println("Fordonet kör en bit.");
    }
    void kör(double sträcka) {
        System.out.println("Fordonet kör " + sträcka + " meter.");
    }
} // class Fordon

class Bil extends Fordon {
    public Bil() {
        super(4);
        System.out.println("Skapar en bil...");
    }
    void kör(double sträcka) {
        System.out.println("Bilen kör " + sträcka + " meter.");
    }
} // class Bil

class Lastbil extends Fordon {
    private double lastkapacitet;
    public Lastbil(int hjul, double lastkapacitet) {
        super(hjul);
        System.out.println("Skapar en bil...");
        this.lastkapacitet = lastkapacitet;
    }
    void kör() {
        System.out.println("Lastbilen kör en bit.");
    }
} // class Lastbil

public class Uppgift3 {
    public static void main(String[] args) {
        Fordon cykel = new Fordon(2);
        cykel.kör();
        Fordon saab = new Bil();
        saab.kör();
        Bil volvo = new Bil();
        volvo.kör(14);
        Lastbil scania = new Lastbil(18, 20000);
        scania.kör(14);
    } // main
} // class Uppgift3

Uppgift 4 (2p)

Den som är van att använda pekare i C eller C++ för att till exempel bygga länkade listor kan undra lite över hur man gör samma sak i Java, för "Java har ju inga pekare". Men alla referenser till objekt i Java är egentligen pekare, utan att det syns särskilt i syntaxen, och en posttyp för att bygga länkade listor som skulle skrivas så här i C:
struct ListElement {
  int content;
  struct ListElement *next;
}; /* struct ListElement */
kan skrivas så här i Java:
class ListElement {
  int content;
  ListElement next;
} // class ListElement

Skriv en Java-metod som heter length. Den ska ta ett argument i form av (en pekare till) det första elementet i en länkad lista av ListElement-poster, och den ska returnera antalet poster i listan i form av ett heltal.

Precis som en länkad lista i C avslutas med att pekaren i den sista posten är NULL, avslutas en länkad lista i Java med att pekaren i den sista posten är null.

Uppgift 5 (4p)

a) (2p)

Skriv en metod som heter sum och som adderar alla heltalen i en array. Metoden ska ta ett argument, en array av heltal. Den ska returnera summan av alla heltalen i arrayen.

b) (1p)

Man kan static-deklarera metoden ovan. Vad innebär det? Förklara med exempel.

c) (1p)

Vore det en bra idé att static-deklarera metoden sum? Motivera svaret.

Uppgift 6 (12p)

Utveckla en serverapplikation som kan lagra nycklar och värden. Både nycklarna och värdena utgörs av heltal. Klienter ska kunna koppla upp sig mot servern, och kommunikationsprotokollet mellan servern och klienten består därefter av två kommandon, LAGRA och HÄMTA:

Klienten skickar Exempel Servern svarar
LAGRA
nyckel
värde
LAGRA
14
117
OK
HÄMTA
nyckel
HÄMTA
14
117
  HÄMTA
15
NOK
Allt annat Tour de France NOK

Tabellen med lagrade nycklar och värden är gemensam för alla klienter, så om en klient lagrar ett nyckel-värde-par med LAGRA-kommandot, kommer alla andra klienter därefter att kunna hämta värdet genom att skicka nyckeln i ett HÄMTA-kommando.

Om en klient försöker hämta värdet för en nyckel som ingen har lagrat ett värde för (som 15 i exemplet ovan) svarar servern NOK.

För full poäng på uppgiften krävs att servern kan hantera flera samtidiga klienter. En server som bara kan hantera en enda klient åt gången ger maximalt 7 poäng på uppgiften.

Avslutning av programmet och att stänga socketar ordentligt behöver inte vara med i lösningen.

Bilaga: Utdrag ur API-specifikationen

java.net
Class ServerSocket

java.lang.Object
  extended byjava.net.ServerSocket

ServerSocket(int port)
          Creates a server socket, bound to the specified port.

Socket accept()
          Listens for a connection to be made to this socket and accepts it.

void close()
          Closes this socket.




java.net
Class Socket

java.lang.Object
  extended byjava.net.Socket

Socket()
          Creates an unconnected socket, with the system-default type of SocketImpl.

Socket(InetAddress address, int port)
          Creates a stream socket and connects it to the specified port number at the specified IP address.

void close()
          Closes this socket.

InputStream getInputStream()
          Returns an input stream for this socket.

OutputStream getOutputStream()
          Returns an output stream for this socket.

java.io
Class BufferedReader

java.lang.Object
  extended byjava.io.Reader
      extended byjava.io.BufferedReader

BufferedReader(Reader in)
          Create a buffering character-input stream that uses a default-sized input buffer.

void close()
          Close the stream.

int read()
          Read a single character.

String readLine()
          Read a line of text.




java.io
Class InputStreamReader

java.lang.Object
  extended byjava.io.Reader
      extended byjava.io.InputStreamReader

InputStreamReader(InputStream in)
          Create an InputStreamReader that uses the default charset.

void close()
          Close the stream.

int read()
          Read a single character.

java.io
Class PrintWriter

java.lang.Object
  extended byjava.io.Writer
      extended byjava.io.PrintWriter

PrintWriter(OutputStream out)
          Create a new PrintWriter, without automatic line flushing, from an existing OutputStream.

PrintWriter(OutputStream out, boolean autoFlush)
          Create a new PrintWriter from an existing OutputStream.

void close()
          Close the stream.

void println()
          Terminate the current line by writing the line separator string.

void println(String x)
          Print a String and then terminate the line.

java.net
Class InetAddress

java.lang.Object
  extended byjava.net.InetAddress

public static InetAddress getByName(String host)
                             throws UnknownHostException
          Determines the IP address of a host, given the host's name.