Autor Beitrag
Flop
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 29.10.10 20:57 
Ich wollte ein Taschenrechner programmieren der die Standard Operatoren beherscht.
Also (Addieren, Multiplizieren, etc.) Der Taschenrechner wird über Buttons gesteuert. Also wenn man auf den Button 5 klickt schreibt er eine 5 in die TextBox. (Textbox read only)

Es funktioniert eigentlich sehr gut. Nur kann ich keine "Kettenrechnung" durchführen. Also z.B. 5+5 = 10 * 2 = 8.333156 ( ALso total falsche Werte ...)
Hier mal der Code:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
            try
            {
                if (plus)
                {
                    decimal dec = Convert.ToDecimal(txtEingabe.Tag) + Convert.ToDecimal(txtEingabe.Text);
                    txtEingabe.Text = dec.ToString();
                }
                if (multiply)
                {
                    decimal dec = Convert.ToDecimal(txtEingabe.Tag) * Convert.ToDecimal(txtEingabe.Text);
                    txtEingabe.Text = dec.ToString();
                }
                if (minus)
                {
                    decimal dec = Convert.ToDecimal(txtEingabe.Tag) - Convert.ToDecimal(txtEingabe.Text);
                    txtEingabe.Text = dec.ToString();
                }
                if (divide)
                {
                    decimal dec = Convert.ToDecimal(txtEingabe.Tag) / Convert.ToDecimal(txtEingabe.Text);
                    txtEingabe.Text = dec.ToString();
                }
            }


MfG

Moderiert von user profile iconChristian S.: C#-Tags repariert
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 29.10.10 21:33 
user profile iconFlop hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
 
5:
/* ... */
decimal dec = Convert.ToDecimal(txtEingabe.Tag) + Convert.ToDecimal(txtEingabe.Text);

Ich glaube, den Code solltest du nochmal genauer erklären: Was genau steht in txtEingabe.Tag? Speicherst du dort die erste Zahl, die dann mit der aktuell eingegebenen verrechnet werden soll?

Auf jeden Fall solltest du entweder den ganzen relevanten Quelltext zeigen oder genau ausführen, welche Buttons dem Benutzer zur Verfügung stehen und was welcher macht.
Flop Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 29.10.10 21:55 
Also in txtEingabe.Tag wird die erste zahl der eingabe gespeichert und mit der 2. zahl verrechnet. Dem Benutzer stehen die Buttons 0-9, +, -, *, /, clear und rechne zur verfügung.
Die Taschenrechnereingabe ist ähnlich wie beim Windows Taschenrechner aufgebaut (also eine Textbox als Eingabefeld) und sollte so auch funktionieren.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Sa 30.10.10 00:03 
Dein Konzept ist gar nicht schlecht, das müsste eigentlich funktionieren. Vielleicht steckt in den Methoden, die du nicht gepostet hast, ein Fehler drin?

Du solltest mal in die Methoden, die die Tastendrücke verarbeiten, Haltepunkte setzen und die Eigenschaften Text und Tag prüfen. Sie müssten jeweils nach der entsprechenden Aktion folgende Werte haben:

ausblenden Eigenschaftswerte bei Abschluss der Benutzereingaben:
1:
2:
3:
4:
5:
6:
7:
8:
9:
Eingabe / Taste    Text         Tag
===============    =======      ======
1. Zahl            1. Zahl
   +               leer        1. Zahl
2. Zahl            2. Zahl     1. Zahl
   =               Summe       1. Zahl
   *               leer        Summe
3. Zahl            3. Zahl     Summe
   =               Produkt     Summe
