Programmering i Java
för Dataingenjörsprogrammet m fl
lördag 29 januari 2005 kl 08:00 - 13:00
Hjälpmedel: | Inga hjälpmedel. |
Poängkrav: |
Maximal poäng är 42.
För betyget 3 krävs 21 poäng. För betyget 4 krävs 28 poäng. För betyget 5 krävs 35 poäng. |
Resultat och lösningar: | Meddelas på kursens hemsida senast lördag 19 februari 2005. |
Visning: |
Måndag 21 februari 2005 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. |
Skriv inte svaren till uppgifterna direkt här, utan skriv på lösa blad och lämna in.
Vad är Swing och AWK? Hur förhåller de sig till varandra?
b)
Två program som du ingår i Java-distributionen från Sun heter javac och java. Vad är det för program? Hur förhåller de sig till varandra?
c)
När man programmerar i Java jobbar man med en del filer som slutar på .java och en del filer som slutar på .class. Vad är det för filer? Hur förhåller de sig till varandra?
d)
Java skiljer på applikationer och appletar. Vad är det för något? Hur förhåller de sig till varandra?
Skriv en klass som heter Frukt. Varje frukt ska ha en vikt mätt i gram (till exempel 230) och ett unikt nummer (till exempel 17). Försök komma på något sätt att automatiskt ge varje skapad frukt sitt eget unika nummer.
b)
Det finns tre sorters frukter: apelsiner, bananer och äpplen. Alla är de frukter, men varje apelsin har ett visst antal klyftor (till exempel 10) och varje banan har en krökningsradie mätt i centimeter (till exempel 92). Skapa klasser för dessa frukter.
c)
Skriv en main-metod som skapar ett objekt vardera av de fyra olika klasserna ovan.
class X { private int x; public X(int x) { System.out.println("Skapar en X(" + x + ")."); this.x = x; } public X() { this(0); System.out.println("Skapar en X()."); } public void f() { System.out.println("X.f"); } } // X class XYZ extends X { private int y; private int z; public XYZ(int x, int y, int z) { super(x); System.out.println("Skapar en XYZ(" + x + ", " + y + ", " + z + ")."); this.y = y; this.z = z; } public XYZ(int y, int z) { super(); System.out.println("Skapar en XYZ(" + y + ", " + z + ")."); this.y = y; this.z = z; } public void f() { System.out.println("XYZ.f"); } } // X public class Uppgift3 { X x; public Uppgift3() { x = new XYZ(1, 2, 3); } public static void main(String [] args) { Uppgift3 u = new Uppgift3(); X x1 = new X(); X x2 = new XYZ(4, 5, 6); XYZ xyz = new XYZ(17, 19); u.f(x1); g(x2); } // main public void f(X x) { System.out.println("Uppgift3.f"); x.f(); this.x.f(); } static public void g(X x) { System.out.println("Uppgift3.g"); x.f(); } } // Uppgift3
De data som skickas från servern består av en rad med ett ortsnamn (till exempel Kiruna) och en temperatur (till exempel -16). Exempel:
Appleten ska inte skicka några förfrågningar till servern, utan servern skickar automatiskt ut nya temperaturdata så fort de blir tillgängliga.Stockholm 9 Madrid 23 Kumla 7 Kiruna -16
När man startar appleten har den alltså inga temperaturdata att visa, och då är textfönstret tomt. Allteftersom nya data kommer, fylls dessa på i textfönstret.
Det ska finnas en knapp, till exempel märkt Rensa, som rensar bort alla temperaturer som kommit hittills.
Om det inte går att koppla upp mot servern, eller om servern kopplar ner förbindelsen, ska man få en felutskrift i fönstret:
Det finns inga krav på att appleten ska se ut exakt som på bilderna. Den behöver inte vara vacker, bara temperaturerna och Rensa-knappen finns med.
Vi kan anta att alla utskrifter alltid får plats i fönstret, så det behövs inga rullningslister. Vi kan också anta servern aldrig skickar felaktiga rader, så man behöver ingen särskild hantering av protokollfel.
För full poäng på uppgiften krävs att appleten inte skriver ut dubletter av städer. Om servern skickar en ny temperatur för Kiruna, ska alltså den gamla temperaturen tas bort. (Om man tillåter dubletter blir appleten mycket enklare, eftersom man bara behöver ta raderna som kommer från servern och direkt skriva ut dem i fönstret.) En lösning som tillåter dubletter ger högst tio poäng.
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 (JTextArea) kan användas för textfönstret. Klassen JTextArea har metoderna setText och append.
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?
Beskriv också hur man använder serverapplikationen för att testa appleten!
För full poäng på uppgiften krävs att serverapplikationen klarar att hantera flera olika appletar som samtidigt är uppkopplade. En lösning som bara klarar en enda applet ger högst fem poäng.
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.