SWE-42 Ausdrucksbäume in verschiedenen Darstellungen Infix mit notwendigen Klammern: (a + b) / (c - d) Infix vollständig geklammert: (((a) + (b)) / ((c) - (d))) Postfix a b + c d - / Präfix / + a b - c d Objekte der Klasse BinTree: / © 1999 bei Prof. Dr. Uwe Kastens + a ~ - c b ~ ~ ~ d ~ Vorlesung Software-Entwicklung / Folie 42 Ziele: Darstellungen von Ausdrucksbäumen erlernen in der Vorlesung: • Baumdurchlauf links-abwärts • Postfix- und Präfix-Darstellung erzeugen Übungsaufgaben: Verständnisfragen: • Warum benötigt man Klammern nur in der Infix-Darstellung? ~ ~ SWE-43 Einfache Eingabefunktionen Zeichenfolgen von der Standardeingabe (Tastatur) lesen: Ein Objekt der Klasse BufferedReader aus der Bibliothek java.io wird mit dem Objekt System.in initialisiert und dessen Funktionen werden benutzt: import java.io.*; class Greetings { public static void main (String [] args) throws IOException { BufferedReader in = new BufferedReader (new InputStreamReader (System.in)); System.out.println ("What is your name?"); String name = in.readLine (); System.out.println ("Hello " + name); } } © 1999 bei Prof. Dr. Uwe Kastens in.readLine() liest bis zum nächsten Zeilenwechselzeichen oder bis zum Eingabeende und liefert die Zeichen davor als String-Objekt. throws IOException gibt an, daß ein Aufruf dieser Funktion E/A-Ausnahmen auslösen könnte (siehe SWE-48). Vorlesung Software-Entwicklung / Folie 43 Ziele: Direkte Verwendung von Bibliotheksklassen mit Eingabefunktionen in der Vorlesung: Erläuterungen dazu nachlesen: Judy Bishop: Java lernen, 3.Aufl., Abschnitt 4.1, 4.2 Übungsaufgaben: Tabellen drucken und Grenzen dafür einlesen Verständnisfragen: SWE-44 Java Gently‘s Text Class Vereinfacht interaktive Eingabedialoge mit Fehlerbehandlung. Benutzt E/A-Ströme wie in SWE-22 und SWE-43gezeigt. Einige Funktionen aus der Klasse Text: public public public public public static static static static static void int double String char prompt (String s); readInt (BufferedReader in); readDouble (BufferedReader in); readString (BufferedReader in); readChar (BufferedReader in); Beispiel von SWE-43: © 1999 bei Prof. Dr. Uwe Kastens import java.io.*; import javagently.*; class Greetings { public static void main (String [] args) throws IOException { BufferedReader in = Text.open (System.in); Text.prompt ("What is your name?"); String name = Text.readString (in); System.out.println ("Hello " + name); } } Vorlesung Software-Entwicklung / Folie 44 Ziele: E/A-Unterstützung speziell für Anfänger in der Vorlesung: Am Beispiel erläutern nachlesen: Judy Bishop: Java lernen, 3.Aufl., Abschnitt 4.1, 4.2 Übungsaufgaben: • Weitere E/A-Dialoge programmieren • Verhalten bei Eingabefehlern erproben Verständnisfragen: • Warum ist Eingabe technisch komplizierter als Ausgabe? SWE-45 Eingabe von Zahlenfolgen Es sollen Zahlenfolgen unterschiedlicher Länge gelesen werden. Die Länge wird erst bei der Ausführung des Programms bestimmt. 4 Techniken dazu: 1. Länge interaktiv erfragen; dann entsprechend viele Elemente lesen (SWE-46). 2. Auf der Eingabedatei die Angabe der Länge den Elementen voranstellen, dann entsprechend viele Elemente lesen (SWE-47). 3. Leseschleife am Eingabeende durch eine Ausnahmebehandlung beenden (SWE-48). 4. Einen speziellen Wert, der nicht in der Folge vorkommen kann, als Endezeichen (Sentinel) anfügen. © 1999 bei Prof. Dr. Uwe Kastens Beispiel siehe SWE-46. Vorlesung Software-Entwicklung / Folie 45 Ziele: Nützliche Eingabetechniken parat haben in der Vorlesung: (1) und (4) erläutern, siehe SWE-46 nachlesen: Judy Bishop: Java lernen, 3.Aufl., Abschnitt 4.1, 4.2 Übungsaufgaben: Technik (1) implementieren und zu (4) verändern Verständnisfragen: Welche Fehlersituationen können bei (1) und (4) auftreten? SWE-46 Eingabe von Zahlenfolgen, Beispiel 1 Technik 1: Länge interaktiv erfragen; dann entsprechend viele Elemente lesen. import java.io.*; import javagently.*; public class Summation1 { public static void main(String[] args) throws IOException { BufferedReader in = Text.open (System.in); © 1999 bei Prof. Dr. Uwe Kastens Text.prompt ("How many numbers?"); int count = Text.readInt (in); // Länge interaktiv erfragen double total = 0; for (int i = 1; i <= count; i++) // Leseschleife { Text.prompt (i + ">"); double number = Text.readDouble(in); total += number; } System.out.println ("That's enough, thanks."); System.out.println ("The total is " + total); } } Vorlesung Software-Entwicklung / Folie 46 Ziele: Implementierung zu SWE-45(1) in der Vorlesung: Erläuterungen zusammen mit SWE-45 nachlesen: Judy Bishop: Java lernen, 3.Aufl., Abschnitt 4.1, 4.2 Übungsaufgaben: Verständnisfragen: SWE-47 Ein- und Ausgabe mit Dateien Statt der vordefinierten Dateiobjekte System.in, System.out werden neue Dateiobjekte für Dateien unter deren Dateinamen (Unix-Pfad) von den Funktionen Text.open und Text.create erzeugt: statt Standardeingabe: BufferedReader in = Text.open (System.in); Eingabedatei: BufferedReader in = Text.open ("numbers.in"); Ausgabedatei: PrintWriter out = Text.create ("totals.out"); Im Beispiel SWE-46 nur die Erzeugung des Dateiobjektes und das Lesen der Länge ändern: © 1999 bei Prof. Dr. Uwe Kastens BufferedReader in = Text.open ("numbers.in"); int count = Text.readInt (in); // Länge von der Datei lesen // Lesen der Werte wie in SWE-46 Vorlesung Software-Entwicklung / Folie 47 Ziele: Nur kleine Änderungen beim Übergang zu Dateien in der Vorlesung: Erläuterungen dazu nachlesen: Judy Bishop: Java lernen, 3.Aufl., Abschnitt 4.2, 4.5 Übungsaufgaben: Ändern Sie das Programm so, daß der Dateiname interaktiv erfragt wird Verständnisfragen: SWE-48 Ausnahmebehandlung Ausnahmen signalisieren Fehler oder ungewöhnliche Situationen bei der Programmausführung. In robusten Programmen sollen sie abgefangen und behandelt werden. Ein try-Block wird mit einer oder mehreren Ausnahmebehandlungen (catch-Block) versehen. Wird im try-Block eine Ausnahme ausgelöst, so wird sofort der catch-Block dazu ausgeführt. Dies geschieht wie ein spontaner Aufruf eines passenden catch-Blockes als Funktion mit dem Ausnahmeobjekt als Parameter. Beispiel: Einlesen einer Zahlenfolge Technik (3): © 1999 bei Prof. Dr. Uwe Kastens try { for (int i = 1; /* keine Bedingung */; i++) // Leseschleife { Text.prompt (i + ">"); double number = Text.readDouble(in); total += number; } } catch (EOFException e) // der Parametertyp wählt die Ausnahme aus { System.out.println ("That's enough, thanks."); System.out.println ("The total is " + total); } Vorlesung Software-Entwicklung / Folie 48 Ziele: Elementare Ausnahmebehandlung verstehen in der Vorlesung: Erläuterungen dazu nachlesen: Judy Bishop: Java lernen, 3.Aufl., Abschnitt 4.6 Übungsaufgaben: Programm zum sicheren Benutzen von Dateien entwickeln Verständnisfragen: Nennen Sie Beispiele aus früher geschriebenen Programmen, die durch sinnvollen Einsatz von Ausnahmebehandlung robuster gemacht werden können.