Logische Herangehensweise überprüfung operator

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Logische Herangehensweise überprüfung operator

    Hallo,

    ich habe ein Problem, bei dem mir schon die Logik fehlt.
    Ich programmiere mit VB.NET den einfachen Windows7 Taschenrechner nach.
    Ja, es gibt bereits Milliarden Beispiele, aber bisher habe ich keine Lösung für mich gefunden :(

    Wenn eine Zahl eingegeben wird, und dann ein Operator und anschließen ein anderer Operator, sollte nur der Operator gewechselt werden.
    Beispiel: 8 + -

    Wie löse ich das Problem?
    Gerne auch PseudoCode.. Mir geht es nur um die logische Herangehensweise.

    VB.NET-Quellcode

    1. Private Sub Plus_Click(sender As Object, e As EventArgs) Handles cmdMultiplication.Click
    2. If TextBox1.Text.Length <> 0 Then
    3. If Operator= String.Empty Then
    4. Zahl1 = CDbl(TextBox1.Text)
    5. LöscheLetzte = True
    6. Else
    7. Berechne()
    8. End If
    9. Operator = "plus"
    10. End If
    11. End Sub
    12. - Bei Berechne() dann:
    13. -------
    14. zahl2 = CDbl(TextBox1.Text)
    15. Select Case Operator
    16. Case "plus"
    17. zahl1 = zahl1 + zahl2
    18. ....................
    19. usw.

    Willkommen im Forum. :thumbup:

    bauerandre007 schrieb:

    sollte nur der Operator gewechselt werden.
    Wisse immer, was eingegeben wird. Verfolge, was eingegeben wird.
    Kenne alle erlaubten Operatoren. Und wenn ein Eingabetext auf einen Operator endet und es wird ein weiterer Operator eingegeben, lösche den letzten. String.EndsWith() wäre nützlich.
    Und:

    bauerandre007 schrieb:

    VB.NET-Quellcode

    1. Operator = "plus"
    ist suboptimal.
    Solch erledigst Du mit einem Enum:

    VB.NET-Quellcode

    1. Enum Operators
    2. Plus,
    3. Minus,
    4. Mal,
    5. Durch
    6. ' ...
    7. End Enum
    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:

    Und wenn ein Eingabetext auf einen Operator endet
    sowas kommt glaub bei seim Rechner nicht vor.

    Da gibts glaub einzig eine Textbox für die Zahl, und die Operatoren werden mittels Button eingegeben.
    @TE: interpretiere ich das richtig?

    Weil dann ist auch

    RodFromGermany schrieb:

    Verfolge, was eingegeben wird.
    hinfällig.
    Sondern es reicht, sich einen Operator zu merken, und wenn eben erst btPlus gedrückt wurde, und danach kommt btMinus, dann wird der gemerkte Operator, der zuvor "+" enthielt, eben durch "-" überschrieben.
    Man muss aber auch noch konzipieren, wann ein Zwischenergebnis zu berechnen ist - aber das führt langsam zu weit.


    ErfinderDesRades schrieb:


    Da gibts glaub einzig eine Textbox für die Zahl, und die Operatoren werden mittels Button eingegeben.
    @TE: interpretiere ich das richtig?

    Ja, das ist richtig. Die Operatoren werden auf der TextBox nicht angezeigt.

    ErfinderDesRades schrieb:

    Sondern es reicht, sich einen Operator zu merken, und wenn eben erst btPlus gedrückt wurde, und danach kommt btMinus, dann wird der gemerkte Operator, der zuvor "+" enthielt, eben durch "-" überschrieben.


    Das ist auch richtig, nur fehlt mir die logische Herangehensweise.
    Ich bekomme die mehrfache Verzweigung nicht richtig aufgelöst.

    An erster Stelle überprüfe ich, ob es noch keinen String gibt, falls es keinen gibt, ist meine erste Zahl die, die in der TextBox steht und die aktuelle zahl darf mit der eingabe einer neuen zahl überschrieben werden.
    Falls es aber noch bereits einen Operatoren gibt, gehe ich zu der Funktion Berechne()
    Der Operator wird im Anschluss beider Verzweigungen auf den jeweiligen Operator gesetzt.

    VB.NET-Quellcode

    1. Private Sub Plus_Click(sender As Object, e As EventArgs) Handles cmdMultiplication.Click
    2. If TextBox1.Text.Length <> 0 Then
    3. If Operator= String.Empty Then
    4. Zahl1 = CDbl(TextBox1.Text)
    5. LöscheLetzte = True
    6. Else
    7. Berechne()
    8. End If
    9. Operator = "plus"
    10. End If
    11. End Sub


    also ich konzipiere mal:
    man kann ziffern eingeben und operatoren.
    Es gibt die Anzeige, einen Zahl-Merker und einen OperatorMerker.

    Eine Ziffer eingeben kann 2 Wirkungen haben:
    a) die Anzeige-Zahl bekommt eine weitere Ziffer
    b) eine neue Anzeige-Zahl wird angefangen

    Einen Operator eingeben kann auch 2 Wirkungen haben:
    a) die Merkzahl wird mit dem Merk-Operator verrechnet, das Ergebnis kommt zur Anzeige. Der neue Operator wird gemerkt
    b) die Anzeige wird in die Merkzahl geschrieben, verrechnet wird aber noch nix, denn zuvor muss ja noch durch Ziffer-Eingabe eine weitere Zahl in die Anzeige geschrieben werden.

    Der =-Operator ist besonders, der ist nur gültig, wenn Merkzahl und Anzeige gegeben sind. Und dann wird verrechnet, aber das = wird nicht als neuer Operator gemerkt.

    Dieses Konzept ist nur ein Ansatz, fehlt noch einiges an Logik, insbesondere die Bestimmung, wann eine Ziffer eine neue Anzeige anfängt, und wann sie die bestehende verlängert.

    (Schneider-Nassi-Diagramme halte ich übrigens für Unfug. Jede Programmiersprache drückt die Verhältnisse kompakter und besser lesbar als der blöde Schneider-Nassi)

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

    ErfinderDesRades schrieb:

    sowas kommt glaub bei seim Rechner nicht vor.

    bauerandre007 schrieb:

    Beispiel: 8 + -

    bauerandre007 schrieb:

    Ja, das ist richtig. Die Operatoren werden auf der TextBox nicht angezeigt.

    @bauerandre007 Bitte poste eine vollständige und belastbare Aufgabenstellung / Problembeschreibung.
    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!

    ErfinderDesRades schrieb:

    b) die Anzeige wird in die Merkzahl geschrieben, verrechnet wird aber noch nix, denn zuvor muss ja noch durch Ziffer-Eingabe eine weitere Zahl in die Anzeige geschrieben werden.

    @ErfinderDesRades Alles richtig konzipiert. An b) komme ich nun nicht weiter, weil ich nicht weiß, wie ich nun überprüfe, ob es gerade nicht verrechnet werden soll.
    Die String Variable Operator ist nicht mehr leer, die erste Double Variable Zahl1 hat einen festen Wert. Es darf aber in der Berechnen() Funktion nicht gerechnet werden, da nur der Operator gewechselt werden soll. Wie aber überprüfe ich das?

    @'RodFromGermany' Du hast Recht, ich müsste das verständlicher Ausdrücken und nicht davon ausgehen, dass von dem Code aus alles weitere erkannt wird.

    bauerandre007 schrieb:

    Wie aber überprüfe ich das?
    Mach einen Programmablaufplan.
    Lege fest, was alles eingegeben werden kann und werte aus, wann was eingegeben werden darf, was nicht, und was, wenn editiert wird.
    Du hast da zwei Probleme, die solltest Du nicht mischen.
    1. das Auswerten der Eingabe und Konvertieren in Rechen-Input
    2. das Rechnen selbst
    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: Es wird nichts eingegeben. Siehe dir bitte den Windows 7 Rechner an. Ob es bei Vista oder Win 8 genau ist, gehe ich stark von aus.

    ErfinderDesRades schrieb:

    bauerandre007 schrieb:

    Alles richtig konzipiert.
    sowas kann man erst sagen, wenns Proggi läuft.

    Jo, womöglich brauchst du noch einen MerkBool, der sich merkt, ob nach dem Übertragen der Anzeige in die MerkZahl eine Ziffer eingegeben wurde.

    @ErfinderDesRades:
    Nach dem übertragen der Zahl1 zu überprüfen, ob eine Ziffer eingegeben wurde?

    VB.NET-Quellcode

    1. Private Sub Plus_Click(sender As Object, e As EventArgs) Handles cmdMultiplication.Click
    2. If sOperatorHolder = String.Empty Then
    3. dFirstValueHolder = CDbl(txtDisplay.Text.Replace(".", ","))
    4. ZifferWurdeEingegeben = True
    5. bEraseLastEntered = True
    6. ElseIf ZifferWurdeEingegeben = True Then
    7. CalculateTotals()
    8. End If
    9. sOperatorHolder = "Subtract"
    10. End Sub


    Was bringt mir die Überprüfung, ob nach dem Übertragen der Anzeige in die Zahl1 eine Ziffer eingegeben wurde, wenn ich nach dem Drücken einer Zahl einen Operatoren mehrmals hintereinander drücke? Das würde bedeuten, dass er ständig mit der selben Zahl rechnen würde. Was aber beim TRechner nicht der Fall ist.
    Drücke auf eine Zahl und dann mehrmals auf den Operatoren, wird die Zahl1 gemerkt, der Operator gemerkt, die Anzeige bleibt.
    Drücke auf eine Zahl und dann auf einen Operatoren und dann auf einen anderen Operatoren, die Zahl wird gemerkt, der Operator ändert sich.
    Drücke auf eine Zahl und dann auf einen Operatoren und dann auf eine weitere Zahl, und es wird nur die neue Zahl angezeigt, der Operator und die Zahl1 werden gemerkt.
    Drücke auf eine Zahl und dann auf einen Operatoren und dann auf eine weitere Zahl und dann auf einen neuen Operatoren, und erst jetzt wird gerechnet.
    natürlich hats keinen Sinn, wenn du ZifferWurdeEingegeben im cmdMultiplication.Click auf True setzst.
    Das musste natürlich auf True setzen, wenn du eine Ziffer eingibst - nicht bei Eingabe eines Operators.

    Und warum bei cmdMultiplication.Click der sOperatorHolder ausgerechnet auf "Subtract" gesetzt wird, hat wohl auch was mit Selbst-Obfuscation zu tun.

    heieiei!

    Die Methode heisst auch noch Sub Plus_Click - also da ist ja alles durcheinander: Multiplikation, Subtraction, Addition.

    Dringende Empfehlung: Sprechende Benamung ist lebenswichtig! Nur müssen die Namen auch die Wahrheit sprechen!

    Sonst wird aus "Nomen est Omen!" auf einmal: "Nomen est Chaos!"

    ErfinderDesRades schrieb:

    Das musste natürlich auf True setzen, wenn du eine Ziffer eingibst - nicht bei Eingabe eines Operators.

    Dann hätte ich jetzt eine boolsche Variable, die nichts anderes macht, außer zu überprüfen, ob eine Ziffer eingegeben wurde und dafür einen viel zu geräumigen Gültigkeitsbereich hat. Findest du, dass das eine gute Idee ist?

    ErfinderDesRades schrieb:

    Und warum bei cmdMultiplication.Click der sOperatorHolder ausgerechnet auf "Subtract" gesetzt wird, hat wohl auch was mit Selbst-Obfuscation zu tun.

    Es ist kein Obfuscation, sondern Beschränkung auf das Wesentliche. Dabei kam anscheinend ein Fehler auf, der hinfällig wird, wenn man sich die restlichen Beschreibungen durchliest und erkennt, dass der Code keine große Relevanz hat.

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

    bauerandre007 schrieb:

    Dann hätte ich jetzt eine boolsche Variable, die nichts anderes macht, außer zu überprüfen, ob eine Ziffer eingegeben wurde und dafür einen viel zu geräumigen Gültigkeitsbereich hat. Findest du, dass das eine gute Idee ist?
    Gefällt mir, dass du dir Gedanken angemessene Scopes machst :thumbsup:
    Aber ich sehe nicht, dasses in diesem Falle anders geht - ZifferWurdeEingegeben muss eine Klassenvariable sein, die sich den entsprechenden Zustand merkt.
    Weil anhand dieses Zustandes soll sich der Taschenrechner ja unterschiedlich verhalten, wenn ein Operator kommt.

    bauerandre007 schrieb:

    Es ist kein Obfuscation, sondern Beschränkung auf das Wesentliche.
    naa - es ist einfach ganz falsch benamt, und sowas macht Code in nullkommanix vollkommen unverständlich - schlimmer noch: missverständlich.
    Und missverständlich ist deshalb schlimmer als unverständlich, weil bei unverständlich weißt du, dass du's nicht weißt - und denkst deshalb drüber nach.
    Bei missverständlich denkst du, du wüsstest, aber der Code macht was ganz anneres.

    Also eine Methode namens Plus_CLick darf niemals das ClickEvent eines Buttons namens cmdMultiplication behandeln - auch nicht für Quick & Dirty.

    bauerandre007 schrieb:

    Es wird nichts eingegeben
    Wie willst Du denn dem Programm mitteilen, welche Zahlen es mit welchen Operationen verknüpfen soll?

    bauerandre007 schrieb:

    Drücke auf eine Zahl und dann mehrmals auf den Operatoren, wird die Zahl1 gemerkt, der Operator gemerkt,
    Dies nennt man Eingabe.


    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!
    danke blumen.

    also wenn du nu was funktionierendes fertig hast, kannste das auch zippen und anhängen.

    Dann kann ich mit einer Code-Review davon antworten, bei der ich alle Code-Stil-Horrors korrigiere.
    Das wird anfangen mit Visual Studio - Empfohlene Einstellungen , Benamung, ordentliches Layout, aber auch Verwendung von Enum (s. Rods Anregung) wirst du darin wiederfinden.
    Du wirst kaum was wieder erkennen, und es wird wohl wesentlich knapperer und selbsterklärender Code werden.
    Im Vergleich deiner Vor-Version mit meiner Überarbeitung kannste glaub jede Menge lernen, wenn du dir neues oder unverstandenes, nicht hinnimmst, sondern Punkt für Punkt nachfragst.

    eine zip anhängen kannste? Sonst gugge

    bauerandre007 schrieb:

    detaillierter zu beschreiben
    Jou.
    Solch ist ein großes Problem hier, dass Fragesteller ihr Problem mehr schlecht als recht beschreiben und wir eine Weile brauchen, bis wir das eigentliche Problem herausgearbeitet haben.
    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!

    ErfinderDesRades schrieb:

    Dann kann ich mit einer Code-Review davon antworten, bei der ich alle Code-Stil-Horrors korrigiere.
    Das wird anfangen mit Visual Studio - Empfohlene Einstellungen , Benamung, ordentliches Layout, aber auch Verwendung von Enum (s. Rods Anregung) wirst du darin wiederfinden.


    Danke sehr! Ich komme darauf zurück, sobald ich meine ToDo Liste abgearbetet habe.