Ausdrucksbäume in verschiedenen Darstellungen SWE-42 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: / + - a b c d ~ ~ ~ ~ ~ ~ ~ Vorlesung Software-Entwicklung / Folie 42 Darstellungen von Ausdrucksbäumen erlernen Baumdurchlauf links-abwärts Postfix- und Präfix-Darstellung erzeugen Warum benötigt man Klammern nur in der Infix-Darstellung?
Einfache Eingabefunktionen SWE-43 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); 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 Direkte Verwendung von Bibliotheksklassen mit Eingabefunktionen Erläuterungen dazu Tabellen drucken und Grenzen dafür einlesen
Java Gently s Text Class SWE-44 Vereinfacht interaktive Eingabedialoge mit Fehlerbehandlung. Benutzt E/A-Ströme wie in SWE-22 und SWE-43gezeigt. Einige Funktionen aus der Klasse Text: public static void prompt (String s); public static int readint (BufferedReader in); public static double readdouble (BufferedReader in); public static String readstring (BufferedReader in); public static char readchar (BufferedReader in); Beispiel von SWE-43: 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 E/A-Unterstützung speziell für Anfänger Am Beispiel erläutern Weitere E/A-Dialoge programmieren Verhalten bei Eingabefehlern erproben Warum ist Eingabe technisch komplizierter als Ausgabe?
Eingabe von Zahlenfolgen SWE-45 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. Beispiel siehe SWE-46. Nützliche Eingabetechniken parat haben (1) und (4) erläutern, siehe SWE-46 Technik (1) implementieren und zu (4) verändern Welche Fehlersituationen können bei (1) und (4) auftreten? Vorlesung Software-Entwicklung / Folie 45
Eingabe von Zahlenfolgen, Beispiel 1 SWE-46 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); Text.prompt ("How many numbers?"); int count = Text.readInt (in); // Länge interaktiv erfragen double total = 0; for (int i = 1; i <= count; i++) { Text.prompt (i + ">"); double number = Text.readDouble(in); total += number; System.out.println ("That's enough, thanks."); System.out.println ("The total is " + total); // Leseschleife Vorlesung Software-Entwicklung / Folie 46 Implementierung zu SWE-45(1) Erläuterungen zusammen mit SWE-45
Ein- und Ausgabe mit Dateien SWE-47 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: 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 Nur kleine Änderungen beim Übergang zu Dateien Erläuterungen dazu Judy Bishop: Java lernen, 3.Aufl., Abschnitt 4.2, 4.5 Ändern Sie das Programm so, daß der Dateiname interaktiv erfragt wird
Ausnahmebehandlung SWE-48 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): 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); Elementare Ausnahmebehandlung verstehen Erläuterungen dazu Judy Bishop: Java lernen, 3.Aufl., Abschnitt 4.6 Programm zum sicheren Benutzen von Dateien entwickeln Vorlesung Software-Entwicklung / Folie 48 Nennen Sie Beispiele aus früher geschriebenen Programmen, die durch sinnvollen Einsatz von Ausnahmebehandlung robuster gemacht werden können.