Universität Karlsruhe Einstieg in die Informatik und algorithmische

Werbung
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.
Herunterladen