Möglichkeit zum Wechseln der Rechenoperation innerhalb einer Schleife?

  • WPF

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von #MW31.

    Möglichkeit zum Wechseln der Rechenoperation innerhalb einer Schleife?

    Hallo Leute,

    ich muss für mein Wirtschaftsingenieursstudium eine Projektarbeit in VB abgegeben, nur habe ich bei dem Projekt ein Problem.
    Zuerst mal meine Aufgabenstellung:

    "In der 1. Projektaufgabe sollen Sie eine Windows Consolen Anwendung entwickeln folgendes Gleichungsformat könnte gegeben sein (6_2)_8_9_1= 13. Die Underlines stellen einen Operator dar, welchen muss man herausfinden. Die Gleichung soll mit den richtigen Operatoren (+,-,*,/) ausgestattet werden. Der Benutzer soll beliebige Gleichungen eingeben können, wenn die Gleichung nicht Lösbar ist soll dies angezeigt werden."

    Nun habe ich mir gedacht, dass ich es so aufbauen möchte, dass die Zahlen erst alle miteinander addiert werden sollen und dann soll die letzte Rechenoperation durchwechselt:

    zahl1 + zahl2 + zahl3 + zahl4 = ergebnis
    zahl1 + zahl2 + zahl3 - zahl4 = ergebnis
    zahl1 + zahl2 + zahl3 * zahl4 = ergebnis
    zahl1 + zahl2 + zahl3 / zahl4 = ergebnis
    zahl1 + zahl2 - zahl3 + zahl4 = ergebnis
    zahl1 + zahl2 - zahl3 - zahl4 = ergebnis
    und so weiter...

    Die wollte ich mit einer Schleife machen, habe aber nirgends was dazu gefunden, wie ich das Vorzeichen bei den einzelnen Durchläufen ändern lassen kann.
    Jedes einzeln hin zu schreiben und dann zu überprüfen, ob das richtige Ergebnis raus kommt wäre eine rießen Schreibarbeit und sicher auch nicht der gewünschte Lösungsweg meines Dozeten.

    Würde mich freuen, wenn mir jemand helfen könnte!

    ~blaze~ schrieb:

    Hi
    das oder Delegaten:

    VB.NET-Quellcode

    1. Dim ops As New Func(Of Integer, Integer, Integer)() {Function(a, b) a + b, Function(a, b) a - b, Function(a, b) a * b, Function(a, b) a \ c}

    Dann kannst du über For-Each alle Operationen durchgehen, bzw. + ist ops(0), - ist ops(1), usw.

    Viele Grüße
    ~blaze~


    Erstmal Danke für deine Antwort!

    Delegaten sind für mich neu und wenn ich diese Funktion genauso übernehme, dann gibt es mir einen Fehler raus, dass in der lehren Klammer ein "AddressOf" oder ein Lambda Ausdruck fehlt. Jedoch habe ich es so verstanden, dass das in der {}-Klammer der Lambda Ausdruck steht, aber warum gibt es mir dann trotzdem einen Fehler aus oder genauer gesagt, was müsste da noch ergänzt werden?
    Ich habe auch bei msdn mir den Aufbau von Delegaten angesehen, das hat es mir leider aber auch nicht klarer gemacht.

    Würde mich freuen, wenn du mir nochmal helfen könntest. :)
    Pardon, hatte gedacht, man könne in VB das = einfach so weglassen, wie es geht, wenn man kein Array instanziiert und konnte es am Handy nicht ohne großen Aufwand überprüfen:

    VB.NET-Quellcode

    1. Dim ops = New Func(Of Integer, Integer, Integer)() {Function(a, b) a + b, Function(a, b) a - b, Function(a, b) a * b, Function(a, b) a \ b}

    Obiger Code benötigt Option Infer On. Wenn du sie nicht aktiviert hast, deklariere ops um zu Dim ops As Func(Of Integer, Integer, Integer)(). Option Infer erlaubt es dem Compiler, auf den Typ zurückzuschließen, ohne dass du ihn direkt angeben musst. Es ist ja offensichtlich, welchen Typ die nachfolgende Instanziierung ergibt.
    Delegaten sind Referenzen auf eine Methode und ggf. noch mit einer Instanz verknüpft. Außerdem gibt es eben noch Lambda-Ausdrücke. Function(a, b) a + b ist z.B. ein Lambdaausdruck: Man schreibt den Delegaten einfach direkt hin, ohne eine extra Funktion in der Klasse anlegen zu müssen. Der Compiler erzeugt dann die Methode für dich, sobald er den Code übersetzt.

    Viele Grüße
    ~blaze~

    ~blaze~ schrieb:

    Obiger Code benötigt Option Infer On.
    Allerdings ist er so nur innerhalb einer Prozedur compilierbar.
    @#MW31 Wenn Du den Code in einer Klasse verwenden willst, machst Du

    VB.NET-Quellcode

    1. Private ops() As Func(Of Integer, Integer, Integer) = New Func(Of Integer, Integer, Integer)() {Function(a, b) a + b, Function(a, b) a - b, Function(a, b) a * b, Function(a, b) a \ b}
    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!
    Alles klar, danke! Die Delegate ist nun richtig, mein einziges Problem liegt jetzt darin, dass ich mir nicht sicher bin, wie ich diese Methode aufrufe. Mein bester Freund (das Internet) meinte, ich muss eine Klasse erstellen, die eine Methode hat, die die gleiche Signatur wie die Delegate hat. Anschließend muss ich noch eine Methode in der Klasse schreiben, die die Delegate aufruft.
    Klingt für einen Anfänger ziemlich kompliziert, gibt es da nicht noch eine andere Art sie aufzurufen?