Verbesserungsvorschläge Bruchrechnung



  • Hi, ich habe ein Programm geschrieben welches mit Brüchen rechnen soll und sie im Anschluss kürzt. Bisher habe ich nur
    die Multiplikation programmiert. Nummer 1 dient hierbei als Zähler Nummer 2 Nenner usw. Es funktioniert soweit super. Meine Frage ist nun wie ich das ganze noch kürzer und besser machen könnte da ich denke dass ich das ganze viel zu llang geschrieben habe? Allgemeine Tipps würden mir sehr helfen danke!

    #include <iostream>
    
    using namespace std;
    
    int inputnummer(string nummer){
    cout << "Gib die " << nummer << "Zahl ein";
    int input = 0;
    cin >> input;
    cout << endl;
    return input;
    
    }
    int ggt(int m,int n){
       int r;
    
       int ergebnis1 = m;
       int ergebnis2 = n;
       do{
          if (m < n){
             r = m;
             m = n;
             n = r;
          }
          r = m % n;
          if (r!=0){
             m=n;
             n=r;
          }
       }while (r!=0);
    
      int gekuerzt1 =ergebnis1/n;
       int gekuerzt2 =ergebnis2/n;
    
        cout << gekuerzt1 << "/" << gekuerzt2;
       return(n);
    
    
    }
    
    void multiply(){
    int zahl1 = inputnummer("1.");
    int zahl2 = inputnummer("2.");
    int zahl3 = inputnummer("3.");
    int zahl4 = inputnummer("4.");
    int result = zahl1 * zahl3;
    int ergebnis2 = zahl2 * zahl4;
    cout << "Das Ergebnis ist:";
    ggt(result, ergebnis2);
    
    
    
    
    }
    void menu(){
    cout << "welche Operation wollen sie durchführen? +,/,-;*\n";
    char input = ' ';
    cin >> input;
        switch(input){
        case ('+'):
        break;
            case ('-'):
        break;
    
            case ('/'):
        break;
            case ('*'):
                multiply();
    
        break;
            default:
                cout << "Eingabe ungueltig bitte nochmal probieren";
                break;
    
    
    
    
        }
    }
    
    void divide(){
    
    
    }
    
    void add(){
    
    
    
    
    }
    
    void sub(){
    
    
    }
    int main(){
    menu();
    }
    
    


  • Verbesserungsvorschläge:

    • input überprüfen ob eine Zahl eingeben wird
    • Nenner dürfen nicht Null sein


  • @NMI21 sagte in Verbesserungsvorschläge Bruchrechnung:

    Nummer 1 dient hierbei als Zähler Nummer 2 Nenner usw.

    Hieraus ergibt sich gleich der erste Verbesserungsvorschlag:

    • benenne deine Variablen sinnvoll. Wenn du erklären musst, dass "Nummer1" dem Zähler1 und "Nummer2" dem Nenner1 entsprichst, dann kannst du die Variable doch auch gleich "zaehler1" und "nenner1" bzw. "zaehler2" und "nenner2" nennen! Das macht den Code gleich viel lesbarer.

    Außerdem sollten deine Funktionen genau ein Ding tun - und vor allem NICHT Eingabe und Verarbeitung mischen. Das bedeutet:

    • Die Funktion ggt sollte nichts ausgeben, sondern nur den ggT zurückgeben. Die Ausgabe bzw. das Kürzen des Bruches ist nicht Aufgabe der Funktion ggT. Selbige soll AUSSCHLIESSLICH den ggT berechnen.
    • Die Funktion multiply sollte die beiden Brüche als Eingabeparameter nehmen und einen Bruch zurückgeben
    • Es ist zu überlegen, ob du nicht "zaehler" und "nenner" zu einer Klasse Bruch zusammenfassen willst. Dann ist die Signatur der Multiplizierungsfunktion: Bruch multiply(Bruch bruch1, Bruch bruch2). Gegebenenfalls könntest du sogar den operator* implementieren, damit du auch direkt den * zum Multiplizieren verwenden kannst
    • Deine ggT-Funktion sieht kompliziert aus. Zwei Variablen im Wert vertauschen funktioniert mit swap. Überleg mal, ob du die do/if/if/while nicht etwas einfacher hinbekommst. Musst du z.B. innerhalb der while-Schleife jedes mal testen, welche Variable größer ist?


  • @NMI21 sagte in Verbesserungsvorschläge Bruchrechnung:

    Bisher habe ich nur die Multiplikation programmiert.

    Die sollte sich auch nur um die Multiplikation kümmern.
    Nutzeraktion (Ein-/Ausgabe) hat die nicht zu machen.
    Zwei Brüche rein, einer raus.

    Nummer 1 dient hierbei als Zähler Nummer 2 Nenner usw.

    Du kannst den Variablen "sprechende" Namen geben. Zb. Nenner_1, Zaehler_2. Dann entfallen auch solche Erklärungen.

    Allgemeine Tipps würden mir sehr helfen danke!

    Lass die Funktionen nur eine Sache richtig machen. Berechnen oder Ein-/Ausgabe.

    Das Kürzen hat in ggt() nichts zu suchen.
    Achte auf den Wertebereich und das Vorzeichen der Zahlen.

    Packe Zähler und Nenner zusammen in eine struct, dann kannst du Beide zusammen behandeln.
    Besser noch in eine Klasse, dann kannst du auch Operatoren wie +, -, *. /, .... dafür anpassen (gibt es zwar schon in boost, aber du willst ja lernen)

    PS. Wenn sich jemand wundert, warum ich Wobs Anzwort mehr oder weniger wiederholen: als ich Anfing den Text zu schreiben, war nur ein Antwort da (es geht um 3 Minuten)



  • @DirkB sagte in Verbesserungsvorschläge Bruchrechnung:

    PS. Wenn sich jemand wundert, warum ich Wobs Anzwort mehr oder weniger wiederholen: als ich Anfing den Text zu schreiben, war nur ein Antwort da (es geht um 3 Minuten)

    🙂 Ist mir auch schon oft passiert. Aber wir haben immerhin unabhängig voneinander mehr oder weniger dasselbe geschrieben. Also @NMI21: nimm dir unsere beiden Antworten zu Herzen.



  • @DirkB sagte in Verbesserungsvorschläge Bruchrechnung:

    Packe Zähler und Nenner zusammen in eine struct, dann kannst du Beide zusammen behandeln.
    Besser noch in eine Klasse, dann kannst du auch Operatoren wie +, -, *. /, .... dafür anpassen ...

    Auch bei Strukturen (struct) kann man Operatoren erstellen (Unterschiede zu Klassen gibt es ja nur in der Standard-Sichtbarkeit von Membern sowie für Ableitungen, s. z.B. The real difference between struct and class).


Log in to reply