Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Formel als String zerlegen und berechnen
Flo78
myCSharp.de - Member



Dabei seit:
Beiträge: 5
Herkunft: Nähe Köln

Themenstarter:

Formel als String zerlegen und berechnen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
hummigbird1
myCSharp.de - Member

Avatar #avatar-3534.jpg


Dabei seit:
Beiträge: 127

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Flo78
myCSharp.de - Member



Dabei seit:
Beiträge: 5
Herkunft: Nähe Köln

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Stefan.Haegele
myCSharp.de - Member

Avatar #avatar-3068.jpg


Dabei seit:
Beiträge: 463
Herkunft: Untermeitingen

beantworten | zitieren | melden

Onkel Google kennst du?

Googlesuche C# Taschenrechner

1. Ergebnis bei der Suche "C# Taschenrechner"

Taschenrechner C#
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Stefan.Haegele am .
private Nachricht | Beiträge des Benutzers
Flo78
myCSharp.de - Member



Dabei seit:
Beiträge: 5
Herkunft: Nähe Köln

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
hummigbird1
myCSharp.de - Member

Avatar #avatar-3534.jpg


Dabei seit:
Beiträge: 127

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Ezio
myCSharp.de - Member

Avatar #avatar-3575.png


Dabei seit:
Beiträge: 196

beantworten | zitieren | melden

Zitat von Flo78
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
private Nachricht | Beiträge des Benutzers
t0ms3n
myCSharp.de - Member



Dabei seit:
Beiträge: 319

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2461
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

Beachte auch mal die Forensuche. Du bist ja nicht der erste mit dem Problem:

Taschenrechner programmieren
String Splitten, in Int Umwandeln + addieren => funktioniert das?
Taschenrechner: String mit Zahlen und Operatoren aufteilen & verarbeiten

Ausserdem interessant:

Parser für mathematische Formeln

Gruss
private Nachricht | Beiträge des Benutzers
Flo78
myCSharp.de - Member



Dabei seit:
Beiträge: 5
Herkunft: Nähe Köln

Themenstarter:

beantworten | zitieren | melden

@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
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

Zitat von Flo78
@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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am .
"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)
private Nachricht | Beiträge des Benutzers
Flo78
myCSharp.de - Member



Dabei seit:
Beiträge: 5
Herkunft: Nähe Köln

Themenstarter:

beantworten | zitieren | melden

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. =)
private Nachricht | Beiträge des Benutzers