Turm von Hanoi



  • Hallo Community!
    Ich programmiere eine Funktion zum Turm von Hanoi,
    und bin auf eine Lösung gestoßen mit der ich nicht umgehen kann.
    Könnte mir jemand das Vorgehen des Programmes in den einzelnen Segmenten erklären?
    Ich danke euch!

    #include <stdio.h>
    																														//Funktion zum Bewegen der Scheiben
    																														//Scheibe ist die Nummer der Scheibe = Größe der Scheibe
    																														//von und nach sind die Türme
    void bewegen(int scheibe, char von, char nach)
    {
    printf("Scheibe%d: von %c nach %c\n", scheibe, von, nach);
    }
    																														//Funktion, die den rekursiven Hanoi-Algorithmus implementiert
    																														//Scheibe ist die zu bewegende Scheibe
    																														//von ist der urspruengliche Turm
    																														//nach ist der Zielturm
    																														//ueber ist der Hilfsturm
    void hanoi(int scheibe, char von, char nach, char ueber)
    {
    																														//wenn es sich um die erste Scheibe handelt:
    																														//bewege die Scheibe vom urspruenglichen Turm zum Zielturm
    if (scheibe == 1)
    bewegen(scheibe, von, nach);
    																														//wenn es sich nicht um die unterste Scheibe handelt
    else
    {
    																														//1. Bringe die n-1 Scheiben vom urspruenglichen Turm auf den Hilfsturm
    hanoi(scheibe-1, von, ueber, nach);
    																														//2. Bringe die letzte Scheibe vom urspruenglichen Turm auf den Zielturm
    bewegen(scheibe, von, nach);
    																														//3. Bringe die n-1 Scheiben vom Hilfsturm auf den Zielturm
    hanoi(scheibe-1, ueber, nach, von);
    }
    }
    int main()
    {
    																														//anzahl der scheiben
    int anzahl;
    																														//die drei Türme A, B und C
    char von = 'A', nach = 'C', ueber = 'B';
    																														//lies die Anzahl der Scheiben ein
    printf("Wieviele Scheiben? ");
    scanf("%d", &anzahl);
    																														//es muss mindestens eine Scheibe vorhanden sein
    if (anzahl < 1)
    printf("Nicht möglich!\n");
    else
    hanoi(anzahl, von, nach, ueber);
    }
    


  • 1. Richtig Einrücken.. so haben wenige Lust den Code anzuschaun
    2. Hast du schonmal C Programmiert, weist du was funktionen sind?
    3. Sind das Hausaufgaben?



  • Die grünen Kommentare im Quellcode sind meistens dazu da, um gelesen zu werden.



  • nein, das sind keine Hausaufgaben und ja ich kenne Funktionen und nein, ich habe das hier nicht verstanden, auch mit Kommentare! UND DANKE FÜR EURE SINNVOLLEN ANTWORTEN; JETZT WEIß ICH DIREKT MEHR! IHR IDIOTEN



  • talina schrieb:

    nein, das sind keine Hausaufgaben und ja ich kenne Funktionen und nein, ich habe das hier nicht verstanden, auch mit Kommentare! UND DANKE FÜR EURE SINNVOLLEN ANTWORTEN; JETZT WEIß ICH DIREKT MEHR! IHR IDIOTEN

    Eigendlich wollte ich dir gerade helfen...
    aber wenn du dir zu fein bist um etwas ein zu rücken oder zumindest Kommentare so zu setzen das sie das aufrufen der Seite nicht behindern (ich benutze 1280x1024 also komm mir nicht mit zu niedriger Auflösung)
    Also wenn du lieb bist und wenn etwas in { } eingeschlossen ist um 4 Leerzeichen einrückst (das Forum hat sogar eine Funktion dafür) dann werde ich dir helfen, aber wenn du etwas willst Tick nicht aus...



  • #include <stdio.h>
    //Funktion zum Bewegen der Scheiben
    //Scheibe ist die Nummer der Scheibe = Größe der Scheibe
    //von und nach sind die Türme
    void bewegen(int scheibe, char von, char nach)
    {
    printf("Scheibe%d: von %c nach %c\n", scheibe, von, nach);
    }
    //Funktion, die den rekursiven Hanoi-Algorithmus implementiert
    //Scheibe ist die zu bewegende Scheibe
    //von ist der urspruengliche Turm
    //nach ist der Zielturm
    //ueber ist der Hilfsturm
    void hanoi(int scheibe, char von, char nach, char ueber)
    {
    //wenn es sich um die erste Scheibe handelt:
    //bewege die Scheibe vom urspruenglichen Turm zum Zielturm
    if (scheibe == 1)
    bewegen(scheibe, von, nach);
    //wenn es sich nicht um die unterste Scheibe handelt
    else
    {
    //1. Bringe die n-1 Scheiben vom urspruenglichen Turm auf den Hilfsturm
    hanoi(scheibe-1, von, ueber, nach);
    //2. Bringe die letzte Scheibe vom urspruenglichen Turm auf den Zielturm
    bewegen(scheibe, von, nach);
    //3. Bringe die n-1 Scheiben vom Hilfsturm auf den Zielturm
    hanoi(scheibe-1, ueber, nach, von);
    }
    }
    int main()
    {
    //anzahl der scheiben
    int anzahl;
    //die drei Türme A, B und C
    char von = 'A', nach = 'C', ueber = 'B';
    //lies die Anzahl der Scheiben ein
    printf("Wieviele Scheiben? ");
    scanf("%d", &anzahl);
    //es muss mindestens eine Scheibe vorhanden sein
    if (anzahl < 1)
    printf("Nicht möglich!\n");
    else
    hanoi(anzahl, von, nach, ueber);
    }
    


  • Ey, da ist _JEDE_ Zeile kommentiert.. was glaubst du sollen wir jetzt hier machen? Die Kommentare kommentieren?
    Das ist doch nun schon für Idioten erklärt... Wer im Glashaus sitzt sollte nicht... (andere als Idioten beschimpfen). 🙄



  • ich verstehe die vorgehensweise nicht, wenn zum bsp die anzahl der scheiben 4 ist, was passiert dann, wo geht er rein? ich dachte mir er geht in den else zweig, der ihm dann wieder sagt, geh in hanoi, und macht das solange bis die scheiben anzahl 1 ist, aber das stimmt nicht! also wie gehts?



  • talina schrieb:

    wenn zum bsp die anzahl der scheiben 4 ist, was passiert dann, wo geht er rein? ich dachte mir er geht in den else zweig, der ihm dann wieder sagt, geh in hanoi, und macht das solange bis die scheiben anzahl 1 ist, aber das stimmt nicht!

    Doch, das stimmt. Beachte, dass bei jedem rekursiven Aufruf von, nach und ueber vertauscht werden. Und beachte, dass es nach einem Durchlauf der Funktion hinter dem Aufruf weitergeht, der den Durchlauf ausgelöst hat.



  • ich habe dir den Source mal eingerückt.

    So du möchtest wissen wie das Programm Funktioniert?
    Also das Programm benutzt eine rekursive Funktion um an das Ergebnis zu kommen.
    Das sind Funktionen die sich selber aufrufen so wie GNU die Abkürzung von "GNU is not Unix" ist und du GNU wieder auflösen must 🙂

    Wenn du das Programm wirklich verstehen willst würde ich dir raten mit einem Debuger das ding durch zu stepen also Schritt für Schritt die Ausführung des Programmes angucken. Das machst du am besten mit dem MSVC++ Debuger der ist anfängerfreundlicher für Windows User als der vom GNU Projekt.
    Der ist bei der Express Version von MSVC++ dabei

    Hier musst du Microsoft Visual C++ downloaden http://www.microsoft.com/express/download/ kostenlos und legal

    Wenn dir das zu viel Arbeit ist wirst du nie Programmieren lernen.
    Viel erfolg 🙂

    #include <stdio.h>
    
    void bewegen(int scheibe, char von, char nach) {
    	printf("Scheibe%d: von %c nach %c\n", scheibe, von, nach);
    }
    
    void hanoi(int scheibe, char von, char nach, char ueber) {
    
    	if (scheibe == 1) {
    		bewegen(scheibe, von, nach);
    	} else {
    		hanoi(scheibe-1, von, ueber, nach);
    		bewegen(scheibe, von, nach);
    		hanoi(scheibe-1, ueber, nach, von);
    	}
    }
    
    int main(void) {
    	int anzahl;
    	char von = 'A', nach = 'C', ueber = 'B';
    
    	printf("Wieviele Scheiben? ");
    	scanf("%d", &anzahl);
    
    	if (anzahl < 1) {
    		printf("Nicht möglich!\n");
    	} else {
    		hanoi(anzahl, von, nach, ueber);
    	}
    }
    


  • ISBN-10: 3-446-41244-1

    kauf dir dieses Buch 🙂
    Die Kunst des Fragens !



  • Stelfer schrieb:

    ISBN-10: 3-446-41244-1

    kauf dir dieses Buch 🙂
    Die Kunst des Fragens !

    nice book 👍
    links_fuer_schlechtes_fragen_fuer_andere_forenuser->add("3-446-41244-1");



  • Ihr seid viel zu nette Menschen.

    Nach dem Spruch am Anfang hätte ich keinen Fuß mehr in den Thread gesetzt 🙂
    (Der Spruch hat ja auch irgendetwas pre-pubertäres in sich...)



  • It0101 schrieb:

    (Der Spruch hat ja auch irgendetwas pre-pubertäres in sich...)

    lol genau dasselbe dachte ich auch


Anmelden zum Antworten