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







Omtentamen i

Programmering i Java

för Dataingenjörsprogrammet

lördag 31 januari 2004 kl 08:00 - 13:00







Hjälpmedel: Inga hjälpmedel.
Poängkrav: Maximal poäng är 34.
För betyget 3 krävs 17 poäng.
För betyget 4 krävs 23 poäng.
För betyget 5 krävs 28 poäng.
Resultat och lösningar: Meddelas på kursens hemsida senast lördag 14 januari 2004.
Visning: Tisdag 17 januari 2004 kl 12:00-12:30 i mitt rum (T2220).
Efter visningen kan tentor hämtas på expeditionen.
Examinator och jourhavande: Thomas Padron-McCarthy, telefon 070-7347013.
(Kommer inte att besöka salen.)



LYCKA TILL!

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

Uppgift 1 (3p)

Vad skrivs ut när följande Java-program körs?
class Djur {
    private String namn;
    public Djur(String namn) {
	System.out.println("Skapar ett djur");
	this.namn = namn;
    }
    public Djur() {
	System.out.println("Skapar ett namnlöst djur");
	this.namn = null;
    }
    public void läte() {
	System.out.println("Allmänt djurljud");
    }
} // class Djur

class Katt extends Djur {
    private int kloskärpa;
    public Katt(String namn, int kloskärpa) {
	super(namn);
	System.out.println("Skapar en katt");
	this.kloskärpa = kloskärpa;
    }
    public void läte() {
	System.out.println("Mjau!");
    }
} // class Mojäng

class Myra extends Djur {
    public Myra() {
	System.out.println("Skapar en myra");
    }
    public void läte() {
	System.out.println("Myran är tyst");
    }
} // class Mojäng

public class Utskrifter {
    public static void main(String[] args) {
	Djur d1 = new Djur("Albert");
	Djur d2 = new Katt("Måns", 3);
	Katt k = new Katt("Pelle", 2);
	Myra m = new Myra();

	d1.läte();
	d2.läte();
	k.läte();
	m.läte();
    } // main
} // class Utskrifter

Uppgift 2 (3p)

Vart och ett av följande tre Java-program ger kompileringsfel. Ange för varje program vad det är som är fel, och hur man kan skriva i stället för att slippa kompileringsfelet.

a)

class Andra {
    private int x;
} // class Andra

public class Ena {
    public static void main(String[] args) {
	Andra a = new Andra();
	a.x = 7;
    }
} // class Ena
b)
public class Fel {
    private void f() {

    }

    public static void main(String[] args) {
	f();
    }
} // class Fel
c)
public class Yttre {
    private int y;

    class Inre {
	private int i;	
    }

    public static void main(String[] args) {
	Inre i = new Inre();
    }
} // class Yttre

Uppgift 3 (5p)

Skriv en Java-applet med två inmatningsfält: ett för ett heltal, och ett för en textsträng. Använd textfält (JTextField) för inmatningsfälten. Det ska också finnas en knapp samt ett utmatningsfält i form av en JTextArea. När man trycker på knappen ska utmatningsfältet fyllas på med så många kopior av den inmatade textsträngen som angavs av det inmatade talet.

Appleten kan se ut så här, men det är inget krav att den ska vara exakt likadan. Den behöver inte vara vacker, bara alla knapparna och textfälten finns med.

Division
Om det inmatade talet inte är ett tillåtet heltal, eller om den inmatade textsträngen är tom, ska svaret ERROR presenteras:
Felaktig inmatning
Några tips:

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

Klassen JTextField har metoderna getText och setText.

Textareaklassen JTextArea, har en metod som heter append, vilken som argument tar en sträng, och lägger till den strängen sist i textarean.

Uppgift 4 (12p)

Ett chattsystem består av en server och flera klienter:

Chatt-system

Idén är att när någon användare skriver en rad i sin klient, ska raden genast skickas till servern, som skickar vidare raden till alla de andra klienterna. Var och en av de andra klienterna ska sen visa raden.

a) (1p)

Servern bör använda flera trådar. Varför? Om man ändå skriver en enkeltrådad server, vilket beteende kan man då få i systemet?

b) (1p)

Även klienten bör använda flera trådar. Varför? Om man ändå gör klienten enkeltrådad, vilket beteende kan man då få i systemet?

c) (10p)

Skriv klienten. Den behöver inte vara grafisk. Servern kör på port 3000 på datorn chat.oru.se. För full poäng på uppgiften krävs att klienten är flertrådad. En lösning utan flera trådar ger maximalt fem poäng på deluppgift c.

Uppgift 5 (3p)

a) (1p)

Vad är skillnaden mellan en applet och en applikation?

b) (2p)

Det finns två olika sätt att skapa och starta en tråd i Java. Visa med exempel!

Uppgift 6 (8p)

Adventure är ett klassiskt dataspel, där spelaren går runt och utforskar en värld fylld av monster, vapen och andra saker. Användargränssnittet är helt textbaserat, och man skriver kommandon som till exempel look at bag eller take sword. Som svar skriver spelet ut hur den där väskan ser ut, eller ifall man lyckas lyfta upp svärdet eller inte.

Vi ska skriva ett Adventure-spel på svenska, med hjälp av Java. Vi låter alla saker i spelet, som väskor och svärd, vara objekt. Som allra första steg i utvecklingen av spelet vill vi skapa följande klasser:

Skriv dessa klasser.

Ovanstående beskrivning ger utrymme för en del egna val, så gör en lämplig och bra design av klasserna. Klasserna ska gå att använda sen när man fortsätter att konstruera spelet, vilket till exempel betyder att väskklassen ska vara skriven på ett sätt så att man kan skriva kod som stoppar i och tar ut saker ur en väska. Förklara gärna de designval som du tycker behöver motiveras.

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.