Kleines Problem im Programm



  • Hallo,
    ich habe mal aus Spaß ein Programm geschrieben um eine Quadratwurzel zu errechnen,
    klappt auch ganz gut, zumindest bei so zahlen wie 9, 16 25 und 17, 1444 oder sowas eben, aber bei sagen wir jetzt 11 oder 13, schließt er einfach die anwendung, ich weiß aber nicht wieso...ich kopiere euch den queeltext mal rein:

    #include <iostream>
    using namespace std;
    
    float untere, obere, mittelpunkt, radikand, quadrat;
    
    float Quadrat(float a)
    {
        quadrat = a * a;
    }
    
    float Mittelpunkt(float a, float b)
    {
        mittelpunkt = (untere+obere)/2;
    }
    
    float ZuKlein()
    {
        untere = mittelpunkt;
    }
    
    float ZuGross()
    {
        obere = mittelpunkt;
    }
    
    float Hauptprogramm()
    {
        Mittelpunkt(untere, obere);
        Quadrat(mittelpunkt);
        if(quadrat > radikand) ZuGross();
        if(quadrat < radikand) ZuKlein();
        if(quadrat == radikand) {
            cout << "Die gesuchte Quadratwurzel ist: ";
            printf("%5.18f", mittelpunkt);
            return true;
        }
        Hauptprogramm();
    }
    
    int main()
    {
    cout << "Bitte gib einen Radikand ein: ";
    cin >> radikand;
    untere = 0;
    obere = radikand;
    Hauptprogramm();
    
    cin.get(); cin.get();
    return 0;
    }
    

    So, also wäre echt nett wenn mir jemand helfen könnte

    MfG mrfypower



  • Bitte lesen. Danke.

    Bye, TGGC (Reden wie die Großen)



  • Hi TGGC,

    statt Schwachsinn zu labern könntest du doch einfach die Klappe halten. 😡
    Das spart dir auch noch ne Menge Tipparbeit, den Sinnvolles kommt sowieso nicht
    von dir. Musst du deinen Frustabbau unbedingt hier erledigen. Red doch stattdessen
    mal mit Freunden oder Familie oder auch nem Psychologen wenn dir sonst keiner
    zuhört.



  • Hi mrfypower2,

    das kann nicht dein Quellcode sein, weil das Ganze sich, wegen grober
    syntaktischer Fehler, auf keinem C/C++-Compiler dieser Welt kompilieren
    lassen wird. Auch nicht auf deinem eigenen System.

    mfg JJ



  • John Doe schrieb:

    Hi mrfypower2,

    das kann nicht dein Quellcode sein, weil das Ganze sich, wegen grober
    syntaktischer Fehler, auf keinem C/C++-Compiler dieser Welt kompilieren
    lassen wird. Auch nicht auf deinem eigenen System.

    mfg JJ

    why? gibt nurn paar warnings aufm gcc. klar sind stilfehler und syntaxfehler drin, aber der compiler nimmts.

    @mrfypower2

    float ZuGross()
    

    du musst "float" nur dann schreiben, wenn du irgendwo in der funktion ein "return" hast,welches eine variable vom typ float zurückgibt. ansonsten bitte demnächst "void"(kein rückgabewert).
    globale variablen sind zwar auf dem ersten blick einfacher, aber versuch dich bitte an lokale variablen zu gewöhnen, dann wird dein programm auch viel übersichtlicher und somit deutlicher lesbarer.



  • otze schrieb:

    why? gibt nurn paar warnings aufm gcc. klar sind stilfehler und syntaxfehler drin, aber der compiler nimmts.

    Dürfte er aber eigentlich nicht, da die fehlenden return's UB ergeben.


  • Mod

    der algorithmus funktioniert für zahlen, die keine quadrate sind, nicht mal auf dem papier 😉


  • Mod

    Ich spare mir mal, die ganzen sonstigen fehler zu korrigieren...

    if((quadrat == radikand)||(mittelpunkt==obere)||(mittelpunkt==untere)) {
            cout << "Die gesuchte Quadratwurzel ist: ";
            printf("%5.18f", mittelpunkt);
            return true;
        }
        if(quadrat > radikand) ZuGross();
        if(quadrat < radikand) ZuKlein();
    

    dein problem ist, dass sich die wurzel in den meisten fällen nicht exakt darstellen lässt. irgendwann bist an dem punkt, wo obere und untere grenze benachbarte zahlen (im sinne der darstellbarkeit im float format) sind. bei der mittelpunktsberechnung tut sich dann gar nichts mehr, weil es keine darstellbare zahl zwischen den grenzen mehr gibt (das ergebnis ist eine der beiden zahlen). die folge ist eine endlosrekursion, die zum stacküberlauf führt.



  • John Doe schrieb:

    Hi TGGC,

    statt Schwachsinn zu labern könntest du doch einfach die Klappe halten. 😡
    Das spart dir auch noch ne Menge Tipparbeit, den Sinnvolles kommt sowieso nicht
    von dir. Musst du deinen Frustabbau unbedingt hier erledigen. Red doch stattdessen
    mal mit Freunden oder Familie oder auch nem Psychologen wenn dir sonst keiner
    zuhört.

    Bitte lesen. Danke.

    Bye, TGGC (Reden wie die Großen)



  • Halt bitte einfach deine Schn****, ja? 🙄



  • Ich will da gar nicht drauf eingehen, nur so viel sei gesagt:

    Du bist definitiv nicht lustig.

    Damit ist für mich das Thema erledigt und wir gehen jetzt beide getrennte Wege.


Anmelden zum Antworten