Problem mit Taschenrechner mal und geteilt taste

  • C#
  • .NET (FX) 4.0

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von Joshi.

    Problem mit Taschenrechner mal und geteilt taste

    Folgendes Problem und bevor jemand was sagt ja habe gegoogelt.
    Habe einen Taschenrechner mit buttons für jede taste und eingabe mit tastatur ermöglicht. Dies habe ich bereits für plus und minus geschaft siehe code unten. Jedoch schaffe ich dies nicht mit mal oder geteilt.

    C#-Quellcode

    1. private void textBoxergebnis_KeyPress(object sender, KeyPressEventArgs e)
    2. // Buchstaben eingabe Sperren
    3. {
    4. if (e.KeyChar != '\b' && e.KeyChar != ',' && e.KeyChar != '-' && e.KeyChar != '+')
    5. //Copy & paste zulassen
    6. if (Char.IsControl((e.KeyChar)))
    7. {
    8. }
    9. //Nur Nummern zulassen
    10. else if (!Char.IsDigit(e.KeyChar))
    11. {
    12. e.Handled = true;
    13. }
    14. else if (!Char.IsDigit(e.KeyChar))
    15. {
    16. e.Handled = true;
    17. }
    18. {
    19. if (e.KeyChar == '+')
    20. if (Bedienung == 0 || Bedienung == 10)
    21. {
    22. Speicher = decimal.Parse(textBoxergebnis.Text);
    23. textBoxergebnis.Text = "";
    24. Bedienung = 1;
    25. }
    26. textBoxergebnis.Focus();
    27. if (e.KeyChar == '-')
    28. {
    29. if (Bedienung == 0 || Bedienung == 10)
    30. {
    31. Speicher = decimal.Parse(textBoxergebnis.Text);
    32. textBoxergebnis.Text = "";
    33. Bedienung = 1;
    34. }
    35. }
    Da die Zeilen#20-#25 und #29-#34 identisch sind, ergibt sich kein Wirkungsunterschied zwischen + und -. Aber sei's drum. Was hindert Dich jetzt, den gleichen Code nochmal für * und / zu schreiben?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Habe ich bereits versucht aber es funktioniert nicht und ich weiß nicht wieso ich mache es genau so wie oben auch
    Habe das hier gemacht.

    C#-Quellcode

    1. if (e.KeyChar == '*')
    2. {
    3. if (Bedienung == 0 || Bedienung == 10)
    4. {
    5. Speicher = decimal.Parse(textBoxergebnis.Text);
    6. textBoxergebnis.Text = "";
    7. Bedienung = 1;
    8. }

    Was heißt "funktioniert nicht"? Kommt eine Fehlermeldung? Stürzt das Programm ab? Oder kommt nicht das Ergebnis raus, was Du erwartest? Wenn dem so ist: Was erwartest Du, was erhälst Du?
    Was ist Bedienung? Wo wird da an irgendeiner Stelle in dem Code so gerechnet, so dass ein sinnvolles Taschenrechnerergebnis erscheint? Ist nirgends zu sehen. Keine Addition, Subtraktion, Multiplikation, Division. Nur Verarbeitung von Eingabetasten, deren Weiterarbeitungscode (wie in Post#2 erwähnt) aber überall gleich ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Habe zusätzlich noch diesen code.

    C#-Quellcode

    1. private void button9_Click(object sender, EventArgs e) //Multiplizieren
    2. {
    3. if (Bedienung == 0 || Bedienung == 10)
    4. {
    5. Speicher = decimal.Parse(textBoxergebnis.Text);
    6. textBoxergebnis.Text = "";
    7. Bedienung = 1;
    8. }
    9. textBoxergebnis.Focus();
    10. }

    Wenn ich das mit den buttons mache funktioniert die rechnung bei 2*2 =4 mit den tasten geht es nicht.
    Solange Du nicht alle Fragen beantwortest, kann ich Dir nicht helfen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Moritzgs1 Setze einen Haltepunkt in den Code.
    Drücke eine Taste und steppe den Code durch.
    Verhält sich der Code anders als Du es erwartest, hast Du einen Fehler gefunden. 8o
    Lerne zu debuggen: Debuggen, Fehler finden und beseitigen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VaporiZed schrieb:

    Solange Du nicht alle Fragen beantwortest,
    Es geht um alle Fragen, die ich gestellt habe. Dieser Bereich ist noch völlig unklar:

    VaporiZed schrieb:

    Was ist Bedienung? Wo wird da an irgendeiner Stelle in dem Code so gerechnet, so dass ein sinnvolles Taschenrechnerergebnis erscheint? Ist nirgends zu sehen. Keine Addition, Subtraktion, Multiplikation, Division. Nur Verarbeitung von Eingabetasten, deren Weiterarbeitungscode (wie in Post#2 erwähnt) aber überall gleich ist.

    @RodFromGermany: Das hat beim ersten Thread schon nicht gefruchtet.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Dann mach jetzt hier Feierabend und widme Dich Deiner Familie. ;)
    Ich werde mich hier nicht lange aufhalten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Im Folgenden ist mein Code den ich bezüglich der Rechnung habe hoff damit ist alles beantwortet was gefragt wurde. Ws mein problem ist habe ich auch bereits geschildert.

    C#-Quellcode

    1. private void button5_Click(object sender, EventArgs e) //gleich
    2. {
    3. if (Bedienung == 0)
    4. {
    5. //Läd jeweilige Aktionen
    6. }
    7. else if (Bedienung == 1) // Plus
    8. {
    9. textBoxergebnis.Text = (decimal.Parse(textBoxergebnis.Text) + Speicher).ToString();
    10. Bedienung = 10;
    11. textBoxergebnis.Focus();
    12. }
    13. else if (Bedienung == 2) // Minus
    14. {
    15. textBoxergebnis.Text = (Speicher - decimal.Parse(textBoxergebnis.Text)).ToString();
    16. Bedienung = 10;
    17. }
    18. else if (Bedienung == 3) // X
    19. {
    20. textBoxergebnis.Text = (Speicher * decimal.Parse(textBoxergebnis.Text)).ToString();
    21. Bedienung = 10;
    22. }
    23. else if (Bedienung == 4) // /
    24. {
    25. textBoxergebnis.Text = (Speicher / decimal.Parse(textBoxergebnis.Text)).ToString();
    26. Bedienung = 10;
    27. }
    28. }
    29. private void button15_Click(object sender, EventArgs e) //Eingabe löschen
    30. {
    31. textBoxergebnis.Clear();
    32. textBoxergebnis.Focus();
    33. }
    34. private void button9_Click(object sender, EventArgs e) //Multiplizieren
    35. {
    36. if (Bedienung == 0 || Bedienung == 10)
    37. {
    38. Speicher = decimal.Parse(textBoxergebnis.Text);
    39. textBoxergebnis.Text = "";
    40. Bedienung = 1;
    41. }
    42. textBoxergebnis.Focus();
    43. }
    44. private void button16_Click(object sender, EventArgs e) //Dividieren
    45. {
    46. if (Bedienung == 0 || Bedienung == 10)
    47. {
    48. Speicher = decimal.Parse(textBoxergebnis.Text);
    49. textBoxergebnis.Text = "";
    50. Bedienung = 4;
    51. }
    52. textBoxergebnis.Focus();
    53. }
    54. private void button6_Click(object sender, EventArgs e) // Minus
    55. {
    56. if (Bedienung == 0 || Bedienung == 10)
    57. {
    58. Speicher = decimal.Parse(textBoxergebnis.Text);
    59. textBoxergebnis.Text = "";
    60. Bedienung = 1;
    61. }
    62. textBoxergebnis.Focus();
    63. }
    64. private void button1_KeyDown(object sender, KeyEventArgs e)
    65. {
    66. if (e.KeyCode == Keys.D0)
    67. {
    68. textBoxergebnis.Text = textBoxergebnis.Text + "0";
    69. }
    70. }
    71. private void textBoxergebnis_KeyPress(object sender, KeyPressEventArgs e)
    72. // Buchstaben eingabe Sperren
    73. {
    74. if (e.KeyChar != '\b' && e.KeyChar != ',' && e.KeyChar != '-' && e.KeyChar != '+' && e.KeyChar != '*')
    75. //Copy & paste zulassen
    76. if (Char.IsControl((e.KeyChar)))
    77. {
    78. }
    79. //Nur Nummern zulassen
    80. else if (!Char.IsDigit(e.KeyChar))
    81. {
    82. e.Handled = true;
    83. }
    84. else if (!Char.IsDigit(e.KeyChar))
    85. {
    86. e.Handled = true;
    87. }
    88. {
    89. if (e.KeyChar == '+')
    90. if (Bedienung == 0 || Bedienung == 10)
    91. {
    92. Speicher = decimal.Parse(textBoxergebnis.Text);
    93. textBoxergebnis.Text = "";
    94. Bedienung = 1;
    95. }
    96. textBoxergebnis.Focus();
    97. if (e.KeyChar == '-')
    98. {
    99. if (Bedienung == 0 || Bedienung == 10)
    100. {
    101. Speicher = decimal.Parse(textBoxergebnis.Text);
    102. textBoxergebnis.Text = "";
    103. Bedienung = 1;
    104. }
    105. if (e.KeyChar == '*')
    106. {
    107. if (Bedienung == 0 || Bedienung == 10)
    108. {
    109. Speicher = decimal.Parse(textBoxergebnis.Text);
    110. textBoxergebnis.Text = "";
    111. Bedienung = 1;
    112. }
    113. }
    114. }
    115. }
    116. }
    117. private void Form1_Load(object sender, EventArgs e)
    118. {
    119. this.MaximizeBox = false; //Verbietet das Vergrößern der Form
    120. }
    121. private void wurzel_Click(object sender, EventArgs e)
    122. {
    123. if (Double.TryParse(textBoxergebnis.Text, out double zahl))
    124. {
    125. double ergebnis = Math.Sqrt(zahl);
    126. textBoxergebnis.Text = Convert.ToString(ergebnis);
    127. }
    128. }
    Da sind ifs, die nicht von einem geklammerten Block gefolgt sind, dabei.
    Das macht die Sache total unübersichtlich, und ich vermute, dadurch haben sich logische Fehler eingeschlichen.
    Empfehlung: Nach If(...) immer den Klammer-Block {...} hinschreiben, damit klar ist, wie weit das if reicht.
    Dann nochmal den VisualStudio-Editor die Einrückungen neu machen lassen und nochmal posten - vlt. erkennt man dann was.
    Habe den Code nochmal gecleard hoffe es ist etwas besser.

    C#-Quellcode

    1. private void button4_Click(object sender, EventArgs e) //Plus
    2. {
    3. {
    4. if (Bedienung == 0 || Bedienung == 10)
    5. {
    6. Speicher = decimal.Parse(textBoxergebnis.Text);
    7. textBoxergebnis.Text = "";
    8. Bedienung = 1;
    9. }
    10. textBoxergebnis.Focus();
    11. }
    12. }
    13. private void button5_Click(object sender, EventArgs e) //gleich
    14. {
    15. if (Bedienung == 0)
    16. {
    17. //Läd jeweilige Aktionen
    18. }
    19. else if (Bedienung == 1) // Plus
    20. {
    21. textBoxergebnis.Text = (decimal.Parse(textBoxergebnis.Text) + Speicher).ToString();
    22. Bedienung = 10;
    23. textBoxergebnis.Focus();
    24. }
    25. else if (Bedienung == 2) // Minus
    26. {
    27. textBoxergebnis.Text = (Speicher - decimal.Parse(textBoxergebnis.Text)).ToString();
    28. Bedienung = 10;
    29. }
    30. else if (Bedienung == 3) // X
    31. {
    32. textBoxergebnis.Text = (Speicher * decimal.Parse(textBoxergebnis.Text)).ToString();
    33. Bedienung = 10;
    34. }
    35. else if (Bedienung == 4) // /
    36. {
    37. textBoxergebnis.Text = (Speicher / decimal.Parse(textBoxergebnis.Text)).ToString();
    38. Bedienung = 10;
    39. }
    40. }
    41. private void button15_Click(object sender, EventArgs e) //Eingabe löschen
    42. {
    43. textBoxergebnis.Clear();
    44. textBoxergebnis.Focus();
    45. }
    46. private void button9_Click(object sender, EventArgs e) //Multiplizieren
    47. {
    48. if (Bedienung == 0 || Bedienung == 10)
    49. {
    50. Speicher = decimal.Parse(textBoxergebnis.Text);
    51. textBoxergebnis.Text = "";
    52. Bedienung = 1;
    53. }
    54. textBoxergebnis.Focus();
    55. }
    56. private void button16_Click(object sender, EventArgs e) //Dividieren
    57. {
    58. if (Bedienung == 0 || Bedienung == 10)
    59. {
    60. Speicher = decimal.Parse(textBoxergebnis.Text);
    61. textBoxergebnis.Text = "";
    62. Bedienung = 4;
    63. }
    64. textBoxergebnis.Focus();
    65. }
    66. private void button6_Click(object sender, EventArgs e) // Minus
    67. {
    68. if (Bedienung == 0 || Bedienung == 10)
    69. {
    70. Speicher = decimal.Parse(textBoxergebnis.Text);
    71. textBoxergebnis.Text = "";
    72. Bedienung = 1;
    73. }
    74. textBoxergebnis.Focus();
    75. }
    76. private void button1_KeyDown(object sender, KeyEventArgs e)
    77. {
    78. if (e.KeyCode == Keys.D0)
    79. {
    80. textBoxergebnis.Text = textBoxergebnis.Text + "0";
    81. }
    82. }
    83. private void textBoxergebnis_KeyPress(object sender, KeyPressEventArgs e)
    84. // Buchstaben eingabe Sperren
    85. {
    86. if (e.KeyChar != '\b' && e.KeyChar != ',' && e.KeyChar != '-' && e.KeyChar != '+' && e.KeyChar != '*')
    87. //Copy & paste zulassen
    88. if (Char.IsControl((e.KeyChar)))
    89. {
    90. }
    91. //Nur Nummern zulassen
    92. else if (!Char.IsDigit(e.KeyChar))
    93. {
    94. e.Handled = true;
    95. }
    96. else if (!Char.IsDigit(e.KeyChar))
    97. {
    98. e.Handled = true;
    99. }
    100. {
    101. if (e.KeyChar == '+')
    102. if (Bedienung == 0 || Bedienung == 10)
    103. {
    104. Speicher = decimal.Parse(textBoxergebnis.Text);
    105. textBoxergebnis.Text = "";
    106. Bedienung = 1;
    107. }
    108. textBoxergebnis.Focus();
    109. if (e.KeyChar == '-')
    110. {
    111. if (Bedienung == 0 || Bedienung == 10)
    112. {
    113. Speicher = decimal.Parse(textBoxergebnis.Text);
    114. textBoxergebnis.Text = "";
    115. Bedienung = 1;
    116. }
    117. if (e.KeyChar == '*')
    118. {
    119. if (Bedienung == 0 || Bedienung == 10)
    120. {
    121. Speicher = decimal.Parse(textBoxergebnis.Text);
    122. textBoxergebnis.Text = "";
    123. Bedienung = 1;
    124. }
    125. }
    126. }
    127. }
    128. }
    129. private void Form1_Load(object sender, EventArgs e)
    130. {
    131. this.MaximizeBox = false; //Verbietet das Vergrößern der Form
    132. }
    133. private void wurzel_Click(object sender, EventArgs e)
    134. {
    135. if (Double.TryParse(textBoxergebnis.Text, out double zahl))
    136. {
    137. double ergebnis = Math.Sqrt(zahl);
    138. textBoxergebnis.Text = Convert.ToString(ergebnis);
    139. }
    140. }
    Zeile#116, #124: "Wenn - gedrückt wird und gleichzeitig wenn stattdessen * gedrückt wird." Das kann niemals zutreffen. Der Bereich von Z#124-#132 gehört nicht in den umschließenden If-Block, der bei Z#124 beginnt.
    Zeile#49: entweder Button9 ist nicht Multiplizieren oder der dann gesetzte Wert für Bedienung ist falsch. Dementsprechend gibt es keinen Button-EventHandler für + oder *
    Das alles würde viel klarer werden, wenn die CEs nicht button9 etc heißen würden, sondern z.B. btnMultiply, btnAdd
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Womit wir wieder bei Post#8 wären. Wenn der Fehler auftaucht, fahrt mit der Maus über textBoxErgebnis.Text und es wird gezeigt, was da drin steht. Und das kann wohl nicht in ne Zahl umgewandelt werden, weil da irgendwelche Zeichen drin sind, die nicht zu ner Zahl gehören.

    btw: Bilder solltest Du forenintern über [+ Erweiterte Antwort] -> _|Dateianhänge|_ -> [Hochladen] posten. Nicht wenige (Power)User hier klicken ungern auf ImageHosterLinks und stellen stattdessen die Hilfe hier im Thread ein bzw. fangen gar nicht erst mit Hilfe an. Deine Entscheidung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    "2x2" ist keine Zahl, die als Text vorliegt. Daher kann das auch nicht in eine Decimal-Zahl umgewandelt werden. Für den Compiler ist das ein Text wie 2,.2, ABC oder R2D2
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nein, wenn man vernünftig programmiert, ist so ziemlich alles möglich. Das Problem ist, dass Du eine Texteingabe wie 2x2 parsen müsstest. Das heißt, Du musst diesen Text in seine Bestandteile auflösen und damit rechnen. Mit den Buttons arbeitest Du mit Zwischenergebnissen. Das machst Du bei einer Texteingabe nicht. Bei den Buttons ist dem Programm klar: "Ach, jetzt wird durch Klick auf [+] addiert." Wenn Du aber "2+2" eingibst, ist es Deine Aufgabe durch geeignete Programmierung diesen Text in 2. Zahlen und einen Rechenoperator aufzuteilen und die Zahlen dann mit dem Rechenoperator zu verrechnen. Ein Taschenrechner ist nicht so leicht zu programmieren wie manch einer behauptet. Vor allem, wenn er gut werden soll.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.