String durchsuchen bis zur ersten Zahl

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von RushDen.

    String durchsuchen bis zur ersten Zahl

    Hallo,

    ich bin Anfänger in VB und habe ein Problem.
    Ich suche eine Funktion bzw. Möglichkeit in VB einen String zu durchsuchen der + und - Zeichen enthält und sie dann jeweils zusammenrechnet.

    Sprich "String von vorne nach hinten durchgehen, bis zu das erste Operanden -> zahl bilden, operant lesen, weiter im string bis zum Operanden, zahl lesen, rechnen, operant lesen ....."

    Aber ich habe es nicht hinbekommen den String zu durchsuchen :( Was ist da besser mit regex ? Oder was?
    Könnt ihr mir helfen ?
    @Trulchen Willkommen im Forum. :thumbup:
    Falls das ein Formelparser werden soll, such mal im Forum nach Formelparser.
    Wenn nicht, beschreib mal Deinen Plan etwas ausführlicher, dann kann Dir auch gut geholfen werden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich muss eine Windows Forms Anwendung bauen.

    Der Anwender gibt eine Formel ein (mit beliebigen einzeilige Operanden und nur + und - ) und klickt auf
    "berechnen".

    z.B. 8 + 9 -10 + 5

    Und die Rechnung wird dann ausgeben in einem extra Label.

    Somit muss ich ja den String durchsuchen bis zum ersten Operanden, dann eine Zeichen vorrücken die zahl sich merken, und mit der Zahl nach dem Operanden addieren bzw. subtrahieren je nach Operant halt....
    Bevor ich den String durchsuche entferne ich noch alle Leerzeichen.

    Trulchen schrieb:

    Somit muss ich ja den String durchsuchen bis zum ersten Operanden
    Genau dies ist ein Formelparser.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Trulchen schrieb:

    selbst machen
    Über was für eine Programmiererfahrung verfügst Du?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Trulchen schrieb:

    selbst machen
    Über was für eine Programmiererfahrung verfügst Du?



    Ich bin Anfänger. Wirtschaftsinformatik Semester 1. Grundlagen von VB.
    Mehr als bisschen OO-Grundlagen und paar Schleifen kann ich nicht... Die Aufgabe ist nur eine Abschluss
    Deswegen ist glaub auch dieser Expressiontree nichts für mich

    Ich suche jetzt einfach nur nen Befehl wie ich ein String durchsuchen kann wie ich es oben beschrieben habe....
    Weil dann könnte ich ja theoretisch den String durchlaufen lassen bis er entweder ein + oder ein - gefunden hat.
    mir dann die Länge des Strings bis dahin anzeigen lassen, ein Zeichen zurück mir die Zahl zwischen speichern, zwei Zeichen vor, mir die Zahl speichern, ausrechnen mit dem entsprechende Operanden , Zwischenergebnis speichern... und weiter...
    oder ist das falsch?
    also wenn du mathematisch korrekte ausdrücke auswerten willst, kommst du damit nicht durch.
    Dann schaff lieber eine Oberfläche, wo der User keine Ausdrücke frei eingeben kann, sondern nur ein paar Buttons für Operatoren, und NumericUpdowns für die Zahlen verfügbar hat.

    Des weiteren kannst du den Expression-Tree ja stark vereinfachen.
    Also den Expression-Kram komplett weglassen, denn man kann ja bereits einen Postfix-notierten Ausdruck zuverlässig ausrechnen.
    Das ist dann halt ohne Variablen, nur mit Zahlen und Operatoren.
    Das müsste man als Programmierer bewältigen können, sobald man einen Stack(Of T) von einer List(of T) unterscheiden kann, weil bis dahin sind ja keine allzu abgedrehte SprachFeatures verwendet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Trulchen schrieb:

    wie ich ein String durchsuchen kann
    Sieh Dir mal das an:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    2. Dim txt = "8 + 9 -10 + 5" ' Dein Text
    3. Dim index = 0 ' Rückgabe der String-Suche
    4. Dim indexStart = 0 ' ab wo gesucht wird
    5. Do While index >= 0
    6. index = txt.IndexOfAny(New Char() {"+"c, "-"c, "*"c, "/"c}, indexStart) ' Die eigentliche Suche
    7. indexStart = index + 1 ' nicht denselben 2Mal finden (ist Null-basiert)
    8. Debug.WriteLine(index.ToString) ' Ausgabe, kannst Du im Output => Debug-Fenster sehen
    9. Loop
    10. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Trulchen schrieb:

    wie ich ein String durchsuchen kann
    Sieh Dir mal das an:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    2. Dim txt = "8 + 9 -10 + 5" ' Dein Text
    3. Dim index = 0 ' Rückgabe der String-Suche
    4. Dim indexStart = 0 ' ab wo gesucht wird
    5. Do While index >= 0
    6. index = txt.IndexOfAny(New Char() {"+"c, "-"c, "*"c, "/"c}, indexStart) ' Die eigentliche Suche
    7. indexStart = index + 1 ' nicht denselben 2Mal finden (ist Null-basiert)
    8. Debug.WriteLine(index.ToString) ' Ausgabe, kannst Du im Output => Debug-Fenster sehen
    9. Loop
    10. End Sub


    Das ist cool ! Sprich er gibt mir jetzt jeweils den Index aus an der sich ein Operant befindet und ich kann jetzt
    ein Zeichen vor und ein Zeichen springen oder?
    Wie bekomm ich raus welcher Operant gerade da ist?

    Trulchen schrieb:

    Wie bekomm ich raus
    So:

    VB.NET-Quellcode

    1. Do While index >= 0
    2. index = txt.IndexOfAny(New Char() {"+"c, "-"c, "*"c, "/"c}, indexStart)
    3. If index >= 0 Then
    4. Debug.WriteLine(String.Format("Index = {0}, Operator = {1}", index, txt(index)))
    5. End If
    6. indexStart = index + 1
    7. Loop
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. ​Public Function berechne() As String
    2. Dim first As Integer
    3. Dim second As Integer
    4. Dim zwischenergebnis As Integer
    5. Dim operant As String
    6. Dim index = 0 ' Rückgabe der String-Suche
    7. Dim indexStart = 0 ' ab wo gesucht wird
    8. Dim anzahldurchlauf = 1
    9. Do While index >= 0
    10. index = Me.Text.IndexOfAny(New Char() {"+"c, "-"c}, indexStart)
    11. If index >= 0 Then
    12. operant = Me.Text(index)
    13. End If
    14. indexStart = index + 1
    15. 'operant von String in "operant" umwandeln
    16. If anzahldurchlauf = 1 Then
    17. first = Me.Text.Substring(0, indexStart)
    18. second = Me.Text.Substring(0, index + 1)
    19. zwischenergebnis = first + second
    20. End If
    21. If anzahldurchlauf > 1 Then
    22. first = Me.Text.Substring(0, indexStart)
    23. second = Me.Text.Substring(0, index + 1)
    24. zwischenergebnis = zwischenergebnis + second
    25. End If
    26. anzahldurchlauf = anzahldurchlauf + 1
    27. SetErgebnis(zwischenergebnis)
    28. Loop
    29. End Function


    Der operant ist jetzt ein String.... wie bekomm ich den als "gültiges" Rechnzeichen konvertiert?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Trulchen“ ()

    ErfinderDesRades schrieb:

    Leerzeilen ohne Sinn
    Das kommt vom Einfügend des Codes, ohne den Quellcode-Button zu checken. :/
    @Trulchen Solange Du an Deinem Algorithmus arbeitest, solltest Du stets alle Zwischenergebnisse ausgeben und Dich davon überzeugen, dass sie korrekt sind!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Das kommt vom Einfügend des Codes, ohne den Quellcode-Button zu checken.
    echt?
    Bei mir kann ich ganz normal Code einfügen, mittm VB.Net-Button. Den Quellcode-Button meide ich sogar, weil er mir alle anneren Buttons deaktiviert.

    Und es gibt wirklich Leute, die haben sich wirklich angewöhnt immer mit so viele Leerzeilen zu coden.

    ErfinderDesRades schrieb:

    echt?
    Weil das bei mir so war, benutze ich jetzt fein säuberlich den Quellcode-Check, nachdem ich den entsprechenden Code-Tag gedrückt hab. Klingt blöd, is aber so. :/
    Und dann gibt es in der erweiterten Antwort ja noch den "Vorschau"-Button.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    QuellcodeCheck?
    Ich muss immer, damit diese blöden Leerzeilen verschwinden, mit Notepad eine Text-Datei erstellen/öffnen, dann dort erst rein-.. und dann wieder rauskopieren und ihn dann letztendlich hier reinlpopieren zu können.
    Ist zwar nervig, ging aber nicht anders. Muss mal beim nächsten mal schauen, was man da "checken" kann.

    RoulettePilot schrieb:

    was man da "checken" kann.
    Diesen hier:
    Bilder
    • Quellcode.png

      17,85 kB, 897×180, 178 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!