C# Taschenrechner Problem mehrere Rechnungen

ExE_96

Grünschnabel
Hallo ich muss als Praktikant einen Taschenrechner programmieren. Das habe ich soweit auch geschafft, er kann addieren, subtrahieren
,multiplizieren und dividieren. Ich muss ihn mit einer WinForm programmieren. Mein Problem ist nun,
dass der Rechner Ketten wie 53-7-5 nicht rechnen kann ( da kommt 55 raus). Er muss es in einem
Schritt machen können. Bin ziemlicher Anfänger in dem Gebiet.
Punkt vor Strich muss nicht beachtet werden.

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        
        }

        double total1 = 0;
        double total2 = 0;
        
        

        private void button1_Click(object sender, EventArgs e) //1
        {

            textBox1.Text = textBox1.Text + button1.Text;       
        }

        private void button2_Click(object sender, EventArgs e) //2
        {
            textBox1.Text = textBox1.Text + button2.Text;
        }

        private void button3_Click(object sender, EventArgs e) //3
        {
            textBox1.Text = textBox1.Text + button3.Text;
        }

        private void button4_Click(object sender, EventArgs e) //4
        {
            textBox1.Text = textBox1.Text + button4.Text;
        }

        private void button5_Click(object sender, EventArgs e) //5
        {
            textBox1.Text = textBox1.Text + button5.Text;
        }

        private void button6_Click(object sender, EventArgs e) //6
        {
            textBox1.Text = textBox1.Text + button6.Text;
        }

        private void button7_Click(object sender, EventArgs e) //7
        {
            textBox1.Text = textBox1.Text + button7.Text;
        }

        private void button8_Click(object sender, EventArgs e) //8
        {
            textBox1.Text = textBox1.Text + button8.Text;
        }

        private void button9_Click(object sender, EventArgs e) //9
        {
            textBox1.Text = textBox1.Text + button9.Text;

        }

        private void button10_Click(object sender, EventArgs e) //0
        {
            textBox1.Text = textBox1.Text + button10.Text;
            
        }

        private void button15_Click(object sender, EventArgs e) //Clear
        {
            textBox1.Clear();

        }



        private void button14_Click(object sender, EventArgs e) //addieren
        {
            total1 = total1 + double.Parse(textBox1.Text);
            textBox1.Clear();

            addieren = true;
            subtrahieren = false;
            multiplizieren = false;
            dividieren = false;

        }

        private void button16_Click(object sender, EventArgs e) //Gleichheitszeichen
        {
            if(addieren == true)
            {
                total2 = total1 + double.Parse(textBox1.Text);
                

            }
            else if (subtrahieren == true)
            {
                total2 = total1 - double.Parse(textBox1.Text);
            }
            else if (multiplizieren == true)
            {
                total2 = total1 * double.Parse(textBox1.Text);
            }
            else if (dividieren == true)
            {
                total2 = total1 / double.Parse(textBox1.Text);
            }


            textBox1.Text = total2.ToString();
            total1 = 0;
            
        }

        bool addieren = false;
        bool subtrahieren = false;
        bool multiplizieren = false;
        bool dividieren = false;

        private void button12_Click(object sender, EventArgs e) //subtrahieren
        {
            total1 = total1 + double.Parse(textBox1.Text);

           
            textBox1.Clear();

            addieren = false;
            subtrahieren = true;
            multiplizieren = false;
            dividieren = false;
        }

        private void button11_Click(object sender, EventArgs e) //multiplizieren
        {
            total1 = total1 + double.Parse(textBox1.Text);
            textBox1.Clear();

            addieren = false;
            subtrahieren = false;
            multiplizieren = true;
            dividieren = false;
        }

        private void button13_Click(object sender, EventArgs e) //dividieren
        {
            total1 = total1 + double.Parse(textBox1.Text);
            textBox1.Clear();

            addieren = false;
            subtrahieren = false;
            multiplizieren = false;
            dividieren = true;
        }

        private void button17_Click(object sender, EventArgs e) //Schliessen
        {
            this.Close();
        }

        private void button18_Click(object sender, EventArgs e) //Komma
        {
            textBox1.Text = textBox1.Text + button18.Text;
            
        }

       
        
    }
}
 
hi,

habe leider grade keine Zeit mir das genau anzusehen, aber dein Problem liegt glaube ich hier:

Code:
private void button12_Click(object sender, EventArgs e) //subtrahieren
        {
            total1 = total1 + double.Parse(textBox1.Text);
 
           
            textBox1.Clear();
 
            addieren = false;
            subtrahieren = true;
            multiplizieren = false;
            dividieren = false;
        }

um genau zu sein
Code:
total1 = total1 + double.Parse(textBox1.Text);

wenn du 53-7-5 rechnen willst, dann Addiert er jedesmal die Zahlen zusammen.
also
er schreibt in total1 = 0 + 53 -> 53
dann total1 = 53 + 7 -> 60
dann drückst du auf gleich und er Subtrahiert die letzte Zahl also
total2 = 60 - 5

Dein Problem besteht im grunde darin, das du erst auf die Operation klickst und dann die Zahl eingibst.
evt könnte die Lösung sein:

Code:
// Startwerte
            addieren = true;
            subtrahieren = false;
            multiplizieren = false;
            dividieren = false;

private void button12_Click(object sender, EventArgs e) //subtrahieren
        {
            if(addieren == true)
            {
                total1 = total1 + double.Parse(textBox1.Text);
                
 
            }
            else if (subtrahieren == true)
            {
                total1 = total1 - double.Parse(textBox1.Text);
            }
            else if (multiplizieren == true)
            {
                total1 = total1 * double.Parse(textBox1.Text);
            }
            else if (dividieren == true)
            {
                total1 = total1 / double.Parse(textBox1.Text);
            }
 
 
            // textBox1.Text = total2.ToString();
            // total1 = 0;
 
           
            textBox1.Clear();
 
            addieren = false;
            subtrahieren = true;
            multiplizieren = false;
            dividieren = false;
        }
natürlich auch für Addition, Multiplikation und der Division
und "Gleich" noch anpassen
Eine Funktion wäre hier angebracht ;)
 
Zuletzt bearbeitet:
Hat funktioniert, vielen Dank :) neues Problem ist jetzt aber dass wenn ich den Clear Button drücke sich zwar die TextBox löscht aber irgendwie bleibt der Wert noch erhalten und die zweite Rechnung wird wieder verfälscht.
 
überleg mal wo überall der Wert drin steht.
Im Clear Button löscht du nur die Textbox, aber nicht die Variablen...

im übrigen sollten immer sinn volle Variablen Namen Verwendet werden, auch für Buttons, Textboxen und co. Hier bietet sich auch immer an, im Namen, ein kleines Kürzel des Objektes zu verwenden. Zum Beispiel "btn_Addition" btn steht dann für Button.
Und bei deinen Ursprünglichen Program hast du die Textbox als Zwischenspeicher benutzt, sowas macht man nicht. Immer eine Variable benutzen.
 
Vielen Dank auch das funktioniert jetzt. die Button Namen habe ich auch geändert. Nun gibt es aber einen Fehler, dass wenn ich 2mal ein Rechenzeichen hintereinander drücke, das Programm abstürzt.

EDIT: Problem hat sich erledigt, hab eine Lösung gefunden. Nun möchte ich aber noch eine Tastatureingabe hinzufügen, weiß aber nicht wie ich das hinbekommen kann.
 
Zuletzt bearbeitet:
mein Problem war, dass ich immer den Fokus auf der Taste die ich auf der Tastatur drücken will, auch in meiner Form haben muss, hab das Problem aer wie folgt gelöst

Code:
 private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.NumPad1 || e.KeyCode == Keys.D2)
            {
                tb_display.Text = tb_display.Text + "2";
 
Kannst du nicht den Focus direkt in die Textbox setzen und dann einfach loschreiben?
Für das Beenden der Eingabe kannst du ja bei der TextBox KeyPress auf Enter oder sowas prüfen.
Wobei enter dann das "=" auslöst.
 
Hab das Problem jetzt bereits gelöst, nun muss ich einen Vorzeichenwechsel und eine Hystorie hinzufügen.
Mein Ansatz zum Vorzeichenwechsel:
Code:
double test = -1;

private void Vorzeichen_Click(object sender, EventArgs e)
        {
            Convert.ToDouble(tb_display.Text);
            Convert.ToDouble(test);

            tb_display.Text = (tb_display.Text) * test;
        }

bekomm aber immer den Fehler, dass das mal zeichendort nicht geht.
Für die historie fehlt mir bis jetzt nochder Ansatz
 
Wenn ich mich nicht irre, dann müsste der Compiler dir ein Fehler ausspucken, da du versuchst einen String mit einer Double Zahl zu Multiplizieren.

Code:
            Convert.ToDouble(tb_display.Text);
            Convert.ToDouble(test);

ich bin mir nicht sicher ob das so funktioniert, da du das Convertierte in eine neue Variable schreiben musst. Außerdem warum willst du test, zu double Convertieren, test ist doch bereits ein double.

Da du aber den richtigen Ansatz hast, zeig ich dir eine Lösung:
Code:
private void Vorzeichen_Click(object sender, EventArgs e)
        {
            tb_display.Text = (Convert.ToDouble(tb_display.Text) * -1).ToString();
        }

oder

Code:
private void Vorzeichen_Click(object sender, EventArgs e)
        {
            double Zahl;

           Zahl = Convert.ToDouble(tb_display.Text);

           Zahl = Zahl * -1;

            tb_display.Text = Zahl.ToString();
        }
habs direkt ins Forum geschrieben, ist also nicht durch einen Compiler gelaufen.

es ist beides das selbe. Du kannst auch Lokale Variablen benutzen die sind dann nur zwischen den beiden {} gültig. Deine Variable (überflüssige) Wert wäre Global und wäre in der gesamten Klasse gültig. Nur so als Tipp.

Um eine History einzubauen, empfehle ich dir die Listbox als Steuerelement. Hier kannst du wie in einer Liste Einträge nachschieben.
Die für dich wichtigen Befehle wären:
Code:
lsb_Listbox.Items.Add("Hier die Zeile die du Hinzufügen willst");
lsb_Listbox.Items.Clear(); //alles Löschen.
string Zeile;
Zeile = lsb_Listbox.Items[0].toString(); // die 0. Zeile Auslesen.

int Anzahl;
Anzahl = lsb_Listbox.Items.Count(); //Anzahl der verwendeten Zeilen auslesen beginnend bei 1.

Also .Items[0] bedeutet die 1. Zeile. wenn du nur einen Eintrag hast, bedeutet das du kannst ihm mit .Items[0] auslesen. .Count() würde dir aber 1 zurück geben.
Wenn du 2 Zeilen hast, kannst du mit .Items[0] die 1. Zeile und mit Items[1] die 2. Zeile Auslesen, und .Count würde dir 2 zurück geben.
wenn du immer die unterste Zeile auslesen willst wäre das dann .Items[lsb_Listbox.Items.Count() - 1];
 
Zuletzt bearbeitet:
Zurück