Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

09.01.2011, 01:11

Towers of hanoi

Hallo

ich habe ein richtig großes Problem!!!!!!

Ich muss in einer Woche das komplette programm für Tower of hanois in C++ abgeben, wenn ich es nicht habe tschüß.....

Das Thema ist ich verstehe seit dem wir pointer durchgenommen haben gar nichts mehr....
und nun soll ich ein ganzes programm schreiben...

ich habe mal angefange... aber das bringt mir kaum was muss noch für viele andere fächer lernen...... (voll zeitaufwendig)
kann mir jemand helfen...., der da ein bissl schneller ist als ich.
ich habe das interface schon mal gezeichnet habe bestimmt zwei wochen gebraucht...... (also ich bin wirklich zu doof dafür....)



ich brauch unbedingt hilfe nächstes semester hab ich nämlich auch kein c++ mehr juhu........

danke schon mal

Developer_X

Treue Seele

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

2

09.01.2011, 09:54

Wo sind denn genau konkret deine Probleme bei der Entwicklung, ich kann dir zwar erklären, wie Pointer und Referenzen funktionieren, dafür musst du aber auch sagen, was genau deine Probleme sind, und genauere Angaben, wie das Programm denn konkret auszusehen hat.

Also hier ein kleines Tutorial :

Pointer (Zeiger)
Wenn man einen Integer Wert erstellt, dann wird der im Speicher erstellt. Damit dein Programm auch weiß, wo dieser Wert ist, gibt es einen Zeiger, eine Adresse, die auf ihn weist.
Hier probier das mal, in einem kleinen Programm :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
int main()
{
    int wert = 5;
    int *zeiger = &wert;
    cout << "Der Wert 'wert' hat den Wert : " << wert << endl;
    cout << "Der Wert 'wert' hat die Adresse : " << zeiger << endl;
    cout << "Der Wert 'wert' hat über die Adresse den Wert : " << *zeiger << endl;
    return 0;
}


Also wie erstellen einen Wert, namens wert, und geben ihm den Wert 5.
Danach erstellen wir einen Pointer, das * steht für den Datentyp pointer, der pointer muss außer dem * noch ein int,double,... enthalten. Der Datentyp außer dem * muss dem Typ entsprechen, von dem auch der Wert ist, auf den du zeigst. Also int.
Wir weisen dem Pointer *adresse die Adresse von wert zu. Benutzen wir wert kriegen wir immer eine 5, benutzen wir &wert, kriegen wir eine Adresse.
Nun lassen wir den Wert, und dessen Adresse ausgeben. Das wars auch schon.
Danach aber, lasser wir den Wert von 'wert' über den Pointer aus. Wir können also auf Werte zugreifen, ohne sie zu benutzen, in dem wir Pointer nutzen.
adresse = irgendeine Adresse
*adresse = der Wert von 'wert'. So einfach war das.

Wenn wir einen großen Datentyp hätten, z.B. ein double, und den einer Funktion übergeben, dann wäre das ja viel mehr Rechenzeit für den PC den double zu empfangen, als den Pointer des doubles, den Pointer haben immer die Größe eines Ints, egal worauf sie zeigen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void function(double* d);

int main()
{
    double wert = 20.2;
    double* zeiger_auf_wert = &wert;

    function(zeiger_auf_wert); // Wir übergeben einmal einen Pointer der Funktion 'function' 
    function(&wert); // und einmal direkt die Adresse, kann man auch so machen
}

void function(double* d)
{
    cout << "Wert des doubles : " << *d << endl; // Wir geben den Wert aus, nicht vergessen, *d = der Wert von dem double
}



Referenzen
So nun zu den Referenzen, die sind auch einfach fast das gleiche wie Zeiger, was man wann benutzt, habe ich dir unten noch einmal hingeschrieben, erst behandeln wir aber die Referenzen.

Referenzen sind einfach zu bedinen, ein kleines Beispiel:

C-/C++-Quelltext

1
2
    double wert = 20.2;
    double &wert = wert; // Referenz wird erstellt


Es ist einfacher Referenzen zu erklären, wenn man das bei der Parameterübergabe an eine Funktion sieht :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    double wert = 20.2;
    double& referenz_auf_wert = wert;

    function(referenz_auf_wert); // Wir übergeben einfach so die Referenz, ohne viel arbeit
}

void function(double& d)
{
    cout << "Wert des doubles : " << d << endl; // Wir können auf den Wert einfach so zugreifen, ohne viel Arbeit, mit *, oder &
}


Verwendung von Pointern und Referenzen (Was nutze ich wann?)
Pointer benutzt man, wenn man die Werte auch ändern will.
Referenzen benutzt man, wenn man nur die Werte lesen will.
Wenn du einen kleinen Typ wie einen bool, oder einen int übergibst, kannst du es gleich einfach so übergeben, da eh keine Zeit gespart wird.

Das alles ist wichtig, um Programme schnell machen zu können, und Zeit zu sparen.

