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. |
Skriv inte svaren till uppgifterna direkt här, utan skriv på lösa blad och lämna in.
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:
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.
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?
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
kan skrivas så här i Java:struct ListElement { int content; struct ListElement *next; }; /* struct ListElement */
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.
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.
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.
java.lang.Object java.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.lang.Object java.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.lang.Object java.io.Reader java.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.lang.Object java.io.Reader java.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.lang.Object java.io.Writer java.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.lang.Object java.net.InetAddress
public static InetAddress getByName(String host) throws UnknownHostExceptionDetermines the IP address of a host, given the host's name.