Hilfe! Bruch kürzen in C++



  • Hallo,
    ich bin C++ Neuling und hab da eine wichtige Frage. Komm einfach nicht drauf und bin echt verzweifelt 😞 Es geht um eine Aufgabe, in der ein Bruch gekürzt werden soll und meine Frage ist, warum abgefragt wird if(zahler <0) ?
    Hab die Passage jetzt mal kopiert, ich hoffe das reicht sonst poste ich nochmal den Rest!

    class bruch
    {public: float zahler,nenner,z,n;
    float erg1,erg2;
    void eingabe();
    void kurzen();
    void ausgabe();
    };

    void bruch::eingabe()
    {
    cout<<"Zaehler : "; cin>>zahler;
    cout<<"Nenner : "; cin>>nenner;
    cout<<endl<<endl;

    }

    void bruch::kurzen()
    {
    erg1=zahler/nenner;
    if(zahler<0){

    for(z=0;z>=zahler;z--)
    {
    for(n=0;n<=nenner;n++)
    { erg2=z/n;
    if(erg2==erg1){goto next;}}
    }
    }
    if(nenner<0){

    for(z=0;z<=zahler;z++)
    {
    for(n=0;n>=nenner;n--)
    { erg2=z/n;
    if(erg2==erg1){goto next;}}
    }
    }

    usw...

    Vielen Dank schonmal! 😃



  • Ich würde dir raten deinen Code etwas übersichtlicher zu gestalten, hab das mal gemacht für dich 🙂 und verwende keine gotos...

    class bruch
    {
    public: 
        float zahler,nenner,z,n;
        float erg1,erg2;
        void eingabe();
        void kurzen();
        void ausgabe();
    };
    
    void bruch::eingabe()
    {
        cout<<"Zaehler : "; cin>>zahler;
        cout<<"Nenner : "; cin>>nenner;
        cout<<endl<<endl;
    }
    
    void bruch::kurzen()
    {
        erg1=zahler/nenner;
        if(zahler<0)
        {
            for(z=0;z>=zahler;z--)
            {
                for(n=0;n<=nenner;n++)
                { 
                    erg2=z/n;
                    if(erg2==erg1)
                    {
                        goto next;
                    }
                }
            }
        }
        if(nenner<0)
        {
            for(z=0;z<=zahler;z++)
            {
                for(n=0;n>=nenner;n--)
                { 
                    erg2=z/n;
                    if(erg2==erg1)
                    {
                        goto next;
                    }
                }
            } 
        }
    


  • lalelu88 schrieb:

    Hallo,
    ich bin C++ Neuling und hab da eine wichtige Frage. Komm einfach nicht drauf und bin echt verzweifelt 😞 Es geht um eine Aufgabe, in der ein Bruch gekürzt werden soll und meine Frage ist, warum abgefragt wird if(zahler <0) ?
    Hab die Passage jetzt mal kopiert, ich hoffe das reicht sonst poste ich nochmal den Rest!

    #include <iostream>
    
    class bruch
    {
    public: 
        float zahler,nenner,z,n;
        float erg1,erg2;
        void eingabe();
        void kurzen();
        void ausgabe();
    };
    
    void bruch::eingabe()
    {
        cout<<"Zaehler : "; cin>>zahler;
        cout<<"Nenner : "; cin>>nenner;
        cout<<endl<<endl;
    }
    
    void bruch::kurzen()
    {
        erg1=zahler/nenner;
        if(zahler<0)
        {
            for(z=0;z>=zahler;z--)
            {
                for(n=0;n<=nenner;n++)
                { 
                    erg2=z/n;
                    if(erg2==erg1){goto next;}
                }
            }
        }
        if(nenner<0)
        {
            for(z=0;z<=zahler;z++)
            {
                for(n=0;n>=nenner;n--)
                { 
                    erg2=z/n;
                    if( erg2==erg1 ){ goto next; }
                }
            }
        } 
    }
    

    usw...

    Einen Bruch kürzen heißt den größten gemeinsamen Teiler (ggT) von Zähler und Nenner suchen und beide durch den ggT teilen. Dafür ist der Euklidische Algorithmus das übliche Verfahren. (siehe auch boost.rational)

    Den ggT sucht man unabhängig vom Vorzeichen, daher vielleicht die Fallunterscheidung 'if( zaehler<0)' - ansonsten ist der Code zu schlecht, um ihn zu kommentieren.

    Gruß
    Werner



  • float für Zähler und Nenner ist Unfug - würde mich wundern, wenn das damit problemlos funktioniert. Verwende einen Ganzzahltyp, um Problemen aus dem Weg zu gehen.



  • TGGC schrieb:

    Fuer mich sieht der Code nach Unsinn aus. Wirf ihn weg. f'`8k

    Autocogito

    Gruß, TGGC (Was Gamestar sagt...)

    Du bettelst aber auch darum, gelöscht zu werden.



  • Nanyuki schrieb:

    float für Zähler und Nenner ist Unfug - würde mich wundern, wenn das damit problemlos funktioniert. Verwende einen Ganzzahltyp, um Problemen aus dem Weg zu gehen.

    👍
    Zähler und Nenner sind nun einmal ganzzahlig! Du kannst aber einfach eine float-Berechnung ergenis = zaehler / nenner durchführen und das Ergenis analysieren, z.B. auf vorhandene Nachkommastellen. Achtung: unbedingt abs() einsetzen.



  • volkard schrieb:

    TGGC schrieb:

    Fuer mich sieht der Code nach Unsinn aus. Wirf ihn weg. f'`8k

    Autocogito

    Gruß, TGGC (Was Gamestar sagt...)

    Du bettelst aber auch darum, gelöscht zu werden.

    Mit Bruch kürzen hat der Code aber wirklich nicht viel am Hut.



  • TGGC schrieb:

    volkard schrieb:

    TGGC schrieb:

    Fuer mich sieht der Code nach Unsinn aus. Wirf ihn weg. f'`8k

    Autocogito

    Gruß, TGGC (Was Gamestar sagt...)

    Du bettelst aber auch darum, gelöscht zu werden.

    Ok, nur noch zwei Fragen:

    Ist der Code algorithmisch Muell?
    Ist der Code stilistisch Muell? f'`8k

    Autocogito

    Gruß, TGGC (Was Gamestar sagt...)

    Nur eine Frage:
    Bist du ein arrogantes Arschloch?


Log in to reply