Quadratische Gleichung auflösen

  • Hallo!

    Ich versuch grad ein Programm zu schreiben, welches mir eine quadratische Gleichung mithilfe der Mitternachtsformel
    -b +- Wurzel(b²-4ac)
    -----------------------
    2a

    aufslöst.

    [autoit]


    $a = InputBox("Eingabe", "Bitte gib a ein:")
    $b = InputBox("Eingabe", "Bitte gib b ein:")
    $c = InputBox("Eingabe", "Bitte gib c ein:")

    [/autoit][autoit][/autoit][autoit]

    $b = $b*(-1) ;Der Parameter b wird der Gleichung angepasst (-b)

    [/autoit][autoit][/autoit][autoit]

    ; { Radikant }
    $disk1 = $b*$b ;b²
    $disk2 = -4*$a*$c ;-4ac
    $disk3 = $disk1 + $disk2 ;b²-4ac
    $wurzel = Sqrt($disk3) ;Wurzel(b²-4ac)
    If $wurzel < "0" Then MsgBox(64, "Lösung", "L={]")
    MsgBox(64, "Ausgabe", $wurzel)

    [/autoit]

    Irgendwie klappt das mit der Wurzel nicht. Da bekomm ich immer "-1.#IND" raus. Wo liegt der Fehler?

    fabs

  • Dass Sqrt nicht mehr das zurückgibt, was in der Hilfe steht :)

    Spoiler anzeigen
    [autoit]

    Do
    $a = InputBox("Eingabe", "Bitte gib a ein:")
    If @error Then Exit
    Until $a > 0
    Do
    $b = InputBox("Eingabe", "Bitte gib b ein:")
    If @error Then Exit
    Until StringIsDigit($b) Or StringIsFloat($b)
    Do
    $c = InputBox("Eingabe", "Bitte gib c ein:")
    If @error Then Exit
    Until StringIsDigit($c) Or StringIsFloat($c)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $b = $b*(-1) ;Der Parameter b wird der Gleichung angepasst (-b)

    [/autoit] [autoit][/autoit] [autoit]

    ; { Radikant }
    $disk1 = $b*$b ;b²

    [/autoit] [autoit][/autoit] [autoit]

    $disk2 = -4*$a*$c ;-4ac
    $disk3 = $disk1 + $disk2 ;b²-4ac
    ConsoleWrite($disk3 & @CRLF)
    $wurzel = Sqrt($disk3) ;Wurzel(b²-4ac)
    If StringInStr($wurzel,"#IND") Then ; Divisionsfehler/Wurzelfehler :)
    MsgBox(64, "Lösung", "L={}")
    ElseIf $wurzel = 0
    $L = ($b)/(2*$a)
    MsgBox(64, "Lösung", "L={ " & $L & " }")
    Else
    $L1 = ($b+$wurzel)/(2*$a)
    $L2 = ($b-$wurzel)/(2*$a)
    MsgBox(64, "Lösung", "L={ " & $L1 & " ; " & $L2 & " }")
    EndIf

    [/autoit]
  • progandys lösung ist super, aber für die Zukunft:
    Nutze anstatt:

    [autoit]

    If $wurzel < "0" Then MsgBox(64, "Lösung", "L={]")

    [/autoit]


    lieber

    [autoit]

    If $wurzel < 0 Then MsgBox(64, "Lösung", "L={]")

    [/autoit]

    Gruß

  • Ich versteh in dem Quellcode garnichts mehr.

    - Was bringt StringIsFloat ?
    - Warum "Do $a = InputBox(...) Until $a > 0"
    - Was bringt ConsoleWrite(...)
    - "StringInStr($wurzel,"#IND")" <--- hä...

    Außerdem, wenn ich die Werte a = 1, b = -4 und c = -2 nehme, komme ich per Hand auf L={4,45|0,9} (gerundet). Das Prog lässt mich aber nichtmal -4 beim b-Wert eingeben, bzw. es geht nicht aus der DoUntil-Schleife (allgemein kann ich keine negativen Werte eingeben).

    • Offizieller Beitrag

    komme ich per Hand auf L={4,45|0,9}

    Da hast du dich vertan ;-), der Wert muß halbiert werden ( / 2*a ).

    Habs mal so probiert, funzt:

    [autoit]

    Global $a = 1
    Global $b = -4
    Global $c = -2
    Global $p, $x1, $x2
    Global $sqrt_radikant = Sqrt($b*$b - 4*$a*$c)
    $p = -1*$b
    $x1 = ($p + $sqrt_radikant) / 2*$a
    $x2 = ($p - $sqrt_radikant) / 2*$a
    MsgBox(0, '', '$x1 = ' & $x1 & @LF & '$x2 = ' & $x2)

    [/autoit]