Brüche in c++ (Addieren, Subtrahieren, Multiplizieren, Dividieren und Rest berechnen)



  • noch ne frage: wenn ich unterschiedliche nenner habe? muss i die dann mittels ggt oda kgn auf gemeinsamen nenner bringen? um das zu berechnen oda ist das hinflüssig.

    vielleicht hat wer ne einfache lösung oda weiß was zu verbessern an dem source



  • Wenn du unterschiedlich Nenner hast dann erweitere beide Brüche mit dem jeweils anderen Nenner und kürze dann via gcd (oder ggT).



  • ok, aba wie mach ich das?
    gct?



  • Du kannst noch viel verbessern.
    Unter anderem kannst du versuchen, die Operatoren überladen.
    Beispiel:

    // Operator +
    bruch operator+(const bruch& a, const bruch& b)
    {
       bruch temp;
       temp.n = a.n * b.n;
       temp.z = a.z * b.n + b.z * a.n;
       temp.reduce();
       return temp;
    }
    
    // Und in Klasse
    class bruch
    {
       // ...
       public:
          friend bruch operator+(const bruch&, const bruch&);
       // ...
    };
    
    // Kürzen
    void bruch::reduce()
    {
       int temp;
       if (n > z)
         temp = n;
       else
          temp = z;
    
       for (int i = temp; i > 1; i--)
       {
          if ((n % i == 0) && (z % i == 0))
          {
             n /= i;
             z /= i;
          }
       }
    }
    
    // Klasse erweitern..
    class bruch
    {
       // ...
       public:
          void reduce();
       // ...
    };
    

    Ist aber alles ungetestet.



  • für was wäre denn das erweitern hier gut?



  • Redsky schrieb:

    für was wäre denn das erweitern hier gut?

    Meinst du das Kommentar?
    Das soll nur ausdrücken, dass in der Klasse die Deklaration der Methode ergänzt werden muss.



  • ChrissiB schrieb:

    Du kannst noch viel verbessern.
    Unter anderem kannst du versuchen, die Operatoren überladen.
    Beispiel:

    // Operator +
    bruch operator+(const bruch& a, const bruch& b)
    {
       bruch temp;
       temp.n = a.n * b.n;
       temp.z = a.z * b.n + b.z * a.n;
       temp.reduce();
       return temp;
    }
    
    // Und in Klasse
    class bruch
    {
       // ...
       public:
          friend bruch operator+(const bruch&, const bruch&);
       // ...
    };
    
    // Kürzen
    void bruch::reduce()
    {
       int temp;
       if (n > z)
         temp = n;
       else
          temp = z;
    
       for (int i = temp; i > 1; i--)
       {
          if ((n % i == 0) && (z % i == 0))
          {
             n /= i;
             z /= i;
          }
       }
    }
    
    // Klasse erweitern..
    class bruch
    {
       // ...
       public:
          void reduce();
       // ...
    };
    

    Ist aber alles ungetestet.

    gehört hier das obige vom Operator und kürzen zusammen? muss i beides eingeben dann in den source?, weil irgendwie funzt das ned



  • Redsky schrieb:

    gehört hier das obige vom Operator und kürzen zusammen? muss i beides eingeben dann in den source?, weil irgendwie funzt das ned

    Kannst du mal bitte deine Compilerfehlermeldung sagen?
    Ja, das gehört alles zusammen.
    Hier nochmal eine kleines Bruchprogramm, das ich grad gemacht habe:
    (mit g++ compiliert es)

    // Datei: bruch.h
    
    #include <iostream>
    using namespace std;
    
    // Klasse bruch
    class bruch 
    { 
       private: 
          long z, n;   // Zähler und Nenner
          // weitere Variablen 
       public: 
          bruch(int pz = 0, int pn = 1)                           // Minimal-Konstruktor
          { 
             z = pz; 
             n = pn; 
           } 
          friend bruch operator+(const bruch&, const bruch&);     // Operator +
          friend ostream& operator<<(ostream& os, const bruch&);  // Operator << 
          void reduce();                                          // Kuerzen 
          // weitere Methoden 
    };
    
    // Datei: bruch.cpp
    #include "bruch.h"
    
    // Methode zum Kürzen
    void bruch::reduce()
    {
       int temp;
       if (n > z)
         temp = n;
       else
          temp = z;
    
       for (int i = temp; i > 1; i--)
       {
          if ((n % i == 0) && (z % i == 0))
          {
             n /= i;
             z /= i;
          }
       }
    }
    
    // Operator + zum Addieren von 2 Brüchen
    bruch operator+(const bruch& a, const bruch& b)
    {
       bruch temp;
       temp.n = a.n * b.n;
       temp.z = a.z * b.n + b.z * a.n;
       temp.reduce();
       return temp;
    }
    
    // Zur Ausgabe
    ostream& operator<<(ostream& os, const bruch& a)
    {
       os << a.z << "/" << a.n;
       return os;
    }
    
    // Datei: main.cpp
    
    #include "bruch.h"
    
    int main()
    {
       // Zwei Brüche
       bruch a(2, 4), b(3, 6);
       // Ausgeben
       cout << "a + b = " << (a + b) << endl;
       // Bei Subtraktion nun:
       // cout << "a - b = " << (a - b) << endl;
    }
    

    EDIT:
    Du musst jetzt noch die anderen Operatoren (Subtraktion, Division und Multiplikation) und die Eingabe hinzufügen oder was du sonst noch brauchst.



  • hey jungs warum macht ihr euch dass alle so schwer? für kürzen nimmst du
    modulo(%) das programm könnte viel kürzer sein... einfach for-schleifen if-anweisungen und */... das ist doch voll easy cu
    ps: % nur bei gaszahlen



  • mr. xXx schrieb:

    ps: % nur bei gaszahlen

    *rofl*

    Oh Mann, Gaszahlen!!!

    Insgesamt ist dein PS gänzlich unnötig. Denn ein Bruch mit Kommazahlen ist kein richtiger Bruch.


Anmelden zum Antworten