Taschenrechner in C#

Shauni

Cadet 3rd Year
Registriert
Feb. 2011
Beiträge
44
Hey Leute wir programmieren gerade einen Taschenrecher in c# mit Windows Forms

mein Code sieht wie folgt aus:

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 Taschenrechner
{
    public partial class fTaschenrechner : Form
    {
        CRechner Rechner = new CRechner();
        string[] sMember = new string[4] {"", "", "", ""};
        int i=0;
        public fTaschenrechner()
        {
            InitializeComponent();
        }

        private void bGetNum(object sender, EventArgs e)
        {
            if (((Button)sender).Text == "," && sMember[i].Contains(",") == false)
            {
                if (sMember[i].Length == 0 || sMember[i].Length == 1 && sMember[i].Contains("-") == true)
                {
                    sMember[i] += "0" + ((Button)sender).Text;
                }
                else
                {
                    sMember[i] += ((Button)sender).Text;
                }
            }
            
            else if (((Button)sender).Text == "+/-")
            {
                if (sMember[i].Contains("-") == false)
                {
                    sMember[i] = sMember[i].Insert(0,"-");
                }
                else
                {
                    sMember[i] = sMember[i].Remove(0, 1);
                }
            }

            else if(((Button)sender).Text != "," && ((Button)sender).Text != "+/-")
            {
                sMember[i] += ((Button)sender).Text;
            }
            
            lAusgabe.Text = sMember[0] + sMember[1] + sMember[2];
        }

        private void bOperations(object sender, EventArgs e)
        {
            if (((Button)sender).Text == "+" || ((Button)sender).Text == "-" ||
                ((Button)sender).Text == "*" || ((Button)sender).Text == "/")
            {
                sMember[2] = (((Button)sender).Text);
                lAusgabe.Text += sMember[2];
            }

            if (sMember[0].Length > 0 && sMember[1].Length > 0 && sMember[2].Length == 0 ||
                sMember[0].Contains(",") == true && sMember[0].Length > 2 ||
                sMember[1].Contains(",") == true && sMember[1].Length > 2 ||
                sMember[0].Contains("-") == true && sMember[0].Length > 1 ||
                sMember[1].Contains("-") == true && sMember[1].Length > 1)
            {
                switch (((Button)sender).Text)
                {
                    case "+": sMember[3] = Convert.ToString(Rechner.Addieren(Convert.ToDouble(sMember[0]), Convert.ToDouble(sMember[1])));
                        break;
                    case "-": sMember[3] = Convert.ToString(Rechner.Subtrahieren(Convert.ToDouble(sMember[0]), Convert.ToDouble(sMember[1])));
                        break;
                    case "*": sMember[3] = Convert.ToString(Rechner.Multiplizieren(Convert.ToDouble(sMember[0]), Convert.ToDouble(sMember[1])));
                        break;
                    case "/": sMember[3] = Convert.ToString(Rechner.Dividieren(Convert.ToDouble(sMember[0]), Convert.ToDouble(sMember[1])));
                        break;
                }
                i++;
            }

            else if (sMember[0].Length > 0 || sMember[1].Length > 0 || sMember[2].Length > 0)
            {
                switch (((Button)sender).Text)
                {
                    case "CE": if (sMember[0].Length > 0 && sMember[2].Length == 0)
                            sMember[0].Remove(sMember.Length, 1);
                        else if (sMember[3].Length > 0 && sMember[1].Length == 0)
                            sMember[3].Remove(0, 1);
                        else if (sMember[1].Length > 0)
                            sMember[1].Remove(sMember[1].Length, 1);

                        if (sMember[2].Length == 0)
                            i--;
                        break;
                    case "CLR": sMember[0].Remove(0, sMember[0].Length);
                        sMember[1].Remove(0, sMember[1].Length);
                        sMember[2].Remove(0, sMember[2].Length);
                        i--;
                        break;
                }
            }
        }

        private void bCalc_Click(object sender, EventArgs e)
        {
            lAusgabe.Text += "=" + sMember[3];
        }
    }

    class CRechner
    {
        public double Addieren(double dZahl1, double dZahl2)
        {
            return dZahl1 + dZahl2;
        }

        public double Subtrahieren(double dZahl1, double dZahl2)
        {
            return dZahl1 - dZahl2;
        }

        public double Multiplizieren(double dZahl1, double dZahl2)
        {
            return dZahl1 * dZahl2;
        }

        public double Dividieren(double dZahl1, double dZahl2)
        {
            return dZahl1 / dZahl2;
        }
    }
}

