Lady_Lilith Geschrieben 12. August 2008 Teilen Geschrieben 12. August 2008 Hallo. Ich hab gerade eine Aufgabe, und zwar, dass ich eine Rekursion zum Puzzle "Noch Verzwickter!" von Uli Stein von Visual Quick Basic umschreiben soll in C#. Die Rekursion hab ich vorliegen, jedoch weiß ich nicht genau was mir der Ausdruck "IF ok = 0 THEN" sagen soll Die Rekursion in VBQ findet ihr unten im Anhang. Vielleicht könnt ihr mir ja helfen? Wär echt lieb! Liebe Grüße! PS: Und wenn ihr noch andere Möglichkeiten seht, mir zu helfen, sagt bescheid! DANKE!AltRekursion_Kommentar.txt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 12. August 2008 Teilen Geschrieben 12. August 2008 jedoch weiß ich nicht genau was mir der Ausdruck "IF ok = 0 THEN" sagen soll Ist einfach nur eine if Abfrage if (ok == 0) { //mach was } [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 12. August 2008 Autor Teilen Geschrieben 12. August 2008 Hmmm und ist ok dann eine Variable, die ich zuordnen muss? Weil das ok hab ich ja nicht vorgegeben dort, das taucht einfach auf. (Sry, wenn ich mich nen bissi blöd anstell ) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 12. August 2008 Autor Teilen Geschrieben 12. August 2008 Hier mal mein aktueller Stand bei C# um Vergleich.PuzzleRek.txt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 12. August 2008 Teilen Geschrieben 12. August 2008 Ja ok ist eine Variable die da an verschiedenen Stellen auf 0 oder 1 gesetzt wird. Das ganze ist aber ziemlich unübersichtlicher Code :\ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 12. August 2008 Autor Teilen Geschrieben 12. August 2008 Sorry bin extrem neu auf dem Gebiet Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 12. August 2008 Teilen Geschrieben 12. August 2008 Ich meinte den original Basic Code Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 12. August 2008 Autor Teilen Geschrieben 12. August 2008 Achso ok, ja den hatte ich aus einer Internetseite von so einem Uralttyp. Komme da ja selbst nicht mit klar. Ich bin grad so ziemlich im Gedankenchaos. Und ich weiß nicht wieso er was wo macht, das ist echt böse. Weil Programmieren an sich ja nicht schwer ist, aber die Gedankengänge von anderen hinterherzukommen, gerade wenn man das vor 4 Wochen das erste Mal gemacht hat, ist das schon der Hammer Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 12. August 2008 Teilen Geschrieben 12. August 2008 Ja das stimmt. Oft ist es auch sehr hilfreich den Programmablauf mal durch zu debuggen. Ich weiß aber nicht wie da die Möglichkeiten bei Basic sind... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 12. August 2008 Autor Teilen Geschrieben 12. August 2008 Hab ich schon gemacht, aber das ist sooo komplex, da blick ich als Frischling noch nicht so durch. Und das dann noch in C# reinzupacken . . . Naja, mein Ausbilder meint, ich schaff das. Allein. Ich glaub nicht dran . . . Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 12. August 2008 Teilen Geschrieben 12. August 2008 Man sollte beachten, dass Quick (and dirty) Basic nicht objektorientiert ist und C# aber komplett auf OOP aufbaut. Verschiedene Klassen würde ich daher empfehlen, das machts auch übersichtlicher. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 12. August 2008 Teilen Geschrieben 12. August 2008 Naja, mein Ausbilder meint, ich schaff das. Allein. Ich glaub nicht dran . . . Selbst wenn du es am Ende nicht schaffen solltest, dann hast du einen Lerneffekt wenn du dich selber mit der Aufgabe auseinandersetzt und das ist es worum es dabei hauptsächlich geht. Aber ich denke mal das dir dein Ausbilder da bei konkreten Problemen auch ein paar Tipps zu geben wird. Wir hier aber natürlich auch, nur komplett lösen wird das keiner für dich aber davon hättest du ja auch nichts... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 12. August 2008 Autor Teilen Geschrieben 12. August 2008 Das will ich ja auch gar nicht Bin ja auch schon relativ weit. Highlights sind dann immer, wenn das Fenster gescheit aufgeht Glaube schon dass ich das hinbekomm. Wenn ichs erstmal raus hab, was der Typ da wie gemacht hat . . . Einzelne Sachen gehen ja sehr gut, nur im Zusammenspiel ist es knifflig. Aber das passt schon Thx für die Hilfe! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 18. August 2008 Autor Teilen Geschrieben 18. August 2008 Sooo . . . nun Folgendes: Ich bin jetzt quasi am Ende meiner Übersetzung, nur gibt es einen kleinen Schönheitsfehler, und zwar: Ich möchte, dass er alle Möglichkeiten der Kartenlegung durchprobiert, bis er irgendwann die umgekehrte Anfangsreihenfolge hat. Also: Aus 123456789 soll später 987654321 werden. Jetzt hatte ich das versucht, indem ich immer die letzte Zahl nehme, und die weiter nach vorn schiebe. Nun kamen aber immer nur die 1 und die 9 an den Anfang. Also probierte er nicht alles aus. Ich möchte also jede einzelne kleine Möglichkeit erfassen und die durchspielen lassen. Habt ihr eine Idee, wie ich das in C# schreiben kann? Folgendes soll dabei herauskommen, nur ich kenn den Code dafür nicht: 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 9 8 1 2 3 4 5 6 8 7 9 1 2 3 4 5 6 8 9 7 1 2 3 4 5 6 9 7 8 1 2 3 4 5 6 9 8 7 1 2 3 4 5 7 6 8 9 1 2 3 4 5 7 6 9 8 Er soll halt mit den vorhandenen Zahlen (in diesem Fall Karten) - jede nur EINMAL - einfach nur hochzählen. Und wenn er beim nächsten Tausender angekommen ist, dann soll er die nächste Zahl mit einbeziehen, etc. Ich denke die Gesetzmäßigkeit dahinter habt ihr verstanden, oder? Liebe Grüße! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 18. August 2008 Teilen Geschrieben 18. August 2008 Bubblesort mit immer nur einer Änderung pro Durchlauf? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 18. August 2008 Autor Teilen Geschrieben 18. August 2008 (bearbeitet) Naja, das ist doch das, was ich eigentlich gemacht hatte, oder? Ich hatte ja vorgegeben, wenn die eine Zahl größer ist, als die davor, dann sollen die getauscht werden. Aber dadurch werden ja nicht alle Möglichkeiten genannt, sondern es kommt dazu, dass man zwar von 123456789 nach 987654321 aber durch anderes Verschiebeverfahren, welches nicht ALLE Möglichkeiten wahrnimmt, als wenn man es hochzählt. Bearbeitet 18. August 2008 von Lady_Lilith Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. August 2008 Teilen Geschrieben 18. August 2008 Ich möchte, dass er alle Möglichkeiten der Kartenlegung durchprobiert, bis er irgendwann die umgekehrte Anfangsreihenfolge hat.Du suchst alle Permutationen in lexikographischer Ordnung. Algorithmus Nr. 2 auf dieser Seite könnte für dich interessant sein. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 18. August 2008 Autor Teilen Geschrieben 18. August 2008 Dankeschön Werde mich damit mal auseinandersetzen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 19. August 2008 Autor Teilen Geschrieben 19. August 2008 Guten Morgen. Nun habe ich es leider immernoch nicht herausgefunden, wie ich es schreiben soll . . . habe mir zwar Gedanken gemacht, hat aber nicht viel gebracht. Ich weiß jetzt, dass ich die Lexikographische Ordnung aufschreiben muss, weiß jedoch nicht wie. Bei mir steht momentan: Swap(ref rxString, n, s); private static void Swap(ref char[] a, int iPos1, int iPos2) { char c = a[iPos1]; a[iPos1] = a[iPos2]; a[iPos2] = c; } Das vertauscht die beiden Zahlen, die mit n und s betitelt sind. Hat jemand ne Idee, wie ich das, wie gewünscht, aufschreibe? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 19. August 2008 Teilen Geschrieben 19. August 2008 Hat jemand ne Idee, wie ich das, wie gewünscht, aufschreibe? Du musst doch einfach nur das Beispiel, auf das ich verlinkt habe, nach C# übersetzen, und dort, wo in dem Beispiel swap steht, deine Funktion aufrufen. Zusätzlich wäre es noch gut, wenn die Funktion erkennt, wann das Ende erreicht ist: static Boolean get_next(char[] a) { int i = a.Length - 1; while (a[i - 1] >= a[i]) { i = i - 1; if (i == 0) return false; } int j = a.Length; while (a[j - 1] <= a[i - 1]) j = j - 1; // swap values at positions (i-1) and (j-1) swap(a, i - 1, j - 1); i++; j = a.Length; while (i < j) { swap(a, i - 1, j - 1); i++; j--; } return true; }[/code] Diese Funktion rufst du solange auf, bis sie false zurückgibt. Es sind übrigens 9! = 362880 Permutationen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 19. August 2008 Autor Teilen Geschrieben 19. August 2008 Ja, das mit den Permutationen weiß ich, wieviele das sind. Nur bekomme ich es immernoch nicht wirklich hin. Ich fühle mich grad ein wenig verschusselt und hab keine Ahnung, was ich dort wie aus meiner Rekursion ersetzen muss: do { Console.SetCursorPosition(0, 0); Console.WriteLine("Alte Reihenfolge: " + reiheString); Console.WriteLine("Suche neue Reihenfolge . . . bitte warten . . ."); for (x = 8; x >= 1; x--) { if (int.Parse(reiheString.Substring(x, 1)) > int.Parse(reiheString.Substring(x - 1, 1))) { n = x - 1; x = 0; } } nString = reiheString.Substring(n, 1); z = -1; sString = ""; do { z++; if (z >= 9) { return; } sString = reiheString.Substring(int.Parse(nString) + z 1); s = reiheString.IndexOf(sString, n + 1); } while (s == -1); for (x = 0; x < 9; x++) { rxString[x] = reiheString[x]; } Swap(ref rxString, n, s); reiheString = reiheString.Substring(0, n) + sString; for (x = 0; x < 9; x++) { for (y = n+1; y < 9; y++) { if (rxString[y] == (char)(49 + x)) { reiheString = reiheString + rxString[y]; } } } anzahlInt = anzahlInt + 1; for (x = 0; x < 9; x++) { r = int.Parse(reiheString.Substring(x, 1)); for (b = 0; b < 5; b++) { kString[x, b] = dString[r - 1, b]; } } Display(kString); if (Dreh(ref kString)) { Display(kString); Console.ReadKey(); } } while (reiheString != "987654321"); private static void Swap(ref char[] a, int iPos1, int iPos2) { char c = a[iPos1]; a[iPos1] = a[iPos2]; a[iPos2] = c; } Ich habe momentan leider ein totales Blackout und weiß absolut nicht, wie ich das da rein bekommen könnte, sodass es mit MEINEN Variablen funktioniert. Würdest du dir die Mühe machen, und mir das da rein packen? Wäre echt lieb. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 19. August 2008 Teilen Geschrieben 19. August 2008 Du brauchst gar keine Rekursion, die Funktion oben ist alles, was du brauchst. Das funktioniert übrigens mit jedem Array, egal ob Zahlen oder Buchstaben, egal wie lang. Ich mach einfach mal ein ganzes Programm draus: class Program { private static void swap(char[] a, int iPos1, int iPos2) { char c = a[iPos1]; a[iPos1] = a[iPos2]; a[iPos2] = c; } static Boolean get_next(char[] a) { int i = a.Length - 1; while (a[i - 1] >= a[i]) { i = i - 1; if (i == 0) return false; } int j = a.Length; while (a[j - 1] <= a[i - 1]) j = j - 1; // swap values at positions (i-1) and (j-1) swap(a, i - 1, j - 1); i++; j = a.Length; while (i < j) { swap(a, i - 1, j - 1); i++; j--; } return true; } static void Main(string[] args) { char[] a = "123456789".ToCharArray(); do { System.Console.Out.WriteLine(a); } while (get_next(a)); } }[/code] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 19. August 2008 Autor Teilen Geschrieben 19. August 2008 Nunja, dass das funktioniert habe ich durch testen jetzt gesehen. Es ist nur so, dass ich ein ganz anderes Projekt habe. Das mit der Sortierung soll ja IN das Projekt. Es geht darum: Ich habe hier ein Puzzle von Uli Stein. Dort gibt es 9 verschiedene Karten, deren Kanten bei nur EINER möglichen Anordnung zusammenpassen. Diese Reihenfolge der Karten möchte ich herausfinden, und dazu muss ich alle Möglichkeiten der Anordnung durchspielen (das wäre ja jetzt der Teil, den du hier reingeschrieben hast. Es soll ja in JEDEM Durchgang EINE Karte vertauscht werden, dann wird geschaut, ob sie zur nächsten Karte passt in Bezug auf deren Kanten und wenn nicht, gibt es eine neue Vertauschung und das Programm läuft von vorn durch. Es geht hier nicht allein um diese Sortierung, sondern die soll IN mein Programm rein. Mein Problem ist jetzt: Ich weiß nicht, wie ich das darin einfügen soll. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 19. August 2008 Teilen Geschrieben 19. August 2008 Es soll ja in JEDEM Durchgang EINE Karte vertauscht werdenWarum? Hauptsache ist doch, dass jede Permutation drankommt. Mein Problem ist jetzt: Ich weiß nicht, wie ich das darin einfügen soll.Bau deine Prüfung an Stelle der Ausgabe in Main ein. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lady_Lilith Geschrieben 19. August 2008 Autor Teilen Geschrieben 19. August 2008 Aber es soll ja erst geprüft werden und da kann ich ja nicht laufend durchsortieren, sondern muss prüfen, obs passt, dann kann ich die nächsten Karten vertauschen. Da sind ja noch andere Dinge am Werk. Hier mal komplett, dass du dir das vorstellen kannst, wie ich das meine.PuzzleRek.txt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.