C# Taschenrechner: Einige typische Anfängerfragen



  • Hallo :),

    ich bringe mir im Moment C# bei und möchte einen Taschenrechner programmieren.
    Das sieht bis jetzt so aus:

    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 Taschenrechner
    {
        public partial class Form1 : Form
        {
            bool plus = false, minus = false, mal = false, geteilt = false, gleich=false; //Global
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void CheckifGleich() //Methodenstub=einfache Möglichkeit, beim Schreiben eines Methodenaufrufs eine neue Methodendeklaration von Visual Studio erstellen zu lassen. Visual Studio leitet die Deklaration vom Aufruf ab.Praktischer, da Änderungen gleich für alle Zahlen übernommen werden 
            {
                if (gleich == true)
                {
                    textBox1.Text = "";
                    textBox2.Text = "";
                    gleich = false;
                }
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                CheckifGleich();//Überprüft,ob bereits etwas berechnet wurde und beginnt beim Klicken auf eine Zahl eine neue Berechnung
                textBox1.Text = textBox1.Text + "1";
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "2";
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "3";
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "4";
            }
    
            private void button5_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "5";
            }
    
            private void button6_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "6";
            }
    
            private void button7_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "7";
            }
    
            private void button8_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "8";
            }
    
            private void button9_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "9";
            }
    
            private void button10_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "0";
            }
    
            private void button12_Click(object sender, EventArgs e)
            {
                if (textBox1.Text.Contains(","))//Prüfen, ob Textbox bereits einen Dezimalpunkt enthält
                {
                    return;
                }
                else
                {
                    textBox1.Text = textBox1.Text + ",";
                }
    
            }
    
            private void button11_Click(object sender, EventArgs e)
            {
                if (textBox1.Text.Contains("-"))
                {
                    textBox1.Text = textBox1.Text.Remove(0, 1);// Wenn bereits ein Minus in der Textbox steht, wird das erste Zeichen in der Textbox beim Klicken des Buttons gelöscht,in dem Fall das Minus. So wird die Zahl wieder positiv.
                }
                else
                {
                    textBox1.Text = "-" + textBox1.Text; //Das Minus wird vor die Zahl gesetzt
                }
            }
    
            private void button15_Click(object sender, EventArgs e)
            {
                if (textBox1.Text == "")
                {
                    return;
                }
                else
                {
                    plus = true;
                    textBox1.Tag = textBox1.Text;//Die Zahlen sollen in der Textbox gespeichert werden, deshalb "tag"
                    textBox1.Text = "";
    
                }
            }
    
            private void button16_Click(object sender, EventArgs e)
                {
                    if (textBox1.Text == "")
                    {
                        return;
                    }
                    else
                    {
                        minus = true;
                        textBox1.Tag = textBox1.Text;//Die Zahlen sollen in der Textbox gespeichert werden, deshalb "tag"
                        textBox1.Text = "";
    
                    }
                }
    
                private void button17_Click(object sender, EventArgs e)
                {
                    if (textBox1.Text == "")
                    {
                        return;
                    }
                    else
                    {
                        mal = true;
                        textBox1.Tag = textBox1.Text;//Die Zahlen sollen in der Textbox gespeichert werden, deshalb "tag"
                        textBox1.Text = "";
                    }
                }
    
                private void button18_Click(object sender, EventArgs e)
                {
                    if (textBox1.Text == "")
                    {
                        return;
                    }
                    else
                    {
                        geteilt = true;
                        textBox1.Tag = textBox1.Text;//Die Zahlen sollen in der Textbox gespeichert werden, deshalb "tag"
                        textBox1.Text = "";
                    }
    
                }
    
            private void button19_Click(object sender, EventArgs e)
            {
                gleich = true; //gleich=true sagt dem Programm,dass bereits etwas berechnet wurde
    
                if (plus)//Wenn plus=true,dann...
                {
                    decimal dec = Convert.ToDecimal(textBox1.Tag) + Convert.ToDecimal(textBox1.Text);//Die Zahl im Tag und die Zahl in der Textbox sollen addiert werden
                    textBox2.Text = dec.ToString(); //To String,damit es in der Textbox ausgegeben werden kann
                }
    
                if (minus)//Wenn plus=true,dann...
                {
                    decimal dec = Convert.ToDecimal(textBox1.Tag) - Convert.ToDecimal(textBox1.Text);//Die Zahl im Tag und die Zahl in der Textbox sollen addiert werden
                    textBox2.Text = dec.ToString(); //To String,damit es in der Textbox ausgegeben werden kann
                }
    
                if (mal)//Wenn plus=true,dann...
                {
                    decimal dec = Convert.ToDecimal(textBox1.Tag) * Convert.ToDecimal(textBox1.Text);//Die Zahl im Tag und die Zahl in der Textbox sollen addiert werden
                    textBox2.Text = dec.ToString(); //To String,damit es in der Textbox ausgegeben werden kann
                }
    
                if (geteilt)//Wenn plus=true,dann...
                {
                    decimal dec = Convert.ToDecimal(textBox1.Tag) / Convert.ToDecimal(textBox1.Text);//Die Zahl im Tag und die Zahl in der Textbox sollen addiert werden
                    textBox2.Text = dec.ToString(); //To String,damit es in der Textbox ausgegeben werden kann
                }
            }
    
            private void button20_Click(object sender, EventArgs e)
            {
                plus = minus = mal = geteilt = false; 
                textBox1.Text= "";
                textBox2.Text = "";
                textBox1.Tag = "";
            }
        }
    }
    

    Ich habe mir einige Notizen gemacht,lasst euch davon aber nicht stören :P. Der Rechner beherrscht die Grundrechenarten und kann Kommazahlen berechnen. Aber alles nur mit 2 Zahlen! Z.B. 5+5+5 ist momentan noch 10. Was muss ich also tun, damit ich so viele Zahlen wie ich möchte berechnen kann? Die andere Frage ist, ich würde gerne Formeln eingeben können. Sowas wie (4+5)*2. Nur wie erkennt mein Taschenrechner jetzt,dass ich eine Klammer gesetzt habe?



  • Ich hab den Code mal ein wenig abgeändert. Jetzt kann ich zwar für Plus mehrere Zahlen berechnen, aber bei dem Rest kommen jetzt völlig falsche Ergebnisse raus:

    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 Taschenrechner
    {
        public partial class Form1 : Form
        {
            bool plus = false, minus = false, mal = false, geteilt = false, gleich=false; //Global; bool ist entweder "true" oder "false"
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void CheckifGleich() //Methodenstub=einfache Möglichkeit, beim Schreiben eines Methodenaufrufs eine neue Methodendeklaration von Visual Studio erstellen zu lassen. Visual Studio leitet die Deklaration vom Aufruf ab.Praktischer, da Änderungen gleich für alle Zahlen übernommen werden 
            {
                if (gleich == true)
                {
                    textBox1.Text = "";
                    textBox2.Text = "";
                    gleich = false;
                }
            }
    
            double gespZahl1 = 0;//Die Zahl, die als erstes in die Textbox eingegeben wird,wird in dieser Variable gespeichert, um sie später mit weiteren Zahlen berechnen zu können (damit die Textbox die Zahl nicht "vergisst")
            double gespZahl2 = 0;//Notwendig,um das Ergebnis der Rechnung zu speichern
    
            private void button1_Click(object sender, EventArgs e)
            {
                CheckifGleich();//Überprüft,ob bereits etwas berechnet wurde und beginnt beim Klicken auf eine Zahl eine neue Berechnung
                textBox1.Text = textBox1.Text + "1";
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "2";
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "3";
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "4";
            }
    
            private void button5_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "5";
            }
    
            private void button6_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "6";
            }
    
            private void button7_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "7";
            }
    
            private void button8_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "8";
            }
    
            private void button9_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "9";
            }
    
            private void button10_Click(object sender, EventArgs e)
            {
                CheckifGleich();
                textBox1.Text = textBox1.Text + "0";
            }
    
            private void button12_Click(object sender, EventArgs e)
            {
                if (textBox1.Text.Contains(","))//Prüfen, ob Textbox bereits einen Dezimalpunkt enthält
                {
                    return;
                }
                else
                {
                    textBox1.Text = textBox1.Text + ",";
                }
    
            }
    
            private void button11_Click(object sender, EventArgs e)
            {
                if (textBox1.Text.Contains("-"))
                {
                    textBox1.Text = textBox1.Text.Remove(0, 1);// Wenn bereits ein Minus in der Textbox steht, wird das erste Zeichen in der Textbox beim Klicken des Buttons gelöscht,in dem Fall das Minus. So wird die Zahl wieder positiv.
                }
                else
                {
                    textBox1.Text = "-" + textBox1.Text; //Das Minus wird vor die Zahl gesetzt
                }
            }
    
            private void button15_Click(object sender, EventArgs e)
            {
                if (textBox1.Text == "")
                {
                    return;
                }
                else
                {
                    plus = true;
                    gespZahl1 = gespZahl1 + double.Parse(textBox1.Text);//Der Text in der Textbox wird zu double konvertiert und anschließend in gespZahl1 gespeichert. 
                    textBox1.Clear();//Textbox wird geleert, um eine neue Zahl eingeben zu können
    
                }
            }
    
            private void button16_Click(object sender, EventArgs e)
                {
                    if (textBox1.Text == "")
                    {
                        return;
                    }
                    else
                    {
                        minus = true;
                        gespZahl1 = gespZahl1 - double.Parse(textBox1.Text);
                        textBox1.Clear();
    
                    }
                }
    
                private void button17_Click(object sender, EventArgs e)
                {
                    if (textBox1.Text == "")
                    {
                        return;
                    }
                    else
                    {
                        mal = true;
                        gespZahl1 = gespZahl1 * double.Parse(textBox1.Text);
                        textBox1.Clear();
    
                    }
                }
    
                private void button18_Click(object sender, EventArgs e)
                {
                    if (textBox1.Text == "")
                    {
                        return;
                    }
                    else
                    {
                        geteilt = true;
                        gespZahl1 = gespZahl1 / double.Parse(textBox1.Text);
                        textBox1.Clear();
    
                    }
    
                }
    
            private void button19_Click(object sender, EventArgs e)
            {
                gleich = true; //gleich=true sagt dem Programm,dass bereits etwas berechnet wurde
    
                if (plus)//Wenn plus=true,dann...
                {
                    gespZahl2 = gespZahl1 + double.Parse(textBox1.Text);//Der Text aus der Textbox wird zu double konvertiert und zu dem hinzugefügt,was in gespZahl1 gespeichert ist. Wenn all das funktioniert hat,wird das Ergebnis in gespZahl2 gespeichert.
                    textBox2.Text = gespZahl2.ToString();//ToString konvertieren,damit es in der Textbox angezeigt werden kann
                    gespZahl1 = 0;//gespZahl1 wird auf 0 gesetzt,damit man mit einer neuen Berechnung beginnen kann
                }
    
                if (minus)//Wenn minus=true,dann...
                {
                    gespZahl2 = gespZahl1 - double.Parse(textBox1.Text);
                    textBox2.Text = gespZahl2.ToString();
                    gespZahl1 = 0;
                }
    
                if (mal)//Wenn mal=true,dann...
                {
                    gespZahl2 = gespZahl1 * double.Parse(textBox1.Text);
                    textBox2.Text = gespZahl2.ToString();
                    gespZahl1 = 0;
                }
    
                if (geteilt)//Wenn geteilt=true,dann...
                {
                    gespZahl2 = gespZahl1 / double.Parse(textBox1.Text);
                    textBox2.Text = gespZahl2.ToString();
                    gespZahl1 = 0;
                }
            }
    
            private void button20_Click(object sender, EventArgs e)
            {
                plus = minus = mal = geteilt = false; 
                textBox1.Text= "";
                textBox2.Text = "";
                textBox1.Tag = "";
            }
        }
    }
    

    Hilfe!



  • Hallo Lavorita,

    zuerst muss ich sagen das ich deinen Code nicht so ganz verstehe.. Deinen vielen Buttons (deren Namen nichtssagend sind) nach würde ich sagen dass du versuchst sowas wie den Windows-Taschenrechner mit Tasten zu programmieren. Allerdings würde dann ein Problem wie "5+5+5 = 10" oder Klammern wegfallen. Das klingt eher so als ob jemand eine Rechnung in eine Textbox eingibt und das dann ausgerechnet wird. Wie soll der Rechner denn funktionieren ?



  • Hallo Lavorita,

    dein Quelltext ist wirklich schwer zu überblicken. Du solltest zumindest den EventHandlern für die Buttons sprechende Namen geben.

    Anbei eine Grundlegende Frage, würdest du nachdem du ein Ergebnis errechnet hast und weitere Zahlen addieren möchtest erwarten, das dein Zwischenergebnis plötzlich weg ist?!

    Grundlegend ist es aber wirklich zu unübersichtlich und sollte aufgearbeitet werden.

    Was mir auch Schleierhaft ist: Nachdem der Benutzer ein Zeichen für die Berechnung eingegeben hat, löschst du seinen Wert, macht das Sinn?

    Stellt mans schlau an, reicht (ohne Validierung) schon folgendes:

    private void OnButtonInput(object sender, EventArgs e)
    		{
    			this.txtInput.Text += (sender as Button).Text;
    		}
    
    		private void OnCalculate(object sender, EventArgs e)
    		{
    			// get all numbers
    			string[] sNumbers = this.txtInput.Text.Split(new char[] { '+', '-', '*', '/' }, StringSplitOptions.RemoveEmptyEntries);
    
    			Double result = 0;
    
    			foreach (string number in sNumbers)
    			{
    				if (Char.IsNumber(txtInput.Text[0]))
    					result += Double.Parse(number);
    				else
    				{
    					switch (txtInput.Text[0])
    					{
    						case '+':
    							result += Double.Parse(number);
    							break;
    						case '-':
    							result -= Double.Parse(number);
    							break;
    						case '*':
    							result *= Double.Parse(number);
    							break;
    						case '/':
    							result /= Double.Parse(number);
    							break;
    					}
    					txtInput.Text = txtInput.Text.Remove(0, 1);
    				}
    				txtInput.Text = txtInput.Text.Remove(txtInput.Text.IndexOf(number), number.Length);
    			}
    
    			this.txtInput.Text = result.ToString();
    		}
    


  • hab mich 3tage eingelesen, habe keinerlei programier vorkenntnisse 😉

    using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.Data;
        using System.Drawing;
        using System.Linq;
        using System.Text;
        using System.Threading.Tasks;
        using System.Windows.Forms;
    
        namespace WindowsFormsApplication13
        {
            public partial class Rechner : Form
            {
                public Rechner()
                {
                    InitializeComponent();
                }
                double numberOne;     // Die zahl die addiert wird.
                double numerTwo;      // Der wert der, das gewünschte ergebniss ausgibt.
                string theOP;         // Die jeweiligen Operatoren ( + - / * ) sowie ggf. eine fehler meldung.
    
                private void btnOne_Click(object sender, EventArgs e)
                {
                    // Gibt die Zahl 1 aus.
                    txtDisplay.Text = txtDisplay.Text + btnOne.Text;
                }
    
                private void btnZero_Click(object sender, EventArgs e)
                {
                    // Gibt die Zahl 0 aus.
                    txtDisplay.Text = txtDisplay.Text + btnZero.Text;
                }
    
                private void btnTwo_Click(object sender, EventArgs e)
                {
                    // Gibt die Zahl 2 aus.
                    txtDisplay.Text = txtDisplay.Text + btnTwo.Text;
                }
    
                private void btn3_Click(object sender, EventArgs e)
                {
                    // Gibt die Zahl 3 aus.
                    txtDisplay.Text = txtDisplay.Text + btn3.Text;
                }
    
                private void btnFour_Click(object sender, EventArgs e)
                {
                    // Gibt die Zahl 4 aus.
                    txtDisplay.Text = txtDisplay.Text + btnFour.Text;
                }
    
                private void btn5_Click(object sender, EventArgs e)
                {
                    // Gibt die Zahl 5 aus.
                    txtDisplay.Text = txtDisplay.Text + btn5.Text;
                }
    
                private void btnSix_Click(object sender, EventArgs e)
                {
                    // Gibt die Zahl 6 aus.
                    txtDisplay.Text = txtDisplay.Text + btnSix.Text;
                }
    
                private void btnSeven_Click(object sender, EventArgs e)
                {
                    // Gibt die Zahl 7 aus.
                    txtDisplay.Text = txtDisplay.Text + btnSeven.Text;
                }
    
                private void btnEight_Click(object sender, EventArgs e)
                {
                    // Gibt die Zahl 8 aus.
                    txtDisplay.Text = txtDisplay.Text + btnEight.Text;
                }
    
                private void btnNine_Click(object sender, EventArgs e)
                {
                    // Gibt die Zahl 9 aus.
                    txtDisplay.Text = txtDisplay.Text + btnNine.Text;
                }
    
                private void btnPlus_Click(object sender, EventArgs e)
    
                    // Dieser befehl ermöglicht die zahl + zahl auszugeben.
                {
                    numberOne = numberOne + double.Parse(txtDisplay.Text);
                    txtDisplay.Clear();
    
                    theOP = "+";
                }
    
                private void btnEqual_Click(object sender, EventArgs e)
                {
                    switch (theOP) // Die jeweiligen Operatoren ( + , - , * , /)
    
                    { case "+" : // Code zum addieren.
                            numerTwo = numberOne + double.Parse(txtDisplay.Text);
                            break;
                        case "-" : // Code zum subtrahieren.
    
                            numerTwo = numberOne - double.Parse(txtDisplay.Text);
                            break;
    
                        case"*": // Code zum multiplyzieren.
                            numerTwo=numberOne*double.Parse(txtDisplay.Text);
                            break;
                        case"/": // Code zum Dividieren.
                            numerTwo = numberOne / double.Parse(txtDisplay.Text);
                            break;
    
                        default : // Code um einen absturz zu verhindern und einde fehlermeldung auszugeben.
                            MessageBox.Show("Dieser vorganag ist nicht möglich", "404", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            break;
    
                    }
    
                    txtDisplay.Text = numerTwo.ToString(); // Gibt das ergeniss in der String methode aus.
                    numberOne = 0;
                }
    
                private void btnClear_Click(object sender, EventArgs e)
                {
                    txtDisplay.Clear(); // Der eingetragene Wert wird gelöscht.
                }
    
                private void btnKomma_Click(object sender, EventArgs e)
                {
                    txtDisplay.Text = txtDisplay.Text + ","; // ermöglicht deziaml rechnen.
    
                }
    
                private void btnC_Click(object sender, EventArgs e)
                {
                    txtDisplay.Text = txtDisplay.Text + 0; // löscht den Wert, ermöglicht einen neuen hinzuzufügen -
                    txtDisplay.Clear();                   // ohne die Rechnung erneut zu beginnen.
    
                }
    
                private void btnMinus_Click(object sender, EventArgs e)
                {
                    numberOne = numberOne + double.Parse(txtDisplay.Text);
                    txtDisplay.Clear();
    
                    theOP = "-"; // Minus
                }
    
                private void btnMultiply_Click(object sender, EventArgs e)
                {
                    numberOne = numberOne + double.Parse(txtDisplay.Text);
                    txtDisplay.Clear();
    
                    theOP = "*"; // Mal
                }
    
                private void btnDivide_Click(object sender, EventArgs e)
                {
                    numberOne = numberOne + double.Parse(txtDisplay.Text);
                    txtDisplay.Clear();
    
                    theOP = "/"; // Geteilt
    
                }
            }
        }
    


  • Ich denke mal, das es sich bei deinem Taschenrechner um ein Grundliegendes Design-Problem handelt.

    Du hast dir nun für jedes Zeichen ein globale Variable definiert.
    Was ist wenn jemand aber nun (((5 + 5 - 32 + 9) / 2 ) + 17) rechnen möchte?

    Ich würde an Deiner Stelle ein Textfeld nehmen, indem der Benutzer mittels Buttons eine Zeichenkette erstellen kann.
    Also wie in jedem Taschenrechner üblich mittels 0,1,2,3,4,5,6,7,8,9,+,-,*,/
    Wenn Du nun diese Zeichenkette nimmst, kannst eigentlich schon so etwas wie:

    int Ergebnis = Zeichenkette;
    

    machen und du hast alle erdenklichen Variationen abgedeckt.



  • Sorry, Deinen Code kann ich nicht durchlesen, da habe ich im Moment nicht die Zeit für. Aber Du möchtest anscheinend einen Rechner, der ganze Ausdrücke berechnen kann, so wie Coca. Ich habe den allerdings in C++ geschrieben. Der Parser selbst (es gibt auch ein Kommandozeilenprogramm dafür) basiert auf dem Beispiel "Ein Tischrechner" in Bjarne Stroustrups Buch "Die C++ Programmiersprache".

    Ich kann Dir dieses Beispiel nur wärmstens empfehlen, wenn Du selbst einen Parser entwickeln willst. Da C# nicht so viel anders wie C++ ist, sollte man dieses Konzept leicht für C# umwandeln können. Insbesondere der Trick, dass der Scanner immer ein Token voraus ist (jede Funktion z. B. zur Berechnung von + liest schon immer das nächste Token im Voraus).

    Mit Stroustrups Beispiel war es wirklich nicht so schwer, das ganze zu verstehen. Ich konnte danach den Parser selbst leicht um Funktionen und Potenz-Operator (^) erweitern. Außerdem solltest Du den Code für die grafische Oberfläche strikt vom Code für den Parser trennen (Stichwort Model View Controller). Ich habe zunächst erst eine Kommandozeilenversion entwickelt und als die stand, den Parser daraus entnommen, und eine Funktion daraus gemacht calcfunc(char *resultbuf,char *errorbuf). Den Stroustrup solltest Du Dir in jeder besseren Bücherei ausleihen können.


Log in to reply