mein Problem ist jetzt die Methode bOperations() unzwar hab ich in dieser richtig rumgepfuscht, will aber eine richtige lösung haben ^^ (die Methode enthält auch noch paar Fehler)

die Methode wird aufgerufen wenn der Benutzer auf + - * / CE oder CLR klickt

entwurd
[LABEL]
1 2 3 CE CLR
4 5 6 / *
7 8 9 + -
0 , +/- =

so sieht ungefähr mein entwurf aus ^^ (weiß grad nicht wie ich hier ein bild von meiner platte einfüg)
 
Erstmal: Dein Codestyle ist gruselig. Es gibt ein paar Konventionen, an die man sich halten sollte:

- Felder (zB. "Rechner") mit Unterstrich und dann klein anfangen (gängiste Variante)
- Eigentlich alle Variablen/Klassen auf Englisch bennen, zumindes aber die Klassen.
- Jede Klasse, außer sie ist nested, in eine eigene Datei.
- Wenn du aus einem Event-Handling heraus ein parameter (in dem Fall object sender) benötigst, wandel ihn erst mit einem Safe-Cast in den entsprechenden Typ um, anstatt dann immer hard zu casten, um an das Property zu kommen.
- Bei Vergleichen (grade bei strings) sollte man Equals benutzen, anstatt ==.
- Das mit dem Indexer und dem Array als Feld versteh ich nicht, da gibts definitiv ne bessere Lösung.
- Variablennamen sollten ihren Zweck beinhalten, "member" ist keine gute Bezzeichnung.
 
Thaxll'ssillyia schrieb:
- Felder (zB. "Rechner") mit Unterstrich und dann klein anfangen (gängiste Variante)

Ist meiner Meinung nach eine der dämlichsten Konventionen.
Ich finde eher die Konvention besser, dass man den Typen mit angibt - Beispiel:
String sToken ....
Int iCount
Finde die Unterstriche absolut unleserlich.
Mit dem Rest hast du natürlich nicht unrecht.
 
Was läuft denn nicht?

@SymA
Das ist eher Geschmackssache. Den Typen mit angeben, braucht man bei einer typsicheren Sprache eigentlich nicht. Der Debugger meckert da sofort. Der Unterstrich hingegen sagt mir sofort, dass ich es mit einem Attribut zu tun habe, zu der es ein Property gibt. Das empfinde ich als deutlich wichtiger.
 
Zuletzt bearbeitet:
Ist meiner Meinung nach eine der dämlichsten Konventionen.
Ich finde eher die Konvention besser, dass man den Typen mit angibt - Beispiel:
String sToken ....
Int iCount
Finde die Unterstriche absolut unleserlich.

Naja, ich möchte auf den ersten Blick schon unterscheiden können, ob es ein Feld oder eine Variable/Parameter ist.
Da mit dem Typ voranstellen ist imo eine davon unabhängige Geschichte, kann man machen.
 
Ich habe auch im Studium gelernt dass man am Ende ein _ref benutzen soll (zumindest in Java).
Geht also auf jede grausame Art und Weise.
 
Thaxll'ssillyia schrieb:
Bei Vergleichen (grade bei strings) sollte man Equals
Wenn du in Java programmierst gebe ich dir Recht. Der einzige Unterschied in C# ist, dass bei Null-Werten == false zurückgibt und Equals eine NullReferenceException.
 
naja genau weil ich auch selber finde dass der code müll ist hab ich ja den post hier gemacht ^^

allerdings programmieren wir auch nicht professionell bin in einer Ausbildung zum Technischen Assistenten für Informatik d.h. Wir lernen viel (c++, c# Assembler, HTML, PHP, uvm.) jedoch können wir sozusagen nichts richtig gut :D wir lernen da sozusagen alles ein bisschen weswegen die Ausbildung nicht so speziell ist wie z.B. die eine Informatikers ^^

Deswegen Code ich auch wahrscheinlich kein ZAuberprogramm hier hin ^^
 
Zurück
Oben