Laden...

Formel als String zerlegen und berechnen

Erstellt von Flo78 vor 8 Jahren Letzter Beitrag vor 8 Jahren 6.233 Views
F
Flo78 Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren
Formel als String zerlegen und berechnen

Hallo zusammen,

ich bin zugegebenermaßen blutiger Anfänger. Seit ein paar Wochen beschäftige ich mich nun mit C#. Nun versuche ich in Windows Forms einen kleinen Taschenrechner zu erstellen. Es gibt eine Textbox und 16 buttons. Die Zahlen 0-9, + - / und *, sowie einen leeren- und Ergebnis- button. Der Nutzer kann nun über die buttons eine Rechenaufgabe eingeben. Z.B.: 12+34-6.

Nun zum Problem:

Ich lese nun den Inhalt der Textbox.Text in einen string aus. Jetzt bekomme ich es allerdings einfach nicht hin damit zu rechnen. Ich habe die einzelnen Zahlen und arithmetischen Operatoren nun in einen string array eingelesen. Also text[0] = "12", text[1] = "+", text[2] = "34", text[3] = "-", text[4] = "6". Jetzt bleibe ich hängen. Wie bekomme ich es jetzt hin hiermit das Ergebnis 40 zu errechnen? Das die Zahlen (noch string-Werte) natürlich in int oder ähnliches convertiert werden müssen ist mir klar. Nur wie geht's jetzt weiter?

Wenn die Frage in der falschen Kategorie untergebracht ist habt bitte Nachsehen. Ick bin noch neu hier. 😁

Vorab erstmal vielen Dank

Flo

127 Beiträge seit 2015
vor 8 Jahren

Trivial ist die Lösung nicht ...
Die vermutlich einsteigerfreundlichste Lösung ist eine Schleife die durch die das Array geht und auf "Operator" oder "Zahl" prüft.
Im Falle von "Zahl" den String erstmal in eine echte Zahl umwandelt (Int32.Parse Method (String) (System) oder Int32.TryParse Method (String, Int32) (System))
Im Falle von "Operator" einen switch/case Block (switch (C# Reference)) durchwandert der je nach "Operator" dann die eigentliche Operation durchführt.

Ich hoffe das die grobe Vorgehensweise reicht um dir einen Lösungsansatz aufzuzeigen.

F
Flo78 Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren

Hi hummigbird,

in die Richtung bin ich auch schon gegangen. Die Zahlen konnte ich auch schon in einen int array einlesen (convertieren). Mit einem switch/case block den operator bestimmen bekomme ich vielleicht auch noch hin. Aber wie verschachtel ich das ganze richtig?

Vielleicht könnte jemand ein kleines Codebeispiel posten, damit ich einfach mal ein Gefühl für den Aufbau einer solchen Operation bekomme.

Hoffe das ist jetzt nicht zu dreist.

463 Beiträge seit 2009
vor 8 Jahren

Onkel Google kennst du?

Googlesuche C# Taschenrechner

  1. Ergebnis bei der Suche "C# Taschenrechner"

Taschenrechner C#

F
Flo78 Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren

Hallo,

ja, von Google hatte ich schon mal gehört. Leider haben diese Suchergebnisse nichts mit meiner Problemstellung zu tun. Eine einfache Rechnung mit zwei Zahlen und einem Operator, und das auf drei Felder verteilt ist selbst für mich als Anfänger hin zu bekommen. Außerdem lernt man diese Dinge ja schon recht früh in den Büchern. Mein Problem ist die Tatsache, dass der Nutzer seine Aufgabe hintereinander in eine textbox eingibt. Diese möchte ich dann auslesen und analysieren können. Im Prinzip wie der Windows Rechner, nur halt mit den einfachsten Rechenarten.

127 Beiträge seit 2015
vor 8 Jahren

Also, ich schreib dir mal Pseudocode damit du auch ein wenig selbst grübeln mußt (sonst ist da kein Lerneffekt)
RechenElemente ist dein Array mit den einzelnen Bestandteilen
Ich gehe davon aus das du in diesem Array bereits echte Zahlen hast. Wenn nicht müßtest du nur an geeigneter Stelle noch eine Umwandlung vornehmen (die Stelle findest du bestimmt selber).

Methode Rechnen()
{
variable Rechenvariable = 0
variable NächsteRechenOperation;
für jedes Element in RechenElemente
{
    Wenn Element:
        Rechenoperation +:              
        Rechenoperation -:
                NächsteRechenOperation = Element
        Etwas anderes:

               RechenVariable = FühreOperationAus(NächsteRechenOperation, Rechenvariable, Element)

}
}

Methode FühreOperationAus(Operation, Wert1, Wert2)
{
Wenn Operation:
     Rechenoperation +:
          = Addieren(Wert1, Wert2)

}

Methode Addieren(Wert1, Wert2)
{
= Wert1 + Wert2
}

Ich habe den Code jetzt nicht ausprobiert, kann also sein das er noch die einer oder andere Fehlerstelle enthält (oder auch gar nicht funktioniert? 🤔 )
Auch habe ich bewußt die andere Methode weggelassen, die kannst du dir, wenn du das Prinzip vertanden hast, bestimmt selbst dazu bauen.
Aber so ungefähr stelle ich mir das Prinzip auf Einsteigerfreundlichem Niveau vor.

Es gäbe da mit Delegaten, und ähnlichen fortgeschrittenen Konzepten Möglichkeiten dies eleganter zu gestalten aber zuerst mal solltest du das so hin bekommen damit du deine Denkblockade löst und die Grundlagen lernst.

189 Beiträge seit 2014
vor 8 Jahren

Im Prinzip wie der Windows Rechner, nur halt mit den einfachsten Rechenarten.

Im Prinzip ist das aber NICHT so wie der Windows Rechner (zumindest ab Win7).
Dieser führt auch nur Berechnungen von 2 Operatoren aus, solange man nicht mit Klammern oder anderen komplexen Operatoren arbeitet.
Gerade wenn es um simple Operatoren geht, bildet der Rechner zuerst aus den ersten beiden Eingaben das Zwischenergebnis und bildet aus diesem Zwischenergebnis und der nächsten Eingabe das Zwischenergebnis usw.
Angezeigt wird dann oben z.B. 1+2+3+4 aber im Eingabefeld steht immer das aktuelle Zwischenergebnis (also 3 bei 1+2) solange du keine Eingabe für den nächsten Operator getätigt hast.
Wenn du aber alles "in einem Rutsch" berechnen möchtest, wäre der Ansatz von hummingbird1 zu benutzen.

Ezio

T
314 Beiträge seit 2013
vor 8 Jahren

Da Du schreibst, dass alles über die Buttons eingegeben wird, ist es sinnvoller direkt die Operationen jeweils passend abzuspeichern (oder sogar schon zu berechnen).
Die Anzeige muss zu diesem Zeitpunkt ja nicht das interne Ergebnis sein.

2.207 Beiträge seit 2011
vor 8 Jahren
F
Flo78 Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren

@Ezio
Also ich habe Windows 7 auf dem Rechner. Wenn ich hier 10+10/2 eingebe, kommt da eben nicht 10 raus, sondern 15. Demnach für mich ein Zeichen dafür, das er eben keine Zwischenergebnisse bildet, oder?

@Coffeebean
Vielen Dank für die Links. Sorry ich muss mich erstmal in diesem Forum zurecht finden. Auch wenn ich eine ganze Zeit lang nach was passendem gesucht habe, bin ich auf deine Ergebnisse nicht gestoßen. 😃 Danke nochmal

@ t0ms3n
Eigentlich ne coole Idee. Hab ich so noch gar nicht auf dem Schirm gehabt. Im ersten Moment hätte ich allerdings Bedenken, dass es mit Punktrechnung vor Strichrechnung damit klappt. Aber trotzdem danke für die Anregung!

@hummigbird1

Super, und vielen Dank für den Code. Ich gebe zu, dass ich ersteinmal das Gefühl habe davon gar nichts zu raffen, wie gesagt, blutiger Anfänger 😉, aber ich versuche mich einfach mal durchzuarbeiten.

Vielen Dank nochmal

3.003 Beiträge seit 2006
vor 8 Jahren

@Ezio
Also ich habe Windows 7 auf dem Rechner. Wenn ich hier 10+10/2 eingebe, kommt da eben nicht 10 raus, sondern 15. Demnach für mich ein Zeichen dafür, das er eben keine Zwischenergebnisse bildet, oder?

Liegt an der Ansichtswahl oder daran, dass in Windows 10 der Taschenrechner überarbeitet und brauchbar(er) gemacht wurde (wenn man win10 nutzt). Der vorherige Rechner hat (bei Ansicht: Standard) tatsächlich Zwischenergebnisse gebildet.

Ansonsten beschreibst du ziemlich exakt einen Parser - siehe CoffeeBeans Link. Schönes (und typisches) Projekt für Anfänger - lass dir nicht zuviel vorkauen 😃.

LaTino
Edit: Grammatik

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

F
Flo78 Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren

Danke für die Aufklärung. 👍

Ich habe grundsätzlich schon den Anspruch mir die Dinge möglichst selbst zu erarbeiten, aber ichmmuss zugeben, dass ich als absoluter Programmieranfänger, manchmal schon das Gefühl habe Chinesisch zu lernen. Glücklicherweise kann ich sagen das es trotzdem riesig Spaß macht. =)