datalukas
Captain
- Registriert
- Dez. 2009
- Beiträge
- 3.627
Hallo liebe Forencommunity,
hab mich mal seit längeren wieder mit Programmieren beschäftigt (bin auf dem Gebiet aber ziemlicher Amateur) und habe mir dabei dieses Video als Orientierung genommen.
http://www.youtube.com/watch?v=kgBjXUE_Nwc
Zunächst habe ich "bubble sort" in Code umgesetzt. Das ging noch ganz gut, aber merge sort hat einige Probleme bereitet. Im Grunde habe ich das ganze schon vor Wochen begonnen, immer ein bisschen verändert, dann mal wieder länger nichts gemacht. Man kann auch so leicht Fehler machen und dann braucht man wieder ewig, bis man das gefixt hat.
Den Code hänge ich als .txt an, da sonst wahrscheinlich wieder der Code-Tag aufgrund der ausgeprägten Verschachtelung in die Knie geht. Wahrscheinlich sollte man das ganz anders machen, aber ich habe das eben in meinem eigenen Stil gemacht. Die Funktion ist zunächst mal nur für ein Array der Größe 10 geeignet und soll dann ausgebaut werden.
Zunächst werden mithilfe der ersten Schleife Stapel mit je zwei Karte gebildet, die dann miteinander verglichen werde. Die Reihenfolge wird dann gleich in ins array layers[10][3] abspeichert. layers umfasst am Ende die Reihenfolge nach je einem Durchlauf des Algorithmus. 10 steht hier für die zehn Werte, die sortiert werden und drei für die Anzahl der Ebenen/Durchläufe, die für eine Sortierung notwendig sind.
In einem Durchlauf der äußeren Schleife mit der Variable c wird eine Ebene durchgearbeitet, wie in dem Video in der Grafik zu sehen.
Da ich das "der Stapel ist leer" und "die Karte wird nach oben verschoben" im Video schlecht umsetzen konnte, habe ich die Variablen counter_right, counter_left und counter_comp deklariert. Summiert mit der Schleifenvariable b werden so die jeweils richtigen "Karten" miteinander verglichen. counter_comp wird immer nach einer Wertzuweisung der nächsten Ebene um eins hochgezählt und Ob ein Stapel noch Karte enthält ist, wird mit "if(counter_right < maximum_right)" geprüft. maximum_right wird oben mithilfe der Schleifenvariable c der äußeren Schleife ermittelt.
Ist der Stapel leer, werden die übrig gebliebenen Karte ins Feld darüber gepackt.
Im Falle einer Kartenanzahl, die in der Primzahlenzerlegung nicht nur Zweier enthalten (gibt bestimmt einen Begriff dafür), gibt es außerdem noch Stapel, die kleiner sind als die anderen, hier ab der zweiten Ebene (zwei Stapel mit vier Karten, einer mit zwei). Dafür ist durch das Abprüfen der Größe von maximum_right und maximum_left am Anfang gesorgt.
Die Ausgabe des Programms ist richtig, allerdings wird der Fehler "Run-Time Check Failure #2 - Stack around the variable 'layers' was corrupted." angezeigt, allerdings nur, wenn ich drei Ebenen durchlaufen lasse, bei zwei passiert das nicht. Ich kann mir das nicht erklären, denn nirgendwo gibt es eine Wertzuweisung, bei der der eine Parameter des Arrays (oder wie man das da nennt) größer als neun ist, das habe ich alles durchprobiert.
Ich weiß ja nicht, ob meine Ausführungen nachvollziehbar waren. Ehrlich gesagt wäre ich eher erstaunt, wenn jemand dem folgen konnte, aber versuchen, kann man ja mal. Habt ihr Ideen?
Gruß
Datalukas
hab mich mal seit längeren wieder mit Programmieren beschäftigt (bin auf dem Gebiet aber ziemlicher Amateur) und habe mir dabei dieses Video als Orientierung genommen.
http://www.youtube.com/watch?v=kgBjXUE_Nwc
Zunächst habe ich "bubble sort" in Code umgesetzt. Das ging noch ganz gut, aber merge sort hat einige Probleme bereitet. Im Grunde habe ich das ganze schon vor Wochen begonnen, immer ein bisschen verändert, dann mal wieder länger nichts gemacht. Man kann auch so leicht Fehler machen und dann braucht man wieder ewig, bis man das gefixt hat.
Den Code hänge ich als .txt an, da sonst wahrscheinlich wieder der Code-Tag aufgrund der ausgeprägten Verschachtelung in die Knie geht. Wahrscheinlich sollte man das ganz anders machen, aber ich habe das eben in meinem eigenen Stil gemacht. Die Funktion ist zunächst mal nur für ein Array der Größe 10 geeignet und soll dann ausgebaut werden.
Zunächst werden mithilfe der ersten Schleife Stapel mit je zwei Karte gebildet, die dann miteinander verglichen werde. Die Reihenfolge wird dann gleich in ins array layers[10][3] abspeichert. layers umfasst am Ende die Reihenfolge nach je einem Durchlauf des Algorithmus. 10 steht hier für die zehn Werte, die sortiert werden und drei für die Anzahl der Ebenen/Durchläufe, die für eine Sortierung notwendig sind.
In einem Durchlauf der äußeren Schleife mit der Variable c wird eine Ebene durchgearbeitet, wie in dem Video in der Grafik zu sehen.
Da ich das "der Stapel ist leer" und "die Karte wird nach oben verschoben" im Video schlecht umsetzen konnte, habe ich die Variablen counter_right, counter_left und counter_comp deklariert. Summiert mit der Schleifenvariable b werden so die jeweils richtigen "Karten" miteinander verglichen. counter_comp wird immer nach einer Wertzuweisung der nächsten Ebene um eins hochgezählt und Ob ein Stapel noch Karte enthält ist, wird mit "if(counter_right < maximum_right)" geprüft. maximum_right wird oben mithilfe der Schleifenvariable c der äußeren Schleife ermittelt.
Ist der Stapel leer, werden die übrig gebliebenen Karte ins Feld darüber gepackt.
Im Falle einer Kartenanzahl, die in der Primzahlenzerlegung nicht nur Zweier enthalten (gibt bestimmt einen Begriff dafür), gibt es außerdem noch Stapel, die kleiner sind als die anderen, hier ab der zweiten Ebene (zwei Stapel mit vier Karten, einer mit zwei). Dafür ist durch das Abprüfen der Größe von maximum_right und maximum_left am Anfang gesorgt.
Code:
maximum_right = (int)pow((double)2, c+1) - 1;
if(maximum_right > 9)
maximum_right = 9;
maximum_left = (int)pow((double)2, c) - 1;
if(maximum_left > 9)
maximum_left = 9;
Die Ausgabe des Programms ist richtig, allerdings wird der Fehler "Run-Time Check Failure #2 - Stack around the variable 'layers' was corrupted." angezeigt, allerdings nur, wenn ich drei Ebenen durchlaufen lasse, bei zwei passiert das nicht. Ich kann mir das nicht erklären, denn nirgendwo gibt es eine Wertzuweisung, bei der der eine Parameter des Arrays (oder wie man das da nennt) größer als neun ist, das habe ich alles durchprobiert.
Ich weiß ja nicht, ob meine Ausführungen nachvollziehbar waren. Ehrlich gesagt wäre ich eher erstaunt, wenn jemand dem folgen konnte, aber versuchen, kann man ja mal. Habt ihr Ideen?
Gruß
Datalukas
Anhänge
Zuletzt bearbeitet: