C# Taschenrechner wie beliebig viele Zahlen addieren?

4 Antworten

1) Fasse die Abläufe in den jeweiligen Event Handlern zusammen. Du musst nicht jedesmal das Gleiche aufführen, das einzige was sich ändert sind die Zahlen.

if (!kommaGesetzt)
{
  // Vorkommateil
  zahl = zahl * 10 + aktuelleZahl;
}
else
{
  // Nachkommateil
  zahl += aktuelleZahl / Math.Pow(10, zahlX);
  ++zahlX;
}

anzeige();

2) Lege dir eine Variable an, die stets das aktuelle Ergebnis speichert.

Wenn du jede Aufgabe in eine Textbox hintereinander hineinschreiben wollen würdest (Bsp.: 5 + 2 - 3), müsstest du dir einen Parser schreiben. Bei so einer Aufgabe:

5 + 2 + 3 - 7

mag es noch einfach sein, denn da brauchst du den String nur zeichenweise splitten (dabei leere Einträge verwerfen) und die Einträge kategorisieren (Zahl oder Operator?). Immer wenn du einen Term findest (dieser besteht aus zwei Zahlen und einem Operator), kannst du diesen durch dessen Ergebnis austauschen.

Mit zunehmender Anzahl an Operatoren wird es jedoch komplexer und komplizierter.


xBlackMass 
Beitragsersteller
 03.12.2018, 15:35

In "zahl" steht doch schon das aktuelle ergebnis oder? wieso dann eine neue variable

regex9  03.12.2018, 15:43
@xBlackMass

Ach dazu ist die Variable da. Der Name ist nichtssagend.

Warum es Einfach machen wenn es auch kompliziert geht.

Beim guten alten Javascript es möglich eine Formel zur Laufzeit in einem String zu Speichern und diesen dann "live" auszuführen.

In C# ist Eval zwar nicht direkt verfügbar. Es gibt jedoch Workarounds um etwas Vergleichbares zu bewekstelligen.

https://stackoverflow.com/questions/6052640/in-c-sharp-is-there-an-eval-function#25313985

Dabei dürfte die Vewendung von "Compute" ... DataTable class am Optimalsten erscheinen.

 static Double Eval(String expression) { System.Data.DataTable table = new System.Data.DataTable(); return Convert.ToDouble(table.Compute(expression, String.Empty)); }



Double result = Eval("7 * 6"); result = Eval("17 + 4"); 

Den String , welchen Du über die Eingabe erhältst, kannst Du statt 7*6 der Funktion Eval übergeben und berechnen lassen.

Einzig sollte die Schreibweise von Floats 3.14 statt 3,14 beachtet werden!

Der Tausch Kamma-> sollte per Stringreplace absolut keine Sache sein.

Wichtig ist nur das deine Eingabe einenen evaluierbaren String zusammenbastelt.

Das Parsen und Berechnen kannst Du der Evalfunktion überlassen. .

Mehr zu Eval:

https://social.msdn.microsoft.com/Forums/en-US/a2256293-7bd1-4094-a354-e5366cb8d82d/what-is-c-net-equivalent-of-javascripts-eval-?forum=csharplanguage

https://www.codeproject.com/Articles/11939/Evaluate-C-Code-Eval-Function


xBlackMass 
Beitragsersteller
 03.12.2018, 14:06

Ok, danke aber ich muss das (Zu Übungszwecken) am besten ohne irgendwelche Funktionen, wie eval usw machen (Sondern mathematisch/rechnerisch vorgehen)

Naja, du kannst theoretisch bei der Eingabe "1+2+" dann das 1+2 schon berechnen und dann einfach bei "3+..." weitermachen für die Eingabe. Wenn du noch Punkt vor Strich etc beachten willst, dann wird das ganze DEUTLICH komplizierter.

Woher ich das weiß:Studium / Ausbildung – Informatikstudium

Wenn du viel stellige zahlen addieren oder subtrahieren willst musst du decimal statt int nehmen.