C++-Programmierung/ Brüche/ Die Methoden
Aus Wikibooks
In diesem Kapitel werden Sie mit den Methoden bekannt gemacht die unsere Bruch-Klasse zur Verfügung stellt. Grundlegend tauchen im Zusammenhang mit Brüchen zwei Begriffe auf: „Erweitern“ und „Kürzen“. Im Zusammenhang mit diesen beiden finden sich wiederum die Begriffe „kleinstes gemeinsames Vielfaches“ und „größter gemeinsamer Teiler“. Wir haben uns bei dem Vorüberlegungen dafür entschieden das Erweitern wegzulassen, beim der Addition und Subtraktion brauchen wir es aber oder genauer gesagt wir brauchen das damit in Zusammenhang stehende „kleinste gemeinsame Vielfache“. Im folgenden werden „kleinste gemeinsame Vielfache“ und „größter gemeinsamer Teiler“ mit kgV und ggT abgekürzt.
Wir haben also die folgenden Methoden:
- ggT
- kgV
- kuerzen
Dazu kommen noch 2 Zugriffsfunktionen, da sich der Benutzer unserer Klasse vielleicht für Zähler und Nenner des Bruchs interessiert:
- zaehler
- nenner
2 dieser 5 Methoden müssen aber gleich wieder gestrichen werden. ggT und kgV sind zwar in Zusammenhang mit Brüchen hilfreich, aber sie beschreiben allgemeine Mathematische Funktionen die nicht ausschließlich in Zusammenhang mit Brüchen eingesetzt werden. Daher sind diese beiden Funktionen unter der überschrift Methoden etwas fehlpositioniert, da Sie keine Member der Klasse Bruch sind.
Inhaltsverzeichnis |
[Bearbeiten] Zugriff
Die beiden Zugriffsmethoden tun nichts weiter als Zähler und Nenner des Bruchs zurückzugeben, daher schreiben wir Sie direkt in die Klassendeklaration.
public:
Bruch(int zaehler = 0, unsigned int nenner = 1);
int zaehler()const {return m_zaehler;}
unsigned int nenner()const {return m_nenner;}
private:
int m_zaehler;
unsigned int m_nenner;
};
Wie Sie sehen, haben die beiden Methoden den gleiche Rückgabetyp wie die Variablen, die Sie repräsentieren. Achten Sie bitte auch darauf, dass beide als const Deklariert sind, da Sie keine Variable innerhalb der Klasse verändern.
[Bearbeiten] ggT()
In der Schule haben Sie sicher gelernt, dass sich der ggT (größter gemeinsamer Teiler) durch Primfaktorzerlegung ermitteln lässt. Dieses Verfahren ist allerdings denkbar ungünstig, um es auf einem Rechner umzusetzen. Sie müssten zunächst mal die Primzahlen berechnen und das dauert, zumal Sie ja gar nicht wissen wie viele Primzahlen Sie überhaupt benötigen.
Deshalb bedingen wir uns eines anderen Verfahrens, dem Euklidischen Algorithmus. Eine Verbesserung dieses Verfahrens ist der Steinsche Algorithmus, aber für unsere Zwecke reicht ersterer. Sie dürfen die Klasse natürlich gerne dahingehend verbessern, das Sie den Steinschen Algorithmus einsetzen.
Der euklidische Algorithmus beruht auf zwei Eigenschaften des größten gemeinsamen Teilers:
und
Wenn Sie eine genaue Beschreibung wünschen, dann schauen Sie sich doch mal den entsprechenden Wikipediaartikel an.
Beachten Sie, dass diese Funktion rekursiv funktioniert. Die Implementierung als einfache Schleife, wäre ebenfalls möglich gewesen, aber sie ist etwas unübersichtlicher und dank Optimierung, ist die rekursive Variante nur unwesentlich langsamer. Wenn Sie nicht mehr wissen, was rekursive Funktionen sind, dann werfen Sie noch mal einen Blick auf das Kapitel „Schleifen mal anders – Rekursion“ im Abschnitt „Weitere Grundelemente“.
[Bearbeiten] kgV()
Das kgV lässt sich ganz einfach Berechnen wenn Sie das ggT kennen. Daher schreiben wir die Funktion mit Hilfe der eben erstellten ggT-Funktion.
Damit kgV() auf ggT zugreifen kann, muss ggT() natürlich bekannt sein. Sie müssen die Deklaration (in diesem Fall den Prototyp von ggT() immer geschrieben haben, bevor Sie das entsprechende Element verwenden.
[Bearbeiten] kuerzen()
kuerzen() ist nun endlich mal wirklich eine Memberfunktion (oder auch Methode) von Bruch. Da sie somit direkten Zugriff auf die Variablen hat die sie verändern soll, braucht sie keine Argumente und auch keinen Rückgabewert.
public:
Bruch(int zaehler = 0, unsigned int nenner = 1);
int zaehler()const {return m_zaehler;}
unsigned int nenner()const {return m_nenner;}
private:
void kuerzen();
int m_zaehler;
unsigned int m_nenner;
};
void Bruch::kuerzen(){
unsigned int tmp(ggT(m_zaehler, m_nenner));
m_zaehler /= tmp;
m_nenner /= tmp;
}
Da kuerzen() eine Methode ist, die nur innerhalb der Klasse nach einer Rechenoperation aufgerufen wird, deklarieren wir sie im privaten Bereich der Klasse.

