Bubblesort mit Zufälligenzahlen

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Bubblesort mit Zufälligenzahlen

    Mein Problem ist wir sollten in der Schule zufällige Zahlen mit Bubblesort sortieren.

    Das ist keine Hausaufgabe aber mich interessiert VB sehr daher habe ich mich entschlossen das schon zu bearbeiten, allerdings komme ich nicht voran und bitte hier um Hilfe.

    Folgendes Problem ist = Mein Lehrer meint das sind nicht viele Zeilen, vielleicht ein paar mehr als bei mir.

    Bevor mir jemand kommt mit "Google doch und Kopier es einfach" 1. Ich werde dann ja nicht schlau daraus, 2. habe ich das schon in der Schule, doch es gibt meist nur welche mit "InputBox("")" und wir sollen mit zufällig generierten Zahlen "rechnen"







    Quellcode

    1. Public Class Form1Private Sub btnRechnen_Click(sender As System.Object, e As System.EventArgs) Handles btnRechnen.Click
    2. Dim Zufallszahl As New System.Random
    3. Dim Zahl(20) As Integer
    4. Dim Merkzahl As Integer
    5. Zahl(20) = Zufallszahl.Next(1, 101)
    6. For j = UBound(Zahl) - 1 To LBound(Zahl) Step -1
    7. For i = LBound(Zahl) To j
    8. If Zahl(i) > Zahl(i + 1) Then
    9. Merkzahl = Zahl(i)
    10. Zahl(i) = Zahl(i + 1)
    11. Zahl(i + 1) = Merkzahl
    12. End If
    13. Next i
    14. Next j
    15. libAusgabe.Items.Add(Zahl)
    16. End Sub
    17. End Class




    Danke im Voraus für die Helfe, hoffe jemand hilft mir dann :thumbsup: :)
    Hi und herzlich willkommen im Forum!

    Was ist jetz deine Frage? Sollen wir dir nen Code geben den du dann per C&P verwenden kannst? Sollen wir dir den BubbleSort erklären? Willste wissen, wie du die Random-Zahlen bekommst?

    Tipps für eine höhere Antwort-Quote - Vielleich hilft dir das hier :D


    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Ohh ich hätte vielleicht meine Frage näher erläutern sollen, also ! Meine Bitte ist folgende:
    Einen vernünftigen Quellcode mit Erklärung wäre PRIMA ! Weil mein Quellcode funktioniert nicht, oder eben sagen was an meinem Falsch ist!

    Bbblesort weiß ich, mit dem tauschen ich verstehe das ja an sich, ich kann es bloß nicht umsetzen in Kurzen Programmier-Zügen =(


    Vielleicht als Anmerkung, ich soll quasi durch KNOPFDRUCK in einer Listbox die Sortierten Zahlen angeben :)!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NyuQz“ ()

    Willkommen im Forum. :thumbup:

    NyuQz schrieb:

    VB.NET-Quellcode

    1. Zahl(20) = Zufallszahl.Next(1, 101)
    Du hast nur einen einzigen von 0 verschiedenen Wert. Der Algo als solcher sieht ganz gut aus.
    Setz einen Haltepunkt rein und lerne zu debuggen. Gugst Du hier.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Du meinst also quasi ich soll so oft probieren bis ich selber den Fehler finde, in dem ich ständig debugge?

    Denn gerade das hilft mir ja nicht, das Programm läuft ja, allerdings wird in der Listbox im Entwurf "Int32[]-Array" angezeigt.. Und ich sehe nicht wo das Problem ist. Daher habe ich halt hier um Hilfe gebeten, mir einmal den Fehler zuzeigen, die bublesort scheint ja nach deiner Aussage "ganz gut" auszusehen, aber wie kriege ich nun besagte in Listbox rein?
    Danke ! Allerdings verstehe ich jetzt nicht wie du das mit Eingangs Daten meinst. Wie muss ich das denn machen? Ich will ja quasi das wenn ich auf den Knopf drücke er Zahlen generiert und SOFORT sortiert, den schritt bemerkt man ja nicht!

    Aber ich verstehe einfach nicht wie ich "ihm" sage das bei Knopfdruck die Zahl = Random sein soll..
    dann ja alles bestens, und du musst nur noch das Generieren der Zufallszahlen richtig machen.
    Derzeit gibts ja nur

    VB.NET-Quellcode

    1. Zahl(20) = Zufallszahl.Next(1, 101)
    Da wird eine einzige Zufallszahl ins 20.Element des Arrays geschrieben - alle anneren bleiben leer, also '0'.

    Reicht das schon als Hint?

    Ich empfehle ja sehr, diese Vorgänge zu trennen.
    Also schreib eine Methode zum Generieren von Zufallszahlen, der du dein Zahlen-Array übergibst.
    Und schreib eine, die es sortiert (kriegts natürlich auch übergeben).
    Letzteren Algo haste ja schon, brauchste nur noch eine Methode drumrum machen.

    gugge auch Grundlagen: Fachbegriffe

    Weil meist werde ich garnet richtig verstanden, wenn ich "Methode" sage, "Array", oder "Übergeben".
    Ehrlich gesagt verstehe ich den Tipp nicht.... Ich weiß nicht heute ist nicht so mein Tag & das ist halt alles sehr neu , unser Lehrer will halt immer "Learning by doing" verstehste?^^


    Also könntest du mir noch einen kleinen Tipp geben, ich versuche es die ganze Zeit mit einer For schleife weil ich mir denke er macht das "Zufallszahl" dann 20 mal, allerdings glaube ich nicht das dies der richtige Lösungsansatz ist..


    Mir ist schon bewusst das ich nur eine Random erzeuge =) Also das weiß ich und verstehe ich auch, allerdings weiß ich das nicht zu beheben :/





    ------EDIT------

    Ich habe es selber hinbekommen dein Hint war Prima, DANKE ! Ich wusste doch es muss ein For schleife sein habe nun

    SQL-Abfrage

    1. Private Sub btnRechnen_Click(sender As System.Object, e As System.EventArgs) Handles btnRechnen.Click
    2. Dim Zufallszahl As New System.Random
    3. Dim Zahl(20) As Integer
    4. Dim Merkzahl As Integer
    5. For i = 0 To 20
    6. Zahl(i) = Zufallszahl.Next(1, 101)
    7. Next
    8. For j = UBound(Zahl) - 1 To LBound(Zahl) Step -1
    9. For i = LBound(Zahl) To j
    10. If Zahl(i) > Zahl(i + 1) Then
    11. Merkzahl = Zahl(i)
    12. Zahl(i) = Zahl(i + 1)
    13. Zahl(i + 1) = Merkzahl
    14. End If
    15. Next i
    16. Next j
    17. libAusgabe.DataSource = Zahl
    18. End Sub



    Das habe ich quasi hinzugefügt damit das Array halt nicht nur das 20. Element random bekommt sondern alle anderen auch !:)

    For i = 0 to 20
    Zahl(i) = Zufallszahl.Next(1,101)


    Danke bin ich nun doch selber drauf gekommen , vielen dank nochmals schönen Tag :)

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „NyuQz“ ()

    Super :thumbsup:

    Nun würde ich aber an deiner Stelle hier nicht aufhören, sondern jetzt kannste eiglich anfangen mit ordentlich proggen.

    Etwa kannst du dir das Ziel setzen, bei Button1_Click die Random-Zahlen zu generieren (und inne Listbox anzeigen), und bei Button2_Click den Salat sortieren.
    Also den Vorgang aufteilen in generieren und sortieren.
    Dazu musste dein Array zu einer Klassenvariablen machen.

    Und spätestens danach sollteste dich mit Benamung beschäftigen.

    Und dann kommt noch die Deppen-Einstellungen rauswerfen, denn man sieht deinem Code an, dass die noch aktiv sind.

    Also ich hab 3 Punkte auf der Liste:
    1. Code aufteilen
    2. Benamung
    3. Deppen-Settings rauswerfen: Visual Studio - Empfohlene Einstellungen
    Wie gesagt: Einer nach dem anneren.

    NyuQz schrieb:

    so oft probieren bis ich selber den Fehler finde
    Nein.
    Wenn Du einen Algo baust, solltest Du wissen, was rauskommen soll. Verwende dafür geeignete Testdaten.

    NyuQz schrieb:

    der richtige Lösungsansatz
    Du hast offensichtlich mehrere Probleme, die Du ganz furchtbar vermengst und deren Effekte Du nicht trennen kannst.
    1. Erstellen von Zufallszahlen in einem Array,
    2. Sortieren des Arrays,
    3. Befüllen einer ListBox.
    Mach Dir zu jedem dieser Probleme ein separates Teilprojekt, in dem Du ausschließlich diese Problematik behandelst.
    Wenn alles zu Deiner Zufriedenheit läuft, setze diese zu einem neuen Gesampprojekt zusammen.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:


    Also ich hab 3 Punkte auf der Liste:
    1. Code aufteilen
    2. Benamung
    3. Deppen-Settings rauswerfen: Visual Studio - Empfohlene Einstellungen
    Wie gesagt: Einer nach dem anneren.



    Also ehrlich gesagt weiß ich wie das mit dem "Code-Aufteilen" geht, aber ehm ... Nicht mit Arrays, denn wenn ich das Aufteile weiß VB ja nicht mehr was "Zahl(i)" da es in einer anderen Sub ist.

    2. Benamung verstehe ich nicht ganz was du damit meinst :/

    3. Der dritte Punkt ebenfalls , ich habe mir das durchgelesen was du verlinkt hast, allerdings verstehe ich nicht wozu das not tut ;/
    also Code aufteilen:
    Versuch mal das Prog so zu gestalten, dass der User auch sieht, was passiert. Also das hier gesagte:

    ErfinderDesRades schrieb:

    Etwa kannst du dir das Ziel setzen, bei Button1_Click die Random-Zahlen zu generieren (und inne Listbox anzeigen), und bei Button2_Click den Salat sortieren.
    Also den Vorgang aufteilen in generieren und sortieren.


    Deine Benamung ist i.a. nicht ganz schlimm, aber zB daneben ists, das Zahl-Array Zahl zu nennen, da denkt man, das wäre eine Zahl. Es ist aber ein Array von Zahlen. Ich bename vorzugsweise englisch(-ähnlich), bei mir würde das Numbs heißen, also Auflistungen sind plural flexiert.
    Und ZufallsZahl ist auch keine Zahl, sondern ist ein Zahlengenerator. Den würde ich einfach rnd nennen.
    Optimal ist, wenn die Namen aussagen, wozu das Objekt gut ist.
    Schlecht sind nichtssagende Namen, und wirklich mies sind Namen, die was anneres aussagen, als was da vorliegt. Bei solchen Namen (wie Zahl) ist das Fehler programmieren gewissermassen vorprogrammiert.

    Deppen-Einstellungen: Du hast doch jetzt selbst gemerkt, wie mühsam es dir war, den Datentyp von Zahl richtig wahrzunehmen und korrekt zu nutzen. Und dich gewundert, dass die Listbox "Int32[]-Array" anzeigt, wenn man ein Integer-Array reintut.
    Die eine der Deppen-Einstellungen bewirkt nun, dass der Hintergrund-Compiler jeden Datentypen in jeden anderen zu konvertieren versucht, was ja sehr bequem erscheint, aber verhindert, dass du die Datentypen überhaupt voneinander zu unterscheiden lernst.
    Die andere Deppen-Einstellung bewirkt, dass dir ständig schrottige vb6-Methoden unter die Finger kommen, was ebenfalls bequem erscheint, aber verhindert, dass du die 1000-fach besseren .Net-Konzepte kennenlernst.
    Also der Sinn von punkt 3) ist, zu ermöglichen, dass du programmieren überhaupt erlernen kannst. Aber sowas geht mir auf die Nerven - immer wiederhole ich für jeden einzelnen neu, was da doch auch zig-fach aufgeschrieben und begründet ist, im gegebenen Link. Wozu gibts diese Artikel überhaupt, wenn mans jedem einzelnen dann doch nochmal im einzelnen vorkauen muss.

    Entschuldige bitte - ich bin grad noch unduldsamer als eh schon.
    Alles gut, ich verstehe schon. Meine Frage war eig. nur wo ich diese "Deppen-Einstellung" quasi umstelle. Oder muss ich die einfach nur über die Public Class schreiben .. Das war meine Frage. Und das benennen verstehe ich nun auch .

    Also verlangst du quasi, bei "btnAnzeige" sollen die Random Zahlen angezeigt werden und bei z.B. "btnSortieren" sollen sie sortiert werden? ODER ! Willst du das ich Bubblesort in eine Listbox mache und das dann wie folgt angezeigt wird.
    In der Listbox halt, das die Zahlen nach diesem Bild <--- Immer weiter sortiert werden, sowie Bubblesort halt funktioniert.
    lol die Animation ist ja mal cool.

    Habs nach geproggt (just 4 fun)

    (Müsst einen Timer auf die Form ziehen den im Designer enablen und Intervall auf 100 ms)

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Windows.Forms;
    9. namespace WindowsFormsApplication1
    10. {
    11. public partial class Form1 : Form
    12. {
    13. private Random _random;
    14. private List<Balken> lBalken;
    15. public Form1()
    16. {
    17. InitializeComponent();
    18. lBalken = new List<Balken>();
    19. _random = new Random(DateTime.Now.Millisecond);
    20. float lFactor = ((float)this.Height / (float)(this.Width));
    21. for (float i = 0; i < this.Width - 19; i += WIDTH)
    22. {
    23. lBalken.Add(new Balken(lFactor * i));
    24. }
    25. lBalken = lBalken.OrderBy((Balken pBalken) => _random.Next(0, 10)).ToList();
    26. this.Paint += new PaintEventHandler(Form1_Paint);
    27. }
    28. private const float WIDTH = 5F;
    29. private void Form1_Paint(object sender,PaintEventArgs e)
    30. {
    31. for (int index = 0; index < lBalken.Count;index++)
    32. {
    33. e.Graphics.FillRectangle(Brushes.Black, new RectangleF(index * WIDTH, this.Height - lBalken[index].Height - 39, WIDTH, lBalken[index].Height));
    34. }
    35. }
    36. private void timer1_Tick(object sender, EventArgs e)
    37. {
    38. Tuple<List<Balken>, bool> lTuple = lBalken.BubbleSortStep();
    39. if (lTuple.Item2)
    40. {
    41. timer1.Stop();
    42. MessageBox.Show("Finished");
    43. return;
    44. }
    45. lBalken = lTuple.Item1;
    46. this.Invalidate();
    47. }
    48. }
    49. public static class Extensions
    50. {
    51. public static Tuple<List<Balken>,bool> BubbleSortStep(this List<Balken> pElements)
    52. {
    53. bool lDone = true;
    54. for (int i = 0; i < pElements.Count - 1; i++)
    55. {
    56. Balken lFirst = pElements[i];
    57. Balken lSecond = pElements[i + 1];
    58. if (lFirst.Height > lSecond.Height)
    59. {
    60. pElements[i] = lSecond;
    61. pElements[i + 1] = lFirst;
    62. lDone = false;
    63. }
    64. }
    65. return Tuple.Create<List<Balken>,bool>(pElements,lDone);
    66. }
    67. }
    68. public struct Balken
    69. {
    70. public Balken(float pHeight)
    71. {
    72. this._height = pHeight;
    73. }
    74. private float _height;
    75. public float Height { get { return _height; } set { _height = value; } }
    76. }
    77. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RushDen“ ()

    NyuQz schrieb:

    Also verlangst du quasi, bei "btnAnzeige" sollen die Random Zahlen angezeigt werden und bei z.B. "btnSortieren" sollen sie sortiert werden?
    Naja - "verlangen"...
    Es könnte für dich interessant sein, solch zu coden, denke ich.
    Und das hat was mit 1) - Aufteilung zu tun.
    Könntest du Code aufteilen, so hättest du erst das Generieren gecodet, und dich dann an die Entwicklung des Algos gemacht - was ja eiglich das eiglich komplizierte ist (bei dir aber komischerweise schon perfekt war, bevor die Ausgabe funztete)
    Normal entwickelt man halt so: erstmal TestDaten generieren und die Ausgabe, dass man ühaupt was sehen kann. Danach entwickelt man die Problemlösung (und dass man TestDaten hat und eine Ausgabe ist ungeheuer hilfreich dabei).

    NyuQz schrieb:

    wo ich diese "Deppen-Einstellung" quasi umstelle.
    Da sind doch 2 Videos dort in post#1.
    Reichen die nicht aus?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()