Zusatzübung Abgabetermin: 1. 3. 2006 Name: Matrikelnummer: Gruppe: G1 (Löberbauer) G2 (Prähofer) G3 (Prähofer) Aufgabe Punkte gelöst abzugeben schriftlich abzugeben elektronisch korr. Pkte Aufgabe 11.1 12 Prosabeschreibung, Aufgabe 11.2 12 Prosabeschreibung, Aufgabe 11.3 12 Prosabeschreibung, Aufgabe 11.4 12 Prosabeschreibung, Aufgabe 11.5 12 Prosabeschreibung, Aufgabe 11.6 12 Prosabeschreibung,
Aufgabe 11_1: Näherungsweise Berechnung der Exponentialfunktion e x Der Wert der Exponentialfunktion e x für ein gegebenes x kann mit Hilfe der Taylorreihe x 1 2 1 3 1 4 1 5 y( x) = e = 1+ x + x + x + x + x + 2! 3! 4! 5! angenähert werden. Entwickeln Sie ein das die Werte der Exponentialfunktion für alle Werte in einem variablen Wertebereich x = [ x a x e ] an durch eine variable Schrittweite dx bestimmten Stellen mit einer variablen Fehlerschranke ε berechnet und ausgibt. Für jeden näherungsweise berechneten Funktionswert soll auch der exakte Wert der Exponentialfunktion (mittels Math.exp(x)) und der Fehler f ( x) = yexakt ( x) y genaehert ( x) ausgegeben werden, wohl wissend, dass man keinen wirklich exakten Funktionswert ermitteln kann. Eine Sitzung soll folgendermaßen aussehen: Bitte geben Sie den Startpunkt ein: 0 Bitte geben Sie den Endpunkt ein: 10 Bitte geben Sie die Schrittweite ein: 1 Bitte geben Sie die Fehlerschranke ein: 0.001 # x exp(x)(genähert) exp(x)(exakt) Fehler 1: 0.0 1.0 1.0 0.0 2: 1.0 2.7182539682539684 2.7182818284590455 2.7860205077168132E-5 3: 2.0 7.388994708994708 7.38905609893065 6.138993594273501E-5 4: 3.0 20.08546859390609 20.085536923187668 6.832928157862739E-5 5: 4.0 54.5978829056501 54.598150033144236 2.6712749413349E-4 6: 5.0 148.4129510721643 148.4131591025766 2.0803041229555674E-4 7: 6.0 403.42863583131975 403.4287934927351 1.5766141535777933E-4 8: 7.0 1096.6330406760985 1096.6331584284585 1.1775235998356948E-4 9: 8.0 2980.957677782414 2980.9579870417283 3.0925931423553266E-4 10: 9.0 8103.08370349121 8103.083927575384 2.2408417407859815E-4 11: 10.0 22026.465632423035 22026.465794806718 1.6238368334597908E-4 Tipp: Die Berechnung des Näherungswertes soll abbrechen, sobald der Beitrag eines Terms zur Näherung kleiner als oder gleich der Fehlerschranke ε ist.
Aufgabe 11_2: Multiplikation Matrix mit Vektor Die Multiplikation einer Matrix A (mit n Zeilen und m Spalten) mit einem Vektor b (der Länge m) ist folgend definiert: m 1 ci = Aijbj, i = 1.. n j= 0 (Hinweis: damit ist das Ergebnis ein Vektor c der Länge n.) Beispiel einer Multiplikation einer Matrix mit einem Vektor: 2.0 1.0 4.0 0.0 1.0 3.0 2.0 1.0 + 4.0 2.0 3.0 6.0 8.0 2.0 = = 6.0 1.0 1.0 + 0.0 2.0 + 6.0 6.0 37 6.0 Entwickeln Sie ein Programm, das eine Matrix A und einen Vektor b einliest, die Multiplikation durchführt und das Ergebnis schön formatiert ausgibt. Implementieren Sie eigene Methoden für: das Einlesen der Matrix (um das Einlesen zu erleichtern, sollen zuerst die Dimensionen der Matrix, d.h. Anzahl der Zeilen n und Spalten m, eingelesen werden) das Einlesen des Vektors (d.h. Einlesen der Länge des Vektors und Einlesen der Werte) die Multiplikation der Matrix mit dem Vektor die Ausgabe des Ergebnisvektors Gehen Sie bei der Lösung folgend vor: Beschreiben Sie alle Methoden in Prosa. Verwenden Sie für die Beschreibung der Operationen Notationen wie z.b.: für alle Zeilen i von 0 bis n-1 oder für alle Spalten j von 0 bis m-1 Implementieren Sie das Verfahren in Java Stellen Sie für jede Methode einzeln einen Testplan auf und testen Sie die Methoden.
Aufgabe 11.3: Autokorrektur Schreiben Sie ein welches einen Text (Folge von Zeichen) von einer Datei einliest, wie folgt korrigiert und die korrigierte Version auf eine Ausgabedatei ausgibt: a) Mehr als einmal auftretende Leerzeichen und Tabulatoren sind zu eliminieren. Am Anfang des Textes soll überhaupt kein Leerzeichen kommen. Bsp: " Das Wetter ist schön. -> "Das Wetter ist schön." b) Nach einem Satzzeichen (hierzu zählen:.!?) sowie ganz am Anfang soll der erste Buchstabe, wenn nötig, in einen Großbuchstaben konvertiert werden. Bsp: "heute schön! morgen regen. -> "Heute schön! Morgen regen." Gehen Sie bei der Lösung folgend vor: 1. Machen Sie eine genaue Problemanalyse, d.h., überlegen Sie, wie man als Mensch an die Aufgabe herangehen würde. Beschreiben Sie dann in wenigen Worten die grundsätzliche Idee zu dem Verfahren. 2. Beschreiben Sie das Verfahren in Prosa. 3. Implementieren Sie das Verfahren in Java, indem Sie das in Prosa beschriebene Verfahren in Java umsetzen. Verwenden Sie Methoden für klar definierte Aufgaben. 4. Legen Sie sich eine Testdatei an, welche die wichtigen Testfälle beinhaltet. Hinweis: Lösen Sie die Aufgabe in 2 Schritten. Überlegen Sie sich eine Lösung für a) und implementieren Sie diese Lösung. Überlegen Sie sich dann eine Lösung für b) und bauen Sie die Lösung von b) in die Lösung von a) ein.
Aufgabe 11_4: Römische Zahlen Schreiben Sie eine Klasse RomanNumber für die Darstellung römischer Zahlen. Objekte dieser Klasse sollen aus einer Zahl (vom Datentyp int) oder einer römischen Zahl (vom Datentyp String) erzeugt werden können. Auf RomanNumber-Objekte sollen Methoden zum Ermitteln des numerischen Wertes (als int) und zur Darstellung als römische Zahl (Datentyp String) angewendet werden können. Es soll auch möglich sein, Zahlen zwischen den beiden Darstellungen (int/string) umzuwandeln, ohne dafür erst ein Objekt der Klasse RomanNumber erzeugen zu müssen. Beim Umwandeln müssen folgende Regeln eingehalten werden: I steht nur vor V oder X, X nur vor L oder C, C nur vor D oder M: 99=XCIX (nicht IC), 999=CMXCIX (nicht IM) I, X und C stehen nur vor maximal einem höherwertigen Symbol: 19=XIX (nicht IXX), 190=CXC (nicht XCC) Wird ein Objekt der Klasse RomanNumber aus einer Zeichenkette erzeugt, so sind auch abweichende Darstellungen (wie z.b. IC=99, IXX=19, IIII=4) erlaubt. Beim Umwandeln in eine Zeichenkette soll dann auch die beim Erzeugen des Objekts angegebene Darstellung zurückgegeben werden. Beispiel: RomanNumber x=new RomanNumber(99), y=new RomanNumber("IC"); IO.writeLn(x.toInt()); // 99 IO.writeLn(x.toString()); // XCIX IO.writeLn(y.toInt()); // 99 IO.writeLn(y.toString()); // IC Hinweise: Gibt es für eine Zahl keine römische Darstellung (also 0 oder negative Zahlen), soll das durch die Zeichenkette "???" ausgedrückt werden. Definieren Sie hierfür eine Konstante. Achten Sie darauf, daß etwaige Hilfsmethoden, die nur innerhalb der Klasse verwendet werden, von außen nicht zugänglich sind. Römische Zahlen, die nicht zulässige Symbole enthalten, sollen als 0 dargestellt werden. Wie Sie mit unsinnigen Kombinationen aus gültigen Symbolen umgehen (wie z.b. LDDCCMD), bleibt Ihnen überlassen.
Aufgabe 11_5: Telefonbuch 12 Punkte a) Implementieren Sie ein Telefonbuch (Klasse PhoneBook) mit einer Funktionalität, wie sie (einfache) Telefonbücher auf Handys aufweisen. Jeder Telefonbucheintrag (Klasse Entry) bestehe aus Namen, Vorwahl und Nummer. Im Telefonbuch sollen die Einträge nach dem Namen sortiert sein. Das Telefonbuch soll folgende Operationen unterstützen: void insertentry(entry e) fügt einen neuen Eintrag in das Telefonbuch ein, Entry firstentry() liefert den ersten Eintrag im Telefonbuch, Entry nextentry() liefert den jeweils nächsten Eintrag im Telefonbuch, Entry lookupentry(string name) liefert den Eintrag mit gegebenen Namen, Hinweise: Für die Speicherung der Telefonbucheinträge in aufsteigender Reihenfolge eignet sich eine sortierte lineare Liste. Orientieren Sie sich bei Ihrer Implementierung an der in der Vorlesung besprochenen Implementierung sowie der linearen Liste in Übung 6. Für den Vergleich der Namen sollten sie die Methoden comparetoignorecase und equalsignorecase der Klasse String verwenden. Zur Vereinfachung der Aufgabe sollen in Namen nur die Standardzeichen A bis Z und a bis z und keine Sonderzeichen wie Ä, Ö, ü, etc. verwendet werden. b) Schreiben Sie einen Dialog (nur Text-basiert), mit dem ein Benutzer das Telefonbuch bearbeiten kann. In einer Schleife soll zuerst ein Operationscode eingelesen, daraufhin eventuell benötigte Daten gelesen, die Operation ausgeführt und schließlich das Ergebnis ausgegeben werden. Beispieldialog: Telefonbuch =========== Folgende Operationen stehen zur Verfügung: i - insert: Einfügen eines Eintrags f - first: ersten Eintrag anzeigen n - next: nächsten Eintrag anzeigen s - search: eine Eintrag nach Namen nachschlagen q - quit: Programm verlassen Bitte Operation auswählen: (i, f, n, s, q): i Bitte Namen eingeben: Gustav Bitte Vorwahl eingeben: 1 Bitte Nummer eingeben: 698634 Bitte Operation auswählen: (i, f, n, s, q): i Bitte Namen eingeben: franz Bitte Vorwahl eingeben: 565 Bitte Nummer eingeben: 234342 Bitte Operation auswählen: (i, f, n, s, q): s Bitte Namen eingeben: franz --> franz: (0565) 234342 Bitte Operation auswählen: (i, f, n, s, q): n --> Gustav: (01) 698634 Bitte Operation auswählen: (i, f, n, s, q): q --> Ende
Aufgabe 11_6: Buchstabenindex für Telefonbuch 12 Punkte Implementieren Sie einen Buchstabenindex (Klasse PhoneBookIndex) für das Telefonbuch aus Aufgabe 1. Über den Index soll es möglich sein, direkt zum ersten Eintrag eines gegebenen Buchstabens zu gelangen (gibt es keinen Eintrag für den Buchstaben, soll man zum ersten Eintrag nach diesem Buchstaben gelangen). Index a b c d e f g h i Entries Alex 699 2471293 Alois 7221 63152 Edith 650 2341282 Florian 2342 3472942 Franz 732 2374092 Fritz 7433 9274219 Gustav 7732 293420 Hans 1 29342923 Helmut 3322 23472 Erweitern Sie dann die Klasse PhoneBook um eine Methode Entry firstentrywithchar(char ch) welche den ersten Eintrag mit Buchstaben ch liefert (bzw. den ersten Eintrag nach dem Buchstaben ch, wenn kein Eintrag mit Buchstaben ch existiert). Erweitern Sie den Dialog aus Aufgabe 1.b um eine weitere Operation c - character: ersten Eintrag nach bestimmten Buchstaben anzeigen mit der direkt zum ersten Eintrag eines einzulesenden Buchstabens gesprungen wird. Beispieldialog: Bitte Operation auswaehlen: (i, f, n, s, c, q): c Bitte Buchstaben eingeben: a --> alois: (0446) 2342323 Bitte Operation auswaehlen: (i, f, n, s, c, q): c Bitte Buchstaben eingeben: f --> franz: (0565) 234342