C# Taschenrechner wie beliebig viele Zahlen addieren?
Code: https://pastebin.com/EDHeFvSP
Ich habe es bis jetzt so programmiert, dass ich beliebige Zahlen eingeben kann, also das in der Textbox zahlen 0-9 erscheinen und ich kann auch kommazahlen angeben also z.b. 4,6475. (Hierfür arbeite ich mit dem bool kommagesetzt). Frage: Wie kann ich beliebig viele Zahlen jetzt addieren? Am besten erst mal nur Ganzzahlen oder nur 2 Zahlen also z.B. 5+3 oder so
Danke
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.
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://www.codeproject.com/Articles/11939/Evaluate-C-Code-Eval-Function
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.
Wenn du viel stellige zahlen addieren oder subtrahieren willst musst du decimal statt int nehmen.
In "zahl" steht doch schon das aktuelle ergebnis oder? wieso dann eine neue variable