Taschenrechner easy



  • hi leute
    ich brauche etwas hilfe bei meinem taschenrechner den ich programmieren wollte.
    ich habe versucht ihn mit einem edit-fenster zu programmieren.
    Jetzt habe ich folgendes problem:
    irgendwie harkt das mal und geteilt rechnen, also es kommt immer null raus, und wenn ich überhaut etwas rechnen will muss ich die variablen erst mit der gegebenen rechenoperation eingeben als nicht wie bei einem normale taschenrechner:

    [7] [+] [8] [=] 15

    sondern

    [7] [+] [8] [+] [=] 15

    hier der qq

    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    double zahl = 0.0,ergebnis = 0.0;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "1";
    zahl = Edit1 -> Text.ToDouble();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "2";
    zahl = Edit1 -> Text.ToDouble();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "3";
    zahl = Edit1 -> Text.ToDouble();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button7Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "6";
    zahl = Edit1 -> Text.ToDouble();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button6Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "5";
    zahl = Edit1 -> Text.ToDouble();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "4";
    zahl = Edit1 -> Text.ToDouble();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "7";
    zahl = Edit1 -> Text.ToDouble();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button8Click(TObject *Sender)
    {
    Edit1->Text = Edit1->Text + "8";
    zahl = Edit1 -> Text.ToDouble();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button9Click(TObject *Sender)
    {
    Edit1 -> Text = Edit1 -> Text + "9";
    zahl = Edit1 -> Text.ToDouble();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button14Click(TObject *Sender)
    {
    Edit1 -> Text = Edit1 -> Text +",";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button16Click(TObject *Sender)
    {
    Edit1 -> Text = Edit1 -> Text + "0";
    zahl = Edit1 -> Text.ToDouble();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button13Click(TObject *Sender)
    {
    ergebnis = zahl + ergebnis;
    Edit1 -> Clear ();        
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button15Click(TObject *Sender)
    {
    Label1 -> Caption = double (ergebnis);        
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button12Click(TObject *Sender)
    {
    ergebnis = ergebnis - zahl;
    Edit1 -> Clear();        
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button11Click(TObject *Sender)
    {
    ergebnis = ergebnis * zahl;
    Edit1 -> Clear();
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button10Click(TObject *Sender)
    {
    ergebnis = ergebnis / zahl;
    Edit1 -> Clear();
    }
    

    danke im vorraus
    mfg neuling954



  • Ich vermute mal, dass dir mit dem Code keiner helfen kann... deine Buttons sind nicht benannt, so dass man schonmal extreme Mühe hat, überhaupt zu erkennen, welcher nun was machen soll...
    Dann sind da noch so einige Funktionen, die alle fast das Gleiche machen, das ließe sich sicher zusammenfassen.

    Und ganz ehrlich gesagt verstehe ich auch nicht so wirklich, was die Funktionen überhaupt so machen. 😕



  • Hallo,

    Problem Nummer 1:

    in deinem Fall (sofern vorher nicht berechnet wurde):
    0.0 = 0.0*(4) = 0

    Wenn du also 4 eintippst, dann aufs "" klickst ergibt sich eine 0, wenn du dann wieder auf "4" und danach nochmal auf "" klickst kommt eben nicht wie gewünscht 16 sondern 0 ! Weil x*0 oder 0*x ist immer 0

    Problem Nummer 2:

    ergibt sich aus der Tatsache dass deine Berechnungen immer erst stattfinden wenn eine Rechenoperation ausgewählt wurde.

    LG, Micha



  • Mit deinem Ansatz schränkst du dich ein, was die Prioritäten der Rechenoperationen angeht. Klickst du zB 4 + 5 * 3 kommt bei deiner Rechnung 27 raus, das richtige Ergebnis ist allerdings 19.
    Die Lösung liegt im Aufbau eines Expression Trees, das heisst, du musst dir eine Datenstruktur überlegen (im Normalfall ein binärer Baum), in der du die einzelnen Operatoren und ihre Argumente ablegst. Um das Ergebnis zu bestimmen musst du erst einmal feststellen, ob das Ergebnis bereits berechenbar ist, oder ob noch weitere Eingaben abgewartet werden müssen.
    Der Ausdruck 1+2+3 kann nach jedem Argument ausgerechnet werden, der Ausdruck 1+2*3 allerdings erst nach der Eingabe des zweiten Operanden der Multiplikation.
    Ich würde das Problem so lösen, dass intern ein Expression Tree aufgebaut wird, und dass alle Eingaben über die Buttons lediglich zum Aufbau des Baums benutzt werden. Die Aktualisierung des Ergebnisses kann erfolgen, sobald der Baum vollständig ist. Vollständigkeit heisst hier, dass alle Ausdrücke aufgelöst werden können, nicht, dass keine weitere Eingabe mehr möglich ist.
    Hier mal die schematische Darstellung eine Expression Trees für den Ausdruck 4 + 5 * 3

    +
     / \
    4   *
       / \
      5   3
    

    Die Abarbeitung beginnt bei der Wurzel (+ = Addition), dessen Summanden der linke und der rechte Teilbaum sind. Der Ausdruck des linken Teilbaums ist die Konstante 4, der des rechten Teilbaums ist wiederum ein Ausdruck (* = Multiplikation) mit den Multiplikanden des linken und rechten Teilbaums (was die Konstanten 5 bzw. 3 sind).
    Ich hoffe, das hilft dir etwas weiter, aber es bedeutet wesentlich mehr Arbeit als du wahrscheinlich angenommen hast.


Anmelden zum Antworten