BinomiRechner [(a+b)^n Rechner]

  • Hallöchen! Ich melde mich mal nach laaaaaaaaaaanger Zeit wieder :thumbup:

    Ich habe neulich mal ein kleines Programm geschrieben, womit man die Binomische Formeln errechnen kann, egal welchen Grades. Ein Beispiel hierfür (für jene, die offenbar keinen Mathematikunterricht genossen haben ;) ) wäre wohl folgendes:

    (a+b)^2 = a^2 + 2ab + b^2

    Ich weiß, es ist nix besonderes. Aber vielleicht ja trotzdem praktisch :D

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>

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

    $hGUI = GUICreate( "Binomische Formel Rechner", 415, 290, -1, -1, $WS_MINIMIZEBOX + $WS_CAPTION + $WS_POPUP + $WS_SYSMENU + $WS_VISIBLE )
    $hZeigeFormelAn = GUICtrlCreateButton( "&Zeige Formel an", 95, 5, 315, 20 )
    GUICtrlCreateLabel( "(", 5, 8, 7, 17 )
    $ZeichenA = GUICtrlCreateInput( "a", 12, 5, 20, 20 )
    GUICtrlCreateLabel( "+", 32, 8, 7, 17 )
    $ZeichenB = GUICtrlCreateInput( "b", 39, 5, 20, 20 )
    GUICtrlCreateLabel( ")^", 59, 8, 10, 17 )
    $Grad = GUICtrlCreateInput( "2", 69, 5, 20, 20 )
    $Output = GUICtrlCreateEdit( "( a + b )^2 = a^2 + 2ab + b^2", 5, 30, 405, 175, $ES_READONLY )
    $malzeichen = GUICtrlCreateCheckbox( "Unnötige &Malzeichen entfernen", 5, 205, 405, 20 )
    GUICtrlSetState( $malzeichen, $GUI_CHECKED )
    $maleins = GUICtrlCreateCheckbox( "&Ein mal irgendwas entfernen", 5, 225, 405, 20 )
    GUICtrlSetState( $maleins, $GUI_CHECKED )
    $expoeins = GUICtrlCreateCheckbox( "E&xponent gleich eins entfernen", 5, 245, 405, 20 )
    GUICtrlSetState( $expoeins, $GUI_CHECKED )
    $ausrechnen = GUICtrlCreateCheckbox( "&Faktoren ausrechnen", 5, 265, 405, 20 )
    GUICtrlSetState( $ausrechnen, $GUI_DISABLE )

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

    Do

    $msg = GUIGetMsg( )

    If $msg = $hZeigeFormelAn Then

    If GUICtrlRead( $ZeichenA ) = "" Or GUICtrlRead( $ZeichenA ) = "" Or GUICtrlRead( $ZeichenA ) = "" Then

    MsgBox( 0, "Binomische Formel Rechner", "Geben sie Werter für a, b und den Exponenten (Grad) an." )

    Else

    $vMalzeichen = Checked( GUICtrlRead( $malzeichen ) )
    $vMaleins = Checked( GUICtrlRead( $maleins ) )
    $vExpoeins = Checked( GUICtrlRead( $expoeins ) )
    $vAusrechnen = Checked( GUICtrlRead( $ausrechnen ) )

    GUICtrlSetData( $Output, BinomischeFormel( GUICtrlRead( $Grad ), GUICtrlRead( $ZeichenA ), GUICtrlRead( $ZeichenB ), $vMaleins, $vMalzeichen, $vExpoeins, $vAusrechnen ) )

    EndIf

    EndIf

    Until $msg = -3

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

    Exit

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

    Func BinomischeFormel( $Grad, $a = "a", $b = "b", $EinMalX = True, $Malzeichen = True, $ExponentGleich1 = True, $AutoAusrechnen = True )

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

    $Koeffizienten = KoeffizientenAusrechnen( $Grad )

    $string = ""
    If Not $Malzeichen Then
    $mal = "*"
    Else
    $mal = ""
    EndIf
    $tmpString = ""

    $string = "( " & $a & " + " & $b & " )^" & $Grad & " = "

    $aExp = $Grad
    $bExp = 0

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

    For $i = 0 To UBound( $Koeffizienten, 1 ) - 1

    If $i = 0 And $EinMalX = True Then

    $string &= $a & "^" & $aExp

    ElseIf $i = UBound( $Koeffizienten, 1 ) - 1 And $EinMalX = True Then

    $string &= $b & "^" & $bExp

    Else

    If IsNumber( $a ) Or IsNumber( $b ) Then

    If IsNumber( $a ) and $AutoAusrechnen Then

    $tmpString &= $Koeffizienten[$i] * $a

    Else

    $tmpString &= $Koeffizienten[$i] & "*" & $a

    EndIf

    Else

    $tmpString &= $Koeffizienten[$i] & $mal & $a

    EndIf

    If $ExponentGleich1 Then

    If $aExp <> 1 Then $tmpString &= "^" & $aExp

    Else

    $tmpString &= "^" & $aExp

    EndIf

    ;mal b rechnen (wenn a oder b Zahlen sind Malzeichen hinzufügen)
    If IsNumber( $a ) Or IsNumber( $b ) Then

    $tmpString &= "*" & $b

    Else

    $tmpString &= $mal & $b

    EndIf

    If $ExponentGleich1 Then ;Wenn ^1 Exponenten entfernt werden sollen...

    If $bExp <> 1 Then $tmpString &= "^" & $bExp ;checke, ob der b Exponent = 1 ist und schreibe ihn wenn aj hin

    Else ;ansonsten...

    $tmpString &= "^" & $bExp ;Schreibe einfach den Exponenten hin

    EndIf
    If Execute( $tmpString ) = "" Then

    $string &= $tmpString

    Else

    $string &= Execute( $tmpString )

    EndIf

    EndIf

    ;Addieren
    $string &= " + "

    ;Exponenten in- bzw. dekrementieren
    $aExp -= 1
    $bExp += 1

    $tmpString = ""

    Next

    Return StringTrimRight( $string, 3 )

    EndFunc

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

    Func KoeffizientenAusrechnen( $iBinomischerGrad )

    Local $KoeffizientenListe[1] = [1]
    Local $TmpKoeffizientenListe[1] = [1]

    For $i = 0 To $iBinomischerGrad

    If $i <> 0 Then _ArrayAdd( $TmpKoeffizientenListe, 1 )
    For $i2 = 1 To $i - 1

    $TmpKoeffizientenListe[$i2] = $KoeffizientenListe[$i2] + $KoeffizientenListe[$i2-1]

    Next

    $KoeffizientenListe = $TmpKoeffizientenListe

    Next

    Return $KoeffizientenListe

    EndFunc

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

    Func Checked( $v )

    If $v = $GUI_CHECKED Then Return True
    If $v = $GUI_UNCHECKED Then Return False

    EndFunc

    [/autoit]

    [Edit:] Ach ja... es ist auch keine besonders gute Technik... aber es funktioniert. Nur bei hohen Exponenten können die Variablen überlaufen.

    • Offizieller Beitrag

    Mal als Tipp:
    Radio-Ctrl und Checkboxen nicht direkt mit GuiCtrlRead auswerten. Das kann daneben gehen, da du einen Summenwert abfragst. Besser den gesuchten Wert mit BitAnd extrahieren.
    Somit kannst du dir deine Funktion "Checked" komplett sparen, zumal die Funktion auch zuviel tat - wenn du auf CHECKED prüfst und das trifft nicht zu, kann der Status ja nur UNCHECKED sein. Somit brauchst du darauf nicht prüfen. ;) :

    [autoit]


    ; statt
    $vMalzeichen = Checked( GUICtrlRead( $malzeichen ) )

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

    ; besser
    $vMalzeichen = BitAnd(GUICtrlRead($malzeichen), $GUI_CHECKED)
    ; Wert ist dann 1 bei CHECKED und 0 bei UNCHECKED

    [/autoit]