Flop Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 31.10.10 19:07 
Also hier ist der komplette code. Ich habe gestern den ganzen Tag geguckt was falsch sein könnte.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
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_CP_G
{
  public partial class Form1 : Form
  {
      bool plus = false;
      bool minus = false;
      bool multiply = false;
      bool divide = false;

      public Form1()
      {
          InitializeComponent();
      }

      private void button1_Click(object sender, EventArgs e)
      {
          textBox1.Text = textBox1.Text + "1";
      }

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

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

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

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

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

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

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

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

      private void button17_Click(object sender, EventArgs e)
      {
          textBox1.Text = textBox1.Text + "0";
      }

      private void button14_Click(object sender, EventArgs e)
      {
          if (textBox1.Text.Contains(","))
          {
              return;
          }
          else
          {
              textBox1.Text = textBox1.Text + ",";
          }
      }

      private void button12_Click(object sender, EventArgs e)
      {
          if (textBox1.Text == "")
          {
              return;
          }
          else
          {
              minus = true;
              textBox1.Tag = textBox1.Text;
              textBox1.Text = "";
          }
      }

      private void button13_Click(object sender, EventArgs e)
      {
          if (textBox1.Text == "")
          {
              return;
          }
          else
          {
              plus = true;
              textBox1.Tag = textBox1.Text;
              textBox1.Text = "";
          }
      }

      private void button15_Click(object sender, EventArgs e)
      {
          if (plus)
          {
              decimal dec = Convert.ToDecimal(textBox1.Tag) + Convert.ToDecimal(textBox1.Text);
              textBox1.Text = dec.ToString();
          }
          if (minus)
          {
              decimal dec = Convert.ToDecimal(textBox1.Tag) - Convert.ToDecimal(textBox1.Text);
              textBox1.Text = dec.ToString();
          }
          if (multiply)
          {
              decimal dec = Convert.ToDecimal(textBox1.Tag) * Convert.ToDecimal(textBox1.Text);
              textBox1.Text = dec.ToString();
          }
          if (divide)
          {
              decimal dec = Convert.ToDecimal(textBox1.Tag) / Convert.ToDecimal(textBox1.Text);
              textBox1.Text = dec.ToString();
          }
      }

      private void button11_Click(object sender, EventArgs e)
      {
          if (textBox1.Text == "")
          {
              return;
          }
          else
          {
              multiply = true;
              textBox1.Tag = textBox1.Text;
              textBox1.Text = "";
          }
      }

      private void button10_Click(object sender, EventArgs e)
      {
          if (textBox1.Text == "")
          {
              return;
          }
          else
          {
              divide = true;
              textBox1.Tag = textBox1.Text;
              textBox1.Text = "";
          }
      }

      private void button16_Click(object sender, EventArgs e)
      {
          plus = minus = multiply = divide = false;
          textBox1.Text = "";
          textBox1.Tag = "";
      }
  }
}
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 31.10.10 19:27 
Wenn der Benutzer erst addiert, wird plus gesetzt. Will er dann multiplizieren, wird zusätzlich noch multiply gesetzt - plus bleibt true. Beim zweiten Klick auf Rechne wird deshalb erst addiert, dann mit demselben Betrag multipliziert. Nicht ganz das, was du wolltest ;)

Die einfachste Lösung dafür wäre, anstatt von vier bool'schen Variablen eine enum-Definition und -Variable zu verwenden:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
enum Operation {
  Add,
  Subtract,
  Multiply,
  Divide
}

/* ... */

Operation operation;

/* ... */

operation = Operation.Add;

/* ... */

switch (operation) {
  case Operation.Add:
    /* ... */
    break;
  case Operation.Subtract:
    /* ... */
    break;
  /* ... */
}
Flop Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 31.10.10 19:48 
Ja sieht schon einmal anders aus =)
leider weiß ich nur nicht was ein enum ist
könntest du mir das noch ein bisschen deutlicher erkären, möchte ja die sprach lernen :)
ich glaube in der switch einweisung ist die rechnung oder?
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 31.10.10 22:41 
Ich war vorhin nur etwas in Eile, deshalb ist mein Post so knapp ausgefallen.

enum ist das Schlüsselwort für eine Enumeration, also eine Aufzählung. Damit ist eine Art von Datentyp gemeint, die immer genau einen Wert aus einer definierten Liste zulässt.

Wenn du einen Enum deklarierst, gibst du die Werte an, die Variablen dieses Typs annehmen können. Ein Enum "Medium" könnte beispielsweise die Werte "Buch", "Film", "Zeitung" oder "Brief" enthalten. In C# schreibst du das folgendermaßen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
enum Medium {
  Buch,
  Film,
  Zeitung,
  Brief
}

Aus den Wörtern in der Auflistung werden automatisch Konstanten definiert, auf die du dann z.B. über Medium.Zeitung zugreifen kannst. Medium ist ein Typ, und Medium.Zeitung eine Instanz dieses Typs. So wie string und "Hallo" oder int und "42".

Da die Werte ja Konstanten sind, kannst du sie einfach für Zuweisungen verwenden:
ausblenden C#-Quelltext
1:
2:
Medium meinBevorzugtesMedium; // Variablendeklaration
meinBevorzugtesMedium = Medium.Film; // Zuweisung

Abfragen funktionieren natürlich über if oder auch per switch, wobei letzteres bei Enums häufiger verwendet wird.

user profile iconFlop hat folgendes geschrieben Zum zitierten Posting springen:
ich glaube in der switch einweisung ist die rechnung oder?

Ja, die Platzhalter-Kommentare müssen durch die Rechenoperationen ersetzt werden.

Ich hätte noch ein paar weitere Verbesserungsvorschläge für dich :)

Erstens würde ich die zuerst eingegebene Zahl nicht in der Eigenschaft Tag speichern. Die ist wirklich nur für Ausnahmefälle gedacht und dann auch nur, wenn man vielen Komponenten irgendwelche Daten zuordnen will. In deinem Fall wäre es besser, ein gut benanntes Feld (also eine Klassenvariable) zu verwenden. Die kann dann vom Typ decimal sein, was dir einige Umwandlungen spart.

Weiterhin solltest du bei den ButtonClicks nicht direkt den Text ändern, sondern erst ein weiteres Feld vom Typ decimal verwenden, das du dann jeweils mit 10 multiplizierst und mit der eingegebenen Zahl addierst. Diese Zahl kannst du dann in einen String umwandeln und die TextBox aktualisieren. Das hat den Vorteil, dass du nie von einem String in eine Zahl konvertieren musst, denn dabei kann es schnell passieren, dass eine Exception auftritt (wenn die Zahl zu lang wird). Außerdem trennst du die Verarbeitung (Berechnung) von der Darstellung (in der TextBox).

