Eine Klasse kann man gut dazu verwenden, Daten zu schützen und wie mit "struct" zusammenzufassen.
//bruch3.cpp
// So rechne ich mit Bruechen
#include <iostream>
#include <conio.h>
using namespace std;
class Bruch
{
private:
int zaehler;
int nenner;
int ggt;
public:
Bruch()//Konstruktor
{
cout << "Zaehler eingeben: ";
cin >> zaehler;
do
{
cout << "Nenner (nicht 0): ";
cin >> nenner;
} while (nenner == 0);
}//Konstruktor
void ggT()
{// die gute ggT-Methode
int x,y;
x=zaehler;
y=nenner;
while(x!=y)
if(x<y)
y=y-x;
else x=x-y;
ggt = x;
cout << "Groesster gem. Teiler: " << ggt << endl;
}
void kuerze()
{
zaehler= zaehler/ggt;
nenner= nenner/ggt;
cout << zaehler << " / " << nenner << endl;
}
void multipliziere(Bruch b2)
{
zaehler *= b2.zaehler;
nenner *= b2.nenner;
cout << "Ergebnis der Multiplikation: ";
cout << zaehler << " / " << nenner << endl;
}
void dividiere(Bruch b2)
{
zaehler *= b2.nenner;
nenner *= b2.zaehler;
cout << "Mit dem Kehrwert malnehmen.\nErgebnis der Division: ";
cout << zaehler << " / " << nenner << endl;
}
}; //class Ende
//Hauptprogramm:
int main()
{
cout << "Erster Bruch: ";
Bruch bru1;//Konstruktor wird aufgerufen
char operateur;
do
{
cout << "Jetzt multiplizieren oder dividieren ..." << endl;
cout << "Operator eingeben, bitte (*/): ";
cin >> operateur;
} while (operateur!='*' && operateur!='/');
cout << "Zweiter Bruch: ";
Bruch bru2;//Konstruktor wird aufgerufen
bru1.ggT();
bru1.kuerze();
bru2.ggT();
bru2.kuerze();
if (operateur == '*') bru1.multipliziere(bru2);
if (operateur == '/') bru1.dividiere(bru2);
bru1.ggT();
bru1.kuerze();
getch();
return 0;
}
Das hier hineingestellte Programm enthält mehrere Merkmale und "Fähigkeiten". Zuerst einmal ist da der Konstruktor. Dieser kann für den notwendigen ersten Programmschritt verwendet werden. Viele
Programmierer nutzen den Konstruktor für das Initialisieren einiger Variablen.
//addierebrue4.cpp, Variante vom 4. 8. 2015:
#include <iostream>
#include <conio.h>
using namespace std;
class Brueche
{
private:
int zaehler1; int nenner1;
int zaehler2; int nenner2;
bool merker;
int ggt;
public:
Brueche()
{
cout << endl << "Zaehler 1 einlesen: "; cin >> zaehler1;
do {
cout << "Nenner 1 einlesen (nicht 0): "; cin >> nenner1;
} while (nenner1 == 0);
cout << "Zaehler 2 einlesen: "; cin >> zaehler2;
do {
cout << "Nenner 2 einlesen (nicht 0): "; cin >> nenner2;
} while (nenner2 == 0);
}
bool ungleicheNenner()
{
if (nenner1 == nenner2) { merker=true; return false; }
else { merker=false; return true; }
}
bool teilbareNenner()
{ return ( nenner1%nenner2==0 || nenner2%nenner1==0 ); }
void machSchnellGleichnamig()
{
if (nenner2 % nenner1 == 0)
{
cout << "Der zweite Nenner ist ein Vielfaches vom ersten." <<
endl;
zaehler1 = zaehler1 * nenner2/nenner1;
nenner1=nenner2;
}
else
{
cout << "Der erste Nenner ist ein Vielfaches vom zweiten." <<
endl;
zaehler2 = zaehler2 * nenner1/nenner2;
}
cout << "Gleichnamig machen: " << zaehler1 << " / " << nenner1 <<
" + " << zaehler2 << " / " << nenner1 << endl;
}
void machGleichnamig()
{
int nenner1neu = nenner1 * nenner2;
cout << "Man kann in diesem Fall das einfachste Verfahren nehmen, die Brueche" << endl;
cout << "gleichnamig zu machen. Man multipliziert einfach beide Nenner miteinander" <<
endl;
cout << "und erweitert dann." << endl;
zaehler1 = zaehler1 * nenner2;
zaehler2 = zaehler2 * nenner1;
cout << "Mit gleichem Nenner: " << zaehler1 << " / " << nenner1neu
<<
" + " << zaehler2 << " / " << nenner1neu << endl;
nenner1 = nenner1neu;
}
void addiere()
{
cout << "Die beiden Nenner sind";
if (merker) cout << " ja schon";
else cout << " jetzt";
cout << " gleich." << endl;
cout << "Die Brueche lauten: " << zaehler1 << " / " << nenner1
<<
" und " << zaehler2 << " / " << nenner1 << endl;
zaehler1 = zaehler1 + zaehler2;
cout << "Ergebnis der Addition: " << zaehler1 << " / " <<
nenner1 << endl;
}
void ggT()
{// die beste ggT-Methode
int x,y;
x=zaehler1;
y=nenner1;
while(x!=y)// innerhalb der Klasse
if(x<y)// wird auch als inline-Mechanismus bezeichnet
y=y-x;
else x=x-y;
ggt = x;
cout << "Der Bruch kann"; if (ggt==1) cout << " nicht";
cout << " gekuerzt werden." << endl;
cout << "GGT (groesster gem. Teiler): " << ggt << endl;
}
void kuerze();
void rational();
}; //class Ende
void Brueche::kuerze()
{//ausserhalb der Klasse
zaehler1 /= ggt;
nenner1 /= ggt;
cout << zaehler1 << " / " << nenner1 << endl;
}
void Brueche::rational()
{//ausserhalb der Klasse
float z = (float)zaehler1;
float n = (float)nenner1;
float f = z / n;
cout << "Als rationale Zahl: " << f << endl;
}
int main()
{
cout << "Addition zweier beliebiger gekuerzter Brueche.";
Brueche b;//Konstruktor wird aufgerufen.
cout << endl;
if ( b.ungleicheNenner() )
if ( b.teilbareNenner() )
b.machSchnellGleichnamig();
else b.machGleichnamig();//zu welchem if gehoert das else?
cout << endl;
b.addiere();
cout << endl;
b.ggT();
b.kuerze();
b.rational();
getch();
return 0;
}//Ende von main()