mehrere Zahlen ausrechnen Windows Forms Taschenrechner?
Hallo,
Ich habe folgendes "Problem", habe meinen TR soweit hinbekommen, dass er Zahl 1 (+-*/) Zahl 2 ausrechnen kann. Nun soll ich Zahl 1 (+-*/) Zahl 2 (+-*/)Zahl 3,... ausrechnen können, stehe dabei leider irgendwie vor einer Wand und bekomme es nicht hin.
Hier der code: (etwas abgekürzt, da sonst zu lang)
Kopf=
Imports System.CodeDom
Public Class form1
Public Property zahl As String = ""
Public Property calc As String = ""
Bei alle Zahlen (0-9 sowie .)=
Private Sub b1_Click(sender As Object, e As EventArgs) Handles b1.Click
tb.Text += "1"
End Sub
Delete Button=
Private Sub bdel_Click(sender As Object, e As EventArgs) Handles bdel.Click
If (tb.Text.Length > 0) Then
tb.Text = tb.Text.Substring(0, tb.Text.Length - 1)
End If
End Sub
End Sub
Gleich Button=
Private Sub bsolve_Click(sender As Object, e As EventArgs) Handles bsolve.Click
If (calc = "+") Then
tb.Text = Val(zahl) + Val(tb.Text)
End If
If (calc = "-") Then
tb.Text = Val(zahl) - Val(tb.Text)
End If
If (calc = "*") Then
tb.Text = Val(zahl) * Val(tb.Text)
End If
If (calc = "/") Then
tb.Text = Val(zahl) / Val(tb.Text)
End If
End Sub
bei allen Operatoren= (+,-,*,/)
Private Sub bplus_Click(sender As Object, e As EventArgs) Handles bplus.Click
zahl = tb.Text
calc = "+"
tb.Text = ""
End Sub
Vielen Dank schonmal
2 Antworten
Ich denke, am einfachsten machst du es dir, wenn du jede Eingabe (Zahl/Operator) in eine Liste einfügst.
Private Property inputData As New List(Of String)
' add:
inputData.Add("...")
' get:
Dim first As String = inputData(0)
Dim last As String = inputData(items.Count - 1)
' clear
inputData.Clear()
Wenn du eine Zahl einfügst, solltest du schauen, ob der letzte Eintrag (sofern die Liste überhaupt schon Einträge hat) keinem Operator entspricht, denn dann hast du eine Zahl mit mehreren Stellen. In dem Fall verbindest du den letzten Eintrag mit der Eingabe.
inputData(items.Count - 1) += "..."
Wenn das Endergebnis berechnet werden soll, müsstest du aus den Einträgen Dreierpaare bilden, die zusammengerechnet werden können. Zuvor würde ich eine Validation vornehmen: Wenn der erste/letzte Eintrag einem Operator entspricht, wird dieser entweder entfernt oder du fügst der Liste einen weiteren Eintrag (0 bei Addition/Subtraktion und 1 bei Multiplikation/Division) hinzu. Eine Validation/Korrektur für mehrere Operatoren nacheinander (Bsp.: ++) sollte bereits bei der Eingabe getätigt werden.
Den Rechenvorgang kannst du in zwei grobe Schritte unterteilen:
Im ersten Schritt suchst du nach allen Einträgen des Multiplikations/Divisionsoperator und multiplizierst/dividierst dann den Vorgänger- und Nachfolgereintrag miteinander. Das Ergebnis kann an die Stelle des Vorgängereintrags geschrieben werden, die beiden anderen Einträge werden gelöscht.
inputData.RemoveAt(index)
inputData.RemoveAt(index + 1)
Im zweiten Schritt tust du im Prinzip dasselbe, nur diesmal mit Fokus auf die Addition/Subtraktion.
Beschäftige dich dafür mit der For...Next-Schleife.
.NET bietet dafür Funktionen, die das von Haus aus können. Ich glaube, das war die DataTable Klasse oder so mit der Compute Methode. Gerne mal recherchieren.
Wenn es aber um das reine selber machen geht, dann sehe ich nur die eine Lösung: Splitten.
Splitte den String in seine Einzelteile und durchlaufe es Stück für Stück in einer Schleife. Damit wären nur noch nicht die Punkt vor Strich Rechnungsregeln beachtet. Da müsste man auch nochmal ran. Dann könnte man schauen: a + b * c. Ist nach a ein +? Dann ist nach b ein Plus? Nein? Rechne erst b * c. Nach c ein +? Nein? Auch kein Mal? Ok, dann a + Ergebnis von b&c. Man kann hierbei zum Beispiel mit einer for Schleife arbeiten und mit dem iterator index kann man wunderbar hin und herspringen.
Danke erstmal. Bin leider erst Anfang zweite Woche in der Ausbildung. Ist alles noch etwas komplizierter für mich, gerade mit Begriffen die man noch nie gehört hat. Ich schaue mal wie weit ich komme.