Zu guter Letzt könntest du den Code etwas vereinfachen, indem du die Tag-Eigenschaft doch wieder benutzt, aber diesmal richtig ;) Und zwar hast du viele Buttons, die im Prinzip etwas sehr ähnliches bewirken, nur mit anderen Werten. Die Buttons 0-9 hängen immer eine Ziffer an, nur der Wert der Ziffer selbst ist immer unterschiedlich. Wenn du jetzt diese Ziffer in die jeweiligen Tag-Eigenschaften schreibst, kannst du im Click-Event-Handler wiederum darauf zugreifen und weißt sofort, welche Ziffer für den Button vorgesehen ist, ohne den Button selbst zu kennen. Daher reicht eine allgemeine Click-Methode für alle 10 Buttons aus.

Auch die Rechentasten könntest du so gestalten. Dabei speicherst du in der Tag-Eigenschaft den jeweiligen Wert deines Enums. In der Click-Methode musst du nur noch den Wert von Tag in das Feld, das die gewählte Operation beinhaltet, übertragen, und natürlich die Dinge tun, die bei allen Rechenoperationen gleich sind (die Zahlen verschieben).

Ich hoffe, das war nicht zu viel auf einmal. Wenn's irgendwo Probleme gibt, einfach nachfragen :)

Grüße,
Yogu
germy
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mo 01.11.10 18:54 
Also wir haben probiert die enum funktion (zu verstehen) bzw. einzufügen und die operatoren damit zu deklarieren usw. aber wir bekommen immer irgendwelche fehler (Es funktioniert einfach nicht) :( wir machen bestimmt irgendwas falsch aber wir wissen nicht was...könntest du dir mal den code angucken und drüber gucken was daran falsch ist und uns verbessern?


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
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_CP_G
{
    public partial class Form1 : Form
    {
        enum Operation
        {
            plus,
            minus,
            multiply,
            divide
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "1";
        }

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

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

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

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

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

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

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

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

        private void button17_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "0";
        }

        private void button14_Click(object sender, EventArgs e)
        {
            if (textBox1.Text.Contains(","))
            {
                return;
            }
            else
            {
                textBox1.Text = textBox1.Text + ",";
            }
        }


        private void btnRechne_Click(object sender, EventArgs e)
        {


            Operation operation;

            operation = Operation.plus;
            operation = Operation.minus;
            operation = Operation.divide;
            operation = Operation.multiply;

            switch (operation)
            {
                case Operation.plus:

                    decimal dec = Convert.ToDecimal(textBox1.Tag) + Convert.ToDecimal(textBox1.Text);
                    textBox1.Text = dec.ToString();

                    break;
                case Operation.minus:

                    decimal dec1 = Convert.ToDecimal(textBox1.Tag) - Convert.ToDecimal(textBox1.Text);
                    textBox1.Text = dec1.ToString();

                    break;
                case Operation.divide:

                    decimal dec2 = Convert.ToDecimal(textBox1.Tag) / Convert.ToDecimal(textBox1.Text);
                    textBox1.Text = dec2.ToString();

                    break;
                case Operation.multiply:

                    decimal dec3 = Convert.ToDecimal(textBox1.Tag) * Convert.ToDecimal(textBox1.Text);
                    textBox1.Text = dec3.ToString();

                    break;
            }

        }
    }
}
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 01.11.10 20:47 
Hallo,

ihr habt jetzt ja die Event-Handler für die Buttons 10 - 13 rausgeschmissen - das heißt, dass sie gar nichts mehr bewirken. Dabei sollten sie ja die aktuelle Rechenoperation festlegen, also die Variable operation ändern.

In eurer Umsetzung ist diese Variable aber eine lokale Variable der Methode btnRechne_Click und kann daher auch nur dort verwendet werden. Jedes Mal, wenn der Benutzer auf den Rechne-Button klickt, wird eine neue Variable erstellt. Das ist natürlich nicht ganz das richtige, denn schließlich soll in ihr ja gespeichert werden, worauf der Benutzer davor geklickt hat. Das heißt, dass die Variable jedes mal neu erstellt wird.

Deshalb sollte operation lieber in der Klasse deklariert werden, und zwar neben den ganzen Methoden. Das bedeutet, dass sie während der gesamten Programmlaufzeit existiert.

user profile icongermy hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
 
96:
97:
98:
99:
/* ... */
            operation = Operation.plus;
            operation = Operation.minus;
            operation = Operation.divide;
            operation = Operation.multiply;

Wenn ihr mal genauer hinschaut, seht ihr, dass das Unsinn ist ;) Ihr schreibst erst plus in die Varialbe, dann minus und so weiter. Jedes Mal wird der Wert überschreiben, und am Schluss steht eben multiply drin. Diese Zuweisungen sollten in die Event-Handler der Plus-, Minus-, Mal- und Geteilt-Buttons.