zahlen via Selection Sort aus Formular sortieren

  • Allgemein

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

    zahlen via Selection Sort aus Formular sortieren

    Moin moin,

    ich muss bis heute Abend eine uni Hausaufgabe abgeben, und war sollen wir folgendes machen:

    Wir haben eine Input textbox mit dem Namen Input.
    In diese sollen wir beliebige ganze Zahlen eingeben. Sie sollen mit einem ";" getrennt werden.

    Danach sollen wir die zahlen trennen und mit dem Selection Sort Algorithmus sortieren.
    Das ist ja schon mal nicht so schwer:

    VB.NET-Quellcode

    1. Dim StrInput As String
    2. Dim StrNumbers() As String
    3. StrInput = Input.Text
    4. StrNumbers = Split(StrInput, ";")


    Das problem:

    Die "Zahlen" die nun im Array StrNumbers gespeichert sind werden als String behandelt.
    Wenn wir darauf das Sortierverfahren anwenden, wird es wuasi so sortiert wie man Namen oder andere Wörter Sortieren würde.
    Beispiel:

    StrNumbers = {"15","3","6","5"}

    Ausgabe nach Sortierung: 15, 3, 5, 6

    Es wird quasi, so wie man es von der Wörtersortierung kennt, Zeichen für Zeichen überprüft und somit nur nach der ersten Stelle sortiert, weshalb die 15 zuerst kommt.

    Für das Sortierverfahren haben wir größtenteils den Code von Wikibook übernommen:

    VB.NET-Quellcode

    1. Sub SelectionSort()
    2. Dim feld() as Integer = {2, 9, 5, 4, 7, 3, 1, 8, 6}
    3. For i as Integer = 0 To feld.Length - 1
    4. Dim lowest as Integer = i
    5. For j as Integer = i + 1 to feld.Length
    6. lowest = If(feld(j) > feld(lowest), j, lowest)
    7. next
    8. Dim temp as Integer = feld(i)
    9. feld(i) = feld(lowest)
    10. feld(lowest) = temp
    11. next
    12. End Sub


    Und diesen noch angepasst.


    Außerdem haben wir eine liste von Funktionen bekommen, die uns beim Umgang mit String helfen sollen:

    CStr, CInt, CULng, StrText.TrimEnd, Mid, Len, Split, Instr

    Bei den meisten Funktionen sind wir Ratlos, wie diese uns bei der Lösung helfen sollen.

    Unser Lösungsansatz war die Strings in Integer umzuwandeln, was sich aber anscheinend als nicht möglich erwies.
    Daher müssen wir irgendwie dafür sorgen, dass mit den String richtig umgegangen wird.

    Kann mir evtl. jemand einen kleinen Denkanstoß geben?


    Vielen Dank und beste Grüße
    Robin
    Willkommen im Forum. :thumbup:

    RobD schrieb:

    Denkanstoß
    Sieh Dir mal das an:

    VB.NET-Quellcode

    1. Dim feld() As Integer = {2, 9, 5, 4, 7, 3, 1, 8, 6}
    2. Array.Sort(feld)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank!

    leider funktioniert es so leicht nicht.

    Wie gesagt sollen wir diese Zahlen im Input Feld mit einem Semikolon abtrennen, weshalb es sich beim Input um einen String handelt, welchen wir nachher durch Split() bei jedem Semikolon trennen.
    Außerdem SOLLEN wir bewusst das Selection Sort Verfahren anwenden, so lautet die Anweisung aus der hausaufgabe. :(

    RobD schrieb:

    Selection Sort
    Ist das das, was ich als Bubble Sort bezeichnen würde?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Sortieren_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Sortieren.Click
    3. Dim StrInput As String
    4. Dim StrNumbers() As String
    5. 'Dim intNumbers() As Integer
    6. Dim lowest As Integer
    7. Dim i As Integer
    8. Dim j As Integer
    9. Dim k As Integer
    10. Dim nextNumber As Integer
    11. Dim placeholder As Integer
    12. '(6;15;1;8)
    13. ' 0 1 2 3 = 4
    14. StrInput = input.Text
    15. StrNumbers = Split(StrInput, ";")
    16. For i = 0 To (UBound(StrNumbers) - 1) Step 1
    17. lowest = CInt(StrNumbers(i))
    18. For j = i + 1 To (UBound(StrNumbers)) Step 1
    19. nextNumber = CInt(StrNumbers(j))
    20. lowest = If(nextNumber > lowest, lowest, nextNumber)
    21. Next
    22. placeholder = lowest
    23. StrNumbers(i) = placeholder
    24. StrNumbers(j) = nextNumber
    25. For k = 0 To (UBound(StrNumbers) - 1) Step 1
    26. MsgBox(StrNumbers(k))
    27. Next
    28. Next
    29. End Sub
    30. End Class



    Das ist unser Code, funktioniert leider nicht und wir sind hier komplett am verzweifeln.
    Die Strings die durch Split Entstanden sind, lassen sich nicht in Integer umwandeln, so lassen sie sich auch nicht wie zahlen miteinander Vergleichen, sondern werden wie Buchstaben verglichen, was dazu führt, dass eine 15 für einer 2 steht, weil das erste zeichen des String kleiner ist als die 2.

    Müssen bis 24 Uhr heute Abend abgeben, wäre echt nett, wenn uns jemand helfen könnte :(
    @RobD:: Fang an mit Option Strict On.
    Und füge dem Code einen relevanten Input-Text als Beispiel hinzu.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Option Strict On
    2. Dim StrInput As String = "4;1;6;2;13;3;41"



    Ich denke mal du meinst das?

    Natürlich habe ich die Werteübergabe aus der Input-Box auskommentiert.
    Fehler bleibt der Gleiche.
    Durch Split, werden aus dem obigen String die Strings
    "4", "1", "6", "2", "13", "3", "41"
    Die sich aber logischerweise nicht anständig Vergleichen/sortieren lassen.
    Zumindest nicht wie Integer.
    @RobD:: Jou.
    Was sagt denn nun die Aufgabenstellung:
    Sollt Ihr Zahlen sortieren
    oder
    sollt Ihr Strings sortieren?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Schreiben Sie ein Programm in Visual Basic, welches...
    1) ... das Sortierverfahren Selection-Sort (Erläuterung des Verfahrens mit Beispiel siehe uebung02.txt) nutzt, um ein Array mit ganzen Zahlen aufsteigend zu sortieren!

    a. Lesen Sie eine beliebige unsortierte Zahlenfolge aus der TextBox „Input“ der GUI (getrennt mit Semikolons) ein!

    Hinweise:
    Verwenden Sie die String-Methode Split (siehe Befehlsreferenz), um die Zahlenfolge in die einzelnen Werte zu zerlegen!

    Um Ihren implementierten Algorithmus zu testen, können Sie sich zunächst selbst ein Array deklarieren, dies mit einer festen Zahlenfolge (z.B. 15; 5; 3; 7; 6; 4) initialisieren und es sich sortiert ausgeben lassen!

    :(

    zwar sollen wir ganze zahlen sortieren aber Split() liefert bekanntlich immer einzelne Strings zurück.
    @RobD::
    Dann solltest Du zunächst aus Deinem String-Array ein Integer-Array machen.

    VB.NET-Quellcode

    1. Dim value = Integer.Parse(text)
    Dann kannst Du in Ruhe Integers sortieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RobD schrieb:

    um ein Array mit ganzen Zahlen aufsteigend zu sortieren!
    Ich nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!