Problem mit C-Programm

Moin zusammen

Ich hab ein Programm geschrieben, das mir die benötigten Zuege beim Spiel
„Türme von Hanoi“ ausgibt. Funktioniert auch alles bis auf eine Kleinigkeit:

Wenn ich mit „j“ bestätige, das ich nochmals das Programm nutzen möchte,
addiert das Programm die benötigten Züge zu den bereits ermittelten Zügen dazu.
Das ist natürlich nicht Sinn der Sache, hat jemand nen Tipp, wie ich das verhindern kann?
Steh grad ein wenig auf dem Schlauch.

Gruß
diemaus

Und hier der Code:

/\* Praeprozessordirektiven \*/

#include 
#include 

/\* Funktionsprototyp \*/

void verschiebe(int,int,int,int);
void print\_turm(void);

/\* Hauptprogramm \*/

int platten[3][3]={0};
int zuege = 0;

int main(void)
{

 char zeichen;
 int n;
 int zaehler = 0;


 platten[0][0] = 3;
 platten[0][1] = 2;
 platten[0][2] = 1;

 do
 {

 /\* Begrüßung \*/

 clrscr();
 printf("\n\nDIE TUERME VON HANOI\n\n\n");

 print\_turm();

 printf("\n\n\nDieses Programm berechnet die benoetigte\n");
 printf("Anzahl von Zuegen und gibt die Anzahl\n");
 printf("und die auszufuehrenden Zuege aus.\n\n\n");

 /\* Eingabe \*/

 printf("Bitte geben Sie die Anzahl n der Scheiben ein: n= ");
 scanf("%ld", &n);

 printf("\n");
 verschiebe(n,1,3,2);
 printf("\n%d Zuege sind mindestens notwendig.\n\n\n\n", zuege);


 /\* Abfrage erneute Berechnung \*/


 printf("Moechten Sie die Loesung fuer eine andere\n");
 printf("Scheibenanzahl berechnen lassen?\n");
 printf("Dann druecken Sie die Taste j: ");
 fflush(stdin);
 scanf("%c", &zeichen);
 }

 while (zeichen == 'j');
 return 0;
}

void verschiebe (int anzahl, int links, int rechts, int mitte)
{
 if (anzahl\>1)
 {
 verschiebe(anzahl-1, links, mitte, rechts);
 }

 printf("Verschiebe Scheibe %d von Platz %d nach Platz %d\n", anzahl, links, rechts);
 zuege++;

 if (anzahl\>1)
 {
 verschiebe(anzahl-1, mitte, rechts, links);
 }
}

/\* Grafik Tuerme \*/

void print\_turm(void)
{
 int zeile, turm;


 printf("\n\n %c %c %c \n", 179, 179, 179);
 for(zeile=2; zeile\>=0; zeile--)
 {
 for (turm=0; turm

Hallo.

Ich hab ein Programm geschrieben, das mir die benötigten Zuege
beim Spiel
„Türme von Hanoi“ ausgibt. Funktioniert auch alles bis auf
eine Kleinigkeit:

Für Leute mit VS C++ 6.0: aus tcconio.h macht man conio.h und klammert clrscr(); aus. Dann läuft’s :wink:

(…)

scanf("%ld", &n);

printf("\n");
verschiebe(n,1,3,2);
printf("\n%d Zuege sind mindestens notwendig.\n\n\n\n",
zuege);

-> zuege=0;
Damit funktioniert das Programm zumindest wie gewünscht :smile:

/* Abfrage erneute Berechnung */

(…)

void verschiebe (int anzahl, int links, int rechts, int mitte)
{
if (anzahl>1)
{
verschiebe(anzahl-1, links, mitte, rechts);
}

printf(„Verschiebe Scheibe %d von Platz %d nach Platz %d\n“,
anzahl, links, rechts);
zuege++;

if (anzahl>1)

Zweimal anzahl>1. Nanu ?

Sieht übrigens hübsch aus :smile:

HTH
mfg M.L.

Hi

eine Kleinigkeit:

Für Leute mit VS C++ 6.0: aus tcconio.h macht man conio.h und
klammert clrscr(); aus. Dann läuft’s :wink:

Stimmt, hatte ich nicht dran gedacht, ist wieder so ne Eigenheit von lcc…
Ich find den Compiler ehrlich gesagt ziemlich bescheuert, aber leider nutzen wir den in der Uni…

(…)

scanf("%ld", &n);

printf("\n");
verschiebe(n,1,3,2);
printf("\n%d Zuege sind mindestens notwendig.\n\n\n\n",
zuege);

-> zuege=0;
Damit funktioniert das Programm zumindest wie gewünscht :smile:

Hmm, hab ich ganz am Anfang gemacht, allerdings vor dem Hauptprogramm, wenn ichs reinnehme, gibt er immer 0 Zuege aus.

/* Abfrage erneute Berechnung */

(…)

void verschiebe (int anzahl, int links, int rechts, int mitte)
{
if (anzahl>1)
{
verschiebe(anzahl-1, links, mitte, rechts);
}

printf(„Verschiebe Scheibe %d von Platz %d nach Platz %d\n“,
anzahl, links, rechts);
zuege++;

if (anzahl>1)

Zweimal anzahl>1. Nanu ?

Jepp, beim erstenmal werden nur n-1 Scheiben versetzt, beim zweiten mal dann nur noch die übriggebliebene.
Noch ne Idee?

Gruß
diemaus

Hi

-> zuege=0;
Damit funktioniert das Programm zumindest wie gewünscht :smile:

Hmm, hab ich ganz am Anfang gemacht, allerdings vor dem
Hauptprogramm, wenn ichs reinnehme, gibt er immer 0 Zuege aus.

schreib es ganz an den Anfang Deiner Schleife, im Hauptprogramm (vor/nach clrscr), noch bevor Du irgendwelche Berechnungen durchführst. Dann geht es.

Kann mich übrigens nur anschließen: Nettes Programm :smile:

Gruß Yelmalio

Hi

schreib es ganz an den Anfang Deiner Schleife, im
Hauptprogramm (vor/nach clrscr), noch bevor Du irgendwelche
Berechnungen durchführst. Dann geht es.

Ich habs grad mal ausprobiert, wenn ichs da reinnehme, meckert der Kompiler, daß im Unterprogramm „verschiebe“ „zuege“ nicht deklariert ist.

Gruß
diemaus

Hi,

Hi

schreib es ganz an den Anfang Deiner Schleife, im
Hauptprogramm (vor/nach clrscr), noch bevor Du irgendwelche
Berechnungen durchführst. Dann geht es.

Ich habs grad mal ausprobiert, wenn ichs da reinnehme, meckert
der Kompiler, daß im Unterprogramm „verschiebe“ „zuege“ nicht
deklariert ist.

Die Definition von zuege (int zuege:wink: muss schon global bleiben (also ausserhalb irgendeiner Funktion, da wo sie schon ist.)
Lediglich die Wertzuweisung (zuege=0:wink: muss bei jedem Durchgang wiederholt werden.

Ich hoffe es funktioniert jetzt.
Gruß Yelmalio

Gruß
diemaus

1 Like

Hi

Die Definition von zuege (int zuege:wink: muss schon global
bleiben (also ausserhalb irgendeiner Funktion, da wo sie schon
ist.)
Lediglich die Wertzuweisung (zuege=0:wink: muss bei jedem
Durchgang wiederholt werden.

Ich hoffe es funktioniert jetzt.

Jo, das wars :smile:

Man, da hät ich auch selber drauf kommen können…

Na ja, Vielen Dank

Gruß
diemaus