C# Taschenrechner berechnungsprblem

ali7566

Lieutenant
Registriert
Feb. 2007
Beiträge
980
Hallo,

ich mache gerade einen Taschenrechner als WinForm Anwendung.
Ich habe die Tasten alle programmiert, sie beim EventHandler registriert, scheitere jedoch bei der Event Ausführungsmetode beim gleichzeichen.

Ich möchte wenn ich z.B. 2500 + 1200 habe, aufteilen, die Zahlen in int umwandeln, den operator hinzufügen, es berechnen lassen und dann wieder in string umwandeln um es in der TextBox korrekt anzeigen zu können.

Mein Problem bei der Sache ist das mit dem Splitten,

Mein Ansatz ist folgender:
Ich mache ein String Array und speichere jede gesplitteten wert in jeweils eine Variable des Arrays, wandele dies dann in int um und lass es berechnen.

Wie bekomme ich es hin das ich Zahlen von Zeichen wie plus, minus, geteilt und mal trennen kann ?

Gruß Ali
 
Ich kenn's jetzt nur aus C, aber wenn du n Char zu int castest bekommst du doch den ASCII wert, oder?
Also praktisch beim schleifendurchlauf der Char Arrays mit if den wert höher als 9 raussuchen und ihn in ne variable packen, danach mit nem switch Case?

Wenns in deinem Fall anders is, sorry :p


*edit1:
Ach sorry, String Array... Dann sind die Werte immer höher 9... Und gleichsetzen kannst du es auch nicht.
Aber wie trennst du die Zeichen beim einlesen? Wenn du die zahlen und den Operator schon getrennt einliest, ist es doch sicher, zu sagen, jeder zweite wert
In dem Array ist ein Operator.
 
Zuletzt bearbeitet:
Ein Screenshot wäre super, kann mir gerade nicht so richtig vorstellen wie dein Taschenrechner aussehen soll
 
Es gibt für Strings wohl Methoden, mit denen man "Trennzeichen" suchen lassen kann. Auf die Weise könntest du erst einmal die Zahlen separieren und dann an entsprechender Stelle noch das Rechenzeichen einlesen. Wie genau die Befehle dafür lauten weiß ich allerdings nicht.
 
Hi,

wenn ich dein Problem richtig verstehe, gehst du hin, und gibts zunächst den gesamten Berechnungs-String in die Textbox ein. Sobald du nun "=" drückst, soll der Ausdruck vollständig berechnet werden, und das Ergebnis in die Textbox geschrieben werden.
Theoretisch könntest du deinen String aus der Textbox mit "Contains()" durchsuchen auf die Rechenoperatoren +, -, :, * etc...

Was aber hälst du von dem deutlich einfacheren Ansatz, eine Zahl eingeben zu können, sobald du nun auf ein Rechenzeichen klickst, kopierste dir den Inhalt aus der Textbox in eine Tempvariable und merkst dir den Operator dazu und löschst den Inhalt der Textbox, dann kann der Benutzer die zweite Zahl eingeben.... und so weiter.


Viele Grüße
Stephan
 
hm, ich kann empfehlen... nimm einen Dictionary. Als Key speicherst du den aktuellen Wert oder Operator. So kannst du sichergehen dass die Reihenfolge nachvollziehbar ist.

Code:
public Dictionary<int, Object> RechReihenfolge = new ...
int letzteroperandnummer;

private void EventHandler(Object sender, EventArgs e)
{
    RechReihenfolge.Add(letzteroperandnummer, Operand.Text);
}

tja sowas ähnliches.... aber wozu brauchst du jede Operation abzuspeichern? Du kannst auch alles direkt verarbeiten.
 
Mir ist gerade was noch viel viel einfacheres eingefallen:
KeyDown-Event für die TextBox. Da wird dann überprüft, ob eine Zahl oder ein Rechenzeichen eingegeben wurde. Sobald ein Rechenzeichen eingegeben wird, wird die Zahl davor in einen Integer geschrieben, bei Ausführung der Berechnung wird die Zahl dahinter in einen Integer geschrieben und entsprechend berechnet.
Dadurch, dass man direkt bei der Eingabe überprüft, ob die Zahl fertig ist, spart man sich rumgeiere mit irgendwelchen Stringmethoden.

Kleiner Leckerbissen: Drückt man Enter (Keys.Enter/'\r' '\n') wird automatisch berechnet. Auf die Weise könnte man alle Operationen über die Tastatur ausführen. Außerdem könnte man so auch dafür sorgen, dass nur Zahlen und gültige Rechenzeichen eingegeben werden. Wie herrlich das doch alles sein kann :D
 
Also hier sind die wichtigsten Funktionen:

String.Split(Trennzeichen As String) zerlegt einen String in mehrere Zeichen.
Dasselbe gibt es auch also Char Array bzw. String Array beim Trennzeichen. Da wird dann nach allen Zeichen getrennt.
Die Ausgabe ist ein String Array mit den jeweiligen Teilen

Integer.Parse(StringValue) bzw. Double.Parse(StringValue) wandeln eine Zeichenkette in eine Zahl um. Funktioniert das nicht, so wird eine Exception geworfen.
Standardmäßig wird hier das Nummernformat in den Regionaleinstellungen genommen d.h. auf einem deutschen System Dezimaltrennzeichen, bei englischen . usw.

Integer.TryParse(StringValue,RetValue) schreibt das Ergebnis in RetValue rein und liefert True, falls das Umwandeln erfolgreich war (ist schneller als eine Exception zu werfen und zu fangen).
Mit Double.TryParse funktioniert das genauso.

Wenn du aus einem Integer bzw. Double wieder einen String machen, dann nimm einfach die Funktion .ToString().
Du kannst je nach Datentyp auch die Ausgabe formatieren z.B. liefern IntValue.ToString("0000") eine vielstellige Ausgabe. Genaueres hast du in derHilfe.


Beim grundsätzlichen Ansatz liegst du für einen einfachen Taschenrechner schon ganz gut. Soll der dann auch Vorrangregeln (z.B. Klammern, Punkt- vor Strichrechnung etc.) beherrschen, wird das mit dem Array Ansatz aber eher mühsam. Da wäre ein Stack besser, aber schau einmal, dass du es so hinbekommst;)
 
Es gibt spezielle Mathe-Parser. Unter mycsharp.de lässt sich die Source zu so einem Dings finden, ist allerdings nicht ganz trivial und hat viel mit Sprachen an sich zu tun. Ist ein bisschen ähnlich zum Compilerbau.
 
Das schaut mir doch eher mehr nach Hausaufgaben aus und da ist es vielleicht nicht unbedingt der beste Ansatz sich alles mit einem Fix- und Fertig Tool aus dem Internet zu lösen. Es geht ja darum sich selbst Gedanken darüber zu machen bzw. es dann zu implementieren ;)
 
Es geht darum das rad nicht neu zu erfinden und zu schauen wie es profis lösen anstatt rumzufrickeln.
 
ljnk schrieb:
Es geht darum das rad nicht neu zu erfinden und zu schauen wie es profis lösen anstatt rumzufrickeln.

Uhi das könnte wieder ne Grundsatzdiskussion auslösen. Ich sags mal vorsichtig. Es ist nicht verkehrt es erstmal selbst zu probieren um die Logik zu verstehen und danach das anzugucken wie es die Profis machen, so lernt man selbst mit der Materie umzugehen und sieht danach wie man es hätte besser machen können.
 
Zurück
Oben