Anzahl der Durchläufe zählen?

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Taiko
Beiträge: 2
Registriert: Do Mai 29, 2014 2:40 pm

Anzahl der Durchläufe zählen?

Beitrag von Taiko » Do Mai 29, 2014 2:52 pm

Hallo liebe Forengemeinde.

Ich habe ein Problem:
Ich sitze hier an der Hanoi Aufgabe und weiß nicht weiter...

Code: Alles auswählen

#include <stdio.h>

void bewege(char x, char y, char z, int n)
{
	static int count = 1;
	printf("%3d: Bewege %5d:%c nach %c\n",count, n, x, y);
	count++;
 if(n>1)  bewege(x, z, y, n-1);
 if (n>1) bewege(z, y, x, n-1);
  
}

main(void)
{
 int n;
 printf("DIE TUERME VON HANOI\n");
 printf("? Anzahl Scheiben = ");
 scanf("%d", &n);
 bewege('x', 'y', 'z', n);

}
das hier hab ich schon.
Mein Problem ist, daß ich jetzt eine Ausgabe machen muß, die mir nur ausgibt, wie viele Durchläufe ich brauche um zu dem Ende zu kommen.

Wie komme ich dahin?
Ich kapier das irgendwie nicht...
Ich habe es schon probiert mit Count, aber da werden dann nur alle Züge ausgegeben, nicht nur der letzte (d.h. er zählt hoch bis z.B. 15 und gibt nicht nur 15 aus).

Mit welcher Funktion kann ich das hin bekommen?

Vielen lieben Dank!!

Taiko

Nemo
Beiträge: 37
Registriert: Sa Mär 02, 2013 3:18 pm

Re: Anzahl der Durchläufe zählen?

Beitrag von Nemo » Do Mai 29, 2014 5:56 pm

Hi,

Dein Problem ist, dass du count innerhalb der Funktion bewege ausgeben lässt und bewege sich selbst immer wieder aufruft, wodurch auch count erneut ausgegeben wird.
So sollte es gehen:

Code: Alles auswählen

    #include <stdio.h>

    int bewege(char x, char y, char z, int n)
    {
       static int count = 1;
       printf("%3d: Bewege %5d:%c nach %c\n",count, n, x, y);
       count++;
    if(n>1)  bewege(x, z, y, n-1);
    if (n>1) bewege(z, y, x, n-1);
    return count;
    }

    main(void)
    {
    int n;
    printf("DIE TUERME VON HANOI\n");
    printf("? Anzahl Scheiben = ");
    scanf("%d", &n);
    printf("%3d Züge sind notwendig.\n", bewege('x', 'y', 'z', n));

    }
Ich habe einfach bewege in eine Integer-Funktion verwandelt, die am Ende count zrückgibt, sodass es extern ausgegeben wird. Wenn du möchtest kannst du nun einfach diese Zeile:

Code: Alles auswählen

       printf("%3d: Bewege %5d:%c nach %c\n",count, n, x, y);
weglassen und es wird nur noch die Anzahl der nötigen Züge ausgegeben.

Man könnte das Problem auch so lösen:

Code: Alles auswählen

    #include <stdio.h>

    void bewege(char x, char y, char z, int n)
    {
       static int count = 1;
       static int secondCount = 1;
       printf("%3d: Bewege %5d:%c nach %c\n",count, n, x, y);
       count++;
    if(n>1)  bewege(x, z, y, n-1);
    if (n>1) bewege(z, y, x, n-1);
       secondCount++;
    if(count==secondCount) printf("Es sind %3d Züge notwendig\n", count);
    }

    main(void)
    {
    int n;
    printf("DIE TUERME VON HANOI\n");
    printf("? Anzahl Scheiben = ");
    scanf("%d", &n);
    bewege('x', 'y', 'z', n);

    }
Diese Lösung hat den Vorteil, dass count innerhalb der Funktion bewege ausgegeben wird. Hier wird count immer vor und secondCount immer nach den erneuten Aufrufen von Bewege ausgeführt, sodass sie nur innerhalb des ersten Aufrufs von bewege count und secondCount gleich groß sind.

Welche Lösung du benutzt ist dir überlassen.

Taiko
Beiträge: 2
Registriert: Do Mai 29, 2014 2:40 pm

Re: Anzahl der Durchläufe zählen?

Beitrag von Taiko » Do Mai 29, 2014 6:34 pm

Hi Nemo,

vielen Dank für deine Hilfe!!

Auf die Idee mit dem second Count wär ich nicht gekommen...
(gut, und das mit dem return count hab ich echt nicht gesehen..) :-)

Vielen Dank nochmals!!

Taiko

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Anzahl der Durchläufe zählen?

Beitrag von Xin » Fr Mai 30, 2014 10:34 am

Taiko hat geschrieben: Mein Problem ist, daß ich jetzt eine Ausgabe machen muß, die mir nur ausgibt, wie viele Durchläufe ich brauche um zu dem Ende zu kommen.

Code: Alles auswählen

#include <stdio.h>

unsigned int bewege(char x, char y, char z, int n)
{
  unsigned int count = 1;
  printf("%3d: Bewege %5d:%c nach %c\n",count, n, x, y);
  if(n>1) count += bewege(x, z, y, n-1);
  if(n>1) count += bewege(z, y, x, n-1);  

  return count;
}
Die Funktion gibt zurück, wie oft sie aufgerufen wurde.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten