Variablen



  • Hallo,

    Ich habe das Nimm-Spiel aus Volkards Tutorial programmiert.

    So funktioniert es:

    #include <iostream.h>
    #include <stdlib.h>
    
    int ZugSpieler(int anzahlMuenzen)
    {
       int genommeneMuenzen=0;
       while (genommeneMuenzen<1 || genommeneMuenzen>3)
          {
          cout<<"Es liegen "<<anzahlMuenzen<<" auf dem Tisch."<<endl;
          cout<<"Wieviele Muenzen moechten Sie nehmen? ";
          cin>>genommeneMuenzen;
          if (genommeneMuenzen<1 || genommeneMuenzen>3)
             cout<<"Sie duerfen nur 1 bis 3 Muenzen nehmen!"<<endl;
          else
             return genommeneMuenzen;
          };
    };
    
    int ZugRechner(int anzahlMuenzen)
    {
       int genommeneMuenzen=anzahlMuenzen%4;
       if(genommeneMuenzen == 0)
          genommeneMuenzen=1;
    
       return genommeneMuenzen;
    };
    
    int main()
    {
       int anzahlMuenzen;
       int genommeneMuenzen;
       cout<<"Anzahl der Muenzen bei Spielbeginn: ";
       cin>>anzahlMuenzen;
    
       while(true)
       {
          genommeneMuenzen=ZugRechner(anzahlMuenzen);
          anzahlMuenzen=anzahlMuenzen-genommeneMuenzen;
          cout<<"Rechner nimmt "<<genommeneMuenzen<<" Muenzen."<<endl;
          if (anzahlMuenzen==0)
          {
             cout<<"\nRechner hat gewonnen!"<<endl;
             break;
          };
          anzahlMuenzen=anzahlMuenzen-ZugSpieler(anzahlMuenzen);
          if (anzahlMuenzen==0)
          {
             cout<<"\nSie haben gewonnen!"<<endl;
             break;
          };
       };
    
          system("PAUSE");
          return 0;
    };
    

    Wenn ich das Hauptprogramm aber so schreibe steht immer "Rechner zieht 65536":

    int main()
    {
       int anzahlMuenzen;
       int genommeneMuenzen;
       cout<<"Anzahl der Muenzen bei Spielbeginn: ";
       cin>>anzahlMuenzen;
    
       while(true)
       {
          anzahlMuenzen=anzahlMuenzen-ZugRechner(anzahlMuenzen);
          cout<<"Rechner nimmt "<<genommeneMuenzen<<" Muenzen."<<endl;
          if (anzahlMuenzen==0)
          {
             cout<<"\nRechner hat gewonnen!"<<endl;
             break;
          };
          anzahlMuenzen=anzahlMuenzen-ZugSpieler(anzahlMuenzen);
          if (anzahlMuenzen==0)
          {
             cout<<"\nSie haben gewonnen!"<<endl;
             break;
          };
       };
    
          system("PAUSE");
          return 0;
    };
    

    Offensichtlich wird der Wert der Variable "genommeneMuenzen" bei

    anzahlMuenzen=anzahlMuenzen-ZugSpieler(anzahlMuenzen);
    

    korrekt angenommen.

    Wenn ich aber anschließend den Wert der Variable "genommeneMuenzen" ausgeben will wird immer 65536 ausgegeben???

    Warum funktioniert die 2.Variante nicht?

    mfg
    Christian



  • also... schau dir die schleife nochmal genauer an...

    ich seh da nämlich nur einmal das Wort genommene Münzen



  • @Ch.Petry :
    Dir ist wahrscheinlich nicht klar, dass die Variable genommeneMuenzen in main und genommeneMuenzen in der Funktion ZugRechner nichts miteinander zu tun haben, auch wenn sie gleich heißen.



  • Schon klar,
    einmal habe "genommeneMuenzen" im Hauptprogramm und einmal in den beiden Funktionen.

    Ich nahm aber an wenn ich eine dieser Funktionen ausführe wird der (zufällige, weil bisher nicht definierte)Wert der Variablen "genommeneMuenzen" überschrieben?

    Dem ist aber offensichtlich nicht so?!?

    Das bedeutet die Variblen der Funktion haben nichts mit den Variblen im Hauptprogramm zu tun?
    D.h. ich muss die Funktion entweder jedesmal ausführen wenn ich das Ergebnis dieser Funktion brauche oder ich muss das Ergebnis wie bei der 1.Variante in eine Variable schreiben?



  • Betrachten wir die main:

    int main()
    {
       int anzahlMuenzen;
       int genommeneMuenzen;
       cout<<"Anzahl der Muenzen bei Spielbeginn: ";
       cin>>anzahlMuenzen;
    
       while(true)
       {
          anzahlMuenzen=anzahlMuenzen-ZugRechner(anzahlMuenzen);
          cout<<"Rechner nimmt "<<genommeneMuenzen<<" Muenzen."<<endl;
    

    Du nutzt jetzt genommeneMuenzen, aber die wurden hier doch niemals auf irgendwas gesetzt, du hast also keinen sinnvollen Wert in genommeneMuenzen drin!

    Oder wo sollte der festgelegt werden?
    Auf diese Weise jedenfalls würde der Rechner... recht viele Münzen nehmen, schätze ich.

    MfG MAV



  • Ich habs jetzt kapiert.

    Zuerst dachte ich:
    Die Variable habe ich doch in der Funktion "ZugRechner(anzahlMuenzen)" definiert (bzw.die Variable wird dort "berechnet").
    Bevor nun "genommeneMuenzen" ausgegeben werden soll wird die Funktion "ZugRechner(anzahlMuenzen)" ausgeführt und somit der Variablen "genommeneMuenzen" ein Wert zugewiesen.

    Jetzt habe ich aber verstanden das jede Funktion seine eigenen Variablen hat.
    Ausserdem gibt die Funktion "ZugRechner(anzahlMuenzen)" nicht z.B."genommeneMuenzen=2" aus sondern nur "2", daher wird auch der Wert der Variablen "genommeneMuenzen" im Hauptprogramm nicht auf "2" gesetzt.

    War halt kurzzeitig etwas verwirrt...

    Ich sehe den Sinn darin zwar nicht (mehrere gleichnamige Variaben in verschiedenen Funktionen würden doch nur alles völlig unübersichtlich machen???), aber das liegt vielleicht daran das ich noch ziemlich am Anfang stehe in Sachen C++...

    mfg
    Christian


Anmelden zum Antworten