Rechtwinklig? Spitzwinklig? Stumpfwinklig?

  • Yop, es geht um ein Dreieck.
    Mit diesem Tool solltet ihr ganz bequem rauskriegen obs rechtwinklig, stumpfwinklig oder spitzwinklig ist!
    Einfach die Seiten der Länge nach angeben, also kürzeste Seite zuerst, danach die mitlerste dann die längste Seite.
    Wäre nett wenn ihrs kontrolliert obs immer klappt :) :)

    Code:

    Spoiler anzeigen
    [autoit]


    #notrayicon
    #include <guiconstants.au3>
    #include <Array.au3>

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

    $Gui = GUICreate("©qon", 200, 150)
    $Labela = GUICtrlCreateLabel("Seite a", 20, 22, 80)
    $a = GUICtrlCreateInput(3, 100, 20)
    $Labelb = GUICtrlCreateLabel("Seite b", 20, 52, 80)
    $b = GUICtrlCreateInput(4, 100, 50)
    $Labelc = GUICtrlCreateLabel("Seite c", 20, 82, 80)
    $c = GUICtrlCreateInput(5, 100, 80)
    $Calc = GUICtrlCreateButton("Überprüfe!", 70, 115)
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Calc
    _Calc()
    EndSwitch
    WEnd

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

    Func _Calc()
    Local $S[3] = [GUICtrlRead($a), GUICtrlRead($b), GUICtrlRead($c)]

    For $i = 0 to 2
    $S[$i] = StringReplace($S[$i],",",".")
    If (StringIsFloat($S[$i]) = 0 and StringIsDigit($S[$i]) = 0) Then
    MsgBox(16,"Zahlen","Du hast Buchstaben, ungültige Zeichen oder nichts eingegeben")
    Return 0
    EndIf
    Next

    _ArraySort($S)

    If ($S[0] + $S[1]) < $S[2] Then Return SetError(0, 1, MsgBox(16, "", "Unmögliche Seitenlängen angegeben"))

    Select
    Case ($S[0]^2)+($S[1]^2) = $S[2]^2
    MsgBox(64, "Recht", "Das Dreieck ist rechtwinklig")
    Case ($S[0]^2)+($S[1]^2) < $S[2]^2
    MsgBox(64, "Stumpf", "Das Dreieck ist stumpfwinklig")
    Case ($S[0]^2)+($S[1]^2) > $S[2]^2
    MsgBox(64, "Spitz", "Das Dreieck ist spitzwinklig")
    EndSelect

    Return 1
    EndFunc

    [/autoit]

    Viel Spass!^^

    Edit: Ergänzung zur Prüfung der richtigen Reihenfolge
    Edit: Aspirins Verbesserung eingebaut!
    Edit: Weitere Änderungen, das Kommazahlen wieder möglich sind

    5 Mal editiert, zuletzt von qon (22. Januar 2008 um 22:40)

  • Funktioniert wie gewollt - sollte die Dreiecke korrekt interpretieren. :thumbup:
    Nur die Abfrage auf unmögliche Dreiecke fehlt - also wenn die Summe 2er Seiten kleiner ist als die der 3. Seite.

    Noch ein paar Tipps dazu:
    Das nur Nummern eingegeben werden können kann man von vornherein mit dem Flag $ES_NUMBER in der InputBox festlegen.
    Somit entfällt die spätere Abfrage.
    Damit die Reihenfolge Wurst ist kann man die Seiten auch einfach sortieren lassen.
    Ein Array in Verbindung mit _ArraySort wäre da der einfachste Weg.
    Und das Execute ist absolut überflüssig.
    Was in Klammern steht wird sowieso zuerst berechnet.

    Spoiler anzeigen
    [autoit]

    #notrayicon
    #include <guiconstants.au3>
    #include <Array.au3>

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

    $Gui = GUICreate("©qon", 200, 150)
    $Labela = GUICtrlCreateLabel("Seite a", 20, 22, 80)
    $a = GUICtrlCreateInput(3, 100, 20, Default, Default, $ES_NUMBER)
    $Labelb = GUICtrlCreateLabel("Seite b", 20, 52, 80)
    $b = GUICtrlCreateInput(4, 100, 50, Default, Default, $ES_NUMBER)
    $Labelc = GUICtrlCreateLabel("Seite c", 20, 82, 80)
    $c = GUICtrlCreateInput(5, 100, 80, Default, Default, $ES_NUMBER)
    $Calc = GUICtrlCreateButton("Überprüfe!", 70, 115)
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Calc
    _Calc()
    EndSwitch
    WEnd

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

    Func _Calc()
    Local $S[3] = [Number(GUICtrlRead($a)), Number(GUICtrlRead($b)), Number(GUICtrlRead($c)) ]

    _ArraySort($S)

    If ($S[0] + $S[1]) < $S[2] Then Return SetError(0, 1, MsgBox(0, "", "Unmögliche Seitenlängen angegeben!"))

    Switch $S[0] ^ 2 + $S[1] ^ 2
    Case $S[2] ^ 2
    MsgBox(64, "Recht", "Das Dreieck ist rechtwinklig")
    Case 0 To $S[2] ^ 2
    MsgBox(64, "Stumpf", "Das Dreieck ist stumpfwinklig")
    Case Else
    MsgBox(64, "Spitz", "Das Dreieck ist spitzwinklig")
    EndSwitch

    Return 1
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (21. Januar 2008 um 23:38)

  • Hi, danke für deine Tipps!

    Also ich verstehe alles bis auf die Switch Abfrage,
    aber vielleicht hängts da an meinen mathematischen Kenntnissen.
    Vor der Switchabfrage sind wir ja im Prinzip soweit wie bei meinem Script bei der Select ( natürlich wurde noch auf Gültigkeit des Dreiecks geprüft ),
    aber wie schaust du dann, obs nun recht stumpf oder spitzwinklig ist?
    So verstehe ichs:

    Spoiler anzeigen
    [autoit]


    #notrayicon
    #include <guiconstants.au3>
    #include <Array.au3>

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

    $Gui = GUICreate("©qon", 200, 150)
    $Labela = GUICtrlCreateLabel("Seite a", 20, 22, 80)
    $a = GUICtrlCreateInput(3, 100, 20, Default, Default, $ES_NUMBER)
    $Labelb = GUICtrlCreateLabel("Seite b", 20, 52, 80)
    $b = GUICtrlCreateInput(4, 100, 50, Default, Default, $ES_NUMBER)
    $Labelc = GUICtrlCreateLabel("Seite c", 20, 82, 80)
    $c = GUICtrlCreateInput(5, 100, 80, Default, Default, $ES_NUMBER)
    $Calc = GUICtrlCreateButton("Überprüfe!", 70, 115)
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Calc
    _Calc()
    EndSwitch
    WEnd

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

    Func _Calc()
    Local $S[3] = [Number(GUICtrlRead($a)), Number(GUICtrlRead($b)), Number(GUICtrlRead($c)) ]

    _ArraySort($S)

    If ($S[0] + $S[1]) < $S[2] Then Return SetError(0, 1, MsgBox(16, "", "Unmögliche Seitenlängen angegeben!"))

    Select
    Case ($S[0]^2)+($S[1]^2) = $S[2]^2
    MsgBox(64, "Recht", "Das Dreieck ist rechtwinklig")
    Case ($S[0]^2)+($S[1]^2) < $S[2]^2
    MsgBox(64, "Stumpf", "Das Dreieck ist stumpfwinklig")
    Case ($S[0]^2)+($S[1]^2) > $S[2]^2
    MsgBox(64, "Spitz", "Das Dreieck ist spitzwinklig")
    EndSelect

    Return 1
    EndFunc

    [/autoit]

    so quadriere ich und schaue ob c² am ende größer oder kleiner als a² und b² zusammen ist.
    Größer bedeutet Spitz,
    kleiner bedeutet Stumpf und gleich bedeutet Rechtwinklig.
    Wäre cool, wenn du mir deine Variante erklärst ;)
    edit: Ich hab sie glaube verstanden, ist genau die gleiche nur anders hingeschrieben ;)
    erste Case: wenn das Argument ( das quadrat von a + das quadrat von b ) gleich dem quadrat von c (s[2]) ist,
    ists rechtwinklig.
    zweite: wenn das Argument zwischen 0 und dem quadrat von c liegt ists stumpf,
    dritte: wenn ein anderer fall eintritt ( kanns nurnoch größer sein ) ists spitz.
    wenn was falsch is bitte korrigiern ;)

    lg qon

    Einmal editiert, zuletzt von qon (22. Januar 2008 um 00:23)

  • Hi,

    das mit $ES_NUMBER war doch nicht so eine tolle Idee ;)
    Man kann jetzt keine Kommazahlen angeben :(
    Ich habs jetzt so gelöst:

    Spoiler anzeigen
    [autoit]


    #notrayicon
    #include <guiconstants.au3>
    #include <Array.au3>

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

    $Gui = GUICreate("©qon", 200, 150)
    $Labela = GUICtrlCreateLabel("Seite a", 20, 22, 80)
    $a = GUICtrlCreateInput(3, 100, 20)
    $Labelb = GUICtrlCreateLabel("Seite b", 20, 52, 80)
    $b = GUICtrlCreateInput(4, 100, 50)
    $Labelc = GUICtrlCreateLabel("Seite c", 20, 82, 80)
    $c = GUICtrlCreateInput(5, 100, 80)
    $Calc = GUICtrlCreateButton("Überprüfe!", 70, 115)
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Calc
    _Calc()
    EndSwitch
    WEnd

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

    Func _Calc()
    Local $S[3] = [GUICtrlRead($a), GUICtrlRead($b), GUICtrlRead($c)]

    For $i = 0 to 2
    $S[$i] = StringReplace($S[$i],",",".")
    If (StringIsFloat($S[$i]) = 0 and StringIsDigit($S[$i]) = 0) Then
    MsgBox(16,"Zahlen","Du hast Buchstaben, ungültige Zeichen oder nichts eingegeben")
    Return 0
    EndIf
    Next


    _ArraySort($S)

    If ($S[0] + $S[1]) < $S[2] Then Return SetError(0, 1, MsgBox(16, "", "Unmögliche Seitenlängen angegeben"))

    Select
    Case ($S[0]^2)+($S[1]^2) = $S[2]^2
    MsgBox(64, "Recht", "Das Dreieck ist rechtwinklig")
    Case ($S[0]^2)+($S[1]^2) < $S[2]^2
    MsgBox(64, "Stumpf", "Das Dreieck ist stumpfwinklig")
    Case ($S[0]^2)+($S[1]^2) > $S[2]^2
    MsgBox(64, "Spitz", "Das Dreieck ist spitzwinklig")
    EndSelect

    Return 1
    EndFunc

    [/autoit]

    mfg ;)

  • Der Sinussatz wäre hier nicht anwendbar da dafür mindestens ein Winkel des Dreiecks schon bekannt sein muss - das ist bei uns nicht der Fall.
    Der Cosinussatz hingegen wäre ein möglicher Ansatz um einen Winkel des Dreiecks aus den 3 bekannten Seiten heraus zu berechnen - würde das ganze aber nicht wirklich vereinfachen da man da auch 2x rechnen müsste um 2 Winkel herauszubekommen wenn die Reihenfolge der eingegebenen Seiten egal sein sollte.
    Der mathematische Ansatz hier ist schon in Ordnung so.