erste gehversuche mit c++ (Taschenechner)



  • also der fehler mit dem ergebnis "0" liegt hier:

    if ((grundrechenarten(zahl1,zahl2,zeichen) != 0))
                {
                    cout << "das Ergebnis ist: " <<  grundrechenarten(zahl1,zahl2,zeichen) << endl;
                }
                else if ((wurzelziehen(zahl1,zeichen) !=0))
                         {
                    cout << "Die Wurzel ist: " << wurzelziehen(zahl1,zeichen) << endl;
                }
    

    da du damit alle "ergebniss die 0" sind blockst... (also die rückgabe von grundrechenarten() darf nicht null sein...== dein ergebnis )

    deswegen bekommst keine "0" als ergebnis, da die rückgabe von grundrechenarten nicht 0 sein darf... falls doch gehst du ja in den else if()...
    wenn du das änderst dann solltest du auch 0 als ergebnis bekommen können sofern keine weiteren fehler existieren...



  • d4rksider schrieb:

    naja, das ergebnis ist richtig nur kommt der Text kommt nicht:

    das Ergebnis ist:

    ist vll nicht so schwer in den Griff zu kriegen aber ich verstehe es momentan nicht wie ich es hinkriegen soll.

    naja und später möchte ich natürlich noch mehr rechenarten einfügen und nicht daran scheitern^^

    dieser fall kann passieren wenn das ergebnis "leer" ist...
    musst du mal schauen wie sowas passieren kann, soweit ich gesehen habe ist die rückgabe von wurzelziehen "leer" sein, vll auch wenn du durch 0 versuchst zu teilen...
    mach mal bei deinen variablen diesen:

    int x=0;
    int y=0;
    int a=0; ...
    

    dann steht wenigstens da das ergebniss ist "0"... auch wenn du keine rechenoperationen durchführst...

    zuudem sollte man solche fehler wie teilen durch "0" direkt abfangen, dies wäre für mich ein kritischer fehler da die rechnung so nicht möglich ist...
    da solltest du die funktion definiert mit fehlermeldung beenden... ("z.B.: ACHTUNG ......" )
    sonst führt das später zu fehlern die du nicht mehr identifizieren kannst, da du keine fehlermeldung bekommst... 😉 oder etwa doch?
    diese fehler sind im nachhinein, geschweige denn wenn du evt. mal 10.000 zeilen code hast unmöglich oder nur mit sehr viel zeitaufwand zu finden... (musst du aber selbst entscheiden wie du mit fehlern umgehst...)-> nicht kritische fehler musst du ja nicht abbrechen 🙂 ...

    alternativ kann man auch mit "fstream's" schnell ein custom-log anlegen wo du einfach die aktionen loggst... -> damit du beim entwickeln und vorallem später deine fehler erkennen und lokalisieren kannst... (odewr zumindest wesentlich schneller in dieser hinsicht bist) 🙂

    lg



  • danke für den Hinweis...
    muss ich mal drüber nachdenken wie ich das in den griff bekomme.

    also ist der wert 0 der da rauskommt nicht das ergebnis der rechenoption sondern ein false wert.

    Also ich habe bis jetzt noch keine passende lösung dafür aber werde mich da schon reinfuchsen 🙂

    danke MfG



  • d4rksider schrieb:

    danke für den Hinweis...
    muss ich mal drüber nachdenken wie ich das in den griff bekomme.

    also ist der wert 0 der da rauskommt nicht das ergebnis der rechenoption sondern ein false wert.

    Also ich habe bis jetzt noch keine passende lösung dafür aber werde mich da schon reinfuchsen 🙂

    danke MfG

    eigentlich sollte das nicht mehr passieren wenn du deine variablen auf "0" initialisierst... -> wie oben schon geschrieben:

    int x=0; etc...

    ansonsten müsste ich jetzt nochmal schauen...



  • hmm weiß gerade nicht welche variablen du meinst ... sorry.
    habe nämlich gar keine int variablen drin nur double.

    kannst du mir vll sagen welche funktion du meinst?

    danke



  • d4rksider schrieb:

    hmm weiß gerade nicht welche variablen du meinst ... sorry.
    habe nämlich gar keine int variablen drin nur double.

    kannst du mir vll sagen welche funktion du meinst?

    danke

    sry ich meinte damit nich die "int" variablen sondern alle variablen die zahlen enthalten... 😉
    also auch double etc... mir gings eher ums prinzip... 🙂



  • z.B. hier...

    double wurzelziehen(double a,char x)
    {
        double wurzel;
    
    if (x == 'w')
    {
        wurzel = sqrt (a);
    }
        return wurzel;
    }
    

    wenn if() greift ist deine variable "leer"...
    normalerweise müsste das zwar dann NULL sein...
    aber das ist je nach gültigkeit der variablen unterschiedlich...

    deswegen lieber das:

    double wurzelziehen(double a,char x)
    {
        double wurzel=0;
    
    if (x == 'w')
    {
        wurzel = sqrt (a);
    }
        return wurzel;
    }
    

    noch besser wäre:

    double wurzelziehen(double a,char x)
    {
        double wurzel=0;
    
    if (x == 'w')
    {
        wurzel = sqrt (a);
    }else{ 
        cout << "fehler beim wurzel ziehen der Zahl: "<< a << endl; 
    }
        return wurzel;
    }
    

    aber wie du es machst mit



  • alles klar 🙂

    so habe nun

    if ((grundrechenarten(zahl1,zahl2,zeichen)))
    

    verändert

    und auch:

    if (b != 0 && a != 0 )
    

    auch habe ich alle zahlen initialisiert.

    es kommt leider immer noch nicht : Das Ergebnis ist:

    aber werde wohl noch mal einer Nacht drüber schlafen und hoffen das ich dann nichts mehr übersehen werde.

    danke für deine hilfe. Der nächte quelltex(s)t kommt bestimmt 🙂

    Edit: beim tippen gerade deine Antwort gesehen:

    gut zu wissen das man vieles erst initialisieren muss damit alles gut läuft.
    werde ich mir merken
    morgen schicke ich mal die aktualisierte version meiner kleinen rechenmaschine.

    bis denn

    d4rksider



  • d4rksider schrieb:

    alles klar 🙂

    so habe nun

    if ((grundrechenarten(zahl1,zahl2,zeichen)))
    

    verändert

    und auch:

    if (b != 0 && a != 0 )
    

    auch habe ich alle zahlen initialisiert.

    es kommt leider immer noch nicht : Das Ergebnis ist:

    aber werde wohl noch mal einer Nacht drüber schlafen und hoffen das ich dann nichts mehr übersehen werde.

    danke für deine hilfe. Der nächte quelltex(s)t kommt bestimmt 🙂

    Edit: beim tippen gerade deine Antwort gesehen:

    gut zu wissen das man vieles erst initialisieren muss damit alles gut läuft.
    werde ich mir merken
    morgen schicke ich mal die aktualisierte version meiner kleinen rechenmaschine.

    bis denn

    d4rksider

    ok mach das ...
    wenn es dir spaß macht und dich interessiert helfe ich gerne...

    eig passiert so etwas mit der "leeren" ausgabe wenn kein wert in der variablen steht und du sie ausgibst...

    eig musst du das nicht unbedingt, in den meisten fällen macht das der compiler selbst...
    jedoch bei rechenprogrammen habe ich festgestellt das es einfach fehlern vorbeugt auf 0 zu initialisieren... (bei strings,chars brauchst du so etwas z.B. gar nicht!)

    falls dich das interessiert mit den variablen ließ mal hier:
    grundlegend:
    http://www.willemer.de/informatik/cpp/var.htm

    gültigkeitsbereich und alles was damit zusammenhängt (z.B. wert ohne initalisierung)
    http://www.willemer.de/informatik/cpp/geltungvar.htm

    hoff ich konnt dir paar tipps, anregungen, hilfen geben...
    gerne wieder 😉 ...

    lg



  • moin,

    hier mal meine aktualisierte version des Taschenrechners:

    #include <iostream>
    #include <math.h>
    #include <string>
    #include <algorithm>
    
    using namespace std;
    
    bool grundrechenarten(double a, double b,char x, double &summe);
    bool wurzelziehen(double a,char x, double &summe);
    void textgrundrechenarten(double &a , double &b);
    void textwurzelziehen(double &a);
    void bedingung(double &a, double&b);
    
    int main() {
    
        double zahl1, zahl2;
        char zeichen;
        bool schleife1 {1};
        double summe;
        do {
            cout << "Bitte waehlen Sie aus was Sie rechen wollen!" << endl;
            cout << "Um das Programm zu beenden druecken Sie n" << endl << endl;
            cout << "+" << endl;
            cout << "-" << endl;
            cout << "*" << endl;
            cout << "/" << endl << endl;
            cout << "erweiterte Rechenarten: " << endl;
            cout << "***********************************" << endl << endl;
            cout << "Wurzel ziehen (w)" << endl << endl;
            cout << "beenden (n)" << endl;
            cin >> zeichen;
            switch (zeichen)
            {
            case '+' :
            case '-' :
            case '*' :
            case '/' :
                textgrundrechenarten(zahl1, zahl2);
                break;
            case 'w' :
                textwurzelziehen(zahl1);
                break;
            case 'n' :
                cout << "Programm wird beendet!" << endl;
                schleife1 = 0;
            default  :
                cout << "Die Eingabe ist ungültig!" << endl;
                break;
            }
            if (grundrechenarten(zahl1,zahl2,zeichen,summe))
            {
                cout << "das Ergebnis ist: " <<  summe  << endl;
            }
            else if (wurzelziehen(zahl1,zeichen,summe))
            {
                cout << "Die Wurzel ist: " << summe  << endl;
            }
        } while (schleife1);
        return 0;
    }
    
    bool grundrechenarten(double a, double b,char x, double &summe)
    {
        summe = 0;
        bool wahr = 1;
    
        if (x == '+')
        {
            summe = a + b;
        }
        else if (x == '-')
        {
    
            summe = a - b;
        }
        else if (x == '*')
        {
            summe = a * b;
    
        }
        else if (x == '/')
        {
            if (b != 0 || a !=0)
            {
                summe = a / b;
            }
            else
            {
                wahr = 0;
            }
        }
        else
        {
            cout << "Bitte geben Sie eine Zahl ein!" << endl;
            wahr = 0;
        }
        return wahr;
    }
    
    void textgrundrechenarten(double &a , double &b)
    {
        do {
            cout << "Geben Sie bitte Zahl 1 ein" << endl;
            cin >> a;
            bedingung(a,b);
            cout << "Geben Sie bitte Zahl 2 ein" << endl;
            cin >> b;
            bedingung(a,b);
    
        } while (cin.fail() || cin.bad());
    }
    
    bool wurzelziehen(double a,char x, double &summe)
    {
        summe = 0;
        bool wahr = 1;
    
        if (x == 'w')
        {
            summe = sqrt (a);
        }
        return wahr;
    }
    
    void textwurzelziehen(double &a)
    {
        cout << "Geben Sie die Zahl ein, von dem Sie die Wurzel haben moechten" << endl << endl;
        cin >> a;
    }
    
    void bedingung(double &a, double &b)
    {
        if (cin.fail() || cin.bad())
        {
            cin.clear();
            cin.ignore();
            cout << "Bitte geben Sie nur Zahlen ein" << endl << endl;
        }
    }
    

    habe jetzt mal die funktion mit einem bool wert erweitert und nun zeigt der Taschenrechner auch Ergebnisse an wenn eine Null rauskommt :-).
    Nur noch die Erkennung mit den Buchstaben läuft nicht so wie ich das will...



  • Du musst dir ein bisschen klarer werden, was was tut und tuen soll.

    Überleg dir im Kopf einfach immer ein Beispiel-Szenario und geh durch, wie dein Programm für dieses abläuft.

    Im konkreten Beispiel: Deine bedingung-funktion überprüft zwar den stream auf Fehleingabe und weist den User darauf hin, aber lässt das Programm und die Eingabe dann in Ruhe weiterlaufen.
    Desweiteren macht es keinen Sinn, dass diese Funktion die zwei double mitbekommt, wenn sie überhaupt nichts damit anstellt, meinst Du nicht?

    Zudem ist dein Programm einfach ... nicht stimmig, imho. Du selber sagst schon, dass du teilweise nicht mehr durchblickst. Und das wundert nicht, wenn du aus so einem simplem Programm so ein Wirr-Warr machst.

    Reagiere in den entsprechenden case-marken mit der Ausrechnung des Ergebnises.
    So wie du es momentan machst ist es erstens falsch und zweitens gezwungen allgemein, was hier einfach keinen Sinn ergibt.

    Ob man das Einlesen der Variabeln von der Berechnung trennen will, obwohl in den zwei unterschiedlichen Fällen eh unterschiedlicher Text ausgeben und unterschiedlich eingelesen wird ist auch zweifelhaft.



  • hier mal eine kleine änderung mit der Bedingung:

    bool bedingung()
    {
        bool wahr = 0;
        if (cin.fail() || cin.bad())
        {
            cin.clear();
            cin.ignore();
            wahr = 1;
            cout << "Es sind nur Zahlen gueltig!!!" << endl << endl;
        }
      return wahr;
    }
    

    und das einsetzen in eine andere funktion:

    void textgrundrechenarten(double &a , double &b)
    {
        do {
            cout << "Geben Sie bitte Zahl 1 ein" << endl;
            cin >> a;
            } while (bedingung());
        do {
            cout << "Geben Sie bitte Zahl 2 ein" << endl;
            cin >> b;
           } while (bedingung());
    
    }
    

    scheint schon gut zu klappen...
    aber wenn man z.B ddd eingibt kommt die antwort 3 mal^^
    bezüglich das einlesen der Variablen in der einen funktion und das ausrechnen in der Anderen, ich dachte das wäre besser, da der text immer gleich bleibt und ich den Rechner ja noch um ein paar Rechenarten erweitern möchte...
    Berichtigt mich wenn ich falsch liege 😋



  • Du kannst das auch mit exceptinos lösen, d.h. wenn jemand durch 0 teilen will, einfach ne exception werfen. Und die Funktion dann in einen try block packen, im catch einfach die Fehlermeldung ausgeben "Sie können nicht durch 0 dividieren" oder sonst sowas.

    Wenn ich das richtig verstanden habe, ist das ja das Problem in der grundrechen'Dings' Funktion.

    LG


Anmelden zum Antworten