Beim Sortieren Reihenfolge beibehalten

  • Hallo,
    ich bin noch ein ziemlicher Anfänger, was autoit angeht.
    aktuell bin ich auf der problem gestoßen, dass ich die größte variable nach oben schreiben will, ohne dass die reihenfolge geändert wird.

    $var1 = 5
    $var2 = 19
    $var3 =1
    $var4 = 9
    $var5 = 2

    am ende soll es dann so aussehen:
    19, 1, 9, 2, 5

    über den sort befehl mit arrays bin ich leider nicht weitergekommen.
    schonmal im vorraus vielen dank für die hilfe.

  • es geht darum die höchste zahl nach oben zu schreiben und die kleinen zahlen nach unten zu schreiben:

    also:
    1
    5
    6
    8
    9
    11
    2
    3

    soll zu 11, 2, 3, 1, 5, 6, 8, 9 werden. wirklich sortieren kann man dazu nicht sagen. ^^

  • Naja - etwas sinnfrei. Wozu noch die kleinen unten drunter schreiben ohne feste Anordnung. Hol dir doch einfach die größte Zahl mit _ArrayMax. Evtl. kannste noch sagen wozu das ganze ist, dann können wir dir da evtl. mehr Hilfe geben, wie es am einfachsten gehen würde.

    [autoit]

    #include <array.au3>
    Local $array[5] = [1,2,9,7,6]
    $max = _ArrayMax($array)
    MsgBox(0, "", $max)

    [/autoit]
  • es geht um ein kleines tool für ein partyspiel.

    es "würfelt" praktisch jeder und der mit der höchsten zahl fängt an. egal was die anderen gewürfelt haben.
    die reihenfolge wäre einfach nur ganz praktisch, dass man nicht durcheinander kommt. umso später der abend, umso höher die wahrscheinlichkeit. ^^

    und ja... ziemlich sinnfrei. ;)

  • Spoiler anzeigen
    [autoit]

    #include <array.au3>

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

    Local $array[5] = [5, 19, 1, 9, 2]
    _ArrayDisplay($array)
    $array = _SortArray($array)
    _ArrayDisplay($array)

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

    Func _SortArray($aArray)
    Local $aNewArray[UBound($aArray)]
    $iMax = _ArrayMaxIndex($aArray)
    For $i = $iMax To UBound($aArray) - 1
    $aNewArray[$i - $iMax] = $aArray[$i]
    Next
    For $i = 0 To $iMax - 1
    $aNewArray[UBound($aArray) - $iMax + $i] = $aArray[$i]
    Next
    Return $aNewArray
    EndFunc ;==>_SortArray

    [/autoit]
  • super! vielen dank.
    kannst du mir noch erklären, was du genau gemacht hast?
    erst zeigt er das normale array an.
    dann definiert man das array nochmal neu mit hilfe einer funktion und zeigt es an.

    bei der funktion hört es aber bei mir auf. nagut, vielleicht sollte ich mich vorher nochmal mit funktionen beschäftigen, bevor ich dumm frage. ^^

  • :) _ArrayMaxIndex holt die Position im Array wo die höchste Zahl ist. Die erste For-Schleife schreibt von dieser Position bis zum Ende des Arrays die Werte in das neue Array. Die zweite Forschleife schreibt dann noch die Werte vom Anfang bis zur höchsten Zahl im neuen Array unten dran. Klingt kompliziert, sieht auch so aus, ist es aber eigentlich nicht ;).

  • ich hab mich mal damit beschäftigt, aber irgendwie werde ich aus den befehlen noch nicht schlau.
    fang ich mal vorne mit meinen fragen an.

    [autoit]

    Func _SortArray($aArray)

    [/autoit]


    gibt den namen der funktion an und sagt ihm, dass er ein neues array für die funktion bilden soll.

    [autoit]

    Local $aNewArray[UBound($aArray)]

    [/autoit]


    wir hier wieder ein neues array gebildet? die größe dieses arrays, hat die gleiche größe wie das aus der zeile vorher? zumindest glaub ich, dass ubound sowas macht.

    [autoit]

    $iMax = _ArrayMaxIndex($aArray)

    [/autoit]


    hier wird einfach die variabel imax als höchster wert des array gespeichert.

    [autoit]

    For $i = $iMax To UBound($aArray) - 1

    [/autoit]


    hier definiert man die variabel i für den bereich von imax bis zur größe des arrays und zieht 1 ab. z.b. 10 bis 5 - 1 = bereich von 10 bis 4. warum kommt da -1 ran?

    [autoit]

    $aNewArray[$i - $iMax] = $aArray[$i]

    [/autoit]


    jetzt definiert man die teile des zweiten arrays, z.b. 10 bis 4 - 10, also 0 bis -6, als array 10 des ersten arrays?! das versteh ich nicht


    ich versteh irgendwie was gemeint ist, aber kann es nicht wirklich nachvollziehen.

    [autoit]

    Return $aNewArray

    [/autoit]


    das heißt am ende einfach nur, dass er fertig ist?


    ich hab auch einbisschen rumgespielt und wollte bestimmte zahlen rausnehmen. z.b wenn jemand eine 6 würfelt, soll er automatisch aus der liste entfernt werden.
    habs mit if abfragen nicht geschafft. >_>

  • Hallo veal19,

    [autoit]

    Func _SortArray($aArray)

    [/autoit]

    gibt den namen der funktion an und sagt ihm, dass er ein neues array für die funktion bilden soll.

    es wird die func _sortArray aufgerufen und ihr das Array $aArray übergeben

    Zitat
    [autoit]

    Local $aNewArray[UBound($aArray)]

    [/autoit]

    wir hier wieder ein neues array gebildet? die größe dieses arrays, hat die gleiche größe wie das aus der zeile vorher? zumindest glaub ich, dass ubound sowas macht.

    stimmt genau, die func deklariert ein neues Array mit den Dimenensionen des übegebenen Arrays ($aArray)

    Zitat
    [autoit]

    $iMax = _ArrayMaxIndex($aArray)

    [/autoit]

    hier wird einfach die variabel imax als höchster wert des array gespeichert.

    hier wird in der Variable $iMax der Index des höchsten Wertes des übergebenen Arrays ($aArray) gespeichert. Der Wert wird von _ArrayMaxIndex ermittelt.

    Zitat
    [autoit]

    For $i = $iMax To UBound($aArray) - 1

    [/autoit]

    hier definiert man die variabel i für den bereich von imax bis zur größe des arrays und zieht 1 ab. z.b. 10 bis 5 - 1 = bereich von 10 bis 4. warum kommt da -1 ran?

    hier wird eine Schleife ausgehend vom Index ($iMax = Index des höchsten Wertes nicht Wert :!:) solange wiederholt bis das Ende des Arrays erreicht ist. (also werden alle Elemnete einschliesslich des höchten Wertes in das neue Array übertragen.
    Es kommt nicht -1 heraus.
    Ausgehend von Blubbstar's Beispiel läuft die Schleife von 1 bis 4. Da das Array 0 basiert ist, dass heisst die Indexzählung fängt bei 0 an muss 1 von der Anzahl der Elelmente abgezogen werden.

    Zitat
    [autoit]

    $aNewArray[$i - $iMax] = $aArray[$i]

    [/autoit]

    jetzt definiert man die teile des zweiten arrays, z.b. 10 bis 4 - 10, also 0 bis -6, als array 10 des ersten arrays?! das versteh ich nicht

    jetzt werden alle Werte übertragen, die vor dem höchsten Wert liegen.

    Zitat
    [autoit]

    Return $aNewArray

    [/autoit]

    das heißt am ende einfach nur, dass er fertig ist?

    die Werte des neuen Arrays werden zurückgegeben.
    Um die obigen Punkte besser zu verstehen solltest du das Beispiel (von mir um Consolenausgaben ergänzt) noch einmal durcharbeiten:

    Spoiler anzeigen
    [autoit]

    #include <array.au3>

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

    Local $array[5] = [5, 19, 1, 9, 2]
    _ArrayDisplay($array)
    $array = _SortArray($array)
    _ArrayDisplay($array)

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

    Func _SortArray($aArray)
    Local $aNewArray[UBound($aArray)]
    $iMax = _ArrayMaxIndex($aArray)
    ConsoleWrite("Pos.: des höchsten Wertes: " & $iMax & @CRLF)
    ConsoleWrite("jetzt werden ab dem höchsten die Würfe eintragen:" & @CRLF)
    For $i = $iMax To UBound($aArray) - 1
    $aNewArray[$i - $iMax] = $aArray[$i]
    ConsoleWrite("eintragen des Wertes: " & $aArray[$i] & "(Index: " & $i & ")" & @CRLF)
    Next
    ConsoleWrite("jetzt noch die restlichen Würfe eintragen:" & @CRLF)
    For $i = 0 To $iMax - 1
    $aNewArray[UBound($aArray) - $iMax + $i] = $aArray[$i]
    ConsoleWrite("eintragen des Wertes: " & $aArray[$i] & "(Index: " & $i & ")" & @CRLF)
    Next
    Return $aNewArray
    EndFunc ;==>_SortArray

    [/autoit]


    Poste doch einmal die Regeln des Spieles, dann findet sich auch eine Lösung für die gewürfelten 6er,
    (z.B. als 0 eintragen, damit man erkennt Wurf hat gewonnen)

    mfg (Auto)Bert