Haus F, Zimmer F314, Telefon (040) 5494 2399
/opt/java/
bin/
appletviewer -- Applets ausführen
java -- Java-Interpreter
javac -- Java-Compiler
javadoc -- API-Dokumentation
...
lib/
dynamische Link-Bibliotheken
src/ -- Quelltexte
java/
awt/...
io/...
lang/
Thread.java -- Quelltexte
net/...
include/ ... -- Header-Dateien für native-code
Bei Problemen mit Appletviewer/Hotjava und der Meldung
java.lang.UnsatisfiedLinkError: no awt in shared library path
muß unter Solaris der Suchpfad für die Shared-Libraries
um /opt/dt/lib erweitert werden, etwa:
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:/opt/dt/lib
Im FBI Rechenzentrum funktioniert das JDK bestens, wenn alle
zusätzlichen Pfade aus der .cshrc bzw. .login
entfernt werden, da die systemweiten Dateien dann die korrekten Pfade
setzen.
Als Editor zur Erstellung der Quelltexte kann jeder beliebige Unix-Editor eingesetzt werden, zum Beispiel vi, emacs oder axe.
set path = ( /opt/java/bin $path )
Anschließend können dann der Java-Compiler und der Interpreter bequem aus dem aktuellen Arbeitsverzeichnis heraus aufgerufen werden:
rzdspc31> cd rzdspc31> cd javakurs/HelloWorld -- Verzeichnis nach Wunsch rzdspc31> vi HelloWorld.java -- Editieren rzdspc31> javac HelloWorld.java -- Compilieren rzdspc31> java HelloWorld -- Ausführen Hello, World! rzdspc31>
Wichtig ist die unterschiedliche Konvention beim Aufruf der Compilers und des Interpreters: Der Compiler erwartet einen Dateinamen (xxx.java) der Interpreter den Namen der Klasse ohne Extensions (xxx).
http://tech-www/java/api/ -- Version 1.0beta2 http://tech-www/java/apibook/ -- Version 1.02 http://tech-www/java/jdk1.1-docs/ -- Version 1.1beta2
Die ältere Version ist in Details nicht mehr aktuell, aber auf den Workstations deutlich besser lesbar. Die neue Version verwendet Dateinamen mit 8+3 Zeichen und kann daher auch auf DOS-Rechnern eingesetzt werden.
http://tech-www.informatik.uni-hamburg.de/java/
Auf dem FTP-Server sind auch die neuesten Version des Netscape Navigator und von Hotjava vorhanden.
public class GGT {
public static void main( String argv[] ) {
int a, b, ggt;
a = Integer.parseInt( argv[0] );
b = Integer.parseInt( argv[1] );
...
... // hier der Algorithmus
System.out.println(
"Der GGT von " + a + " und " + b
+ " ist " + ggt );
}
}
Das Programm wird dann etwa so aufgerufen:
java GGT 555555 549746und sollte in diesem Fall den Wert 37 ausgeben. Den notwendigen Algorithmus (Euklids Algorithmus) finden Sie in fast allen Büchern über Algorithmen. Wie verhält sich Ihr Algorithmus beim Aufruf:
java GGT 1 2147483647oder für negative Argumente?
static double f( double x ) {
return 4 * Math.sqrt( 1 - x*x );
}
über das Intervall [0, 1] zu integrieren.
Das heißt, das Integral soll durch eine Summe
an diskreten Positionen angenähert werden,
zum Beispiel an den Endpunkten und einer Zwischenposition:
double integral; integral = (f(0) + f(0.5) + f(1)) / 3; System.out.println( "Der gesuchte Wert ist " + integral );Was erhalten Sie als Resultat, wenn Sie die Funktion an 1000 Zwischenpositionen zwischen 0 und 1 auswerten? Verwenden Sie eine for-Anweisung.
String format( double x, int n )die dies leistet. Die Zahl x und die Anzahl der Stellen sollen auf der Kommandozeile übergeben werden. Verwenden Sie die Zeile x = Double.valueOf( argv[0] ).doubleValue() um einen double-Wert aus dem String zu erhalten. Was erhalten Sie beim Aufruf von
java Format 3.14159625 7 java Format 1.9999999989E306 10usw.?
Natürlich soll die Funktion format korrekt runden!
Dokumentieren Sie Ihre Entscheidungen für die Wahl der internen Darstellung der Zahlen und die daraus folgenden Algorithmen.
Haben Sie DOC-Kommentare für Ihre Klasse BigInt verwendet? Erstellen Sie eine Klassendokumentation für BigInt mit dem javadoc-Programm.
Falls Sie die vermutlich fehlenden Icons st&oulm;ren, können Sie diese hier kopieren: images.tar (tar archiv).
Implementieren Sie die Klassen. Wie lange dauert das Einfügen von 100.000 Elementen am Anfang, am Ende oder in der Mitte der Liste? Sie können die Systemzeit in Millisekunden mit der Funktion long System.currentTimeMillis() ermitteln.
Verwenden Sie mindestens die Methoden drawLine(int,int,int,int), drawRect(int,int,int,int) und drawString(String,int,int).
Zum Beispiel könnten Sie versuchen, die in Aufgabe 2 integrierte Funktion f() mitsamt Koordinatensystem graphisch darzustellen. Nach einem Mausclick könnte dann zusätzlich die Annäherung des Integrals durch Rechtecke dargestellt werden.
Erstellen Sie eine HTML-Seite für das Applet und testen Sie es.
Sehen Sie Sich als Beispiele die Dateien Anfang.java und Laufschrift.java im Verzeichnis Grundlagen an, um das Grundgerüst für ein Applet zu bekommen.
Weitere Beispiele zu Applets finden sich hier.
Blättern Sie durch die Klassendokumentation des java.awt Package, um einen Eindruck von den weiteren Klassen und Methoden zu bekommen.
Schreiben Sie eine Klasse, die dieses Interface Integrable mit einer eigenen Funktion f(x) implementiert und dann mittels
class IhreKlasse implements Integrable {
public double f( double x ) { ... }
...
double value;
value = Integral.simpson( double a, double b, Integrable f, double eps )
}
diese Funktion f über das Intervall [a,b] integriert,
und zwar mit einer Genauigkeit von mindestens eps.
Die Methode simpson() verwendet einen adaptiven
Algorithmus, um das gewünschte Integral bis zur
vorgegebenen Genauigkeit anzunähern.
Vergleichen Sie die Geschwindigkeit und die Genauigkeit der Methode simpson() und der trivialen Summation aus Aufgabe 1 für die dort verwendete Beispielfunktion.
Sie können dazu auf das Programm ImageDemo2 aus den Beispielprogrammen zurückgreifen (kap7).
Fragen Sie in der paint()-Methode die aktuelle Fenstergröß ab und skalieren Sie das Bild so, daß es optimal in das Fenster hineinpaßt. (Dabei bleibt evtl. oben/unten oder rechts/links ein Rand um das Bild).
Beobachten Sie das Verhalten Ihres Programms bei einer Änderung der Fenstergröße.
Verwenden Sie die Klassen FileInputStream, BufferedInputStream, SequenceInputStream und die benötigten Ausgabeströme.
Anders als das Unix-Original soll Ihr Programm eine doppelt als Quelle und als Ziel angegebene Datei nicht zerstören, sondern korrekt mit den anderen Dateien verketten, zum Beispiel
java concat titel.txt buch.txt anhang.txt buch.txt
Falls die angegebene Datei nicht existiert, muß evtl. erst der zugehörige Pfad (Verzeichnisse und Unterverzeichnisse) erzeugt werden.
Versuchen Sie, ein Dialogfenster für eine 'Suchen und Ersetzen'-Funktion aufzubauen und menügesteuert aufzurufen.
Überlegen Sie sich, wie Sie die Dateinamen / Datenströme an die einzelnen Threads übergeben wollen, und wie die Threads ihr Ergebnis an das Hauptprogramm zurückliefern sollen.
Sie können dazu zum Beispiel das Programm RunnableDemo entsprechend erweitern.
Eine einfache Vorlage bietet das Programm Schach aus den Beispielprogrammen.
Was passiert, wenn Sie im Haupt-Thread einer Applikation
Thread.currentThread().stop()
aufrufen?
Arbeitet Ihr Programm korrekt?
Versuchen Sie dann, durch Einbau von synchronized-Blöcken, einen unter allen Scheduling-Varianten korrekten Programmablauf zu erreichen.