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
Für Leute mit VS C++ 6.0: aus tcconio.h macht man conio.h und
klammert clrscr(); aus. Dann läuft’s
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
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?
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.
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.