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









Tentamen i

Javaprogrammering

för D3 m fl

måndag 14 januari 2008 kl 14:00 - 19:00 i L003

Gäller som tentamen för:
DT3010 Datateknik C, Java för gränssnitt och nätverk, provkod 0100
JAP004 Java-programmering, provkod 0300










Hjälpmedel: Inga hjälpmedel.
Poängkrav: Maximal poäng är 40.
För godkänt betyg (3 respektive G) krävs 20 poäng.
Resultat och lösningar: Meddelas på kursens hemsida eller via e-post senast måndag 4 februari 2008.
Visning och frågestund: Måndag 11 februari 2008 kl 12:00-12:30 i mitt rum (T2220).
Efter visningen kan tentorna hämtas på institutionen.
Examinator och jourhavande: Thomas Padron-McCarthy, telefon 070-73 47 013.





LYCKA TILL!

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

Uppgift 1 (25 p)

Skriv ett Java-program (antingen en applet eller en applikation) som fungerar som en enkel miniräknare, men där själva arbetet utförs av en server-applikation. Java-programmet ska alltså fungera som klient.

Det ska finnas två inmatningsfält för att mata in tal, knappar för vanliga räkneoperationer, och ett utmatningsfält. Här har vi tryckt på minusknappen:

Kalkylatorappleten

Knapparna för addition, subtraktion, multiplikation och division ska beräkna resultatet utifrån de två tal man matat in. Knapparna för kvadratrot och kvadrat ska använda sig av bara det första talet.

Om man försöker utföra in en felaktig operation, ska texten "Error!" skrivas ut i resultatfältet. Fel som ska hanteras är:

Här har vi tryckt på kvadratrotsknappen:

Kalkylatorappleten med felmeddelande

Använd exempelvis textfält (JTextField) för inmatningen och presentationen. Knapparna kan vara av klassen JButton. Klienten behöver inte se ut exakt som på bilderna.

Klienten ska koppla upp sig mot servern, och skicka de två talen samt vilken operation som valts. Servern ska utföra felkontrollen och beräkningarna, och skicka tillbaka resultatet som ska presenteras av klienten.

(Vänd blad!)

a) (2p) Designa och beskriv det kommunikationsprotokoll som används mellan klienterna och servern.

b) (10p) Skriv klienten. Servern körs på datorn mathserver.oru.se, och lyssnar på port 2000.

c) (12p) Skriv serverapplikationen. Servern behöver inte ha något grafiskt gränssnitt eller skriva ut något. Den måste kunna hantera flera klienter samtidigt.

d) (1p) Den här lösningen, med en klient och en server, är förstås ganska dum i det här fallet. Varför är den dum?

Uppgift 2 (10 p)

Skriv följande klasser: Med dessa klasser ska följande main-funktion:
    public static void main(String[] args) {
        Punkt p1 = new Punkt(1, 1);
        Punkt p2 = new Punkt(2, 3);
        Figur p3 = new Punkt(3, 3);
        Sträcka s1 = new Sträcka(1, 1, 2, 3);
        Sträcka s2 = new Sträcka(p1, p2);
        if (s1 == s2)
            System.out.println("s1 och s2 är samma sträcka.");
        else
            System.out.println("s1 och s2 är INTE samma sträcka.");
        if (s1.equals(s2))
            System.out.println("s1 och s2 är likadana sträckor.");
        else
            System.out.println("s1 och s2 är INTE likadana sträckor.");
        Triangel t1 = new Triangel(1, 1, 2, 3, 3, 3);
    } // main
fungera, och den ska ge de här utskrifterna:
s1 och s2 är INTE samma sträcka.
s1 och s2 är likadana sträckor.

Uppgift 3 (5 p)

a) (1p) Multipelt arv finns inte i Java. Varför inte? Dvs, visa och förklara åtminstone något problem som kan uppstå om man använder multipelt arv.

b) (3p) Visa med ett tydligt exempel hur man kan ersätta multipelt arv i Java med en annan mekanism i språket.

c) (1p) Visa och förklara varför man inte får problemet eller problemen från deluppgift a med denna andra mekanism.


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.