Prof. Jürgen Sauer Programmieren in Java Übungen mit Lösungen Programmieren in Java Inhaltsverzeichnis 2 Programmieren in Java Inhaltsverzeichnis Inhaltsverzeichnis 1. Übung __________________________________________________________________ 7 1. Aufgabe _______________________________________________________________ 7 2. Aufgabe _______________________________________________________________ 8 3. Aufgabe _______________________________________________________________ 9 4. Aufgabe ______________________________________________________________ 10 5. Aufgabe ______________________________________________________________ 10 6. Aufgabe ______________________________________________________________ 11 2. Übung _________________________________________________________________ 12 1. Aufgabe ______________________________________________________________ 12 2. Aufgabe ______________________________________________________________ 13 3. Aufgabe ______________________________________________________________ 14 4. Aufgabe ______________________________________________________________ 16 5. Aufgabe ______________________________________________________________ 17 3. Übung _________________________________________________________________ 18 1. Aufgabe ______________________________________________________________ 18 2. Aufgabe ______________________________________________________________ 20 3. Aufgabe ______________________________________________________________ 21 1. Aufgabe ______________________________________________________________ 23 2. Aufgabe ______________________________________________________________ 25 3. Aufgabe ______________________________________________________________ 27 4. Aufgabe ______________________________________________________________ 29 5. Übung _________________________________________________________________ 31 1. Aufgabe ______________________________________________________________ 31 2. Aufgabe ______________________________________________________________ 32 3. Aufgabe ______________________________________________________________ 34 4. Aufgabe ______________________________________________________________ 37 6. Übung _________________________________________________________________ 39 1. Aufgabe ______________________________________________________________ 39 2. Aufgabe ______________________________________________________________ 41 3. Aufgabe ______________________________________________________________ 42 4. Aufgabe ______________________________________________________________ 43 7. Übung _________________________________________________________________ 45 1. Aufgabe ______________________________________________________________ 45 2. Aufgabe ______________________________________________________________ 46 3. Aufgabe ______________________________________________________________ 47 4. Aufgabe ______________________________________________________________ 48 3 Programmieren in Java Inhaltsverzeichnis 5. Aufgabe ______________________________________________________________ 49 6. Aufgabe ______________________________________________________________ 50 7. Aufgabe ______________________________________________________________ 50 8. Aufgabe ______________________________________________________________ 51 8. Übung _________________________________________________________________ 52 1. Aufgabe ______________________________________________________________ 52 2. Aufgabe ______________________________________________________________ 55 3. Aufgabe ______________________________________________________________ 59 9. Übung _________________________________________________________________ 64 1. Aufgabe ______________________________________________________________ 64 2. Aufgabe ______________________________________________________________ 71 3. Aufgabe ______________________________________________________________ 77 10. Übung ________________________________________________________________ 79 1. Aufgabe ______________________________________________________________ 79 2. Aufgabe ______________________________________________________________ 80 3. Aufgabe ______________________________________________________________ 81 4. Aufgabe ______________________________________________________________ 82 11. Übung ________________________________________________________________ 84 1. Aufgabe ______________________________________________________________ 84 2. Aufgabe ______________________________________________________________ 85 3. Aufgabe ______________________________________________________________ 86 4. Aufgabe ______________________________________________________________ 87 5. Aufgabe ______________________________________________________________ 88 12. Übung ________________________________________________________________ 89 1. Aufgabe ______________________________________________________________ 89 2. Aufgabe ______________________________________________________________ 91 3. Aufgabe ______________________________________________________________ 94 4. Aufgabe ______________________________________________________________ 96 5. Aufgabe ______________________________________________________________ 98 6. Aufgabe _____________________________________________________________ 100 7. Aufgabe _____________________________________________________________ 102 Uebung 13_______________________________________________________________ 104 1. Aufgabe _____________________________________________________________ 104 2. Aufgabe _____________________________________________________________ 107 3. Aufgabe _____________________________________________________________ 110 4. Aufgabe _____________________________________________________________ 116 5. Aufgabe _____________________________________________________________ 118 Uebung 14_______________________________________________________________ 121 4 Programmieren in Java Inhaltsverzeichnis 15. Übung _______________________________________________________________ 126 1. Aufgabe _____________________________________________________________ 126 2. Aufgabe _____________________________________________________________ 129 16. Übung _______________________________________________________________ 131 1. Aufgabe _____________________________________________________________ 131 2. Aufgabe _____________________________________________________________ 133 3. Aufgabe _____________________________________________________________ 135 4. Aufgabe _____________________________________________________________ 136 5. Aufgabe _____________________________________________________________ 137 5 Programmieren in Java Inhaltsverzeichnis 6 Programmieren in Java 1. Übung 1. Übung 1. Aufgabe Gegeben ist das folgende Programm in Quelltextform, das eine Anwendung beschreibt: import java.lang.*; /* ErstesProgramm ist eine Applikation, die den einfachen Gebrauch von Zeichenketten aufzeigt */ public class ErstesProgramm extends Object { // Beginn der Ausfuehrung vom Programm public static void main(String args[]) { // Ausgabe auf das Standard-Ausgabegeraet System.out.println( "Das erste Programm der Vorlesung Programmieren in Java."); } } a) Übertrage den vorliegenden Quelltext in eine Datei, die in einem für die Übung speziell eingerichteten Arbeitsverzeichnis liegen soll. Beachte, daß in diesem Verzeichnis die Datei für die Bearbeitung durch den Java-Compiler einen speziellen Namen erhalten muß. Zum Übertragen des Quellcode nutze man einen auf dem System vorhandenen Editor. b) Nachdem die Datei mit dem Quelltext erstellt wurde, übersetze den Quellcode mit dem JavaCompiler c) Welche Datei wurde in dem unter a) eingerichteten Arbeitsverzeichnis durch den Compiler nach fehlerfreier Übersetzung erzeugt. ErstesProgramm.class d) Rufe das Java-Laufzeitsystem zur Ausführung der im Arbeitsverzeichnis vorliegenden ausführbaren Datei auf. 7 Programmieren in Java 1. Übung 2. Aufgabe Erzeuge 100 Zufallszahlen zwischen 0 und 1 und ermittle aus diesen 100 Zufallszahlen die größte Zahl (das Maximum). Die Routine Math.random() aus dem Paket java.lang liefert eine (Pseudo-) Zufallszahl vom Typ double zwischen 0 und 1. Die beiden Endwerte kommen nicht vor, die Zahlen sind ansonsten gleichmäßig im Intervall verteilt. a) Gib den Algorithmus zur Lösung dieser Aufgabe an! public double ermittle_Zahl () { double zahl = 0.0; double max = 0.0; for (int i = 0; i < 100; i++) { zahl = Math.random (); if (max < zahl) max = zahl; } return max; } b) Gib das Programm an, das eine Lösung dieser Aufgabe bereitstellt. public class Zufallszahlen { public static void main ( String args[] ) { double zahl = ermittle_Zahl (); System.out.println (zahl); } } 8 Programmieren in Java 1. Übung 3. Aufgabe a) Welche Ausgabe auf das Standardausgabegerät produziert das folgende Programmfragment: for (int i = 1; i < 10; i++) { for (int j = 1; j < 10; j++) System.out.print(i * j + “ “); System.out.println(); } 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 4 6 8 10 12 14 16 18 6 9 12 15 18 21 24 27 8 12 16 20 24 28 32 36 10 15 20 25 30 35 40 45 12 18 24 30 36 42 48 54 14 21 28 35 42 49 56 63 16 24 32 40 48 56 64 72 18 27 36 45 54 63 72 81 b) Die Formatierung der vorliegende Ausgabe läßt Wünsche nach Verbesserungen aufkommen. Schreibe ein Programm, das all die Wünsche nach besserer Formatierung erfüllt. public class Aufg03 { public static void main (String args[]) { int tmp = 0; for (int i = 1; i < 10; i++) { for (int j = 1; j < 10; j++) { tmp = i * j; if ( tmp < 10 ) System.out.print( " " ); System.out.print(i * j + " "); } System.out.println(); } } } 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 9 Programmieren in Java 1. Übung 4. Aufgabe Schreibe ein Programm, das in einer „for“-Schleife insgesamt 100 Sternchen („*“) hintereinander ausdruckt. Übergib als Kommandozeilenparameter einen „int“-Wert, der festlegt, nach wiviel Zeichen ein Zeilenvorschub erfolgen soll. So soll z.B nach folgendem Aufruf „java Aufg04 25“ die folgende Bildschirmausgabe erfolgen: ************************* ************************* ************************* ************************* public class Aufg04 { public static void main (String args[]) { int neueZeile = Integer.parseInt( args[0] ); for (int i = 1; i < 101; i++) { System.out.print( "*" ); if ( (i % neueZeile) == 0 ) System.out.println(); } } } 5. Aufgabe Schreibe ein Programm, das die ganzen Zahlen von 1 bis n (n > 1) miteinander multipliziert. Das Programm erwartet den Parameter n in der Kommandozeile und berechnet das Produkt 1*2*3*...*n. Das Resultat soll auf die Standardausgabeeinheit ausgegeben werden. public class Aufg05 { public static void main (String args[]) { int erg = 1; int n = Integer.parseInt( args[0] ); for (int i = 1; i <= n; i++) erg *= i; System.out.println( "Ergebnis: " + erg ); } } 10 Programmieren in Java 1. Übung 6. Aufgabe Schreibe ein Programm, das alle ungeraden Zahlen von 1 bis n (n > 2) addiert. Verwende dazu eine „for“-Schleife. Der Wert von „n“ übergebe als Kommandozeilenparameter an das Programm, das Resultat soll auf die Standardausgabeeinheit ausgegeben werden. public class ungeradeZahlen { public static void main ( String args[] ) { int n = Integer.parseInt ( args[0] ); int erg = 0; for (int i = 1; i <= n; i++) { if ( ( i % 2 ) == 1 ) erg += i; } System.out.println( "Ergebnis: " + erg ); } } 11 Programmieren in Java 2. Übung 2. Übung 1. Aufgabe a) Erstelle das folgende Programm public class WillkommensGruss { public static void main(String args[]) { System.out.print("Herzlich Willkommen "); System.out.println(args[0]); } } b) Was passiert, falls das vorliegende Programm ohne Angabe eines Arguments in der Kommandozeile aufgerufen wird? Das Laufzeitsystem erzeugt eine „Ausnahme (exception)“: ArrayIndexOutOfBoundsException c) Wie kann die unter b) bestimmte Situation durch eine spezielle Behandlung abgefangen werden? Die spezielle Behandlung ist das „exception handling“. d) Gestalte das unter a) vorliegende Programm so, daß es die unter c) angegebene spezielle Behandlung realisiert. class WillkommensGruss { public static void main(String args[]) { try { System.out.println("Herzlich Willkommen " + args[0]); } catch (Exception e) { System.out.println("Herzlich Willkommen Unbekannter"); } } } e) Überprüfe die unter d) realisierte spezielle Behandlung auf Funktionsfähigkeit. 12 Programmieren in Java 2. Übung 2. Aufgabe Gegeben ist im Rahmen der main()-Routine ein Datenfeld mit einer Reihe ganzzahliger Komponenten: public class Aufg2 { public static void main(String args[]) { int x[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1 }; ....... } } a) Ergänze die main()-Methode mit Anweisungen, die das mit Ganzzahlen gefüllte Datenfeld so umgestalten, daß die Zahlen, von der ersten zu letzen Komponente gesehen, eine aufsteigende Sortierung zeigen b) Ergänze die main()-Methode durch Anweisungen, die das Datenfeld (Array) vor und nach der Sortierung in einer Zeile ausgeben. c) Wie müssen die Anweisungen für das Sortieren verändert werden, wenn das folgende Datenfeld zu sortieren ist String x[] = {“Juergen“, “Hubert“, “Josef“, “Liesel“, “Vera“, “Christian“}; public class Aufg2 { public static void main(String args[]) { int x[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1 }; int i; System.out.println("Vor dem Sortieren:"); for (i = 0; i < x.length;i++) { System.out.print(x[i] + " "); } System.out.println(); int j; for (i = 0; i < x.length; i++) { for (j = i + 1; j < x.length; j++) { if (x[i] > x[j]) // if (x[i].compareTo(x[j]) > 0) { int temp = x[i]; // String temp = x[i] x[i] = x[j]; x[j] = temp; } } } // Nach dem Sortieren for (i = 0; i < x.length; i++) { System.out.print(x[i] + " "); } System.out.println(); } } 13 Programmieren in Java 2. Übung 3. Aufgabe a) Stelle aus der Java-API-Dokumentation die Operatoren für ganzzahlige Arithmetik (Datentyp: int) zusammen b) Schreibe eine Applikation, die zwei ganze Zahlen auf der Ebene der Befehlszeile einliest und anschließend mit diesen beiden Zahlen alle binären und unären Operationen auf ganzen Zahlen ausführt. Die Demonstration binärer und unärer Arithmetik mit ganzen Zahlen soll den Namen IntDemo tragen. Aus der Befehlszeile können ganzen Zahlen über int i = Integer.valueOf(args[0]).intValue(); int j = Integer.valueOf(args[1]).intValue(); konvertiert werden. (Quell-Code siehe unten) c) Was passiert, wenn nach fehlerfreier Übersetzung java IntDemo aufgerufen wird java.lang.ArrayIndexOutOfBoundsException d) Wie kann dieser Fehler aufgefangen werden? Durch einen try-catch-Block . e) Erweitere das vorliegende Programm um diese Fehlerbehandlungsroutine. (Quell-Code siehe unten) f) Erweitere das vorliegende Programm durch die Berechnung von 1/0. Führe das Programm anschließend aus. Welches Resultat ergibt sich für 1/0. / by zero 14 Programmieren in Java 2. Übung public class IntDemo { public static void main(String args[]) { try { // Konvertieren int i = Integer.valueOf(args[0]).intValue(); int j = Integer.valueOf(args[1]).intValue(); // Ausgabe der ueber die Befehlszeile eingegebenen Zahlen System.out.println("i = " + i); System.out.println("j = " + j); // Binaere Arithmetik mit den Operatoren + - * / % int n; n = i + j; System.out.println("n = i + j = " + n); n = i - j; System.out.println("n = i - j = " + n); n = i * j; System.out.println("n = i * j = " + j); n = i / j; System.out.println("n = i / j = " + n); n = i % j; System.out.println("n = i % j = " + n); // Unaere Arithmetik mit Inkrement- / Dekrementoperator i++; System.out.println("Nach i++: i = " + i); j--; System.out.println("Nach j--: j = " + j); n = i++; System.out.println("Nach n = i++: n = " + n + ", i = " + i); n = ++i; System.out.println("Nach n = ++i: n = " + n + ", i = " + i); System.out.println("i = " + i); System.out.println("j = " + j); n = ++i + j--; System.out.println("Nach n = ++i + j--: n = " + n + ", i = " + i + " j = " + j); System.out.println("i = " + i); System.out.println("j = " + j); n = i + j * ++j; System.out.println("Nach n = i + j * ++j: n = " + n + ", i = " + i + j = " + j); i = 1; j = 0; System.out.println("i = " + i); System.out.println("j = " + j); n = i / j; System.out.println("n = i / j = " + n); } catch(Exception e) { System.out.println("Fehler bei der Eingabe: java a b"); System.out.println(e.getMessage()); } } } 15 Programmieren in Java 2. Übung 4. Aufgabe Gib über die Kommandozeile eine natürliche Zahl ein. Das über die Kommandozeile ebenfalls aufzurufende Programm soll den kleinsten Teiler der natürlichen Zahl bestimmen und angeben. Falls kein Teiler existiert, soll ausgegeben werden, daß die Zahl eine Primzahl ist. public class Aufg04 { public static void main(String args[]) { int eingabe = Integer.valueOf(args[0]).intValue(); int kleinsterTeiler = eingabe; if ((eingabe % 2) == 0) { System.out.println("Kleinster Teiler: 2"); } else { for (int i = (eingabe - 1); i > 2; i--) { if ((eingabe % i) == 0) kleinsterTeiler = i; } System.out.println ("Kleinster Teiler: " + kleinsterTeiler); } } } 16 Programmieren in Java 2. Übung 5. Aufgabe Schreibe ein Programm zur Berechnung der Iterationsvorschrift: x(n+1) = (x(n) + 2/x(n)) / 2 x(0) = 2 Die Vorschrift wird häufig für die Berechnung von das dies korrekt ist. 2 herangezogen. Bestätige durch das Programm, public class Aufg05 { public static void main (String args[]) { double x = 2.0; double x1 = 0.0; int n = 0; try { n = Integer.parseInt( args[0] ); } catch (Exception ex) { System.out.println("Fehler bei der Eingabe: java n"); System.out.println(ex.getMessage()); } for (int i = 1; i <= n; i++) { x1 = ( x + 2 / x ) / 2; x = x1; } System.out.println( "Ergebnis: " + x1 ); } } 17 Programmieren in Java 3. Übung 3. Übung 1. Aufgabe Entwicklung einer Applikation zur Demonstration der Wirkungsweise einer for-Schleife. a) Über die Kommandozeile soll eine Gleitpunktzahl a (Datentyp double) und eine ganze Zahl n n (Datentyp int) eingelesen werden. Mit Hilfe einer for-Schleife soll a berechnet und ausgegeben werden. Zu beachten ist, daß ganze Zahlen auch negativ sein können. b) Gegeben ist der Vektor double x[] = { 1.0, 2.0, 3.0 }; . Gib diesen Vektor auf die Standard-Ausgabeeinheit in folgender Weise aus: Vektor x: ( 1.0, 2.0, 3.0 ) c) Gegeben ist die Matrix double m[][] = { { -1.0, -2.0, -3.0 }, { 0.0, 1.0, 0.0 }, { 1.0, 2.0, 3.0 } }; Gib die Matrix auf die Standard-Ausgabeeinheit in folgender Weise aus Matrix M: ( -1.0, -2-0, -3.0 ) ( 0.0, 1.0, 0.0 ) ( 1.0, 2.0, 3.0 ) public class ForDemo extends Object { public static void main(String args[]) { // double a = 2.0; double a = Double.valueOf(args[0]).doubleValue(); // int n = 10; int n = Integer.valueOf(args[1]).intValue(); System.out.println("a = " + a); System.out.println("n = " + n); int absn; if (n >= 0) { absn = n; } else { absn = -n; } double aHochn = 1.0; for (int i = 1; i <= absn; i++) { aHochn = aHochn * a; } if (n < 0) { aHochn = 1.0 / aHochn; } System.out.println("aHochn = " + aHochn); 18 Programmieren in Java 3. Übung double x[] = { 1.0, 2.0, 3.0 }; System.out.println("Vektor x:"); for (int i = 0; i < 3; i++) { if (i == 0) { System.out.print("( "); } else { System.out.print(", "); } System.out.print(x[i]); } System.out.println(" )"); double m[][] = { { -1.0, -2.0, -3.0 }, { 0.0, 1.0, 0.0 }, { 1.0, 2.0, 3.0 } }; System.out.println("Matrix M:"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (j == 0) { System.out.print("( "); } else { System.out.print(", "); } System.out.print(m[i][j]); } System.out.println(" )"); } } } 19 Programmieren in Java 3. Übung 2. Aufgabe a) Schreibe ein Programm, das ganze Zahlen von –2 bis +2 bestimmt und dividiert, d.h. –2/-2, 1/-1, 0/0, 1/1, 2/2 berechnet und das Ergebnis auf die Standard-Ausgabeeinheit ausgibt. (siehe unten) b) Welche spezielle Ausnahmesituation tritt bei der Ausführung des unter a) ermittelten Programms auf? java.lang.ArithmeticException: / by zero c) Wie kann die unter b) bestimmte Situation durch eine spezielle Behandlung abgefangen werden? try-catch-Block c) Gestalte das unter a) vorliegende Programm so, daß es die unter c) angegebene spezielle Behandlung realisiert. (siehe unten) e) Überprüfe die unter d) realisierte spezielle Behandlung auf Funktionsfähigkeit. import java.lang.*; public class TryCatchDemo extends Object { public static void main(String args[]) { int n; for (int i = -2; i <= 2; i++) { System.out.println("i = " + i); // n = i / i; // System.out.println("n = i / i = " + n); try { n = i / i; System.out.println("n = i / i = " + n); } catch ( ArithmeticException e) { System.out.println("ArithmeticException!"); } } } } 20 Programmieren in Java 3. Übung 3. Aufgabe a) Stelle aus der Java-API-Dokumentation die Operatoren für Arithmetik von Gleitpunktzahlen (Datentyp: double) zusammen. b) Schreibe eine Applikation, die zwei ganze Zahlen auf der Ebene der Befehlszeile einliest und anschließend mit diesen beiden Zahlen alle binären und unären Operationen auf ganzen Zahlen ausführt. Die Demonstration binärer und unärer Arithmetik mit ganzen Zahlen soll den Namen DoubleDemo tragen. Aus der Befehlszeile können ganzen Zahlen über double x = Double.valueOf(args[0]).doubleValue(); double y = Double.valueOf(args[1]).doubleValue(); konvertiert werden. c) Berechne 1.0/0.0, -1.0/0.0, 0.0/0.0, -0.0/0.0, 1.0/0.0 + 2.0, -1.0/0.0 + 2.0, 0.0/0.0 + 2.0, -0.0 + 2.0 im Rahmen des vorliegenden Programms. public class DoubleDemo { public static void main(String args[]) { try { // Konvertieren double x = Double.valueOf(args[0]).doubleValue(); double y = Double.valueOf(args[1]).doubleValue(); // Ausgabe der ueber die Befehlszeile eingegebenen Zahlen System.out.println("x = " + x); System.out.println("y = " + y); // Binaere Arithmetik mit den Operatoren + - * / double z; z = x + y; System.out.println("z = x + y = " + z); z = x - y; System.out.println("z = x - y = " + z); z = x * y; System.out.println("z = x * y = " + z); z = x / y; System.out.println("z = x / y = " + z); // Unaere Arithmetik mit Inkrement- / Dekrementoperator x++; System.out.println("Nach x++: x = " + x); y--; System.out.println("Nach y--: y = " + y); z = x++; System.out.println("Nach z = x++: z = " + z + ", x = " + x); z = ++x; System.out.println("Nach z = ++x: z = " + z + ", x = " + x); System.out.println("x = " + x); System.out.println("y = " + y); z = ++x + y--; System.out.println("Nach z = ++x + y--: z = " + z + ", x = " + x + " y = " + y); System.out.println("x = " + x); System.out.println("y = " + y); z = x + y * ++y; System.out.println("Nach z = x + y * ++y: z = " + z + ", x = " + x + " y = " + y); 21 Programmieren in Java 3. Übung z = 1.0 / 0.0; System.out.println("z = 1.0 / 0.0 = " + z); z = -1.0 / 0.0; System.out.println("z = -1.0 / 0.0 = " + z); z = 0.0 / 0.0; System.out.println("z = 0.0 / 0.0 = " + z); z = -0.0 / 0.0; System.out.println("z = -0.0 / 0.0 = " + z); z = 1.0 / 0.0 + 2.0; System.out.println("z = 1.0 / 0.0 + 2.0 = " + z); z = -1.0 / 0.0 + 2.0; System.out.println("z = -1.0 / 0.0 + 2.0 = " + z); z = 0.0 / 0.0 + 2.0; System.out.println("z = 0.0 / 0.0 + 2.0 = " + z); z = -0.0 / 0.0 + 2.0; System.out.println("z = -0.0 / 0.0 + 2.0 = " + z); } catch(Exception e) { System.out.println("Fehler bei der Eingabe: java a b"); System.out.println(e.getMessage()); } } } 22 Programmieren in Java 4. Übung 4. Übung 1. Aufgabe Die folgende Darstellung zeigt ein Fenster, das einem Applet zugeordnet ist. Das Fenster zeigt verschiedene Schriften. Schriftart, Stil und Größe ist in der jeweiligen Ausgabezeile im Fenster vermerkt. a) Schreibe das zugehörige Applet, das das vorliegende Fenster mit den unterschiedlichen Schriften produziert. import java.awt.Font; import java.awt.Graphics; public class { public void { Font f = Font fb = Font fi = Font fbi = Aufg1 extends java.applet.Applet paint(Graphics g) new new new new Font("TimesRoman",Font.PLAIN,18); Font("TimesRoman",Font.BOLD,18); Font("TimesRoman",Font.ITALIC,18); Font("TimesRoman", Font.BOLD + Font.ITALIC,18); Font f2 = new Font("Arial",Font.PLAIN,10); Font f2b = new Font("Courier",Font.BOLD,12); Font f2i = new Font("Arial",Font.ITALIC,30); g.setFont(f); g.drawString( "Nomaler (plain) Font (TimesRoman) in Schriftgroesse 18", 10,25); g.setFont(fb); g.drawString( "Fetter Font (TimesRoman) in Schriftgroesse 18", 10,50); g.setFont(fi); g.drawString( "Kursiver (italic) Font (TimesRoman) in Schriftgroesse 18", 10,75); g.setFont(fbi); g.drawString( "Fetter und Kursiver Font (TimesRoman) in Schriftgroesse 18", 23 Programmieren in Java 10,100); g.setFont(f2); g.drawString( "Normaler Font (Arial) 10,125); g.setFont(f2b); g.drawString( "Fetter Font (Courier) 10,150); g.setFont(f2i); g.drawString( "Kursiver Font (Arial) 10,180); 4. Übung in Schriftgroesse 10", in Schriftgroesse 12", in Schriftgroesse 30", } } b) Gib die für die Anzeige des Fensters in einem „Java“-fähigen Web-Browser oder über den „appletviewer“ nötige „HTML“-Datei an. <HTML> <HEAD> <TITLE>1. Aufgabe</TITLE> </HEAD> <BODY> <APPLET CODE="Aufg1.class" WIDTH=600 HEIGHT=200> </APPLET> </BODY> </HTML> c) Teste das unter a) entwickelte Applet mit dem „appletviewer“ bzw. einem „Java“-fähigen WebBrowser. 24 Programmieren in Java 4. Übung 2. Aufgabe Der Spruch „Aller Anfang ist schwer!“ soll mit Hilfe eines Applets in dem zu dem Applet zugeordneten Fenster dargestellt werden. Die Darstellung soll folgende Gestalt annehmen. a) Bestimme den Quellcode zu diesem Applet, das die vorliegende Darstellung über einen WebBrowser bzw. einen „Appletviewer“ ermöglicht. Die Abmessungen des Fensters, des Ovals im Fenster und des Texts sollen der Abbildung entnommen werden. import java.applet.*; import java.awt.*; public class Aufg2 extends Applet { Font f; String spruch; public void init() { f = new Font("Helvetica",Font.BOLD,24); this.spruch = "Aller Anfang ist schwer!"; } public void paint(Graphics g) { // Oval mit Farbe yellow g.setColor(Color.yellow); g.fillOval(10,10,330,100); // Roter Rahmen; da Java keine Linienbreite kennt, // wird die Linienbreite durch 4 Ovale, (die sich // um Pixelbreite unterscheiden,) simuliert g.setColor(Color.red); g.drawOval(10,10,330,100); g.drawOval( 9, 9,332,102); g.drawOval( 8, 8,334,104); g.drawOval( 7, 7,336,106); g.setColor(Color.black); g.setFont(f); g.drawString(this.spruch,40,70); } } 25 Programmieren in Java 4. Übung b) Erstelle die zugehörige HTML-Datei, die das Applet zur Darstellung mit einem Web-Browser bzw. „appletviewer“ benötigt. <HTML> <HEAD> <TITLE>2. Aufgabe </TITLE> </HEAD> <BODY> <CENTER> <APPLET CODE="Aufg2.class" WIDTH=350 HEIGHT=125> </APPLET> </CENTER> </BODY> </HTML> c) Überprüfe die Lösung zu dieser Aufgabe durch einen Test mit dem „appletviewer“ oder einem „Java“-fähigen Web-Browser. 26 Programmieren in Java 4. Übung 3. Aufgabe a) In dem einem Applet zugeordneten Fenster soll der Buchstabe „F“, wie die folgende Abbildung zeigt, abgebildet werden: Die Abmessungen des Fensters, die Konstruktionsmaße zur Darstellung des Buchstabens sollen der folgenden Abbildung direkt entnommen werden. In der oberen, linken Ecke des Fensters befindet sich der Bezugspunkt. 27 Programmieren in Java 4. Übung 1) Bestimme den Quellcode zu dem Applet, das die vorliegende Darstellung über einen WebBrowser bzw. „appletviewer“ ermöglicht. import java.awt.Font; import java.awt.Graphics; public class Aufg3 extends java.applet.Applet { public void paint(Graphics g) { int feldX[] = { 50, 50, 120, 120, 80, 80, 100, 100, 80, 80 }; int feldY[] = {170, 40, 40, 70, 70, 100, 100, 130, 130, 170 }; g.drawPolygon(feldX, feldY, feldX.length); } } 2) Erstelle die „zugehörige“ HTML-Datei. <HTML> <HEAD> <TITLE>3. Aufgabe</TITLE> </HEAD> <BODY> <APPLET CODE="Aufg3.class" WIDTH=200 HEIGHT=200> </APPLET> </BODY> </HTML> 3) Überprüfe die Lösung zu dieser Aufgabe durch eine Implementierung 28 Programmieren in Java 4. Übung b) Die Darstellung soll farbig ausgestattet werden. Der Hintergrund des Bildes soll gelb (Größe: 200 x 200 Pixel), der Buchstabe „F“ rot ausgefüllt werden. Schreibe dazu das zugehörige Applet und überprüfe es anschließend mit dem „appletviewer“ bzw. einem „Java“-fähigen Web-Browser. import java.awt.Font; import java.awt.Color; import java.awt.Graphics; public class Aufg3 extends java.applet.Applet { public void paint(Graphics g) { int feldX[] = { 50, 50, 120, 120, 80, 80, 100, 100, 80, 80 }; int feldY[] = {170, 40, 40, 70, 70, 100, 100, 130, 130, 170 }; g.setColor(Color.yellow); g.fillRect(0,0,200,200); g.setColor(Color.red); g.fillPolygon(feldX, feldY, feldX.length); } } 4. Aufgabe Die in der HTML-Datei im Applet-Tag angegebene Größe eines Fensters kann über die Methode getSize() der im Paket java.awt befindlichen Klasse Dimension bestimmt werden, z.B.: Dimension d = getSize(); hoehe = d.height; breite = d.width; Zeige mit Hilfe von zwei verschiedenen Applets, welcher Unterschied in der Darstellung von a) drawRect(0,0,breite,hoehe); bzw. b) drawRect(0,0,breite – 1, hoehe – 1); im jeweiligen Applet-Fenster besteht. 29 Programmieren in Java a) 4. Übung import java.applet.*; import java.awt.*; public class Aufg4 extends Applet { int hoehe, breite; public void init() { // Wie gross ist das Applet Dimension d = getSize(); hoehe = d.height; breite = d.width; repaint(); } public void paint(Graphics g) { g.drawRect(0,0,breite,hoehe); } } <HTML> <HEAD> <TITLE>4. Aufgabe</TITLE> </HEAD> <BODY> <APPLET CODE="Aufg4.class" WIDTH=300 HEIGHT=300> </APPLET> </BODY> </HTML> b) import java.applet.*; import java.awt.*; public class Aufg4b extends Applet { int hoehe, breite; public void init() { // Wie gross ist das Applet Dimension d = getSize(); hoehe = d.height; breite = d.width; repaint(); } public void paint(Graphics g) { g.drawRect(0,0,breite-1,hoehe-1); } } <HTML> <HEAD> <TITLE>4. Aufgabe</TITLE> </HEAD> <BODY> <APPLET CODE="Aufg4b.class" WIDTH=300 HEIGHT=300> </APPLET> </BODY> </HTML> 30 Programmieren in Java 5. Übung 5. Übung 1. Aufgabe In einem HTML-File können Parameter angegeben werden, die in einem Applet ausgewertet können, z.B. <APPLET CODE="Aufg1.class" WIDTH=350 HEIGHT=150> <PARAM NAME=name VALUE="Nobody"> </APPLET> Parameterangaben in einem HTML-File bestehen demnach aus Name und Wert. Im Applet kann der Paramter hier mit „name“ angesprochen werden und sein Wert überprüft werden (z.B. auf „null“). a) Schreibe ein HTML-File, das den zuvor als Parameter angegebenen Parameter enthält. <HTML> <HEAD> <TITLE>1. Aufgabe</TITLE> </HEAD> <BODY> <APPLET CODE="Aufg1.class" WIDTH=350 HEIGHT=150> <PARAM NAME=name VALUE="Nobody"> </APPLET> </BODY> </HTML> b) Schreibe ein Applet, das überprüft, ob der Parameter „name“ einen Wert besitzt. Falls er einen Wert besitzt, zeige ihn, wie die vorliegende Darstellung zeigt, an. Im anderen Fall gib irgend etwas anderes aus. 31 Programmieren in Java 5. Übung import java.awt.*; public class Aufg1 extends java.applet.Applet { Font f; String name; public void init() { f = new Font("Helvetica",Font.BOLD,48); this.name = getParameter("name"); if (this.name == null) { this.name = "Juergen"; } this.name = "Hallo " + this.name; } public void paint(Graphics g) { // Oval mit Farbe pink g.setColor(Color.pink); g.fillOval(10,10,330,100); // Roter Umfassungsrahmen, da Java keine Linienbreite // verarbeitet, wird die Linienbreite durch 4 Ovale // unterschliedlicher Pixelbreite simuliert g.setColor(Color.red); g.drawOval(10,10,330,100); g.drawOval(9,9,332,102); g.drawOval(8,8,334,104); g.drawOval(7,7,336,106); // Textausgabe g.setColor(Color.black); g.setFont(f); g.drawString(this.name,30,75); } } 2. Aufgabe Die folgende Darstellung zeigt das Fenster eines Applets und gibt eine Kaffeetasse wieder: 32 Programmieren in Java 5. Übung Bei genauer Betrachtung sieht man, daß diese Darstellung sich aus Ellipsen und Bögen zusammensetzt. a) Schreibe ein Applet, das diese Darstellung realisiert. Die Abmessungen der Tasse (für die Bögen bzw. Ellipsen) können frei gewählt werden, es soll nur eine möglichst große Ähnlichkeit zum vorliegenden Bild erreicht werden. import java.awt.*; public class Aufg2 extends java.applet.Applet { public void paint(Graphics g) { Dimension d = getSize(); g.setColor(Color.yellow); g.fillRect(0,0,d.width-1,d.height-1); // Zeichnen der Tasse // Blaue Untertasse g.setColor(Color.blue); // fillOval(x,y,hoehe,breite) g.fillOval(10,110,150,40); g.setColor(Color.black); // drawOval(x,y,hoehe,breite) g.drawOval(10,110,150,40); g.drawOval(60,122,50,16); // rote Tasse g.setColor(Color.red); // Henkel // drawArc(x,y,hoehe,breite,startwinkel,bogen) g.drawArc(130,30,40,50,-120,210); g.fillArc(20,-70,130,200,180,180); g.setColor(Color.black); g.fillOval(20,20,130,20); // Beschriftung g.drawString("Kaffetasse",60,170); } } b) Erstelle das zugehörige HTML-File. <HTML> <HEAD> <TITLE>2. Aufgabe</TITLE> </HEAD> <BODY> <APPLET CODE="Aufg2.class" WIDTH=200 HEIGHT=200> </APPLET> </BODY> </HTML> c) Überprüfe die Lösung zu dieser Aufgabe durch einen Test mit dem „appletviewer“ oder einem „Java“-fähigen Web-Browser. 33 Programmieren in Java 5. Übung 3. Aufgabe a) Schreibe ein Applet, das das folgende, 6 Ecken umfassende, regelmäßige Polygon zeichnet. Die Darstellung des Polygons geht zweckmäßigerweise von der Mitte des Fensters aus: Alle Eckpunkte des Polygons liegen auf einem Kreis, der hier den Radius 60 haben soll, und lassen sich mit Hilfe der trigonometrischen Funktionen bestimmen. 34 Programmieren in Java 5. Übung import java.awt.*; public class Aufg3 extends java.applet.Applet { // Instanzvariable private int eckenAnz = 6; private int radius = 60; private Dimension s; private int xKoord[]; private int yKoord[]; // Methoden public void init() { s = getSize(); xKoord = new yKoord = new for (int i = { xKoord[i] = int[eckenAnz]; int[eckenAnz]; 0; i < eckenAnz; i++) (int) (s.width / 2 + radius * Math.cos(i * 2 * Math.PI / eckenAnz)); yKoord[i] = (int) (s.height / 2 + radius * Math.sin(i * 2 * Math.PI / eckenAnz)); } } public void paint(Graphics g) { g.setColor(Color.white); g.fillRect(0,0,s.width,s.height); g.setColor(Color.black); g.drawPolygon(xKoord, yKoord, eckenAnz); } } b) Gib das zugehörige HTML-File an. <HTML> <HEAD> <TITLE>3. Aufgabe</TITLE> </HEAD> <BODY> <APPLET CODE="Aufg3.class" WIDTH=200 HEIGHT=200> </APPLET> </BODY> </HTML> c) Überprüfe die Lösung zu dieser Aufgabe durch einen Test mit dem „appletviewer“ oder einem „Java“-fähigen Web-Browser. 35 Programmieren in Java 5. Übung d) Erweitere das unter a) angegebene Applet so, wie es die folgende Abbildung zeigt. Das Polygon soll jetzt 12 Ecken haben und jeder Eckpunkt des Polygon ist jetzt mit jedem anderen Eckpunkt des Polygons verbunden. import java.awt.*; public class Aufg3 extends java.applet.Applet { // Instanzvariable private int eckenAnz = 12; private int radius = 60; private Dimension s; private int xKoord[]; private int yKoord[]; // Methoden public void init() { s = getSize(); xKoord = new int[eckenAnz]; yKoord = new int[eckenAnz]; for (int i = 0; i < eckenAnz; i++) { xKoord[i] = (int) (s.width / 2 + radius * Math.cos(i * 2 * Math.PI / eckenAnz)); yKoord[i] = (int) (s.height / 2 + radius * Math.sin(i * 2 * Math.PI / eckenAnz)); } } public void paint(Graphics g) { g.setColor(Color.white); g.fillRect(0,0,s.width,s.height); g.setColor(Color.black); g.drawPolygon(xKoord, yKoord, eckenAnz); for (int i = 0; i < eckenAnz; i++) for (int j = 0; j < eckenAnz; j++) g.drawLine(xKoord[i], yKoord[i], xKoord[j], yKoord[j]); } } 36 Programmieren in Java 5. Übung 4. Aufgabe a) Schreibe ein Applet, das die folgende Rosette zeichnet. import java.awt.*; public class Aufg4 extends java.applet.Applet { /* Abmessungen des Fensters */ private static int hoehe; private static int breite; /* Applet-Verarbeitungsmethoden */ public void init() { Dimension d = getSize(); hoehe = d.height - 1; breite = d.width - 1; } public void paint(Graphics g) { g.setColor(Color.yellow); g.fillRect(0,0,breite,hoehe); g.setColor(Color.black); double b; int rx = breite / 2; int ry = hoehe / 2; 37 Programmieren in Java 5. Übung for (int i = 0;i < 360; i++) { b = i * Math.PI / 180; int x = (int) (breite / 2 * Math.sin(12*b)); int y = (int) (hoehe / 2 * Math.sin(12*b)); int rx1 = (int)(breite/2 + (x * Math.cos(b))); int ry1 = (int)(hoehe/2 + (y * Math.sin(b))); g.drawLine(rx,ry,rx1,ry1); rx = rx1; ry = ry1; } } } b) Erstelle das zugehörige HTML-File. <HTML> <HEAD> <TITLE>5. Aufgabe</TITLE> </HEAD> <BODY> <APPLET CODE="Aufg4.class" WIDTH=300 HEIGHT=300> </APPLET> </BODY> </HTML> c) Überprüfe die Lösung zu dieser Aufgabe durch einen Test mit dem „appletviewer“ oder einem „Java“-fähigen Web-Browser. 38 Programmieren in Java 6. Übung 6. Übung 1. Aufgabe Es soll ein Applet geschrieben werden, das folgende Darstellung in seinem Fenster anzeigt: Wie die Abbildung zeigt handelt es sich um ein Schachbrett, das aus sog. 3D-Rechtecken (Quadraten) besteht. Die Positionierung des Schachbretts soll abhängig von der Größe des Fensters erfolgen, die einzelnen 3D-Quadrate haben eine Größe von 40 Pixel. Auf dem Schachbrett sind 8 Damen positioniert. Die Symbole zu den 8 Damen sind aus Polygone aufgebaut. Das zu schreibende Applet soll die vorliegende Abbildung möglichst genau wiedergeben. import java.awt.*; import java.applet.*; public class Aufg1 extends Applet { static final int N = 8; static final int GROESSE = 40; static int x_offset, y_offset; static int qx[] = { 4, 8, 32, 36, 31, 28, 24, 20, 16, 12, 9, 4, }; static int qy[] = { 19, 34, 34, 19, 24, 13, 22, 4, 22, 13, 24, 19, }; static int qxx[] = { 8, 17, 20, 23, 32, }; static int qyy[] = { 31, 31, 27, 31, 31, }; Dimension d; 39 Programmieren in Java 6. Übung public void init() { d = getSize(); } public void paint( Graphics g ) { holOffsets(); zeichneBrett(g); zeichneAlleDamen(g); } void holOffsets() { x_offset = (d.width - (N * GROESSE)) / 2; y_offset = (d.height- (N * GROESSE)) / 2 - 10; } void zeichneBrett( Graphics g ) { g.setColor( Color.lightGray ); g.fillRect( 0, 0, d.width, d.height ); g.setColor( Color.lightGray ); g.draw3DRect( x_offset-2, y_offset-2, N*GROESSE+3, N*GROESSE+3, true ); g.draw3DRect( x_offset-3, y_offset-3, N*GROESSE+5, N*GROESSE+5, true ); g.draw3DRect( x_offset-4, y_offset-4, N*GROESSE+7, N*GROESSE+7, true ); for( int j=0; j < N; j++ ) { for( int i=0; i < N; i++ ) { if ((i + j) % 2 == 1) g.setColor(Color.red); else g.setColor(Color.lightGray); g.fillRect( x_offset + i*GROESSE, y_offset + j*GROESSE, GROESSE, GROESSE ); } } } void zeichneAlleDamen( Graphics g ) { for( int i = 0; i < N; i++ ) { zeichneEineDame(g, x_offset+GROESSE*i, y_offset+GROESSE*(N - i - 1) ); } } void zeichneEineDame(Graphics g, int x, int y ) { g.translate( x, y ); g.setColor( Color.white ); g.fillPolygon( qx, qy, qx.length ); g.setColor( Color.black ); g.drawPolygon( qx, qy, qx.length ); g.drawPolygon( qxx, qyy, qxx.length ); g.translate( -x, -y ); } } 40 Programmieren in Java 6. Übung 2. Aufgabe a) Schreibe eine Java-Anwendung, die die Initialisierungswerte primitiver Typen anzeigt. Hinweis zur Lösung: Instanzvariable erhalten standardmäßig Initialisierungswerte zugeordnet. class Messung { // Instanzvariable boolean t; char z; byte b; short k; int i; long l; float f; double d; // Instanzmethoden void ausgabe() { System.out.println( "Datentyp Initialisieungwert\n" + "boolean " + t + "\n" + "char " + z + "\n" + "byte " + b + "\n" + "short " + k + "\n" + "int " + i + "\n" + "long " + l + "\n" + "float " + f + "\n" + "double " + d + "\n"); } /* Anzeige der standardmaessig zugeordneten Initialisierungswerte */ public class Initialisierungswerte { public static void main(String[] args) { Messung m = new Messung(); m.ausgabe(); // auch moeglich: new Messung().ausgabe(); } } 41 Programmieren in Java 6. Übung 3. Aufgabe 1. Welche Ausgaben zeigen die folgenden Anwendungen? a) public class Gleichheit { public static void main(String[] args) { Integer n1 = new Integer(13); Integer n2 = new Integer(13); System.out.println(n1 == n2); } } false b) public class GleichMethode { public static void main(String[] args) { Integer n1 = new Integer(13); Integer n2 = new Integer(13); System.out.println(n1.equals(n2)); } } true c) class Wert { int i; } public class GleichMethode2 { public static void main(String[] args) { Wert w1 = new Wert(); Wert w2 = new Wert(); w1.i = w2.i = 100; System.out.println(w1.equals(w2)); } } false 2. Implementiere die drei Anwendungen und überprüfe die unter a) bis c) angegebene Vorhersage. 42 Programmieren in Java 6. Übung 4. Aufgabe a) Schreibe ein Programm, das Primzahlen (von der Primzahl 2 an) ermittelt. Was ist eine Primzahl? Eine Primzahl ist eine natürliche Zahl, die genau zwei verschiedene Teiler besitzt (1 und sich selbst). Die Zahl ist 1 ist keine Primzahl, weil sie keine zwei verschiedene Teiler besitzt. Nach dieser Definition ist die Zahl 2 die kleinste Primzahl. Weiter geht es mit 3, 5, 7, 11, ... Wie findet man eine Primzahl? Man teilt die primzahlverdächtigen Zahlen durch alle Zahlen von 2 ab bis kurz vor der Zahl selbst. War die Zahl nie teilbar, dann ist sie eine Primzahl, anderenfalls nicht. Primzahlen startet man mit der Zahl 2 und wiederholt das Verfahren so oft, bis die gewünschte Zahl erreicht wurde. Wie kann man den vorliegenden Algorithmus verbessern? (1) Scheide alle geraden Zahlen aus, denn sie sind garantiert durch 2 teilbar (2) Teile die so verbliebenen Zahlen mindestes durch Divisor 3 (3) Teile nur durch Primzahlen als Divisoren, denn jede Nichtprimzahl läßt sich als Produkt von Primzahlen aufbauen (4) Gehe mit den Primzahldivisoren nur bis höchstens zur Wurzel aus der primzahlverdächtigen Zahl. Warum? 25 ist bspw. 5 * 5, d.h. weiteres Probieren über 5 ist sinnlos. b) Die Anzahl der zu ermittelten Primzahlen (erste Primzahl ist 2) soll per Default 100 sein. Ist eine davon abweichende Größe gewünscht, so soll das über die Kommandozeile bestimmt werden können. c) Die so ermittelten Primzahlen sollen in einen Array ausgegeben werden. Die in diesem Array gespeicherten Primzahlen sollen auf der Standardausgabeeinheit protokolliert werden. Dabei sollen jeweils 12 Primzahlen je Zeile angezeigt werden. import java.lang.*; class Primzahlen { private int start; public int zaehler = 100; // Konstruktor mit einem Argument public Primzahlen(int sta) { start = sta; } private boolean istPrimzahl(int p) { int i; for (i = 2; i < (p / 2); i++) { if ( (i * (p / i)) == p) return false; } return true; } 43 Programmieren in Java 6. Übung public void erzeuge(int feld[]) { int sta = start; int z = zaehler; int idx = 0; while (z > 0) { if (istPrimzahl(sta)) { feld[idx++] = sta; z--; } if (sta == 2) sta++; else sta = sta + 2; } } } public class Aufg4 { public static void main(String args[]) { Primzahlen p; int feldP[]; int laenge; int sta = 2; int zaehler = 0; laenge = args.length; p = new Primzahlen(sta); if (laenge > 0) { zaehler = Integer.parseInt(args[0]); p.zaehler = zaehler; } feldP = new int[p.zaehler]; p.erzeuge(feldP); for (int i = 0; i < p.zaehler; i++) { System.out.print(feldP[i] + " "); if (i == 0) continue; if ((i % 12) == 0) System.out.println(); } } } 44 Programmieren in Java 7. Übung 7. Übung 1. Aufgabe Schreibe ein Programm, das Methoden zum Berechnen der Fakultät enthält und aufruft. Die Berechnung der Fakultät soll a) iterativ b) rekursiv erfolgen. Die Ausgabe soll jeweils die Fakultät der Zahlen 1 bis 10 zeigen. public class FakultaetTest extends Object { public static void main(String args[]) { int n; int i; long resultat; for (i = 1; i <= 10; i++) { resultat = fakit(i); System.out.println(i + "!= " + resultat); } for (i = 1; i <= 10; i++) { resultat = fakrek(i); System.out.println(i + "!= " + resultat); } for (i = 1; i <= 10; i++) { resultat = fakultaet(i); System.out.println(i + "!= " + resultat); } System.out.println(-1 + "!= " + fakit(-1)); System.out.println(-1 + "!= " + fakultaet(-1)); } public static long fakit(int n) { int i; // Lokale Variable long resultat = 1; // Lokale Variable if (n < 0) return -1; for (i = 1; i <= n; i++) { resultat *= i; } return resultat; // Rueckgabewert } 45 Programmieren in Java 7. Übung public static long fakrek(int n) { if (n == 0) { return 1; } else { return n * fakrek(n - 1); } } public static long fakultaet(int n) { if (n < 0) { return -1; } else if (n == 0) { return 1; } else { return n * fakrek(n - 1); } } } 2. Aufgabe a) Schreibe ein Java-Programm, das die Zahl e ermittelt. Zur Berechnung der Zahl e verwende die Taylor-Reihe. b) Vergleiche das unter a) erhaltene Ergebnis mit der Konstanten Math.E public class Zahle { public static void main(String [] args) { double g = 1.; double s = 1.; for (int i = 1; i <= 15; i++) { g = g / i; s = s + g; System.out.println("i = " + i + " s = " + s); } System.out.println("Die Konstante Math.E hat den Wert " + Math.E); } } 46 Programmieren in Java 7. Übung 3. Aufgabe Schreibe ein Programm, das über die folgenden Summe ∞ ∑ (−1) n =1 n +1 ⋅ 1 n die Zahl ln2 berechnet. public class LN2 extends Object { public static double ln2() { double res = 1; short vorz = -1; for (int i = 2; i <=10000; i++) { res += 1. / i * vorz; vorz *= -1; System.out.println(res); } return res; } public static void main(String args[]) { System.out.println("Natuerlicher Logarithmus von 2: " + ln2()); } } 47 Programmieren in Java 7. Übung 4. Aufgabe Schreibe ein Programm, das folgende Ausgabe auf dem Bildschirm erzeugt: * *** ***** ******* ********* *********** public class SternchenDreieck { public static void main(String[] args) { final int N = 10; int i; int j; for (i = 0; i < N; i++) { for (int k = 1; k < N - i; k++) System.out.print(" "); for (j = 0; j < i * 2 -1; j++) System.out.print("*"); System.out.println(); } } } 48 Programmieren in Java 7. Übung 5. Aufgabe Alle Glieder einer Fibonacci-Folge, deren Werte eine feste Größe „MAXWERT“ nicht überschreitet, soll berechnet werden. In der Fibonacci-Folge 1, 1, 2, 3, 5, 8, 13, .... kann ab dem 3 Glied jedes weitere Glied aus der Summe der beiden vorhergehenden Glieder berechnet werden. Die Ausgabe der Folge soll so erfolgen: * * ** *** ***** ******** ************* MAXWERT soll den Wert 30 besitzen. public class ZeigeFibo { public static void main(String[] args) { final int MAXWERT = 30; int a; int b; int c; a = 1; b = 1; System.out.println("*"); do { for (int i = 1; i <= b; i++) System.out.print("*"); System.out.println(); c = a + b; a = b; b = c; } while (c < MAXWERT); } } 49 Programmieren in Java 7. Übung 6. Aufgabe Schreibe ein Programm, daß alle 3 Ziffern umfassenden Zahlen ausgibt, die gleich der Summe ihrer zur 3. Potenz erhobenen Ziffern ist, z.B. 153 = 13 + 53 + 33 public class DrittePotenz { public static void main(String[] args) { for (int i = 0; i <= 9; i++) for (int j = 0; j <= 9; j++) for (int k = 0; k <= 9; k++) if (((i*i*i) + (j*j*j) + (k*k*k)) == (i * 100 + 10 * j + k)) { int resultat = i * 100 + 10 * j + k; System.out.println(resultat); } } } 7. Aufgabe Schreibe ein Programm, das eine rekursive Funktion "gibausVertikal" enthält, die ganze Zahlen vertikal auf dem Bildschirm ausgibt- Falls die Zahl negativ ist, dann soll oben das Zeichen "-" stehen. Der Aufruf von bspw. gibausVertikal(-361) soll zu der folgenden Ausgabe führen 3 6 1 Der Aufruf von bspw. gibausVertikal(1234) führt zu der folgenden Ausgabe 1 2 3 4 public class AusgVertikal extends Object { public static void gibausVertikal(int zahl) { if (zahl < 0) { System.out.println('-'); gibausVertikal(Math.abs(zahl)); } else if (zahl < 10) System.out.println(zahl); else { gibausVertikal(zahl / 10); System.out.println((zahl % 10)); } } public static void main(String args[]) { gibausVertikal(-12345); gibausVertikal(54321); } } 50 Programmieren in Java 7. Übung 8. Aufgabe a) Welche Ausgabe zeigt das folgende Programm, wenn die in diesem Programm enthaltenen rekursive Funktion mit dem Argument "n = 5" aufgerufen wird? public class Hurra extends Object { public static void gruesse(int n) { if (n <= 1) System.out.println("Hurra"); else { System.out.println("Hip"); gruesse(n-1); } } public static void main(String args[]) { gruesse(5); } } Hip Hip Hip Hip Hurra b) Modifiziere die in dem vorliegenden Programm enthaltene rekursive Funktion, so daß zuerst "Hurra" ausggeben wird. Diesem Hurra sollen (n-1) "Hip" folgen. public class Hip extends Object { public static void gruesse(int n) { if (n <= 1) System.out.println("Hurra"); else { gruesse(n-1); System.out.println("Hip"); } } public static void main(String args[]) { gruesse(5); } } 51 Programmieren in Java 8. Übung 8. Übung 1. Aufgabe a) Implementiere eine Klasse Complex zur Bearbeitung komplexer Zahlen. Die Struktur, die die Klasse Complex annehmen soll, zeigt das folgende Klassendiagramm: Complex private double real; // Realteil private double imaginaer; // Imaginaerteil public double real(); public double imaginaer(); public double betrag() // Zugriff Realteil // Zugriff Imaginaerteil // Betrag der komplexen Zahl, die diese Methode auf// ruft public Complex plus(Complex z); // Addition 2er komplexer Zahlen (aufrufende Instanz // und uebergebene komplexe Zahl) public Complex minus(Complex z); // Subtraktion 2er komplexer Zahlen (aufrufende Instanz // minus uebergebene komplexe Zahl) public Complex mal(Complex z); // Multiplikation 2er komplexer Zahlen (aufrufende // Instanz multipliziert mit uebergebener komplexer Zahl) public Complex mal(Complex z); // Multiplikation der aufrufenden Instanz (komplexe Zahl) // mit uebergebener „double“-Zahl public Complex teilenDurch(Complex z); // Division 2er komplexer Zahlen (aufrufende Instanz // geteilt durch uebergebene komplexe Zahl) public String toString(); // Ausgabe komplexe Zahl Zusätzlich zu den im Klassendiagramm angegebenen Instanzvariablen und Instanzmethoden soll ein Konstruktor zur Initialisierung von Realteil und Imaginärteil angegeben werden. public class Complex extends Object { private double u; private double v; Complex() { u = 0; v = 0; } Complex(double x, double y) { u = x; v = y; } // Realteil public double real() { return u; } 52 Programmieren in Java 8. Übung // Imagiaerteil public double imaginaer() { return v; } // Betrag public double betrag() { return Math.sqrt(u * u + v * v); } // Addition zweier komplexer Zahlen public Complex plus(Complex z) { return new Complex(u + z.u,v + z.v); } // Subtraktion zweier komplexer Zahlen public Complex minus(Complex z) { return new Complex(u - z.u,v - z.v); } // Multiplikation zweier komplexer Zahlen public Complex mal(Complex z) { return new Complex(u * z.u - v * z.v, u * z.v + v * z.u); } // Multiplikation einer komplexen Zahl mit einer "double"-Zahl public Complex mal(double x) { return new Complex(u * x, v * x); } public Complex teilenDurch(Complex z) { double rz = z.betrag(); return new Complex((u * z.u + v * z.v) / (rz * rz), (v * z.u - u * z.v) / (rz * rz)); } public String toString() { if (v >= 0) return (String.valueOf(u) + " + " + String.valueOf(v) + "i"); else return (String.valueOf(u) + " - " + String.valueOf(-v) + "i"); } } 53 Programmieren in Java 8. Übung b) Zum Test der unter a) entwickelten und implementierten Klasse Complex soll eine Klasse ComplexTest implementiert werden, die über eine Instanz einer komplexen Zahl alle Operationen mit komplexen Zahlen der Klasse Complex aufruft, die Berechnungen durchführt und auf dem Standardausgabegerät protokolliert. public class ComplexTest extends Object { public static void main(String args[]) { Complex u, v, w, z; u = new Complex(1,2); System.out.println("u: " + u); v = new Complex(3,-4.5); /* System.out.println("v: " + v.real() + " + " + v.imaginaer() + "i"); */ System.out.println("v: " + v); // Addiere u und v z = v.plus(u); System.out.println("v + u: " + z); // Subtraktion u - v z = u.minus(v); System.out.println("u - v: " + z); // Multiplikation u * v z = u.mal(v); System.out.println("u * v: " + z); // Multiplikation v * u z = v.mal(u); System.out.println("v * u: " + z); // Multiplikation mit einer Gleitpunktzahl double x = 5.1; z = v.mal(x); System.out.println("v * x: " + z); // Teilen u durch v z = u.teilenDurch(v); System.out.println("u / v: " + z); // Teilen v durch u z = v.teilenDurch(u); System.out.println("v / u: " + z); } } 54 Programmieren in Java 8. Übung 2. Aufgabe a) Implementiere eine Klasse Rational zur Bearbeitung rationaler Zahlen. Die Struktur, die die Klasse Rational annehmen soll, zeigt das folgende Klassendiagramm: Rational private long num; private long den; // Numerator (Zaehler) // Denominator (Nenner) public Rational(double x); // Konstruktor zur Ueberfuehrung einer double-Zahl in // einen Bruch public Rational(long num, long den); // Konstruktor zur Initialisierung einer gebrochenen Zahl // aus dem uebergebenen Zaehler bzw. Nenner public Rational plus(Rational r); // Addition 2er rationaler Zahlen (aufrufende Instanz // und uebergebene rationale Zahl) public Rational minus(Rational r); // Subtraktion 2er komplexer Zahlen (aufrufende Instanz // minus uebergebene komplexe Zahl) public Rational mal(Rational r); // Multiplikation 2er rationaler Zahlen (aufrufende // Instanz multipliziert mit uebergebener rationaler Zahl) public Rational teilenDurch(Complex z); // Division 2er rationaler Zahlen (aufrufende Instanz // geteilt durch uebergebene rationale Zahl) public void reduzieren(); // die vorliegende Instanz soll weitgehend auf kleinst// moegliche Groessen reduziert werden, z.B. Teilen // durch gemeinsame Vielfache von Zaehler und Nenner public String toString(); // Ausgabe rationale Zahl class Rational { // Instanzvariable long num = 0L; long den = 1L; // Numerator // Denominator // Private Methoden private long ggT(long m, long n) { long rest = m % n; while (rest > 0) { m = n; n = rest; rest = m % n; } return n; } 55 Programmieren in Java 8. Übung // Konstruktoren public Rational(double x) { double wert1; double wert2; // Verschieben des Dezimalpunkts um 8 Stellen nach rechts wert1 = 100000000L * x; // Verschieben des Dezimalpunkts um 7 Stellen nach rechts wert2 = 10000000L * x; // wert1 - wert2 = 90000000 * x // Abschneiden zu einer "long"-Zahl, Entfernen des gebrochenen Teils // Approximation von x durch Numerator/90000000 num = (long) (wert1 - wert2); den = 90000000L; // Reduzieren reduzieren(); } public Rational(long num, long den) { super(); this.num = num; this.den = den; if (den == 0) { System.out.println("Ein Null-Denominator ist falsch"); System.out.println("Denominator wird auf 1 gesetzt"); this.den = 1; } } // Instanzmethoden // Addition public Rational plus(Rational r) { Rational temp = new Rational(num * r.den + den * r.num, den * r.den); return temp; } // Subtraktion public Rational minus(Rational r) { Rational temp = new Rational(num * r.den - den * r.num, den * r.den); return temp; } // Multiplikation public Rational mal(Rational r) { Rational temp = new Rational(num * r.num, den * r.den); return temp; } 56 Programmieren in Java 8. Übung // Division public Rational teilenDurch(Rational r) { Rational temp = new Rational(num * r.den, den * r.num); return temp; } public void reduzieren() { long teiler; long absnum; // absoluter Wert des Numerators absnum = (num <0) ? -num : num; if (num == 0) den = 1; else { // Finde den groessten gemeinsamen Teiler // von absnum und dem Denominator teiler = ggT(absnum,den); // Fall „teiler == 1“, ist die rationale Zahl reduziert,anderenfalls // teile Numerator und Denominator durch ihren groessten gemeinsamen // Teiler if (teiler > 1) { num /= teiler; den /= teiler; } } } // Konvertieren rationale Zahl in "double"-Zahl public double rationalIndouble() { return (double) num / den; } // Ausgabe public String toString() { return String.valueOf(num) + '/' + String.valueOf(den); } } 57 Programmieren in Java 8. Übung b) Zum Test der unter a) entwickelten und implementierten Klasse Rational soll eine Klasse RationalTest implementiert werden, die alle unter a) angegebenen Methoden anhand geeigneter Instanzen rationaler Zahlen überprüft und auswertet. class RationalTest { public static void main(String args[]) { System.out.println("Approximation Double-Zahl in rationale Zahl"); double d = 0.75; Rational v = new Rational(d); System.out.println("v: " + v); System.out.println("Erzeugen einer rationalen Zahl"); Rational u = new Rational(2,3); System.out.println("u: " + u); System.out.println("Die zugehoerige double-Zahl ist: " + u.rationalIndouble()); System.out.println("Rechnen mit rationalen Zahlen"); Rational z; z = u.plus(v); System.out.println("u + v: " + z); z = u.minus(v); System.out.println("u - v: " + z); z = v.minus(u); System.out.println("v - u: " + z); z = u.mal(v); System.out.println("u * v: " + z); z = u.teilenDurch(v); System.out.println("u / v: " + z); z = v.teilenDurch(u); System.out.println("v / u: " + z); } } 58 Programmieren in Java 8. Übung 3. Aufgabe Das folgende Klassendiagramm beschreibt die Klasse Turtle. Turtle private double turtleX; private double turtleY; private double turtleR; private double turtleTheta; // x-Koordinate des aktuellen Endpunkts vom Turtle-Fahrstrahl // y-Koordinate des aktuellen Endpunkts vom Turtle-Fahrstrahl // Länge des Fahrstrahls der aktuellen Turtle // Winkel, der am Ende des aktuellen Fahrstrahls entgegen dem Uhr// zeigersinn („-“) bzw. im Uhrzeigersinn („+“) eingeschlagen wird. public void schritt(); // bestimmt die (x,y)-Koordinate vom Endpunkt des jeweiligen Fahrstrahls public void wende(double winkel); // verändert den Winkel vom jeweiligen Endpunkt des Fahrstrahls aus // gesehen. Ein negative Winkelangabe dreht den aktuellen Fahrstrahl ent// gegen dem Uhrzeigersinn, eine positive Winkelangabe dreht den // aktuellen Fahrstrahl im Uhrzeigersinn. Mit Hilfe der Turtle-Grafik können einfache zweidimensionale Darstellungen erzeugt werden. Von einem Ausgangspunkt kann im Rahmen der Turtle-Grafik ein Pfeil bestimmter Länge gezeichnet werden: Die Spitze des Pfeils gibt die Richtung an, die über eine Winkelangabe verändert werden kann. Ein negativer Winkel dreht den Pfeil entgegen dem Uhrzeigersinn, ein positiver Winkel dreht den Pfeil im Uhrzeigersinn. public class Turtle { // Instanzvariable private double turtleR, turtleX, turtleY, turtleTheta; // Konstruktor public Turtle() { this(0.0,0.0,100,0); } public Turtle(double turtleX, double turtleY, double turtleR, double turtleTheta) { this.setzeTurtleX(turtleX); this.setzeTurtleY(turtleY); this.setzeTurtleR(turtleR); this.setzeTurtleTheta(turtleTheta); } // Instanzmethoden public double holeTurtleX() { return turtleX; } public void setzeTurtleX(double turtleX) { this.turtleX = turtleX; } 59 Programmieren in Java 8. Übung public double holeTurtleY() { return turtleY; } public void setzeTurtleY(double turtleY) { this.turtleY = turtleY; } public double holeTurtleR() { return turtleR; } public void setzeTurtleR(double turtleR) { this.turtleR = turtleR; } public double holeTurtleTheta() { return turtleTheta; } public void setzeTurtleTheta(double turtleTheta) { this.turtleTheta = turtleTheta; } public void schritt() { turtleX += turtleR * Math.cos(turtleTheta*Math.PI/180); turtleY += turtleR * Math.sin(turtleTheta*Math.PI/180); } public void wende(double winkel) { turtleTheta += winkel; } } 60 Programmieren in Java 8. Übung Die soeben entwickelte Klasse Turtle kann a) zum Zeichnen eines regelmäßigen Vielecks mit gegebener Anzahl Ecken (z.B. 3 bzw. 12) und Seitenlänge (100 Pixel bzw. 50 Pixel) benutzt werden. Schreibe ein Applet, das mit Hilfe der Klasse Turtle ein regelmäßiges Vieleck zeichnet. import java.awt.*; import java.applet.*; public class Vieleck extends Applet { // Turtle-Objekt Turtle turtle; // Abmessung des Fensters Dimension d; // Anzahl der Ecken /* int eckenZahl = 12; */ int eckenZahl = 3; public void init() { d = getSize(); // turtle = new Turtle(d.width/2-25,3*d.height/4,100,0); turtle = new Turtle(d.width/4,3*d.height/4,200,0); } public void paint(Graphics g) { double xAlt; double yAlt; g.setColor(Color.yellow); g.fillRect(0,0,d.width-1,d.height-1); g.setColor(Color.black); for (int i = 0; i < eckenZahl; i++) { xAlt = turtle.holeTurtleX(); yAlt = turtle.holeTurtleY(); turtle.schritt(); g.drawLine((int) xAlt, (int) yAlt,(int) turtle.holeTurtleX(), (int) turtle.holeTurtleY()); turtle.wende(-360/eckenZahl); } } } 61 Programmieren in Java 8. Übung b) zum Zeichnen einer Qudratrosette verwendet werden. Hier dreht man ein Quadrat um einen festen Punkt. Schreibe ein Applet, das mit Hilfe der Klasse Turtle die Quadratrosette zeichnet. Ein einzelnes Quadrat hat eine Seitenlänge von 100 Pixel. import java.awt.*; import java.applet.*; public class Quadratrosette extends Applet { // Turtle-Objekt Turtle turtle; // Abmessung des Fensters Dimension d; public void init() { d = getSize(); turtle = new Turtle(d.width/2,d.height/2,100,0); } public void paint(Graphics g) { g.setColor(Color.yellow); g.fillRect(0,0,d.width-1,d.height-1); for (int i = 0; i < 36; i++) { zeichneQuadrat(g); turtle.wende(10); } } 62 Programmieren in Java 8. Übung public void zeichneQuadrat(Graphics g) { g.setColor(Color.black); for (int i = 0; i < 4; i++) { double xAlt = turtle.holeTurtleX(); double yAlt = turtle.holeTurtleY(); turtle.schritt(); g.drawLine((int) xAlt, (int) yAlt,(int) turtle.holeTurtleX(), (int) turtle.holeTurtleY()); turtle.wende(90); } } } 63 Programmieren in Java 9. Übung 9. Übung 1. Aufgabe a) „Damen“-Problem Aufgabenstellung: Acht Damen sollen so auf einem Schachbrett positioniert werden, daß sie sich nicht schlagen können, d.h.: Zwei Damen stehen nie in derselben Zeile oder Spalte oder Diagonale. Algorithmus zur Lösung: Zu Beginn wird ein zweidimensionales Feld mit 0 gefüllt. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Danach wird zufällig im zweidimensionalen Feld eine „Dame“ gesetzt. Das Setzen der Dame wird durch eine 9 markiert. 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Durch das Positionieren der Dame sind Positionierungen von weiteren Damen in derselben Zeile und Spalte wie die soeben positionierte Dame, aber auch in den zugehörigen Diagonalen nicht erlaubt. Die nicht mehr zulässigen Positionen werden mit 1 markiert. 1 0 0 1 0 0 1 0 0 1 0 1 0 1 0 0 0 0 1 1 1 0 0 0 1 1 1 9 1 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 64 Programmieren in Java 9. Übung Damen dürfen jetzt nur noch auf die mit 0 markierten Komponenten des zweidimensionalen Felds gebracht werden. Das geschieht solange bis alle Komponenten des zweidimensionalen Felds mit 1 oder 9 gefüllt sind. Wurden beim Füllen des Felds insgesamt 8 Damen positioniert, dann wurde eine Lösung erreicht, die so aussehen könnte: 1 1 1 1 9 1 1 1 1 9 1 1 1 1 1 1 1 1 1 9 1 1 1 1 1 1 1 1 1 9 1 1 1 1 1 1 1 1 1 9 1 1 9 1 1 1 1 1 9 1 1 1 1 1 1 9 1 1 1 1 1 1 9 1 import java.util.*; public class Damen { // Konstanten final int N = 8; // Variable boolean fuellen; boolean ausgeben; Random rand = new Random(); int zeile, spalte; int[][] brett; int aktZahl = 0; int[] positionen = new int[N]; // Methoden int zRand(int mod) { return Math.abs(rand.nextInt() % mod); } public void initialisiere() { fuellen = false; ausgeben = false; aktZahl = 0; brett = new int[N][N]; for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) { brett[i][j] = 0; } } 65 Programmieren in Java 9. Übung public void nimmPosition() { do { zeile = zRand(N); // System.out.println(zeile); spalte = zRand(N); // System.out.println(spalte); } while (brett[zeile][spalte] != 0); brett[zeile][spalte] = 9; aktZahl++; } public void bewertePosition() { for (int i = 0; i < 8; i++) { if (i != spalte) brett[zeile][i] = 1; } for (int i = 0; i < 8; i++) { if (i != zeile) brett[i][spalte] = 1; } int lDzeile = zeile; int lDspalte = spalte; // Beruecksichtigung der nach links laufenden Diagonale while ((lDzeile > 0) && (lDspalte > 0)) { lDzeile--; lDspalte--; } do { if ((lDzeile != zeile) && (lDspalte != spalte)) { brett[lDzeile][lDspalte] = 1; } lDzeile++; lDspalte++; } while ((lDzeile < 8) && (lDspalte < 8)); // ausgabe(); int rDzeile = zeile; int rDspalte = spalte; // Beruecksichtiung der nach rechts laufenden Diagonale while ((rDzeile > 0) && (rDspalte < 7)) { rDzeile--; rDspalte++; } 66 Programmieren in Java 9. Übung do { if ((rDzeile != zeile) && (rDspalte != spalte)) { brett[rDzeile][rDspalte] = 1; } rDzeile++; rDspalte--; } while ((rDzeile < 8) && (rDspalte >= 0)); } public void pruefe() { int nullen = 0; int anzDamen = 0; for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) { if (brett[i][j] == 0) nullen++; if (brett[i][j] == 9) anzDamen++; } if (nullen == 0) fuellen = true; if (anzDamen == 8) ausgeben = true; } public void ausgabe() { System.out.println(); for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { System.out.print(brett[i][j] + " "); } System.out.println(); } System.out.println(); int k = 0; for (int i = 0; i < brett.length; i++) for (int j = 0; j < brett[i].length; j++) { if (brett[i][j] == 9) positionen[k++] = j; } for (k = 0; k < N; k++) System.out.print(positionen[k]+" "); System.out.println(); } 67 Programmieren in Java 9. Übung public void erzeugeDamen() { do { initialisiere(); do { nimmPosition(); // ausgabe(); bewertePosition(); // ausgabe(); if (aktZahl > 4) pruefe(); } while (!fuellen); } while (!ausgeben); ausgabe(); } } public class Damentest { public static void main(String args[]) { Damen d = new Damen(); d.erzeugeDamen(); } } 68 Programmieren in Java 9. Übung b) Die unter a) ermittelte Positionsangaben für Damen sollen jetzt, wie die folgende Darstellung zeigt, in ein Schachbretts eingebracht werden. import java.awt.*; import java.applet.*; public class Aufg1 extends Applet { static final int N = 8; static final int GROESSE = 40; static int x_offset, y_offset; static int qx[] = { 4, 8, 32, 36, 31, 28, 24, 20, 16, 12, 9, 4, }; static int qy[] = { 19, 34, 34, 19, 24, 13, 22, 4, 22, 13, 24, 19, }; static int qxx[] = { 8, 17, 20, 23, 32, }; static int qyy[] = { 31, 31, 27, 31, 31, }; Dimension d; Damen dame; public void init() { // Bestimmen der Applet-Fenstergroesse d = getSize(); // Berechnen der Positionen fuer die Damen dame = new Damen(); dame.erzeugeDamen(); } 69 Programmieren in Java 9. Übung public void paint( Graphics g ) { holOffsets(); zeichneBrett(g); zeichneAlleDamen(g); } void holOffsets() { x_offset = (d.width - (N * GROESSE)) / 2; y_offset = (d.height- (N * GROESSE)) / 2 - 10; } void zeichneBrett( Graphics g ) { g.setColor( Color.lightGray ); g.fillRect( 0, 0, d.width, d.height ); g.setColor( Color.lightGray ); g.draw3DRect( x_offset-2, y_offset-2, N*GROESSE+3, N*GROESSE+3, true ); g.draw3DRect( x_offset-3, y_offset-3, N*GROESSE+5, N*GROESSE+5, true ); g.draw3DRect( x_offset-4, y_offset-4, N*GROESSE+7, N*GROESSE+7, true ); for( int j=0; j < N; j++ ) { for( int i=0; i < N; i++ ) { if ((i + j) % 2 == 1) g.setColor(Color.red); else g.setColor(Color.lightGray); g.fillRect( x_offset + i * GROESSE, y_offset + j * GROESSE, GROESSE, GROESSE ); } } } void zeichneAlleDamen( Graphics g ) { for( int i = 0; i < N; i++ ) { // System.out.print(dame.positionen[i]+" "); zeichneEineDame(g, x_offset+GROESSE*(dame.positionen[i]), y_offset+GROESSE*i); } } void zeichneEineDame(Graphics g, int x, int y ) { g.translate( x, y ); g.setColor( Color.white ); g.fillPolygon( qx, qy, qx.length ); g.setColor( Color.black ); g.drawPolygon( qx, qy, qx.length ); g.drawPolygon( qxx, qyy, qxx.length ); g.translate( -x, -y ); } } 70 Programmieren in Java 9. Übung 2. Aufgabe a) Schreibe eine Anwendung, die folgende Sortierroutinen umfaßt: Sortieren durch Austauschen Sortieren durch Einfügen Quicksort - Die Sortierroutinen sollen Bestandteil der Klasse Sort sein und über deren main()-Funktion aufgerufen werden können. Der Aufruf der Sortierroutinen soll ein ganzzahliges Feld mit unsortiert vorliegenden Zahlen übergeben, die in den Sortierroutinen aufsteigend sortiert werden sollen. Das Füllen des Datenfeldes soll mit Zufallszahlen im Bereich 0 bis 100 erfolgen, eine entsprechende Ausgabe des unsortiert bzw. sortiert vorliegenden Felds ist vorzusehen. import java.util.*; class Ueb1411 { void bubbleSort(int x[], int n) { boolean sortiert = false; // Sortiere das Feld x while (!sortiert) { sortiert = true; for (int i=0; i < n-1; i++) { if (x[i] > x[i+1]) { int temp = x[i]; x[i] = x[i+1]; x[i+1] = temp; sortiert = false; } } } } void einfuegeSort(int x[], int n) { int temp, j; for (int i=1; i < n; i++) { temp = x[i]; j = i - 1; while ((j >= 0) && (temp < x[j])) { x[j+1] = x[j]; j--; } x[j+1] = temp; } } 71 Programmieren in Java 9. Übung public static void quicksort(int x[], int links, int rechts) { int i = links; int j = rechts; // Auswahl eines Elements aus dem zu sortierenden Bereich int pivot = x[(links + rechts) / 2]; do { // Zerlegen in zwei Teilbereiche while (x[i] < pivot) i++; while (pivot < x[j]) j--; if (i <= j) { int temp = x[i]; x[i] = x[j]; x[j] = temp; i++; j--; } } while (i <= j); if (links < j) quicksort(x,links,j); if (i < rechts) quicksort(x,i,rechts); } public static void main(String args[]) { int[] x; int n; n = Integer.valueOf(args[0]).intValue(); x = new int[n]; Random zufallsZahl = new Random(); // Initialisieren des Array x for (int i = 0; i < n; i++) { x[i] = zufallsZahl.nextInt() % 100; } // Ausgabe des noch nicht sortierten x System.out.println("Vor dem Sortieren:"); for (int i = 0; i < n; i++) { System.out.println("x["+i+"] = " + x[i]); } // Aufruf der Sortieroutine Ueb1411 s = new Ueb1411(); s.bubbleSort(x,n); // s.einfuegeSort(x,n); // int l = 0; int r = n - 1; // s.quicksort(x,l,r); // Gib das sortierte Feld x aus System.out.println(); System.out.println("Nach dem Sortieren:"); for (int i = 0; i < n; i++) { System.out.println("x["+i+"] = " + x[i]); } } } 72 Programmieren in Java 9. Übung b) Stelle das unter a) entwickelte Programm so um, daß anstatt ganzer Zahlen „Zeichenketten“ bearbeitet werden können. // import java.util.*; public class Ueb1412 { void bubbleSort(String x[], int n) { boolean sortiert = false; // Sortiere das Feld x while (!sortiert) { sortiert = true; for (int i=0; i < n-1; i++) { if ( (x[i].compareTo(x[i+1]) > 0) ) { String temp = x[i]; x[i] = x[i+1]; x[i+1] = temp; sortiert = false; } } } } void einfuegeSort(int x[], int n) { int temp, j; for (int i=1; i < n; i++) { temp = x[i]; j = i - 1; while ((j >= 0) && (temp < x[j])) { x[j+1] = x[j]; j--; } x[j+1] = temp; } } public static void quicksort(int x[], int links, int rechts) { int i = links; int j = rechts; // Auswahl eines Elements aus dem zu sortierenden Bereich int pivot = x[(links + rechts) / 2]; 73 Programmieren in Java 9. Übung do { // Zerlegen in zwei Teilbereiche while (x[i] < pivot) i++; while (pivot < x[j]) j--; if (i <= j) { int temp = x[i]; x[i] = x[j]; x[j] = temp; i++; j--; } } while (i <= j); if (links < j) quicksort(x,links,j); if (i < rechts) quicksort(x,i,rechts); } public static void main(String args[]) { String[] x = { "juergen","christian","bernd","werner","uwe", "erich","kurt","karl","emil","ernst" }; int n = 10;; // Ausgabe des noch nicht sortierten x System.out.println("Vor dem Sortieren:"); for (int i = 0; i < n; i++) { System.out.println("x["+i+"] = " + x[i]); } // Aufruf der Sortieroutine Ueb1412 s = new Ueb1412(); s.bubbleSort(x,n); // s.einfuegeSort(x,n); // int l = 0; int r = n - 1; // s.quicksort(x,l,r); // Gib das sortierte Feld x aus System.out.println(); System.out.println("Nach dem Sortieren:"); for (int i = 0; i < n; i++) { System.out.println("x["+i+"] = " + x[i]); } } } 74 Programmieren in Java 9. Übung c) Gegeben ist das folgende Interface interface Vergleich { boolean kleinerAls(Object ls, Object rs); boolean kleinerAlsoderGleich(Object ls, Object rs); } Das Interface beschreibt zwei Methoden zum Vergleich zweier Objekte vom Typ Object. Die beiden Methoden ermitteln den Rückgabewert true bzw. false je nachdem, ob das 1. Argument „kleiner“ oder „kleiner gleich“ zu dem 2. Argument ist. Implementiere dieses Interface in einer Klasse „StringSortTest“, die ein Array mit Zeichenketten bereitstellt, der durch Aufruf einer Sortierroutine (Methode: „Quicksort“) der Klasse Sort die in dem Array bereitgestellten Strings sortiert. interface Vergleich { boolean kleinerAls(Object ls, Object rs); boolean kleinerAlsoderGleich(Object ls, Object rs); } public class Sort { private Vergleich vergleich; public Sort(Vergleich vergl) { vergleich = vergl; } public void sort(Object x[],int n) { quickSort(x,0,n); } public void quickSort(Object x[],int links, int rechts) { // System.out.println("rechts: " + rechts); if (rechts > links) { Object o = x[rechts]; int i = links - 1; int j = rechts; // System.out.println("i: " + i + " j: " + j); while (true) { while (vergleich.kleinerAls(x[++i],o)); while (j > 0) if (vergleich.kleinerAlsoderGleich(x[--j],o)) break; if (i >= j) break; tausche(x,i,j); } tausche(x,i,rechts); quickSort(x,links,i-1); quickSort(x,i+1,rechts); } } 75 Programmieren in Java 9. Übung private void tausche(Object x[], int stelle1, int stelle2) { Object tmp = x[stelle1]; x[stelle1] = x[stelle2]; x[stelle2] = tmp; } } public class StringSortTest { static class StringVergleich implements Vergleich { public boolean kleinerAls(Object l, Object r) { return((String)l).toLowerCase(). compareTo(((String)r).toLowerCase()) < 0; } public boolean kleinerAlsoderGleich(Object l, Object r) { return((String)l).toLowerCase(). compareTo(((String)r).toLowerCase()) <= 0; } } public static void main(String args[]) { String x[] = { "Juergen","Christian","Bernd","Werner","Uwe", "Erich","Kurt","Karl","Emil","Ernst" }; Object o[] = new Object[x.length]; for (int i = 0; i < x.length; i++) { o[i] = (Object) x[i]; } // Ausgabe des noch nicht sortierten x System.out.println("Vor dem Sortieren:"); for (int i = 0; i < x.length; i++) { System.out.println("x["+i+"] = " + x[i]); } // Aufruf der Sortieroutine Sort s = new Sort(new StringVergleich()); s.sort(o,x.length-1); // Gib das sortierte Feld x aus for (int i = 0; i < x.length; i++) { x[i] = (String) o[i]; } System.out.println(); System.out.println("Nach dem Sortieren:"); for (int i = 0; i < x.length; i++) { System.out.println("x["+i+"] = " + x[i]); } } } 76 Programmieren in Java 9. Übung d) Die unter c) ermittelte Lösung läßt sich verallgemeinern, indem anstatt eines Datenfelds eine Instanz der Klasse Vector (enthalten im Paket „java.util“) verwendet wird. Gib auch hierfür ein komplette Anwendung an. 3. Aufgabe Mit Hilfe der in Java implementierten mehrdimensionalen Datenfelder lassen sich Datenstrukturen zur Lösung komplexer Probleme realisieren. Eine solche Datenstruktur, die eine Lösung für das bekannte Pascalsche Dreieck beschreibt, zeigt die folgende Abbildung des zweidimensionalen Felds „dreieck[][]“, dessen Komponente die Zahlenwerte des Pascalschen Dreiecks (Binomialkoeffizienten) aufnehmen. Schreibe eine Anwendung, das die vorliegende Datenstruktur mit den Komponenten des Pascalschen Dreiecks enthält und auf die Konsole ausgibt. public class PascalDreieck { static long[][] pascalDreieck(int n) { long [][] dreieck = new long[n][]; // n Zeilen for (int i = 0; i < dreieck.length; i++) { dreieck [i] = new long[i+1]; // i+1 Elemente dreieck[i][0] = 1; for (int j = 1; j < i; j++) { dreieck[i][j] = dreieck[i-1][j-1] + dreieck[i-1][j]; } dreieck[i][i] = 1; } return dreieck; } 77 Programmieren in Java 9. Übung public static void main(String [] args) { long koeffizienten[][] = pascalDreieck(10); for (int i = 0; i < koeffizienten.length; i++) { /* System.out.print(" "); for (int k = 2 * (koeffizienten.length - i) + 7; k > i; k--) System.out.print(" "); */ for (int j = 0; j < koeffizienten[i].length; j++) { System.out.print(" " + koeffizienten[i][j]); } System.out.println(); } } } 78 Programmieren in Java 10. Übung 10. Übung 1. Aufgabe a) Benötigt das folgende Programm eine Spezifikation für den hier vorliegenden Ausnahmetyp public class NieGefangen { static void f() { throw new RuntimeException("Von f()"); } static void g() { f(); } public static void main(String[] args) { g(); } } nein b) Zeige durch Implementierung und anschließenden Test des vorliegenden Programms, daß die unter a) gemachte Angabe korrekt ist. c) Welche Ausgabe zeigt das unter b) implementierte Programm? Am Ende des Programms wird printStackTrace() aufgerufen Ausgabe: java.lang.RuntimeException: Von f() at NieGefangen.f(NieGefangen.java:5) at NieGefangen.f(NieGefangen.java:9) at NieGefangen.f(NieGefangen.java:13) d) Was kann daraus für das Behandeln einer "RuntimeException" in Java-Anwendungen geschlossen werden? RuntimeException bestimmt Programmfehler mit folgenden Eigenschaften: 1. Sie können nicht eingefangen werden 2. Sie müssen im Programm vom Programmierer speziell überprüft und behandelt werden 79 Programmieren in Java 10. Übung 2. Aufgabe a) Wird die Ausnahme des folgenden Programms in main() aufgefangen? public class WirfAus { public static void main(String args[]) throws Throwable { try { throw new Throwable(); } catch (Exception e) { System.out.println("Gefangen in main()"); } } } nein b) Beweise die unter a) gemachte Aussage durch Implementierung und Test des vorliegenden Programms. Gib einen Grund für dieses Programmverhalten an. Eingefangen in main() wird eine Ausnahme der Klasse Exception, ausgeworfen wird von diesem Programm eine Ausnahme der Klasse Throwable Ausgabe: java.lang.Throwable at WirfAus.main(WirfAus.java:7) 80 Programmieren in Java 10. Übung 3. Aufgabe Welche Schlußfolgerung kann für das Wiederauswerfen von Ausnahmen aus der Ausgabe zu dem folgenden Programm gewonnen werden? public class Wiederauswurf { public static void f() throws Exception { System.out.println("Ursprung der Ausnahme in f()"); throw new Exception("Auswurf in f()"); } public static void main(String args[]) { try { f(); } catch (Exception e) { System.out.println("Aufgefangen in main(), e.printStackTrace()"); e.printStackTrace(); throw new NullPointerException("von main()"); } } } Zum Begutachten der Ausgabe implementiere das vorliegende Programm und betrachte das Ergebnis (die Ausgabe) durch den Java-Interpreter. Ursprung der Ausnahme in f() Aufgefangen in main(), e.printStackTrace() java.lang.Exception: Auswurf in f() at java.lang.Throwable.<init>(Compiled Code) at java.lang.Exception.<init>(Compiled Code) at Wiederauswurf.f(Wiederauswurf.java:6) at Wiederauswurf.main(Wiederauswurf.java:12) java.lang.NullpointerException: von main() at java.lang.Throwable.<init>(Compiled Code) at java.lang.RuntimeException.<init>(Compiled Code) at java.lang.NullPointerException.<init>(NullPointerException.java:64) at Wiederauswurf.main(Wiederauswurf.java:18) 81 Programmieren in Java 10. Übung 4. Aufgabe a) Was zeigt das folgende Programm? class MeineAusnahme extends Exception { public MeineAusnahme() {} public MeineAusnahme(String nachricht) { super(nachricht); } } public class AuswurfMeineAusnahme { public static void f() throws MeineAusnahme { System.out.println("Auswurf von MeineAusnahme aus f()"); throw new MeineAusnahme(); } public static void g() throws MeineAusnahme { System.out.println("Auswurf von MeineAusnahme aus g()"); throw new MeineAusnahme("Ursprung in g()"); } public static void main(String args[]) { try { f(); } catch (MeineAusnahme a) { a.printStackTrace(); } try { g(); } catch (MeineAusnahme a) { a.printStackTrace(); } } } Eigene benutzerdefinierte Ausnahmen können direkt von der Klasse Exception abgeleitet werden. Das Wiederauswerfen einer Ausnahme ist möglich 82 Programmieren in Java 10. Übung b) Implementiere das vorliegende Programm und überprüfe dessen Wirkungsweise. Welche Ausgabe erzeugt dieses Programm? Ausgabe: Test Auswurf vom MeineAusnahme aus f() MeineAusnahme at java.lang.Throwable.<init>(Compiled Code) at java.lang.Exception.<init>(Compiled Code) at MeineAusnahme.<init>(AuswurfMeineAusnahme.java:3) at AuswurMeineAusnahme.f(Vererbung.java:14) at AuswurfmeineAusnahme.main(Vererbung.java:24) Auswurf von MeineAusnahme aus g() MeineAusnahme: Ursprung in g() at java.lang.Throwable.<init>(Compiled Code) at java.lang.Exception.<init>(Compiled Code) at MeineAusnahme.<init>(AuswurfMeineAusnahme.java:6) at AuswurfMeineAusnahme.g(AuswurfMeineAusnahme.java:19) at AuswurfMeineAusnahme.main(AuswurfMeineAusnahme.java:31) 83 Programmieren in Java 11. Übung 11. Übung 1. Aufgabe Implementiere das folgende Programm class EineWichtigeAusnahme extends Exception { public String toString() { return "Eine wichtige Ausnahme!"; } } class EineTrivialeAusnahme extends Exception { public String toString() { return "Eine triviale Ausnahme!"; } } public class VerlNachricht { void f() throws EineWichtigeAusnahme { throw new EineWichtigeAusnahme(); } void g() throws EineTrivialeAusnahme { throw new EineTrivialeAusnahme(); } public static void main(String args[]) throws Exception { VerlNachricht vn = new VerlNachricht(); try { vn.f(); } finally { vn.g(); } } } a) Welche Ausgabe zeigt dieses Programm? Ausgabe: Eine triviale Ausnahme! at.java.lang.Throwable.<init>(Compiled Code) at.java.lang.Exception.<init>(Compiled Code) at EineTrivialeAusnahme.<init>(VerlNachricht.java:8) at Verlnachricht.g(VerlNachricht.java:23) at Verlnachricht.main(VerlNachricht.java:32) 84 Programmieren in Java 11. Übung b) Interpretiere diese Ausgabe! EineWichtigeAusnahme wird in der finally-Klausel ersetzt durch EineTrivialeAusnahme c) Welche Schlußfolgerung kann daraus gezogen werden? schwerwiegender Sündenfall, der in einer der folgenden Java-Versionen behoben werden müßte. 2. Aufgabe a) Schreibe ein Programm, das von der Standardeingabe eingelesene Zeichen (Zeichenketten) auf die Standardausgabe ausgibt. b) Überprüfe anhand des unter a) entwickelten und implementierten Programms, welche Ausgaben zu folgenden Eingaben gehören: - Eingabe einer leeren Zeichenketten Eingabe von „end of file“ (EOF) (unter Solaris: CTRL-D; unter Windows: CTRL-C) import java.lang.*; import java.io.*; public class Echo extends Object { public static void main(String args[]) { BufferedReader ein = new BufferedReader(new InputStreamReader(System.in)); String eingabeZeile = null; try { eingabeZeile = ein.readLine(); } catch (IOException e) { System.out.println(e.toString()); System.exit(0); } System.out.println(eingabeZeile); } } 85 Programmieren in Java 11. Übung 3. Aufgabe Erstelle die Kopie einer Textdatei, deren Name über die Kommandozeile eingeben werden soll. import java.io.*; class DateiKopie { public static void main(String args[]) throws IOException { /* Java IO-Bytestrom DataInput ein = new DataInputStream(new FileInputStream("DateiKopie.java")); DataOutput aus = new DataOutputStream(new FileOutputStream("KopieDatei.java")); String zeile; while ((zeile = ein.readLine()) != null) { StringBuffer modifizierteZeile = new StringBuffer(zeile); aus.writeBytes(modifizierteZeile.toString()); System.out.println(modifizierteZeile.toString()); } */ BufferedReader ein; try { ein = new BufferedReader(new FileReader("DateiKopie.java")); } catch (FileNotFoundException a) { System.out.println("Datei kann nicht geoeffnet werden!"); throw a; } PrintWriter aus = new PrintWriter( new BufferedWriter( new FileWriter("KopieDatei.java"))); String s; try { while ((s = ein.readLine()) != null) { aus.println(s); } ein.close(); aus.close(); } catch (IOException a) { System.out.println("Fehler beim Kopieren der Datei"); throw a; } } } 86 Programmieren in Java 11. Übung 4. Aufgabe Bestimme die Größe einer Datei (in Bytes), deren Name über die Kommandozeile angegeben werden soll. Hinweis zur Lösung: Die Klasse InputStream des JDK 1.0 im Paket java.io enthält eine Methode available(), die die Anzahl Bytes eines Eingabestromobjekts zurückgibt import java.io.*; class DateiGroesse { public static void main(String argv[]) throws IOException { int dateiGroesse = -1; InputStream s; s = new FileInputStream("a:DateiDarsteller.java"); dateiGroesse = s.available(); System.out.print("Dateigroesse ist " + dateiGroesse + " bytes\n"); s.close(); } } 87 Programmieren in Java 11. Übung 5. Aufgabe Eine Textdatei, z.B. die Datei "EinAus.java", soll bis zum Dateiende (EOFException) sequentiell eingelesen werden. Jede einzelne Zeile soll nach dem Einlesen mit Hilfe der im Paket "java.io" vorliegenden Klasse LineNumberReader durchnummeriert und in eine Ausgabedatei geschrieben werden. Die Ausgabedatei soll dabei folgende Gestalt annehmen: /* 1 */ import java.io.*; /* 2 */ public class EinAus /* 3 */ { /* 4 */ public static void main(String args[]) throws IOException /* 5 */ { /* 6 */ String s = new String(); /* 7 */ ........................ /* 8 */ ........................ .................................. /* 21 */ ........................ /* 22 */ ........................ /* 23 */ } /* 24 */ } Die Klasse LineNumberReader ist eine Ableitung von BufferedReader, die zusätzlich die Anzahl der Eingabezeilen beim Einlesen zählen kann. Beim Einlesen ist ein vorzeitiges Ende der Eingabedatei abzufangen und speziell über die Standardausgabe zu kommentieren. import java.io.*; public class EinAus { public static void main(String args[]) throws IOException { String s = new String(); try { LineNumberReader ein = new LineNumberReader( new FileReader("EinAus.java")); PrintWriter aus = new PrintWriter( new BufferedWriter( new FileWriter("EinAusDemo.txt"))); while ((s = ein.readLine()) != null) aus.println("/* " + ein.getLineNumber() + " */ " + s); aus.close(); } catch (EOFException e) { System.out.println("Ende des Stroms"); } } } 88 Programmieren in Java 12. Übung 12. Übung 1. Aufgabe Schreibe ein Programm, das eine Textdatei (z.B. *.java“) aus dem aktuellen Verzeichnis über eine „TextArea“ auf ein Fenster des Bildschirms abbildet. Jede Zeile soll dabei durchnummeriert werden. Die Nummerierung ist in Kommentarzeilen einzuschließen. Zur Ermittlung der abzubildenen Datei ist ein „FileDialog“ heranzuziehen. Die Abbildung soll ein einem speziellen Font „Helvetica“, im Stil Font.Plain“ und mit der Fontgröße 10 erfolgen. Das Fenster soll nach der Anzeige vergrößert werden können und schließlich auch wieder geschlossen werden können. import java.awt.*; import java.io.*; import java.awt.event.*; public class Ueb601 extends Frame { private LineNumberReader ein; public Ueb601() throws IOException { FileDialog d = new FileDialog( this, "Welche Datei soll geoeffnet werden?"); d.setFile("*.java"); d.setDirectory("."); // Aktuelles Verzeichnis d.show(); String datei = "*.*"; if ((datei = d.getFile()) != null) { try { ein = new LineNumberReader(new FileReader(datei)); } catch ( FileNotFoundException a) { throw a; } // dateiName.setText(datei); // verzeichnis.setText(d.getDirectory()); try { dateiDarstellen(); } catch (IOException a ) { throw a; } } else { } } 89 Programmieren in Java 12. Übung public void dateiDarstellen() throws IOException { try { String s = new String(); TextArea textBereich = new TextArea(s,24,80); while ((s = ein.readLine()) != null) { s = "/* " + ein.getLineNumber() + " */ " + s + '\n'; textBereich.append(s); } textBereich.setFont(new Font("Helvetica",Font.PLAIN,10)); textBereich.setEditable(false); this.add("Center",textBereich); } catch (IOException e) { } this.show(); } public static void main(String args[]) throws IOException { Frame f = new Ueb601(); f.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setVisible(true); } } 90 Programmieren in Java 12. Übung 2. Aufgabe a) Schreibe ein Programm, das Celsius-Grade in Fahrenheit bzw. Fahrenheit- in Celsius-Grade umrechnet. Zur Eingabe bzw. zur Darstellung der Umrechnung benutze die folgenden beiden Textfelder. Aus deren Beschriftung geht hervor, welches der beiden Textfelder zur Eingabe bzw. Darstellung von Celsius-Graden bzw. Fahrenheit- dient. Ein- ubd Ausgabe sollen in ein Fenster einer grafischen Benutzeroberfläche erfolgen, das folgende Gestalt besitzt. import java.lang.*; import java.awt.*; import java.awt.event.*; public class C2F extends Frame { // Einlesen und Ausgeben von Zeichenketten ueber // eine grafische Benutzeroberflaeche private static TextField celsiusFeld = new TextField(10); private static TextField fahrenhFeld = new TextField(10); public static void main(String args[]) { Frame fenster = new Frame("Umrechnung Fahrenheit - Celsius"); fenster.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); Label celsiusFeldLabel = new Label("Celsius:"); Label fahrenhFeldLabel = new Label("Fahrenheit:"); celsiusFeld.setEditable(true); celsiusFeld.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { Float fRef = null; String s = celsiusFeld.getText(); try { fRef = new Float(s); } catch (NumberFormatException nfe) { System.err.println(nfe.toString()); } float gz = fRef.floatValue(); double temp; temp = gz * 9.0 / 5.0 + 32.0; String s1 = String.valueOf(temp); fahrenhFeld.setText(s1); } }); 91 Programmieren in Java 12. Übung fahrenhFeld.setEditable(true); fahrenhFeld.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { Float fRef = null; String s = fahrenhFeld.getText(); try { fRef = new Float(s); } catch (NumberFormatException nfe) { System.err.println(nfe.toString()); } float gz = fRef.floatValue(); double temp; temp = (gz - 32.0) * 5.0 / 9.0; String s1 = String.valueOf(temp); celsiusFeld.setText(s1); } }); Panel panel = new Panel(); panel.add(celsiusFeldLabel); panel.add(celsiusFeld); panel.add(fahrenhFeldLabel); panel.add(fahrenhFeld); // Frame fenster = new Frame("Echo"); fenster.add(panel); fenster.pack(); fenster.setVisible(true); } } 92 Programmieren in Java 12. Übung b) Schreibe ein Programm, das die Temperturwerte von 0 bis 300 Fahrenheit-Graden in Schritten von 20 Fahrenheit-Graden in Celsius-Grade umrechnet und in eine Datei ausgibt. import java.io.*; public class FnachC { public static void main(String args[]) { double fahr, celsius; double uWert, oWert, schritt; uWert = 0.0; oWert = 300.0; schritt = 20.0; fahr = uWert; try { PrintWriter aus = new PrintWriter( new BufferedWriter( new FileWriter("test.txt"))); while (fahr <= oWert) { celsius = 5.0 * (fahr - 32.0) / 9.0; aus.println(fahr + " " + celsius); fahr += schritt; } aus.close(); } catch (IOException a) { System.out.println("Fehler: " + a); System.exit(0); } } } 93 Programmieren in Java 12. Übung 3. Aufgabe Schreibe ein Programm, das das folgende Fenster erzeugt: Beim Aktivieren (Drücken einer der Schaltknöpfe soll die Hintergrundfarbe gemäß der auf den Schaltknöpfen angegebenen Farbe sich ändern, z.B.: „Beim Drücken des mit „rot“ beschrifteten Schaltknopfs, soll die Hintergrundfarbe des Fensters „rot“ werden. import java.awt.*; import java.awt.event.*; public class { Button b1 = Button b2 = Button b3 = Button b4 = Button b5 = Button b6 = Button b7 = Ueb603 extends Frame new new new new new new new Button("rot"); Button("blau"); Button("gruen"); Button("pink"); Button("orange"); Button("gelb"); Button("cyan"); public Ueb603() { // setLayout(new FlowLayout(FlowLayout.LEFT,20,20)); setLayout(new FlowLayout()); setBackground(Color.lightGray); b1.addActionListener(new B1L()); b2.addActionListener(new B2L()); b3.addActionListener(new B3L()); b4.addActionListener(new B4L()); b5.addActionListener(new B5L()); b6.addActionListener(new B6L()); b7.addActionListener(new B7L()); add(b1); add(b2); add(b3); add(b4); add(b5); add(b6); add(b7); // pack(); } 94 Programmieren in Java 12. Übung public class B1L implements ActionListener { public void actionPerformed(ActionEvent ae) { setBackground(Color.red); } } public class B2L implements ActionListener { public void actionPerformed(ActionEvent ae) { setBackground(Color.blue); } } public class B3L implements ActionListener { public void actionPerformed(ActionEvent ae) { setBackground(Color.green); } } public class B4L implements ActionListener { public void actionPerformed(ActionEvent ae) { setBackground(Color.pink); } } public class B5L implements ActionListener { public void actionPerformed(ActionEvent ae) { setBackground(Color.orange); } } public class B6L implements ActionListener { public void actionPerformed(ActionEvent ae) { setBackground(Color.yellow); } } public class B7L implements ActionListener { public void actionPerformed(ActionEvent ae) { setBackground(Color.cyan); } } 95 Programmieren in Java 12. Übung public static void main(String args[]) { Frame f = new Ueb603(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { // f.setVisible(false); System.exit(0); } }); f.setSize(100,150); f.setVisible(true); } } 4. Aufgabe Gegeben ist die folgende Darstellung einer grafischen Benutzeroberfläche mit CheckboxKomponenten: Label und Status der jeweils zuletzt aktivierten Komponente sollen in das im oberen Teil der Darstellung befindliche Textfeld eingetragen werden. Realisiere die Inplementierung der vorliegendenen Darstellung. import java.awt.*; import java.awt.event.*; public class Ueb703 extends Frame { TextField t = new TextField(100); Checkbox cb1 = new Checkbox("Checkbox 1"), cb2 = new Checkbox("Checkbox 2",true), cb3 = new Checkbox("Checkbox 3",false); 96 Programmieren in Java 12. Übung public Ueb703() { // setLayout(new FlowLayout(FlowLayout.LEFT,20,20)); setLayout(new BorderLayout()); Panel p = new Panel(); p.setLayout(new GridLayout(3,1)); setBackground(Color.lightGray); t.setEditable(true); cb1.addItemListener(new CBL()); cb2.addItemListener(new CBL()); cb3.addItemListener(new CBL()); add(t); p.add(cb1); p.add(cb2); p.add(cb3); add("North",t); add("Center",p); } public class CBL implements ItemListener { public void itemStateChanged(ItemEvent ie) { Checkbox cb = (Checkbox) ie.getItemSelectable(); t.setText(cb.getLabel() + ": " + cb.getState()); System.out.println(cb.getLabel() + ": " + cb.getState()); } } public static void main(String args[]) { Ueb703 f = new Ueb703(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { // f.setVisible(false); System.exit(0); } }); f.setSize(150,150); f.setVisible(true); } } 97 Programmieren in Java 12. Übung 5. Aufgabe Die folgende Darstellung zeigt ein Textfeld, dann auf der linken Seite eine CheckboxGroup mit drei Radio-Buttons, der auf der rechten Seite einen freien Bereich zur Hintergrund-Darstellung der jeweis über einen Radiobutton ausgewählten Farbe folgt. Realisiere die Implementierung der vorliegenden Darstellung. import java.awt.*; import java.awt.event.*; public class Ueb704 extends Frame { TextField t = new TextField(100); CheckboxGroup cbg = new CheckboxGroup(); public Ueb704() { // setLayout(new FlowLayout(FlowLayout.LEFT,20,20)); setLayout(new BorderLayout()); Panel p = new Panel(); p.setLayout(new GridLayout(3,1)); Checkbox cb1 = new Checkbox("rot",cbg,false); Checkbox cb2 = new Checkbox("blau",cbg,false); Checkbox cb3 = new Checkbox("gruen",cbg,false); // Checkbox cb4 = new Checkbox("pink",cbg,false); // Checkbox cb5 = new Checkbox("orange",cbg,false); add("North",t); cb1.addItemListener(new CBIL()); cb2.addItemListener(new CBIL()); cb3.addItemListener(new CBIL()); // cb4.addItemListener(new CBIL()); // cb5.addItemListener(new CBIL()); p.add(cb1); p.add(cb2); p.add(cb3); // p.add(cb4); // p.add(cb5); add("West",p); } 98 Programmieren in Java 12. Übung public class CBIL implements ItemListener { public void itemStateChanged(ItemEvent ie) { Checkbox cb = (Checkbox) ie.getItemSelectable(); if (cb.getLabel() == "rot") { if (cb.getState()) { t.setText("Radio Button rot"); setBackground(Color.red); } } if (cb.getLabel() == "blau") { if (cb.getState()) { t.setText("Radio Button blau"); setBackground(Color.blue); } } if (cb.getLabel() == "gruen") { if (cb.getState()) { t.setText("Radio Button gruen"); setBackground(Color.green); } } /* if (cb.getLabel() == "pink") { if (cb.getState()) { t.setText("Radio Button pink"); setBackground(Color.pink); } } if (cb.getLabel() == "orange") { if (cb.getState()) { t.setText("Radio Button orange"); setBackground(Color.orange); } } */ } } 99 Programmieren in Java 12. Übung public static void main(String args[]) { Ueb704 f = new Ueb704(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { // f.setVisible(false); System.exit(0); } }); f.setBackground(Color.lightGray); f.setSize(200,200); f.setVisible(true); } } 6. Aufgabe Das folgende Fenster einer grafischen Benutzeroberfläche zeigt ein Fenster mit einem Textfeld, dem ein Auswahlmenü folgt. Darunter befindet sich ein Bereich zur Darstellung der ausgewählten Farben im Hintergrund. Es sollen folgende Farben über das Auswahlmenü ausgewählt werden können: „rot“, „blau“, „gruen“, „orange“, „pink“, „gelb“, „cyan“. Die aktivierte Auswahl ist über Index und ItemEvent im Textfeld zu protokollieren. Realisiere eine Implementierung der vorliegenden Darstellung. import java.awt.*; import java.awt.event.*; public class Ueb705 extends Frame { TextField t = new TextField(100); Choice auswahl = new Choice(); public Ueb705() { auswahl.addItem("rot"); auswahl.addItem("blau"); auswahl.addItem("gruen"); auswahl.addItem("pink"); auswahl.addItem("orange"); auswahl.addItem("gelb"); auswahl.addItem("cyan"); t.setEditable(false); setLayout(new BorderLayout()); add("North",t); add("Center",auswahl); // pack(); auswahl.addItemListener(new AuswMerkmL()); } 100 Programmieren in Java 12. Übung class AuswMerkmL implements ItemListener { public void itemStateChanged(ItemEvent e) { t.setText("Index: " + auswahl.getSelectedIndex() + " " + e.toString()); if (auswahl.getSelectedItem() == "rot") { setBackground(Color.red); } else if (auswahl.getSelectedItem() == "blau") { setBackground(Color.blue); } else if (auswahl.getSelectedItem() == "gruen") { setBackground(Color.green); } else if (auswahl.getSelectedItem() == "pink") { setBackground(Color.pink); } else if (auswahl.getSelectedItem() == "orange") { setBackground(Color.orange); } else if (auswahl.getSelectedItem() == "gelb") { setBackground(Color.yellow); } else if (auswahl.getSelectedItem() == "cyan") { setBackground(Color.cyan); } } } public static void main(String args[]) { Ueb705 f = new Ueb705(); f.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setBackground(Color.lightGray); f.setSize(200,100); f.setVisible(true); } } 101 Programmieren in Java 12. Übung 7. Aufgabe Die vorliegende Darstellung zeigt ein Fenster einer grafischen Benutzeroberfläche. Das Fenster besteht aus einem linken und rechten Teil. Im linken Teil befindet sich eine „List“Komponente. Die Liste soll zunächst die Einträge „rot“, „blau“, „gruen“, „pink“ umfassen. Weitere Einträge sollen über Aktivierung derSchlatfläche mit dem Label „Test“ übernommen werden. Diese Eintäge sind: „orange“, „pink“, „gelb“, „cyan“. Auf der rechten Seite des Fensters ist eine „TextArea“ dargestellt. In diesen Textbereich sollen jeweils die ausgewählten (aktivierten) Einträge aus der Komponente List, wie die Abbildung zeigt, übernommen werden. Realisiere eine Implementierung des vorliegenden Fensters im Rahmen einer grafischen Benutzeroberfäche. import java.awt.*; import java.awt.event.*; public class Ueb706 extends Frame { String[] farben = {"rot","blau","gruen","pink","orange", "gelb","cyan"}; List lst = new List(6,true); Button b = new Button("Test"); TextArea t = new TextArea(farben.length,10); int zaehler = 0; public Ueb706() { setLayout(new GridLayout(1,2)); // setLayout(new FlowLayout()); Panel p1 = new Panel(); p1.setLayout(new BorderLayout()); Panel p2 = new Panel(); t.setEditable(false); for (int i = 0; i < 4; i++) lst.addItem(farben[zaehler++]); p2.add(t); // add("North",t); p1.add("Center",lst); p1.add("South",b); // add(t); // add(lst); // add(b); add(p1); add(p2); lst.addItemListener(new LL()); b.addActionListener(new BL()); } 102 Programmieren in Java 12. Übung public class LL implements ItemListener { public void itemStateChanged(ItemEvent ie) { t.setText(" "); String[] items = lst.getSelectedItems(); for (int i = 0; i < items.length; i++) t.append(items[i] + "\n"); } } class BL implements ActionListener { public void actionPerformed(ActionEvent e) { if (zaehler < farben.length) { lst.addItem(farben[zaehler++],0); } } } public static void main(String args[]) { Ueb706 f = new Ueb706(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { // f.setVisible(false); System.exit(0); } }); f.setBackground(Color.lightGray); f.setSize(240,160); f.setVisible(true); } } 103 Programmieren in Java 13. Übung Uebung 13 1. Aufgabe Das folgende Fenster soll erzeugt werden: Das Fenster besteht aus - - - drei Schiebereglern. Die Schieberegler sollen den Anfangswert 0 bis zum Höchstwert 255 abdecken. Der linke Schieberegler dient zum Einstellen der Farbe „rot“, der mittlere zum Einstellen der Farbe „grün“, der rechte Schieberegler dient zum einstellen der Farbe blau. Die drei Farben bilden die Grundlage des RBG-Farbmodells. Der wert 0 bedeutet, daß diese Grundfarbe nicht in das Farbmodell eingeht, der Wert 255 zeigt die maximale Intensität dieser Farbe an. RGBFarben werden durch das Tripel (r,g,b) dargestellt, die den jeweiligen Anteil der jeweiligen Grundfarbe in der Reihenfolge „rot“, gruen“, blau darstellen. Je nach Position des Schiebers soll das rechte Zeichenfeld die Hintergrundfarben annehmen, die dem jeweiligen Anteil an der Grundfarbe gemäß dem RBG-Farbmodell entspricht. drei Textfeldern. Die Textfelder enthalten den Wert des Schiebers der Schieberegler zugeordnet. Die über den Textfeldern angegebenen Labels zeigen die Zugehörigkeit zum jeweiligen Schieberegler an. einem Zeichenfeld, das durch seine Hintergrundfarbe die Mischung der Anteile der Farben nach dem RBG-Farbmodell anzeigt. einer mit Ruecksetzen beschriftete Schaltfläche. Das Drücken dieses Button bewirkt das Ruecksetzen des Schiebers und das Eintragen des Werts 0 in die Textfelder. Der Hintergrund des Zeichenfelds wird auf Color.lightGray gesetzt. import java.awt.*; import java.awt.event.*; public class Ueb91 extends Frame { Scrollbar vsbRot = new Scrollbar(Scrollbar.VERTICAL,0,10,0,255); Scrollbar vsbGruen = new Scrollbar(Scrollbar.VERTICAL,0,10,0,255); Scrollbar vsbBlau = new Scrollbar(Scrollbar.VERTICAL,0,10,0,255); Canvas z = new Canvas(); TextField t1 = new TextField(10); TextField t2 = new TextField(10); TextField t3 = new TextField(10); int r = 0; int g = 0; int b = 0; Button schalter = new Button("Ruecksetzen"); // static Ueb91 f = new Ueb91(); 104 Programmieren in Java 13. Übung public Ueb91() { setLayout(new BorderLayout()); Panel p1 = new Panel(); p1.setLayout(new GridLayout(1,3)); // Scrollbar vsbRot = new Scrollbar(Scrollbar.VERTICAL,0,10,0,255); vsbRot.addAdjustmentListener(new VsbRotAL()); // Scrollbar vsbGruen = new Scrollbar(Scrollbar.VERTICAL,0,10,0,255); vsbGruen.addAdjustmentListener(new VsbGruenAL()); // Scrollbar vsbBlau = new Scrollbar(Scrollbar.VERTICAL,0,10,0,255); vsbBlau.addAdjustmentListener(new VsbBlauAL()); p1.add(vsbRot); p1.add(vsbGruen); p1.add(vsbBlau); add("West",p1); Panel p2 = new Panel(); p2.setLayout(new GridLayout(6,1)); Label t1L = new Label("rot"); // t1.setEditable(false); Label t2L = new Label("gruen"); // TextField t2 = new TextField(10); t2.setEditable(false); Label t3L = new Label("blau"); // TextField t3 = new TextField(10); t3.setEditable(false); p2.add(t1L); p2.add(t1); p2.add(t2L); p2.add(t2); p2.add(t3L); p2.add(t3); add("Center",p2); Panel p3 = new Panel(); // p3.setSize(100,100); p3.setLayout(new BorderLayout()); // schalter.addActionListener(new BL()); p3.add("South",schalter); z.setSize(100,100); z.setBackground(Color.lightGray); p3.add("Center",z); add("East",p3); // pack(); } public class VsbRotAL implements AdjustmentListener { public void adjustmentValueChanged(AdjustmentEvent e) { // System.out.println("Wert: " + e.getValue()); r = e.getValue(); String s = String.valueOf(r); t1.setText(s); Color farbe = new Color(r,g,b); z.setBackground(farbe); } } 105 Programmieren in Java 13. Übung public class VsbGruenAL implements AdjustmentListener { public void adjustmentValueChanged(AdjustmentEvent e) { g = e.getValue(); String s = String.valueOf(g); t2.setText(s); Color farbe = new Color(r,g,b); z.setBackground(farbe); // System.out.println("Wert: " + e.getValue()); } } public class VsbBlauAL implements AdjustmentListener { public void adjustmentValueChanged(AdjustmentEvent e) { String s = String.valueOf(b); t3.setText(s); b = e.getValue(); Color farbe = new Color(r,g,b); z.setBackground(farbe); // System.out.println("Wert: " + e.getValue()); } } public class BL implements ActionListener { public void actionPerformed(ActionEvent e) { t1.setText("0"); t2.setText("0"); t3.setText("0"); vsbRot.setValue(0); vsbGruen.setValue(0); vsbBlau.setValue(0); z.setBackground(Color.lightGray); r = 0; b = 0; g = 0; } } public static void main(String args[]) { Ueb91 f = new Ueb91(); f.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setSize(300,200); f.setBackground(Color.lightGray); f.setVisible(true); } } 106 Programmieren in Java 13. Übung 2. Aufgabe Gesucht ist das Java-Programm, das eine grafische Benutzeroberfläche für ein bekanntes Spiel implementiert. Das Spiel besteht in dem wechselnden Einträgen von Kreuzen und Kreisen in ein zweidimensionales Gitter, das über das folgende Eingabefenster durch Betätigen des Schaltknopfes „go“ mit den in den beiden Textfeldern angegebenen Zeilen und Spalten erscheinen soll. In das zweidimensionale Gitter sollen die Gitterzellen Zeichenflächen („Canvas“) bilden, in die abwechselnd ein Kreuz und danach ein Kreis eingetragen werden muß. „Kreuz“ und „Kreis“ werden in die leeren Zeichenflächen abwechselnd nach einem Mouse-Klick auf die Zeichenfäche eingetragen, bis alle Zellen gefüllt sind. Das Fenster mit dem Titel „Das Spiel selbst“ kann geschlossen werden, mit „go“ kann ein neuer Versuch gestartet werden. import java.awt.*; import java.awt.event.*; public class Ueb101 extends Frame { TextField zeilen = new TextField("3"); TextField spalten = new TextField("3"); public Ueb101() { setTitle("Toe Test"); Panel p = new Panel(); p.setLayout(new GridLayout(2,2)); p.add(new Label("Zeilen",Label.CENTER)); p.add(zeilen); p.add(new Label("Spalten",Label.CENTER)); p.add(spalten); add(p,BorderLayout.NORTH); Button b = new Button("go"); b.addActionListener(new BL()); add(b,BorderLayout.SOUTH); } static final int BLANK = 0; static final int XX = 1; static final int OO = 2; 107 Programmieren in Java 13. Übung class ToeDialog extends Dialog { // b: Anzahl der Zellen in der Breite // h: Anzahl der Zellen in der Hoehe int wende = XX; public ToeDialog(int b, int h) { super(Ueb101.this,"Das Spiel selbst",false); setLayout(new GridLayout(b,h)); for (int i = 0; i < b * h; i++) add(new ToeButton()); setSize(b * 50, h * 50); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); } }); } class ToeButton extends Canvas { int zustand = BLANK; ToeButton() { addMouseListener(new ML()); } public void paint(Graphics g) { int x1 = 0; int y1 = 0; int x2 = getSize().width - 1; int y2 = getSize().height - 1; g.drawRect(x1, y1, x2, y2); x1 = x2 / 4; y1 = y2 / 4; int breite = x2 / 2; int hoehe = y2 / 2; if (zustand == XX) { g.drawLine(x1,y1,x1 + breite, y1 + hoehe); g.drawLine(x1,y1 + hoehe,x1 + breite,y1); } if (zustand == OO) { g.drawOval(x1,y1,x1 + breite / 2,y1 + hoehe / 2); } } 108 Programmieren in Java 13. Übung class ML extends MouseAdapter { public void mousePressed(MouseEvent e) { if (zustand == BLANK) { zustand = wende; wende = (wende == XX ? OO : XX); } else zustand = (zustand == XX ? OO : XX); repaint(); } } } } class BL implements ActionListener { public void actionPerformed(ActionEvent e) { Dialog d = new ToeDialog(Integer.parseInt(zeilen.getText()), Integer.parseInt(spalten.getText())); d.show(); } } public static void main(String args[]) { Ueb101 f = new Ueb101(); f.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setSize(200,100); // f.setBackground(Color.lightGray); f.setVisible(true); } } 109 Programmieren in Java 13. Übung 3. Aufgabe Das folgende Fenster ist in 4 Bereiche aufgeteilt. Die farbigen Flächen können auf alle möglichen Low-Level-Ereignisse reagieren. Die weiße Fläche reagiert nicht. Das jeweilige „Low-Level-Ereignis wird jeweils in Zeile 1 („AWTEvent“) der farbigen Flächen protokolliert.Zeile 2 zeigt jeweils das „ComponentEvent“ an. Zeile 3 und Zeile 4 stehen jeweils für die Ereigne MouseEvent bzw. MouseMotionEvent. Zeile 3 zeigt geweils das FocusEvent und Zeile 7 das KeyEvent. Zu Beginn hat das Fenster folgende Gestalt: Im Laufe der weiteren Verarbeitung kann das Fenster dann z.B. folgende Gestalt annehmen. import java.awt.*; import java.awt.event.*; class Display { public static final int EVENT = 0, COMPONENT = 1, MOUSE = 2, MOUSE_MOVE = 3, FOCUS = 4, KEY = 5, ACTION = 6, LAST = 7; public String[] ereignisse; Display() { ereignisse = new String[LAST]; for (int i = 0; i < LAST;i++) ereignisse[i] = new String(); } 110 Programmieren in Java 13. Übung public void show(Graphics g) { for (int i = 0; i < LAST; i++) g.drawString(ereignisse[i],0,10 * i +10); } } class ErmPanel extends Panel { Color farbe; int id; Display ausgabe = new Display(); public ErmPanel(int i, Color f) { id = i; farbe = f; setLayout(new BorderLayout()); add(new MeinSchalter(),BorderLayout.SOUTH); addComponentListener(new CL()); addFocusListener(new FL()); addKeyListener(new KL()); addMouseListener(new ML()); addMouseMotionListener(new MML()); } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { g.setColor(farbe); Dimension groesse = getSize(); g.fillRect(0,0,groesse.width,groesse.height); g.setColor(Color.black); ausgabe.show(g); } /* Beim Weiterreichen einer Nachricht wird innerhalb der Nachrichtenquelle die Methode processEvent aufgerufen. Diese verteilt Nachrichten anhand ihres Typs an spezialisierte Methoden, deren Name sich nach dem Typ der zugehörigen Ereignisquelle richtet, z.B. processActionEvent. processEvent bzw. processActionEvent wird nur aufgerufen, wenn der entsprechende Ereignistyp für die Ereignisquelle aktiviert wurde public void processEvent(AWTEvent e) { ausgabe.ereignisse[Display.EVENT] = e.toString(); repaint(); super.processEvent(e); } */ 111 Programmieren in Java 13. Übung class CL implements ComponentListener { public void componentMoved(ComponentEvent e) { ausgabe.ereignisse[Display.COMPONENT] = "componentMoved"; repaint(); } public void componentResized(ComponentEvent e) { ausgabe.ereignisse[Display.COMPONENT] = "componentResized"; repaint(); } public void componentHidden(ComponentEvent e) { ausgabe.ereignisse[Display.COMPONENT] = "componentHidden"; repaint(); } public void componentShown(ComponentEvent e) { ausgabe.ereignisse[Display.COMPONENT] = "componentShown"; repaint(); } } class FL implements FocusListener { public void focusGained(FocusEvent e) { ausgabe.ereignisse[Display.FOCUS] = "focusGained"; repaint(); } public void focusLost(FocusEvent e) { ausgabe.ereignisse[Display.FOCUS] = "focusLost"; repaint(); } } class KL implements KeyListener { public void keyPressed(KeyEvent e) { ausgabe.ereignisse[Display.KEY] = "keyPressed"; showCode(e); } public void keyReleased(KeyEvent e) { ausgabe.ereignisse[Display.KEY] = "keyReleased"; showCode(e); } public void keyTyped(KeyEvent e) { ausgabe.ereignisse[Display.KEY] = "keyTyped"; showCode(e); } 112 Programmieren in Java 13. Übung void showCode(KeyEvent e) { int code = e.getKeyCode(); ausgabe.ereignisse[Display.KEY] += KeyEvent.getKeyText(code); repaint(); } } class ML implements MouseListener { public void mouseClicked(MouseEvent e) { requestFocus(); ausgabe.ereignisse[Display.MOUSE] = "mouseClicked"; showMouse(e); } public void mousePressed(MouseEvent e) { ausgabe.ereignisse[Display.MOUSE] = "mousePressed"; showMouse(e); } public void mouseReleased(MouseEvent e) { ausgabe.ereignisse[Display.MOUSE] = "mouseReleased"; showMouse(e); } public void mouseEntered(MouseEvent e) { ausgabe.ereignisse[Display.MOUSE] = "mouseEntered"; showMouse(e); } public void mouseExited(MouseEvent e) { ausgabe.ereignisse[Display.MOUSE] = "mouseExited"; showMouse(e); } void showMouse(MouseEvent e) { ausgabe.ereignisse[Display.MOUSE] += ", x = " + e.getX() + ", y = " + e.getY(); repaint(); } } class MML implements MouseMotionListener { public void mouseDragged(MouseEvent e) { ausgabe.ereignisse[Display.MOUSE] = "mouseDragged"; showMouse(e); } 113 Programmieren in Java 13. Übung public void mouseMoved(MouseEvent e) { ausgabe.ereignisse[Display.MOUSE_MOVE] = "mouseMoved"; showMouse(e); } void showMouse(MouseEvent e) { ausgabe.ereignisse[Display.MOUSE_MOVE] += ", x = " + e.getX() + ", y = " + e.getY(); repaint(); } } } class MeinSchalter extends Button { int klickZaehler; String label = " "; public MeinSchalter() { addActionListener(new AL()); } public void paint(Graphics g) { g.setColor(Color.green); Dimension groesse = getSize(); g.fillRect(0,0,groesse.width,groesse.height); g.drawRect(0,0,groesse.width - 1, groesse.height - 1); drawLabel(g); } public void drawLabel(Graphics g) { FontMetrics fm = g.getFontMetrics(); int breite = fm.stringWidth(label); int hoehe = fm.getHeight(); int ascent = fm.getAscent(); int leading = fm.getLeading(); int horizMargin = (getSize().width - breite) / 2; int verMargin = (getSize().height - hoehe) / 2; g.setColor(Color.red); g.drawString(label,horizMargin, verMargin + ascent + leading); repaint(); } class AL implements ActionListener { public void actionPerformed(ActionEvent e) { klickZaehler++; label = "Klick # " + klickZaehler + " " + e.toString(); repaint(); } } } 114 Programmieren in Java 13. Übung public class PR14165 extends Frame { PR14165() { setLayout(new GridLayout(2,2)); add(new ErmPanel(1,Color.cyan)); add(new ErmPanel(2,Color.lightGray)); add(new ErmPanel(3,Color.yellow)); } public static void main(String[] args) { PR14165 f = new PR14165(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setSize(800,400); f.setVisible(true); } } 115 Programmieren in Java 13. Übung 4. Aufgabe Die folgende Abbildung Zeigt einige der wesentlichen Komponenten einer grafischen Benutzeroberfläche. Dafür ist ein JavaProgramm zu erstellen, das diese Komponenten der grafischen Benutzeroberfläche in einem Fenster realisiert. Wie die Abbildung zeigt, soll ein Menüleiste mit dem Menü „Menue“ und ein Auswahlmenü (rechts unten) erstellt werden. Das „Menue“ soll die Einträge „Menue Merkmal 1, Menue Merkmal 2, Menue Merkmal 3“ und dann getrennt durch eine Linie den Eintrag „Datei Dialog ...“ zeigen. Das Aktivieren von „Datei Dialog ...“ soll einen File-Dialog ermöglichen, allerdings ohne Konsequenzen (nur Anzeige des Dialogfensters). Das Auswahlmenü rechts unten soll die Einträge „Wahl Merkmal 1, Wahl Merkmal 2, Wahl Merkmal 3“ ermöglichen. Die Liste auf der rechten Seite soll 10 Einträge der angegebenen Art zeigen. Der Canvas auf der rechten Seite soll eine Linie zeigen, die drei Punkte verbindet. Die Punkte sind markiert und beschriftet. Die übrigen Komponenten sind durch die Beschriftung in der vorliegenden Abbildung eindeutig bestimmt. import java.awt.*; public class Ueb121 extends Frame { // boolean inAnApplet = true; final String dateiDialogMenueMerkmal = "Datei Dialog..."; public Ueb121() { Panel unteresPanel = new Panel(); Panel zentrPanel = new Panel(); setLayout(new BorderLayout()); //Setze den Menuebalken MenuBar mb = new MenuBar(); Menu m = new Menu("Menue"); m.add(new MenuItem("Menue Merkmal 1")); m.add(new CheckboxMenuItem("Menue Merkmal 2")); m.add(new MenuItem("Menue Merkmal 3")); m.add(new MenuItem("-")); m.add(new MenuItem(dateiDialogMenueMerkmal)); mb.add(m); setMenuBar(mb); // Fuege kleinere Dinge am Fenstergrund ein unteresPanel.add(new TextField("TextFeld")); unteresPanel.add(new Button("Button")); unteresPanel.add(new Checkbox("Checkbox")); Choice w = new Choice(); w.addItem("Wahl Merkmal 1"); w.addItem("Wahl Merkmal 2"); w.addItem("Wahl Merkmal 3"); 116 Programmieren in Java 13. Übung unteresPanel.add(w); add("South", unteresPanel); // Fuege groessere Dinge in den mittleren Bereich des Fenster zentrPanel.setLayout(new GridLayout(1,2)); // Lege einen Canvas in der linken Spalte an zentrPanel.add(new meinCanvas()); // Lege ein Label und einen Textbereich in der rechten Spalte an Panel p = new Panel(); p.setLayout(new BorderLayout()); p.add("North", new Label("Label", Label.CENTER)); p.add("Center", new TextArea("TextArea", 5, 20)); zentrPanel.add(p); add("Center", zentrPanel); // Lege eine Liste auf der rechten Seite des Fenster an List l = new List(3, false); for (int i = 1; i <= 10; i++) { l.addItem("Listen-Element " + i); } add("East", l); } public boolean action(Event event, Object arg) { // reagiert wird auf einen Datei-Dialog if (event.target instanceof MenuItem) { if (((String)arg).equals(dateiDialogMenueMerkmal)) { FileDialog fd = new FileDialog(this, "FileDialog"); fd.show(); } } return true; } public boolean handleEvent(Event event) { // Schliessen des Fensters if (event.id == Event.WINDOW_DESTROY) { // if (inAnApplet) // { dispose(); } /* else { */ System.exit(0); // } } return super.handleEvent(event); } public static void main(String args[]) { Ueb121 fenster = new Ueb121(); // fenster.inAnApplet = false; fenster.setTitle("AWT Komponenten"); fenster.pack(); fenster.show(); } } 117 Programmieren in Java 13. Übung class meinCanvas extends Canvas { public void paint(Graphics g) { int w = size().width; int h = size().height; g.drawRect(0, 0, w - 1, h - 1); g.drawString("Canvas", (w - g.getFontMetrics().stringWidth("Canvas"))/2, 10); g.setFont(new Font("Helvetica", Font.PLAIN, 8)); g.drawLine(10,10, 100,100); g.fillRect(9,9,3,3); g.drawString("(10,10)", 13, 10); g.fillRect(49,49,3,3); g.drawString("(50,50)", 53, 50); g.fillRect(99,99,3,3); g.drawString("(100,100)", 103, 100); } // Ohne die folgende Spezifikationen, wird der Canvas moeglicherweise // nicht alles wiedergeben. public Dimension minimumSize() { return new Dimension(150,130); } public Dimension preferredSize() { return minimumSize(); } } 5. Aufgabe Eine Textdatei (z.B. eine Java-Quelldatei) soll bearbeitet werden. Die Bearbeitung soll menügesteuert erfolgen. Dafür soll aus der Menüleiste das Menü „Datei“ mit folgenden Menüeinträgen: „Oeffnen, Schliessen, Sichern“ aufgerufen werden. Eine Aktivierung des Menü-Eintrags Oeffnen bewirkt die Aktion: - Aufruf des Standard-File-Dialogs Auswahl einer Datei über den File-Dilaog aus dem aktuellen Verzeichnis Kopieren der Datei in einen Textbereich mit Zeilennumerierung, so wie es in der 5. Übung, 5. Aufgabe bereits erfolgte. „Schliessen“ bewirkt die Aktion: Die unter „Oeffnen“ ausgewählte Datei wird ohne Sicherung geschlossen. „Sichern“ bewirkt die Aktion: Die unter „Oeffnen“ ausgewählte und in den Textbereich mit einem bestimmten Format kopierte Datei wird aus dem Textbereich über den File-Dialog in eine speziell ausgewählte Datei kopiert. import java.awt.*; import java.awt.event.*; import java.io.*; public class Ueb111 extends Frame { TextField dateiN = new TextField(); TextField verzeichnis = new TextField(); TextArea textBereich; MenuBar mb = new MenuBar(); Menu m = new Menu("Datei"); MenuItem oeffnen = new MenuItem("Oeffnen"), schliessen = new MenuItem("Schliessen"), sichern = new MenuItem("Sichern"); 118 Programmieren in Java 13. Übung String dateiName; LineNumberReader ein; public Ueb111() throws IOException { super("Ueb111"); // Hinzufuegen ActionListener oeffnen.addActionListener(new OeffnenL()); schliessen.addActionListener(new SchliessenL()); sichern.addActionListener(new SichernL()); // Hinzufuegen Menue-Eintraege m.add(oeffnen); m.add(schliessen); m.add(sichern); mb.add(m); // Installiere MenuBalken setMenuBar(mb); this.show(); } public void dateiDarstellen() throws IOException { String s = new String(); textBereich = new TextArea(s,24,80); try { ein = new LineNumberReader(new FileReader(dateiName)); while ((s = ein.readLine()) != null) { s = "/* " + ein.getLineNumber() + " */" + s + '\n'; textBereich.append(s); } textBereich.setFont(new Font("Helvetica",Font.PLAIN,10)); textBereich.setEditable(false); this.add("Center",textBereich); } catch ( FileNotFoundException a) { throw a; } catch ( IOException e ) { throw e; } this.show(); } class OeffnenL implements ActionListener { public void actionPerformed(ActionEvent e) { FileDialog d = new FileDialog( Ueb111.this, "Welche Datei soll geoeffnet werden?"); d.setFile("*.java"); d.setDirectory("."); // Aktuelles Verzeichnis d.show(); dateiName = "*.*"; if ((dateiName = d.getFile()) != null) { dateiN.setText(dateiName); verzeichnis.setText(d.getDirectory()); try { Ueb111.this.dateiDarstellen(); } catch ( IOException a) { } } 119 Programmieren in Java 13. Übung else { dateiN.setText("Cancel wurde gedrueckt!"); verzeichnis.setText(""); } } } class SichernL implements ActionListener { public void actionPerformed(ActionEvent e) { } } class SchliessenL implements ActionListener { public void actionPerformed(ActionEvent e) { FileDialog d = new FileDialog(Ueb111.this, "Welche Datei soll gesichert werden?", FileDialog.SAVE); d.setFile("*.java"); d.setDirectory("."); // Aktuelles Verzeichnis d.show(); String datei = "*.*"; if ((datei = d.getFile()) != null) { dateiN.setText(datei); verzeichnis.setText(d.getDirectory()); } else { dateiN.setText("Cancel wurde gedrueckt!"); verzeichnis.setText(""); } } } public static void main(String args[]) throws IOException { try { Ueb111 f = new Ueb111(); f.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setSize(350,400); f.setVisible(true); } catch (IOException e) { System.out.println(e); } } } 120 Programmieren in Java 14. Übung Uebung 14 Conway's Game of Life Game of Life ist eine Simulation, welche Zellen, die am Bildschirm als kleine Rechtecke, Pixel oder andere Grafiksymbole dargestellt. Jede einzelne Zelle kann entweder am Leben oder tot sein. (Dargestellt durch zwei unterschiedliche Farben) Ob eine einzelne Zelle am Leben ist oder nicht, entscheidet folgendes (Conway's) Regelwerk: ♦ ♦ ♦ Eine Zelle, die nicht am Leben ist wird genau dann geboren, wenn 3 Nachbarszellen am Leben sind. Eine Zelle, die bereits am Leben ist, kann nur dann überleben, wenn sie 2 oder 3 Nachbarzellen hat, die am Leben sind. (Jede Zelle hat 8 Nachbarzellen => Es sind auch diejenigen Zellen, die diagonal liegen sogenannte Nachbarzellen) Der Startwert einer Zelle ist eine Zufallsgröße. Sie können die Simulation entweder mit einem "toten Rand" oder einem "Wrap-Around Rand" erstellen. "Toter Rand" bedeutet, daß eine Zelle die am Rand oder einer Ecke des Feldes liegt, die nicht vorhandenen Nachbarzellen als "Tot" betrachtet; "Wrap Around" bedeutet, daß die Randzellen diejenigen als Nachbarzellen betrachten, die am Spielfeld gegenüber liegen. (Testen Sie dies am folgenden Applet mit Gliders und ein- bzw. ausgeschalteten Wrap Around) 121 Programmieren in Java 14. Übung Aufgabenstellung: Implementieren Sie eine Applikation, die ein Spielfeld von 100*100 Zellen simuliert. Eine Zelle hat eine Größe von 4x4 Pixel und die Größe des gesamten Frames sollte sinnvollerweise ca. 415 * 470 Pixel betragen. Der Button "Random" belegt das Spielfeld mit einer Zufallswerten. Der Button "Next" simuliert einen Generationswechsel Der Button "100 Steps" führt 100 Generationswechsel durch Zusatzaufgabe: Implementieren Sie einen Button, der das Spielfeld mit Gleitern besetzt (siehe Applet) Mit einem Checkbox-Element kann man "Wrap Around" ein- und ausschalten. Hinweis: Denken Sie bevor Sie zu programmieren beginnen darüber nach wie das "Rand-Problem" am besten zu bewältigen ist (Sowohl "Toter Rand" als auch "Wrap-Around".) import java.awt.*; import java.awt.event.*; import java.applet.*; public class Life extends Applet implements ActionListener, WindowListener, ItemListener { static final byte DEAD = (byte)0; static final byte ALIFE = (byte)1; byte generation1[ ][ ]; byte generation2[ ][ ]; Panel unten = new Panel (); Button next = new Button ("Next"); Button random = new Button ("Random"); Button gliders = new Button ("Gliders"); Button steps = new Button ("100 Steps"); Checkbox wrapAround = new Checkbox ("Wrap Around",true); static Color colorTab[] = {Color.black, Color.yellow}; int x=100,y=100; public public public public public public public void void void void void void void windowOpened(WindowEvent e) {} windowClosing(WindowEvent e) {System.exit(0);} windowClosed(WindowEvent e) {} windowIconified(WindowEvent e) {} windowDeiconified(WindowEvent e) {} windowActivated(WindowEvent e) {} windowDeactivated(WindowEvent e) {} public void init () { setLayout (new BorderLayout()); add ("South", unten); unten.setLayout (new FlowLayout ()); generation1 = new byte[x+2][y+2]; generation2 = new byte[x+2][y+2]; unten.add (random); unten.add (gliders); unten.add (next); unten.add (steps); unten.add (wrapAround); 122 Programmieren in Java 14. Übung random.addActionListener (this); gliders.addActionListener (this); next.addActionListener (this); steps.addActionListener (this); wrapAround.addItemListener (this); unten.setBackground (Color.yellow); wrapAround.setBackground (Color.yellow); setBackground (Color.black); for (int y=0;y<this.y+2;y++) for (int x=0;x<this.x+2;x++) generation2[x][y]=generation1[x][y]=DEAD; randomGeneration(); } public void actionPerformed (ActionEvent ae) { if (ae.getSource()==random) { randomGeneration (); } else if (ae.getSource()==next) { nextGeneration (); } else if (ae.getSource()==steps) { for (int i=0;i<100;i++) nextGeneration (); } else if (ae.getSource()==gliders) { setGliders (); } } public void itemStateChanged(ItemEvent ie) { for (int x=1;x<=this.x;x++) { generation1[x][0]=DEAD; generation1[x][this.y+1]=DEAD; generation2[x][0]=DEAD; generation2[x][this.y+1]=DEAD; } for (int y=0;y<this.y+2;y++) { generation1[0][y]=DEAD; generation1[this.x+1][y]=DEAD; generation2[0][y]=DEAD; generation2[this.x+1][y]=DEAD; } } public void paint (Graphics g) { for (int y=1;y<=this.y;y++) { for (int x=1;x<=this.x;x++) { g.setColor (colorTab[generation1[x][y]]); g.fillRect (x*4,y*4,3,3); } } } 123 Programmieren in Java 14. Übung void setGliders () { killAll (); long gliderData[] = {0x0436, 0x0562, 0x0361, 0x0235}; for (int count=0;count<10;count++) { int x = (int)(Math.random()*(this.x-10)+5); int y = (int)(Math.random()*(this.y-10)+5); long glider = gliderData [(int)(Math.random()*4)]; for (int i=0;i<4;i++) { for (int j=0;j<4;j++) { generation1 [x+i][y+j] = (byte)(glider&1); glider>>=1; } } } paint(getGraphics()); } void killAll () { for (int y=0;y<this.y+2;y++) { for (int x=0;x<this.x+2;x++) { generation1[x][y] = DEAD; } } } void randomGeneration () { for (int j=1;j<=y;j++) { for (int i=1;i<=x;i++) { generation1 [i][j] = (Math.random()<0.5)?ALIFE:DEAD; } } repaint (); } void nextGeneration () { if (wrapAround.getState()) { for (int x=1;x<=this.x;x++) { generation1[x][0]=generation1[x][this.y]; generation1[x][this.y+1]=generation1[x][1]; } for (int y=0;y<this.y+2;y++) { generation1[0][y]=generation1[this.x][y]; generation1[this.x+1][y]=generation1[1][y]; } } Graphics g = getGraphics(); byte sum,result; for (int y=1;y<=this.y;y++) { sum = generation1[0][y-1]; sum += generation1[0][y ]; sum += generation1[0][y+1]; sum += generation1[1][y-1]; sum += generation1[1][y ]; sum += generation1[1][y+1]; 124 Programmieren in Java 14. Übung for (int x=1;x<=this.x;x++) { sum += generation1[x+1][y-1]; sum += generation1[x+1][y ]; sum += generation1[x+1][y+1]; if (sum==3) result = ALIFE; else if (sum==4) result = generation1[x][y]; else result = DEAD; generation2[x][y] = result; if (result != generation1[x][y]) { g.setColor (colorTab [result]); g.fillRect (x*4,y*4,3,3); } sum -= generation1[x-1][y-1]; sum -= generation1[x-1][y ]; sum -= generation1[x-1][y+1]; } } byte swap[][] = generation1; generation1 = generation2; generation2 = swap; } static public void main (String args[]) { Frame life = new Frame("Game of Life"); Life applet = new Life(); applet.init(); life.add (applet); life.addWindowListener (applet); life.setBounds (100,100,415,470); life.setVisible (true); } } 125 Programmieren in Java 15. Übung 15. Übung 1. Aufgabe Entwurf und Implementierung eines Programms zur Darstellung einer Funktion y = f(x), z.B. y = e − 0. 3 x cos( 2 x ) . Die Darstellung der Funktion soll auf dem Bildschirm erfolgen und dort folgende Form annehmen: Die Funktion ist in einem Rechteck darzustellen, das die maximale Bildschirmbreite und Bildschirmhöhe umfaßt. Zur Einbettung ist der Ursprung des Koordinatensystems auf die Angaben XBreiteMin,. XBreiteMax, YHoeheOben, YHoeheUnten abzustimmen. Die vorliegende Skizze zeigt bspw. die Lage des Koordinatensystems für folgende Angaben: XBreiteMin = -2, XBreiteMax = 2, YHoeheOben = 1, YHoeheUnten = -1 Die Angaben zu der Einteilung der Koordinatenachsen sind im vorliegenden Fall DX = 0.5 bzw DY = 0.5 Die angegebenen Abmessungen sind im Dialog vom Benutzer des Programms einzugeben. Die Eingabe erfolgt in sog. Weltschirmkoordinaten, d.h. unabängig von der tatsächlichen Darstellung in den vorliegenden Bildschirmkoordinaten. Entwurf und Implementierung einer Umrechnungsroutine („Weltschirmkoordinaten in Bildschirmkoordinaten“) ist Bestandteil der Aufgabe. Die Benutzereingabe bestimmt weiterhin die Lage des Ursprungs des Koordinatensystems. So führt bspw. XBreiteMin = 0, XBreiteMax = 4, YHoeheOben = 1, YHoeheUnten = -1 zu der folgenden Darstellung: 126 Programmieren in Java 15. Übung Schließlich gibt der Benutzer noch die Anzahl der Stützstellen vor. Für diese Stellen wird der Funktionswert berechnet und nach der Umrechnung (Weltschirmkoordinaten in Bildschirmkoordinaten) in die Graphik eingetragen. a) Zunächst sollen nur die Koordinatenachsen gemäß der Vorgabe dargestellt werden. Die dafür notwendigen Funktionen sind zu entwerfen und zu implementieren. b) Danach soll die „Funktion“ eingezeichnet werden. Die Funktion ist Bestandteil des Programms. c) Ein Beschriftung der Koordinatenachsen ist vorzunehmen. Die Beschriftung soll mindestens die Werte zu XBreiteMin, XBreiteMax, YHoeheOben, YHoeheUnten enthalten. import java.awt.*; import java.awt.event.*; class Ueb152 extends Frame { final static double MAXX = 5.0; final static double MAXY = 1; Ueb152 () { super ("Funktions-Plotter"); setBounds (40,40,640,480); addWindowListener (new WindowAdapter() { public void windowClosing (WindowEvent we) { System.exit(0); } }); } public double function (double x) { return Math.sin(x) * Math.cos(x); // return Math.sin(x)*Math.sin(x)*Math.sin(x); // return Math.tan(x)/Math.pow(Math.sin(x),3); } 127 Programmieren in Java 15. Übung public double screenToWorldX(int x) { double midX = getSize().width/2; return ((x-midX)/midX)*MAXX; } public int worldToScreenX (double x) { double midX = getSize().width/2; return (int)((x/MAXX)*midX+midX); } public int worldToScreenY (double y) { double midY = getSize().height/2-30; return getSize().height - (int)((y/MAXY) * midY + midY)-20; } public void paint (Graphics g) { // horizontale Linie g.drawLine ( 0, worldToScreenY(0), getSize().width, worldToScreenY(0) ); // Verticale Linie g.drawLine ( worldToScreenX(0), worldToScreenY(MAXY), worldToScreenX(0), worldToScreenY(-MAXY) ); // Unterteilung der horizontalen Linie in 1er Schritte for (int i=(int)-MAXX;i<=(int)MAXX;i++) { g.drawLine ( worldToScreenX(i), worldToScreenY(0)-5, worldToScreenX(i), worldToScreenY(0)+5 ); } // Unterteilung der verticalen Linie in 1er Schritte for (int i=(int)-MAXY;i<=(int)MAXY;i++) { g.drawLine ( worldToScreenX(0)-5, worldToScreenY(i), worldToScreenX(0)+5, worldToScreenY(i) ); } // Zeichnen der Funktion for (int i=10;i<getSize().width-10;i++) { double x1 = screenToWorldX(i); double x2 = screenToWorldX(i+1); double y1 = function (x1); double y2 = function (x2); 128 Programmieren in Java 15. Übung g.drawLine ( i, worldToScreenY(y1), i+1, worldToScreenY(y2) ); } } public static void main (String args[]) { Ueb152 test = new Ueb152(); test.show(); } } 2. Aufgabe Darstellung des Random-Walk-Algorithmus in der Simulationstechnik am Beispiel des „drunken Sailor“. Ein Seemann mit viel Alkohol im Blut verläßt eine Kneipe und mach sich auf dem Weg zu seinem Schiff: Die Kneipe liegt in der Mitte des Darstellungsrahmens. Der Betrunkene macht immer gleich große Schritte (25 Pixeleinheitem) nur die Richtung ändert sich dauernd. Zur Vorhersage der Richtung benutzt man eine Zufallszahl zwischen 0 und 359 (Winkel zwischen Bewegungsrichtung und y-Achse). Schreibe ein Applet, das die Position des Betrunkenen auf dem Weg von der Kneipe berechnet, die Darstellung soll über die nächstliegenden Bildschirmkoordinaten erfolgen. Sobald der Heimkehrer die zur Verfügung stehende Zeichenfläche verlassen hat, wird in der Bildmitte eine weitere Saufkumpan auf den Weg geschickt, der seine Spur in einer anderen Farbe hinterläßt (insgesamt 16 Heimkehrer). import java.awt.*; import java.util.*; public class BetrSeemann extends java.applet.Applet implements Runnable { Thread faden; int xMax, yMax, xPos, yPos; Random rand = new Random(); Color farbe; 129 Programmieren in Java 15. Übung // Eigene Methoden int zRand(int mod) { return Math.abs(rand.nextInt() % mod); } // Ueberschriebene Methoden public void init() { setBackground(Color.lightGray); xMax = size().width; yMax = size().height; xPos = xMax / 2; yPos = yMax / 2; } public void start() { if (faden == null) { faden = new Thread(this); faden.start(); } } public void run() { for (int i = 1; i <= 16; i++) { farbe = new Color(255 / i, 16 * i - 1, (16 * i) % 255); repaint(); try { Thread.sleep(1000); } catch(InterruptedException e) { } xPos = xMax / 2; yPos = yMax / 2; } } public void update(Graphics g) { g.setColor(farbe); do { int winkel = zRand(359); g.drawLine(xPos,yPos, (int) (xPos+25*Math.cos(winkel*Math.PI/180.0)), (int) (yPos+25*Math.sin(winkel*Math.PI/180.0))); xPos = (int) (xPos+25*Math.cos(winkel*Math.PI/180.0)); yPos = (int) (yPos+25*Math.sin(winkel*Math.PI/180.0)); } while ((xPos < xMax) && (xPos > 0) && (yPos < yMax) && (yPos > 0)); } public void paint(Graphics g) { g.setColor(farbe); } } 130 Programmieren in Java 16. Übung 16. Übung 1. Aufgabe Schreibe ein Programm, das eine Textdatei (z.B. *.java“) aus dem aktuellen Verzeichnis über eine „TextArea“ auf ein Fenster des Bildschirms abbildet. Jede Zeile soll dabei durchnummeriert werden. Die Nummerierung ist in Kommentarzeilen einzuschließen. Zur Ermittlung der abzubildenen Datei ist ein „FileDialog“ heranzuziehen. Die Abbildung soll ein einem speziellen Font „Helvetica“, im Stil Font.Plain“ und mit der Fontgröße 10 erfolgen. Das Fenster soll nach der Anzeige vergrößert werden können und schließlich auch wieder geschlossen werden können. import java.awt.*; import java.io.*; import java.awt.event.*; public class Aufg1 extends Frame { private LineNumberReader ein; public Aufg1() throws IOException { FileDialog d = new FileDialog( this, "Welche Datei soll geoeffnet werden?"); d.setFile("*.java"); d.setDirectory("."); // Aktuelles Verzeichnis d.show(); String datei = "*.*"; if ((datei = d.getFile()) != null) { try { ein = new LineNumberReader(new FileReader(datei)); } catch ( FileNotFoundException a) { throw a; } // dateiName.setText(datei); // verzeichnis.setText(d.getDirectory()); try { dateiDarstellen(); } catch (IOException a ) { throw a; } } else { } } 131 Programmieren in Java 16. Übung public void dateiDarstellen() throws IOException { try { String s = new String(); TextArea textBereich = new TextArea(s,24,80); while ((s = ein.readLine()) != null) { s = "/* " + ein.getLineNumber() + " */ " + s + '\n'; textBereich.append(s); } textBereich.setFont(new Font("Helvetica",Font.PLAIN,10)); textBereich.setEditable(false); this.add("Center",textBereich); } catch (IOException e) { } this.show(); } public static void main(String args[]) throws IOException { Frame f = new Aufg1(); f.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setVisible(true); } } 132 Programmieren in Java 16. Übung 2. Aufgabe Erstelle eine Java-Anwendung, die ein Fenster mit einem grünen Oval zeigt: Der Fensterinhalt soll als Button fungieren. Falls dieser Button gedrückt wird (Mausklick) soll auf der Konsole „Befehlsausführung“ ausgegeben werden. Falls mit der Maus die Fensterfläche überstrichen wird, soll der Hintergrund „rot“ werden. Falls die Maus die Fensterfläche verlässt, soll der Anfangszustand, d.h. ein Hintergrung mit der Farbe „orange“, wiederhergestellt werden. import java.awt.*; import java.awt.event.*; class MeinButton extends Button { Aufg2 a; public MeinButton() { super(); setBackground(Color.orange); // Aktivierung des Filters enableEvents(AWTEvent.MOUSE_EVENT_MASK); } public MeinButton(Aufg2 a) { this(); this.a = a; } protected void processEvent(AWTEvent ae) { if (ae.getID() == MouseEvent.MOUSE_ENTERED) { setBackground(Color.red); } else if (ae.getID() == MouseEvent.MOUSE_EXITED) { setBackground(Color.orange); } else if (ae.getID() == MouseEvent.MOUSE_CLICKED) { a.test(); } super.processEvent(ae); } 133 Programmieren in Java 16. Übung public void paint(Graphics g) { Rectangle r = getBounds(); g.setColor(Color.green); g.fillOval(2,2,r.width-4,r.height-4); } } public class Aufg2 { public void test() { System.out.println("Befehsausfuehrung"); } public static void main(String [] args) { Aufg2 anw = new Aufg2(); Frame f = new Frame("ButtonTest"); f.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); MeinButton mb = new MeinButton(anw); f.add(mb); f.setSize(100,100); f.setVisible(true); } } 134 Programmieren in Java 16. Übung 3. Aufgabe Lies zwei ganze Zahlen über eine Eingabezeile ein und bestimme das Maximum dieser Zahlen. Die Ausgabe soll auf die Konsole erfolgen. // import java.lang.*; import java.io.*; import java.util.*; public class MaxTest { public static void main(String [ ] args) { BufferedReader ein = new BufferedReader( new InputStreamReader(System.in)); String eineZeile; StringTokenizer str; int x; int y; System.out.println("Eingabe 2er ganzen Zahlen auf eine Zeile"); try { eineZeile = ein.readLine(); str = new StringTokenizer(eineZeile); if (str.countTokens() != 2) throw new NumberFormatException(); x = Integer.parseInt(str.nextToken()); y = Integer.parseInt(str.nextToken()); System.out.println("Max: " + Math.max(x,y)); } catch(Exception e) { System.err.println( "Fehler: Zwei Eingaben sind noetig!"); } } } 135 Programmieren in Java 16. Übung 4. Aufgabe Schreibe eine Java-Anwendung, die Dateinamen über die Kommandozeile einliest und den Inhalt dieser (Text-) Dateien zeilenweise auf der Konsole ausgibt. Exceptions bzw. Fehlerbehandlungsmaßnahmen sind aufzufangen bzw. einzurichten. import java.io.*; public class Aufg4 { public static void listeDateien(String dateiName) { FileReader dieDatei; BufferedReader dateiEin = null; String eineZeile; System.out.println("Datei: " + dateiName); try { dieDatei = new FileReader(dateiName); dateiEin = new BufferedReader(dieDatei); while ((eineZeile = dateiEin.readLine()) != null) System.out.println(eineZeile); } catch(Exception e) { System.out.println(e); } try { if (dateiEin != null) dateiEin.close(); } catch(Exception e) { System.out.println(e); } } public static void main(String [] args) { if (args.length == 0) System.out.println("Keine Dateinamen angegeben!"); for (int i = 0; i < args.length; i++) listeDateien(args[i]); } } 136 Programmieren in Java 16. Übung 5. Aufgabe Schreibe ein Java-Anwendung, die den Text „Ein gutes, erfolgreiches neues Jahr“ in einem Lauffenster der Größe „300 mal 100“ ausgibt import java.awt.*; import java.util.*; public class Aufg5 extends Frame implements Runnable { Thread t; int x; public Aufg5() { x = 0; t = new Thread(this); t.start(); } public void paint(Graphics g) { g.drawString("Ein gutes, erfolgreiches neues Jahr",x,50); } public void run() { while (true) { try { if (x > getSize().width) x = 0; else x += 5; repaint(); t.sleep(100); } catch(InterruptedException e) { t.stop(); } } } public static void main(String [] args) { Aufg5 a = new Aufg5(); a.setSize(300,100); a.setVisible(true); } } 137