VB.net Zahlen runden ? (nicht so ganz)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Hobbl.

    VB.net Zahlen runden ? (nicht so ganz)

    Hallo,

    ich programmiere gerade ein Fahrstuhl-Programm (für meine Kinder).
    Nun möchte ich, dass wenn 2 oder mehr Buttons (die haben Zahlen von 0-17) gedrückt werden, immer die nächste Zahl "angefahren" wird. Wie mache ich das?

    Beispiel:
    Der "Fahrstuhl" ist gerade auf der 6. Etage, und es wird auf die 3 gedrückt. Während der "Fahrstuhl" "fährt" wird die 9 und die 1 gedrückt. Das Programm soll herausfinden, wo er als nächstes "hinfahren" soll, b.z.w. wo der Weg am kürzesten ist.

    Wie geht das?

    ;)
    Drücke auf Hilfreich, wenn dir dieser Post geholfen hat!
    Mein aktuelles Projekt
    Codar: 19%

    Link: bald
    Du nimmst die DIfferenzen zwischen den Zielen und dem Ist-Stockwerk und schaust, welcher Betrag der kleinste ist.
    Ist: 6
    Ziel: 1, 9
    6 - 1 = 5; Betrag von 5 = 5
    6 - 9 = -3; Betrag von -3 = 3 -> Dein nächstes Ziel
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo!
    Vorschlag: speichere jeden Tastendruck in einer list of int und vor dem losfahren subtrahierst du von jedem Eintrag das aktuelle Stockwerk. Die kleinste Differenz ist der kürzeste Weg. Bei erreichen des Ziels dann den Eintrag wieder aus der Liste entfernen.

    Alternativ eine queue of int (FIFO-Speicher) verwenden. Aber dann werden die Ziele der Reihe nach angefahren wenn du den ersten Eintrag nimmst
    Der Beitrag wurde aus 100% wiederverwendbaren Elektronen erstellt!
    Nun, wo ist der Gegenvorschlag, @Hobbl?
    Man könnte das ganze noch priorisieren. Jedes Stockwerk, welches durch ein anderes benachteiligt wurde, wird in dessen Priorität erhöht, beginnend bei 1. Dann könnte man es z.B. so machen, dass man Differenzbetrag durch Priorität teilt. Dann würde das 17. Stockwerk nach 3maligem Überspringen eine Prirität von 4 haben und bei aktueller Ebene 5 dann nur noch eine effektive Ebenendifferenz von 3 haben. (|5 - 17| = 12; 12 : 4 = 3)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    machs doch wie bei nem echten Fahrstuhl...9 (start) -> 0

    Wenn eine Zahl zwischen 9-0 gedrückt wird, hält der Fahrstuhl dort bevor er zur 0 fährt.
    jetzt wurde auch 17 gedrückt. diese wird erstmal wie alle anderen Ziffern die größer als 9 sind gespeichert.

    jetzt ist der Fahrstuhl bei 0 Ziel ist 17. Er fährt zu 17 und hält unterwegs bei allen Stockwerken zwischen 0 und 17.
    ist noch ne größere Ziffer vorhanden, fährt er danach dort hin.

    ein Echter Aufzug hält immer die Fahrtrichtung bei und springt nicht immer hin und her. Man könnte natürlich noch nen Schlüsselknopf hinzufügen, dass der Aufzug nur in ein bestimmtes Stockwerk fährt welches gewählt wird, wenn der Schlüssel gedreht (geklickt) wird und dabei alle anderen Stockwerke ignoriert.
    Wenn während der Fahrt zu einem Ziel auf einem Stockwerk gedrückt wird und das liegt zwischen Ziel und aktueller Position dann stehen bleiben.

    Wir nun ein weiteres Ziel ausgewählt dann prüfen ob es auf dem Weg zwischen aktuellem Ziel und aktueller Position liegt.

    Vermutlich am einfachsten zu machen per list... Aktuelles Ziel ist immer der erste Eintrag... Wenn das Ziel der zu steigenden Person auf dem Weg lieg, dann an Position 0 einfügen, ansonsten weiter hinten... Dort könnte man noch je nach Zielrichtung die dazwischenliegenden Stockwerke der grösse nach sortieren
    Der Beitrag wurde aus 100% wiederverwendbaren Elektronen erstellt!
    @Tizian170

    Ich habe es jetzt mal extra ohne Mathematik versucht. Es lässt sich so lösen.

    Freundliche Grüsse

    exc-jdbi

    Edit:
    Ein paar Sachen die hier angesprochen wurden habe ich nicht beachtet.
    War auch nicht mein Ziel, weil sowas in der Praxis sowieso nicht in Frage
    kommt. (Da gibt es Sensorik, I/O-Module, Regel- und Steuerungskreise etc.)
    Die Simulation lässt sich aber problemlos weiter ausbauen, in dem z.B.
    die Methoden SetNewStorey und Solver zusammengeführt werden, etc.
    Hierzu wäre eine detaillierte Beschreibung aller Anforderungen nötig.

    Was habt Ihr auch immer mit dieser Zahl 0. Die ist meiner Meinung nach
    absolut irrelevant, ausser Sie kommt als Startwert in Frage.


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Module Module2
    4. Private UpStair As Boolean
    5. Private Rand As Random = New Random
    6. Private Const MAX_COUNT As Int32 = 30
    7. Public Sub Main()
    8. Dim min = -100, max = 500
    9. Dim start = Rand.Next(min, max + 1)
    10. Console.WriteLine($"Start: {start}")
    11. Simulation(start, min, max)
    12. Console.WriteLine()
    13. Console.WriteLine("FINISH")
    14. Console.ReadKey()
    15. End Sub
    16. Private Sub Simulation(ByRef start As Int32, min As Int32, max As Int32)
    17. Dim counter = 0I
    18. Dim size = Rand.Next(2, 4)
    19. Console.WriteLine($"Es werden {size} neue Stockwerke gedrückt")
    20. Dim idxs = RngStorey(start, size, min, max + 1)
    21. UpStair = Upstairs(start, idxs)
    22. Console.WriteLine($"Aufwärtsfahrt: {UpStair}")
    23. While idxs.Length > 0 AndAlso counter < MAX_COUNT
    24. 'Ausrechnen
    25. idxs = Solver(start, idxs)
    26. Console.Write("Buffer: ")
    27. Array.ForEach(idxs, Sub(x) Console.Write($"{x} "))
    28. Console.WriteLine() : Console.WriteLine()
    29. 'Lift fährt zum Stockwerk, und
    30. 'übernimmt den neuen startwert.
    31. start = idxs(0)
    32. Console.WriteLine($"Neuer Start: {start}")
    33. 'Je nachdem werden neue Stockwerke gedrückt
    34. size = Rand.Next(0, 3)
    35. Console.WriteLine($"Es werden {size} neue Stockwerke gedrückt")
    36. idxs = SetNewStorey(size, start, idxs, min, max)
    37. 'Wenn im Speicher keine Werte mehr sind dann verlassen
    38. If idxs.Length = 0 Then Return
    39. 'UpStair Umschaltung der Fahrtrichtung
    40. If UpStair AndAlso start >= idxs.Max Then UpStair = Not UpStair
    41. If Not UpStair AndAlso start <= idxs.Min Then UpStair = Not UpStair
    42. Console.WriteLine($"Aufwärtsfahrt: {UpStair}")
    43. 'counter hochzählen, damit ein Ende besteht
    44. counter += 1
    45. End While
    46. End Sub
    47. Private Function SetNewStorey(size As Int32, start As Int32, idxs() As Int32, min As Int32, max As Int32) As Int32()
    48. Dim lidxs = idxs.ToList
    49. lidxs.RemoveAt(0)
    50. Dim tmp = 0I
    51. For i = 0I To size - 1
    52. tmp = Rand.Next(min, max + 1)
    53. If Not tmp = start Then
    54. lidxs.Add(tmp)
    55. Continue For
    56. End If
    57. i -= 1
    58. Next
    59. Return lidxs.ToArray
    60. End Function
    61. Private Function Solver(start As Int32, idxs() As Int32) As Int32()
    62. Dim greater = idxs.Where(Function(x) x >= start).OrderBy(Function(y) y).ToList
    63. Dim smaller = idxs.Where(Function(x) x < start).OrderByDescending(Function(y) y).ToList
    64. If UpStair Then
    65. greater.AddRange(smaller)
    66. Return greater.Distinct.ToArray
    67. End If
    68. smaller.AddRange(greater)
    69. Return smaller.Distinct.ToArray
    70. End Function
    71. Private Function Upstairs(start As Int32, idxs() As Int32) As Boolean
    72. 'Upstairs nach oben (treppenauf), Richtung grössere Zahlen
    73. 'In 'idxs' gilt das "FIFO-Prinzip", die erste Zahl entscheidend,
    74. 'ausser sie ist gleich wie 'start', dann wird die nächste geprüft.
    75. For i = 0 To idxs.Length - 1
    76. If idxs(i) > start Then Return True
    77. If idxs(i) < start Then Return False
    78. Next
    79. Return False
    80. End Function
    81. Private Function RngStorey(start As Int32, size As Int32, min As Int32, max As Int32) As Int32()
    82. 'Es können auch Minuszahlen zum Einsatz kommen
    83. Dim result = New Int32(size - 1) {}
    84. For i = 0I To size - 1
    85. result(i) = Rand.Next(min, max)
    86. If result(i) = start Then i -= 1
    87. Next
    88. Return result
    89. End Function
    90. End Module

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()