Universität Karlsruhe SS 2005 Institut für Angewandte Mathematik II • Einen Operator >> für die Eingabe eines Intervalls. Es sind nur die beiden Intervallkomponenten einzulesen. Sonderzeichen sind nicht zu berücksichtigen. Beachten Sie x ≤ x. • Einen Operator << für die Ausgabe eines Intervalls in der Form Dr. K. Grüner Dipl.-Math. J.-P. Weiß 7. Juni 2005 Praktikum zu Einstieg in die Informatik und algorithmische Mathematik Programmieren mit C++ Aufgabenblatt 8 Bearbeitungszeitraum: 8. Juni - 21. Juni 2005 Aufgabe 22: Rechnen mit Intervallen [inf, sup] Schreiben Sie schließlich ein Hauptprogramm, das • zwei Intervalle a und b vereinbart und diese einliest, • a, b, a+b und den Abstand von a und b ausgibt. Verwenden Sie im Hauptprogramm die selbstdefinierten Funktionen und Operatoren. Pflichtaufgabe bis 21. Juni! Aufgabe 23: Endliche Kettenbrüche Pflichtaufgabe bis 21. Juni! Ein reelles Intervall [x] ist definiert durch [x] := [x, x] := {x ∈ IR | x ≤ x ≤ x} Es enthält sämtliche reellen Zahlen, die zwischen der unteren Grenze x (= Infimum) und der oberen Grenze x (= Supremum) liegen. Entwerfen Sie ein Programm zum Arbeiten mit Intervallen. Gehen Sie dazu folgendermaßen vor: Implementieren Sie eine Struktur intervall, die zwei Komponenten inf und sup vom Typ double zur Darstellung des Infimums x und des Supremums x eines Intervalls [x, x] enthält. Entwickeln Sie die folgenden Funktionen: • Eine Funktion max vom Ergebnistyp double mit zwei Argumenten vom Typ double, die das Maximum ihrer Argumente als Ergebnis zurückgibt. • Eine Funktion abstand vom Ergebnistyp double mit zwei Argumenten vom Typ intervall, die den Abstand q([x], [y]) zweier Intervalle [x] und [y] nach der Formel q([x], [y]) := max{|x − y|, |x − y|} Erstellen Sie ein C++-Programm, welches mit Hilfe von Strukturen das Rechnen mit Brüchen ermöglicht. Als Anwendung soll ein endlicher Kettenbruch ausgewertet werden. Für die Addition zweier Brüche B1 := z1 /n1 und B2 := z2 /n2 mit ganzzahligen Zählern z1 und z2 und ganzzahligen Nennern n1 und n2 mit n1 , n2 6= 0 gilt die Formel z1 z2 z 1 n2 + z 2 n 1 + = . B1 + B 2 = n1 n2 n1 n 2 Nach der Berechnung der Summe ist der entstandene Bruch zu kürzen. Dies geschieht durch die Division des Zählers und des Nenners durch deren größten gemeinsamen Teiler, den ggT. Der Kehrwert eines Bruches z/n ist für z 6= 0 gegeben durch 1 n = . z z n Zu N ganzen, positiven Zahlen a1 , . . . , aN ist der endliche Kettenbruch KN = KN (a1 , . . . , aN ) der Länge N definiert durch (hier für N=5!) 1 K5 = a 1 + bestimmt. Verwenden Sie die oben formulierte Funktion max. Stellen Sie weiterhin folgende Operatoren bereit: • Einen zweistelligen Operator + für die Addition von zwei Intervallen [x] und [y] gemäß der Formel: [x] + [y] := [x + y, x + y] Der Operator soll seine Operanden nicht verändern. . 1 a2 + a3 + 1 1 a5 Der Kettenbruch wird dabei wie folgt ausgewertet: a4 + TN := aN ; for l = N − 1, N − 2, . . . , 1 Tl := al + T 1 ; l+1 KN := T1 ; Gehen Sie bei der Erstellung des Programmes wie folgt vor: a) Die Darstellung eines Bruches in C++ soll mittels einer Struktur rational erfolgen. Definieren Sie die Stuktur rational mit zwei Komponenten zaehler und nenner vom Typ int für den Zähler und den Nenner eines Bruches. b) Definieren Sie die folgenden Funktionen zum Rechnen mit Brüchen: • Eine Funktion setrational vom Typ rational mit zwei Argumenten vom Typ int mit Defaultwerten 0 für den Zähler und 1 für den Nenner. Mittels der beiden Argumente ist der Zähler und der Nenner einer zurückzugebenden Größe vom Typ rational zu belegen. Geben Sie eine Warnung aus, falls der Nenner mit Null initialisiert werden soll. Verwenden Sie in diesem Fall stattdessen den Wert 1. geeigneten Schleife nacheinander die Zahlen aN , aN −1 , . . . , a1 ein und berechnen Sie den Wert des Kettenbruchs. Speichern Sie die Zwischenergebnisse TN , . . . , T1 vom Typ rational in dem erzeugten Feld ab. Achten Sie bei der Addition auf die Vereinbarkeit der Operanden. Die Funktion kettenbruch soll den Wert des zugehörigen Kettenbruches als Rückgabewert liefern. e) Erstellen Sie ein Hauptprogramm, in welchem die Länge des zu ermittelnden Kettenbruchs eingelesen wird. Rufen Sie die Funktion kettenbruch auf und geben Sie deren Ergebnis mit einem begleitenden Text auf dem Bildschirm aus. Verwenden Sie soweit möglich die von Ihnen definierten Funktionen und Operatoren. Probe: K5 (1, 2, 3, 4, 5) = 225/157. • Eine Funktion kuerzen vom Typ rational mit einem Argument vom Typ rational zum Kürzen eines Bruches. Verwenden Sie hierbei eine globale Funktion unsigned int ggT(int,int), welche den größten gemeinsamen Teiler zweier ganzer Zahlen ermittelt (vgl. Vorlesung oder Beispiele auf den Webseiten) • Überladen Sie den Operator + zur Addition zweier Größen vom Typ rational. Bei der Berechnung der Summe ist der entstandene Ausdruck mittels der Funktion kuerzen zu kürzen. • Eine Funktion kehrwert vom Typ rational mit einem Argument vom Typ rational, welche den Kehrwert eines Bruches zurückliefert. Falls der Zähler des Bruches gleich Null ist, soll eine Fehlermeldung ausgegeben und das Programm abgebrochen werden. • Überladen Sie den Ausgabeoperator << für den Typ rational zur Ausgabe eines Bruches auf dem Bildschirm in der Form z/n. c) Die Zwischenergebnisse T1 , . . . , TN bei der Auswertung des Kettenbruches sollen in einem Feld der Länge N zwischengespeichert werden. Definieren Sie hierzu eine Struktur ratfeld zur Darstellung von Feldern, deren Elemente Brüche sind. Die Struktur ratfeld soll dabei die folgenden Elemente enthalten: • Eine Komponente dim vom Typ int für die Länge des Feldes. • Eine Komponente komp vom Typ rational* als Zeiger auf die Feldelemente. d) Erstellen Sie weitere Funktionen für das Rechnen mit der Struktur ratfeld: • Eine Funktion createratfeld vom Typ ratfeld mit einem int-Argument für die Länge des Feldes. Diese Funktion soll dynamischen Speicherplatz für das Feld bereitstellen. • Eine Funktion deleteratfeld mit einem Argument vom Typ ratfeld, welche den dynamischen Speicherplatz für das Feld wieder freigibt. • Eine Funktion kettenbruch vom Typ rational mit einem int-Argument für die Länge des Kettenbruchs, welche einen einzugebenden Kettenbruch auswertet. Innerhalb der Funktion ist eine Größe vom Typ ratfeld zu erzeugen. Das zugehörige Feld soll dabei die Länge N des auszuwertenden Kettenbruchs erhalten. Lesen Sie in einer Aktuelle Informationen zur Vorlesung und dem Praktikumsbetrieb finden Sie auf den WWWSeiten http://www.uni-karlsruhe.de/~ae19/cam/cam.html.