nähestgelegene Zahl

  • Hi,

    ich habe hier jetzt direkt codespezifische Frage sondern eher ein Frage wie ich am bestehn vorgehe.

    Ich habe mehrere Wert (die Werte können nur zwischen 0 und 100 einschließlich dieser beiden Werte liegen) und eine Zahl x von der ich wissen will zu welchem Wert diese am nähesten ist.

    Ein kleines Beispiel dazu:

    Werte:

    23
    57
    13
    59
    73
    99

    Zahl x:

    53

    Hier wäre dei Lösung also 57 weil diese die Zahl ist die am nähesten an 53 ist.


    Hatte überlegt die Werte in eine Array zu stecken und dann vie _ArrayMin und _ArrayMax so lange den Array zu bearbeiten bis zur richtigen Zahl, aber vielleicht gibt es ja einen besseren Weg.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    2 Mal editiert, zuletzt von chip (14. Februar 2011 um 11:27)

  • Ok auf sortieren bin ich nun nicht gekommen lach.

    Habs jetzt so versucht zu lösen:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Dim $wert = 43
    Dim $minwert = 0
    Dim $maxwert = 0
    $avArray = StringSplit("23,57,13,59,73", ",")

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

    While 1
    If _ArrayMin($avArray, 0, 1) < $wert And @error = 0 Then
    $minwert = _ArrayMin($avArray, 0, 1)
    _ArrayDelete($avArray, _ArrayMinIndex($avArray, 0, 1))
    ElseIf @error = 0 Then
    $maxwert = _ArrayMin($avArray, 0, 1)
    ExitLoop
    Else
    ExitLoop
    EndIf
    WEnd

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

    If $minwert = 0 Then
    $final = $maxwert
    ElseIf $maxwert = 0 Then
    $final = $minwert
    Else
    $mindiff = $wert - $minwert
    $maxdiff = $maxwert - $wert
    If $mindiff > $maxdiff Then
    $final = $maxwert
    ElseIf $maxdiff > $mindiff Then
    $final = $minwert
    Else
    $final = "unklar"
    EndIf
    EndIf

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

    MsgBox(0, "", $final)

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    • Offizieller Beitrag

    Ich würde es so machen:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    Dim $wert = 43
    Dim $final = -1
    Dim $avArray = StringSplit("23,57,13,59,73", ",", 2)
    _ArraySort($avArray)
    ;~ _ArrayDisplay($avArray)
    For $i = 0 To UBound($avArray) - 1
    Select
    Case $wert = $avArray[$i]
    $final = $avArray[$i]
    ExitLoop
    Case $wert < $avArray[$i]
    If ($avArray[$i] - $wert) < ($avArray[$i + 1] - $wert) Then
    $final = $avArray[$i]
    ExitLoop
    Else
    $final = $avArray[$i + 1]
    ExitLoop
    EndIf
    EndSelect
    Next
    If $final = -1 Then $final = $avArray[UBound($avArray) - 1]
    MsgBox(0, "", $final)

    [/autoit]