Problem mit Taschenrechner C#


Kamil1984

Grünschnabel
Hallo, danke für dein Code. Ich werde ihn natürlich nicht kopieren und einfügen :) will und muss das ja lernen...werde mir also ein neues Projekt erstellen und das nach deiner methode programmieren, so ähnlich war mein erster taschenrechner auch nur konnte der immer nur 2 Zahlen berechnen. Eigentlich ist dass das Hauptproblem woran ich zu kämpfen habe, naja und die komischen Werte...Bei deinem Code fällt mir aber gleich auf das du keine Klammern setzt. Warum?Ansonsten schönes Wochenende, werde mich erst Montag wieder dran setzen.

MfG
Kamil
 

engelmarkus

Erfahrenes Mitglied
Du willst einen Taschenrechner, mit dem du ganze Terme berechnen kannst? Dann wirds nochmal einiges komplizierter.
Ich bin von einem 0815-Taschenrechner ausgegangen, wie den Windows Rechner oder jedes andere Billig-Teil. Die arbeiten genau so wie mein Code. Eine Operation nach der anderen, in genau der Reihenfolge, in der sie eingegeben werden.
Wenn du natürlich einen Taschenrechner willst, der Klammern beherrscht und Punkt vor Strich beachtet, wäre es vielleicht einfacher, wenn du einen vorprogrammierten Parser nimmst. Da gibts ein paar ganz schöne open-source Bibliotheken, die genau das drauf haben.
Eine andere, langsame, aber vom Programmieren her einfache Methode wäre, dass du zur Laufzeit den eingegebenen Term in eine Methode packst, nachkompilierst, und das Ergebnis zurückgegeben bekommst, wenn du sie aufrufst ;) .
Oder meinst du vielleicht Klammern im Quellcode? Das liegt daran, dass mein Code in VB.Net geschrieben ist, und du C# lernst. Aber du solltest das schon verstehen, nachdem du ja C++ schon mal benutzt hast. Die Methodenaufrufe kannst du eigentlich 1:1 kopieren, nur einen Strichpunkt musst du hinten dran machen.
Was dir vielleicht noch auffällt ist, dass der Datentyp von "aktuelleZahl" "Double?" ist. Anstattdessen könnte man auch "Nullable(Of Double)" schreiben. Wenn du das nicht kennst, schau dir mal die MSDN an. Im großen und ganzen ist das ein normaler Double-Wert, der allerdings auch "Nothing" annehmen kann, und eine Eigenschaft "HasValue" hat.
 
Zuletzt bearbeitet:

Kamil1984

Grünschnabel
Hallo, sitze mal wieder an dem Taschenrechner fest. Kann jetzt zwar mehr als nur 2 Zahlen berechnen aber sobald ein anderer Operator dazu kommt z.B. 5+5-3, rechnet er falsch. Muss irgendwo den Operator abfragen oder so aber mal sehen wie ihr das angehen würdet.
Hier nochmal Quellcode nicht komplett nur mit plus und minus
Code:
        private void button1_Click(object sender, EventArgs e)
        {

           textBox1.Text += button1.Text;
        }
Buttons 1-9 ist klar...
Code:
        private void buttonPlus_Click(object sender, EventArgs e)
        {
                dWert1 = decimal.Parse(textBox1.Text);
                sOperator = "+";
                Eingabe(dWert1, sOperator);
                textBox1.Clear();
        }
        private void buttonMinus_Click(object sender, EventArgs e)
        {

                dWert1 = decimal.Parse(textBox1.Text);
                sOperator = "-";
                Eingabe(dWert1, sOperator);
                textBox1.Clear();
        }
Und die Methode
Code:
        public decimal Eingabe(decimal Wert1,string Operator)
        {
            switch (Operator)
            {
                case "+":

                    dErgebnis += Wert1;

                    break;

                case "-":
                    if (dErgebnis == 0)
                    {
                        dErgebnis = decimal.Parse(textBox1.Text);
                    }
                    else
                    {
                        dErgebnis -= Wert1;

                    }
                    break;
        }
Der gleich Button
Code:
        private void buttonGleich_Click(object sender, EventArgs e)
        {

                Eingabe(decimal.Parse(textBox1.Text), sOperator);
                textBox1.Text = Convert.ToString(dErgebnis);

        }
Sonst ist das ja eigentlich fast wie das Beispiel von Engelmarkus.
Für verbesserungs Vorschläge bin ich gern offen.
Danke im Voraus.
 

Spyke

Premium-User
Wie wirkt sich das falsch rechnen aus?

Ich vermute mal es liegt da dran das zweimal die Methode Eingabe aufgerufen wird (beim Plus/Minus Klick und beim Gleich Klick).
 

Kamil1984

Grünschnabel
Ok hab es jetzt und das Thema ist erledigt hier nochmal der code
Code:
//--------------------------------Operatoren-----------------------------------------
        private void buttonPlus_Click(object sender, EventArgs e)
        {
            if (decimal.TryParse(textBox1.Text, out dec) == true)
            {
                Eingabe(dWert1);
                sOperator = "+";
                textBox1.Clear();
            }
        }
        private void buttonMinus_Click(object sender, EventArgs e)
        {
            if (decimal.TryParse(textBox1.Text, out dec) == true)
            {
                Eingabe(dWert1);
                sOperator = "-";
                textBox1.Clear();
            }
        }
        private void buttonMal_Click(object sender, EventArgs e)
        {
            if (decimal.TryParse(textBox1.Text, out dec) == true)
            {
                Eingabe(dWert1);
                sOperator = "*";
                textBox1.Clear();
            }
        }
        private void buttonGeteilt_Click(object sender, EventArgs e)
        {
            if (decimal.TryParse(textBox1.Text, out dec) == true)
            {
                Eingabe(dWert1);
                sOperator = "/";
                textBox1.Clear();
            }
        }

        private void buttonGleich_Click(object sender, EventArgs e)
        {
                Eingabe(decimal.Parse(textBox1.Text));
                textBox1.Text = Convert.ToString(dErgebnis);
                sOperator = "";
                komma = false;
        }
//-------------------------Komma und Vorzeichen-------------------------------
        private void buttonKomma_Click(object sender, EventArgs e)
        {
            if (decimal.TryParse(textBox1.Text, out dec) == true)
            {
                if (komma == true)
                {
                    textBox1.Text += ",";
                    komma = false;
                }
            }
        }
        private void buttonVorzeichen_Click(object sender, EventArgs e)
        {
            if (decimal.TryParse(textBox1.Text, out dec) == false)
            {
                textBox1.Text = "-";
            }
        }
//------------------------------Rechnung----------------------------------------
        public decimal Eingabe(decimal Wert1)
        {
            dWert1 = decimal.Parse(textBox1.Text);

            switch (sOperator)
            {
                case"":
                    dErgebnis = dWert1;
                    komma = true;
                    break;
                case"+":
                    dErgebnis += dWert1;
                    sOperator = "";
                    komma = true;
                    break;
                case "-":
                    dErgebnis -= dWert1;
                    sOperator = "";
                    komma = true;
                    break;
                case"*":
                    dErgebnis *= dWert1;
                    sOperator = "";
                    komma = true;
                    break;
                case"/":
                    dErgebnis /= dWert1;
                    sOperator = "";
                    komma = true;
                    break;
            }
             return dErgebnis;
        }
        private void buttonClear_Click(object sender, EventArgs e)
        {
            textBox1.Clear();
            dWert1 = 0;
            dErgebnis = 0;
            sOperator = "";
            komma = true;
        }
Punkt vor Strichrechnung wird nicht beachtet.
Danke für alle Antworten.
MfG
Kamil