So du siehst, ist eigentlich gar nicht so schwer, wenn du etwas nicht richtig verstanden hast, dann frage ruhig nocheinmal nach,
für alle anderen Fragen sind wir natürlich auch offen, nie vergessen, es gibt keine dumme Fragen, nur dumme Antworten!
8)

m.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Elmaron

unregistriert

3

09.01.2011, 10:29

(entfernt weil veraltet)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Elmaron« (07.01.2020, 23:08)


4

09.01.2011, 10:38

"double" ist ein ziemlich mieses Beispiel für einen großen Datentyp. Sag lieber eine Liste mit tausend Einträgen ist ein großer Datentyp (und ja, bei denen soltle man dann jedes unnötige kopieren vermeiden).
Die größe von doubles und ints ist nicht fest definiert und kann man schneller und mal langsamer sein. Und selbst wenn ein double 64 bit hat und ein int 32, würde ein 64 bit Prozessor beide vermutlich trotzdem gleich schnell kopieren (es sei denn, er kann irgendwas cleveres bei dem int optimieren, naja).
Lieber dumm fragen, als dumm bleiben!

jokester

Treue Seele

Beiträge: 125

Wohnort: Mainz

  • Private Nachricht senden

5

09.01.2011, 10:39

Wenn wir einen großen Datentyp hätten, z.B. ein double, und den einer Funktion übergeben, dann wäre das ja viel mehr Rechenzeit für den PC den double zu empfangen, als den Pointer des doubles, den Pointer haben immer die Größe eines Ints, egal worauf sie zeigen.
Falsch, sizeof(int) muss nicht gleich sizeof(void*) sein. Außerdem wird der Zugriff durch die Zeigerindirektion langsamer.

Zitat

Pointer benutzt man, wenn man die Werte auch ändern will.
Referenzen benutzt man, wenn man nur die Werte lesen will.
Bitte was? Referenzen nur lesend? Öhm... sicher.

Zitat

Das alles ist wichtig, um Programme schnell machen zu können, und Zeit zu sparen.

Zeiger sind keine Optimierung. Sind mehr da für dynamische Datenstrukturen und Verweise von Objekten untereinander, oder für Outputparameter von Funktionen, oder...

(In deinem Profil steht C++ von A bis Z... nu wundert mich aber doch nichts mehr :))
"There is a theory which states that if ever anyone discovers exactly what the Universe is for and why it is here, it will instantly disappear and be replaced by something even more bizarre and inexplicable. There is another theory which states that this has already happened" -- Douglas Adams.

Developer_X

Treue Seele

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

6

09.01.2011, 10:59

In C++ für Spieleprogrammierer, sind die 3 Regeln für die Verwendung auch in der Art geschildert, außerdem, ich weiß das auch, aber er hat das Thema doch noch nicht mal von Grund auf verstanden, da habe ich es versucht, so einfach wie möglich zu halten, versteht ihr?

Und ja, es ist ein mieses Beispiel einen double zu nehmen, am bestes struct, oder class, aber vielleicht kennt er die noch nicht,
okay? :thumbup:
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Elmaron

unregistriert

7

09.01.2011, 11:07

(entfernt weil veraltet)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Elmaron« (07.01.2020, 23:08)


Developer_X

Treue Seele

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

8

09.01.2011, 11:47

OK, tut mir leid, ich dachte ich könnte ihm damit helfen
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

9

09.01.2011, 11:54

Hallo

ich habe ein richtig großes Problem!!!!!!

Ich muss in einer Woche das komplette programm für Tower of hanois in C++ abgeben, wenn ich es nicht habe tschüß.....

(also ich bin wirklich zu doof dafür....)
Als wenn du wirklich zu doof dafuer bist, dann sollte es wirklich tschuess heissen. Ist ja der Sinn der ganzen Sache.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

09.01.2011, 15:32

Naja ich weiß nicht was genau du das machen sollst. Aber für Türme von Hanoi gibts nen relativ leichten Ansatz. Versuch es einfach rekursiv zu lösen. Sagen wir die Ringe liegen immer auf Stab A und sollen am Ende immer auf Stab C sein. Dann kannst du im Fall ein Ring, diesen direkt auf Stab C legen. Bei 2 Ringen nimmst du Stab B als Zwischenablage. Wenn du jetzt sagen wir mal 10 Ringe hast dann fängst du quasi an Türme von Hanoi mit 10 Ringen zu spielen. Dann gehst du weiter in die Tiefe und spielst es mit 9 Ringen und so weiter. Irgendwann bist du soweit das du Türme von Hanoi mit einem Ring spielst. Diesen kannst du dann direkt legen. Danach geht es wieder zurück. Die Erklärung ist jetzt relativ bescheiden ich weiß;) Kannst aber einfach nach der rekursiven Lösung für dieses Problem googlen. Sollte genug zu finden sein. Ansonsten sind bei Wikipedia noch weitere Möglichkeiten genannt. Das Problem kann man eigentlich auch mit wenig Programmiererfahrung lösen. Viel Erfolg dabei.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige