Anfänger



  • Hallo,
    ich bin c++ anfänger und komme bei einer Aufgabe nicht weiter, die lautet:

    Lass die Münze vom Programm so oft werfen, bis eine Münzseite 50x gekommen ist und gib dann das Ergebnis folgendermaßen aus
    (Schalter (zum "Ausschalten des Werfens") einbauen!):

    Bsp1:

    Kopf Kopf Zahl Kopf Zahl Zahl Zahl Zahl Kopf Zahl
    Kopf Zahl Zahl Zahl Zahl Kopf Zahl Zahl Zahl Zahl
    Kopf Zahl Zahl Zahl Zahl Kopf Zahl Zahl Zahl Zahl
    Zahl Zahl Zahl Zahl Zahl Kopf Zahl Zahl Zahl Zahl
    Zahl Zahl Zahl Zahl Zahl Zahl Zahl Kopf Kopf Zahl
    Kopf Zahl Zahl Zahl Zahl Zahl Zahl Zahl Zahl Zahl
    Kopf Zahl Zahl

    Münzwurf wurde abgebrochen, weil "Zahl" 50x gekommen ist.
    Die Kopf-Seite ist 12x gefallen.

    jetzt komme ich beim Schalter nicht weiter! Mein Ansatz:

    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    #include <stdio.h>
    
    using namespace std;
    int main()
    {
        int zahl=0,kopf=0;
        bool schalter=true;
        srand(time(NULL));
    
        while (schalter)
        {
            if(kopf <50 || zahl<50)
            {
                for ( int i=1; i<=100; i++ )
                {
                    if ( rand() % 2 == 0 )
                    {
                        cout<<"Kopf ";
                        ++kopf;
                    }
                else
                    {
                        cout<<"Zahl ";
                        ++zahl;
                    }
                if ( i % 10 == 0 )
                    cout<<"\n";
    
                if (kopf || zahl >50)
                    schalter=false;
        }}}
    
        cout << kopf <<endl;
        cout << zahl;
    }
    

    kann mir jemand helfen?



  • für was hast du die For-Schleife? ohne die müsste es funktionieren (musst nur die Durchläufe dann mit einer Variablen zählen, wenn du immer nach 10 Würfen die neue Zeile willst...)



  • also for schleife weg und eine neue variable für den zeilenumbruch einführen?

    stimmt denn der rest mit dem schalter?



  • dejavu o.O

    vll solltest du nicht alle deine threads "anfänger" nennen^^



  • Ich wusste, dass mir der Thread bekannt vorkommt.



  • haha, ja vl. aber ich lerne 😃



  • ich habs jetzt umgeändert, stimmt aber immer noch nicht.

    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    #include <stdio.h>
    
    using namespace std;
    int main()
    {
        int zahl=0,kopf=0;
        bool schalter=true;
        srand(time(NULL));
    
        while (schalter)
        {
            while(kopf <50 || zahl<50)
                {
                if ( rand() % 2 == 0 )
                    {
                        cout<<"Kopf ";
                        ++kopf;
                    }
                else
                    {
                        cout<<"Zahl ";
                        ++zahl;
                    }
    
                if (kopf >50 || zahl >50)
                    schalter=false;
        }}
    
        cout <<"\n\nKOPF: "<< kopf <<endl;
        cout <<"ZAHL: " <<zahl;
    }
    

    was mache ich falsch?



  • int main()
    {
        int zahl=0, kopf=0;
        srand(time(NULL));
    
        while(kopf < 50)
        {
            if ( rand() % 2 == 0 )
            {
                cout<<"Kopf ";
                ++kopf;
            }
            else
            {
                cout<<"Zahl ";
                zahl++;
            }
        }
    
        cout <<"\n\nKOPF: "<< kopf <<endl;
        cout <<"ZAHL: " <<zahl;
    }
    

    so sollte das wohl funktionieren
    den schalter braucht du nicht wirlich.



  • ich muss den schalter ja verwenden, ist in der aufgabenstellung (oben) gegeben.



  • int main() 
    { 
        int zahl=0, kopf=0; 
        srand(time(NULL));
        bool schalter = false;
    
        while(!schalter) 
        { 
            if ( rand() % 2 == 0 ) 
            { 
                cout<<"Kopf "; 
                kopf++;
    
                if (kopf >= 50)
                    schalter = true;
            } 
            else 
            { 
                cout<<"Zahl "; 
                zahl++; 
            }
        } 
    
        cout <<"\n\nKOPF: "<< kopf <<endl; 
        cout <<"ZAHL: " <<zahl; 
    }
    

    dann eben so^^



  • das funktioniert auch nit richtig, denn ich bekomme zahlen über 50 raus, aber normalerweiße soll es bei maximal 50 stoppen ^^



  • versuchs nochmal, eben editiert^^

    EDIT:
    oh, verlesen, und ja, seppj hat recht, ne if noch in Zahl und alles wird gut^^


  • Mod

    Niko.S schrieb:

    das funktioniert auch nit richtig, denn ich bekomme zahlen über 50 raus, aber normalerweiße soll es bei maximal 50 stoppen ^^

    Dann musst du das bei Zahl eben auch noch prüfen. Zeig mal ein bisschen Initiative.



  • Niko.S schrieb:

    das funktioniert auch nit richtig, denn ich bekomme zahlen über 50 raus, aber normalerweiße soll es bei maximal 50 stoppen ^^

    Könntest auch mal selber nachdenken 🙄 Schwer ist es nicht, das zu korrigieren.

    int main()
    {
    	int zahl=0, kopf=0;
    	srand(time(NULL));
    
    	while(kopf < 50 && zahl < 50)
    	{
    		if (rand() % 2 == 0 )
    		{
    			cout<<"Kopf ";
    			++kopf;
    		}
    		else
    		{
    			cout<<"Zahl ";
    			zahl++;
    		}
    	}
    
    	cout <<"\n\nKOPF: "<< kopf <<std::endl;
    	cout <<"ZAHL: " <<zahl;
    }
    


  • anti-freak, deine version klappt wieder nicht ^^

    aber ich habs selber hinbekommen

    int main()
    {
        int zahl=0, kopf=0;
        srand(time(NULL));
        bool schalter = true;
    
        while(schalter)
        {
            if ( rand() % 2 == 0 )
            {
                cout<<"Kopf ";
                ++kopf;
    
                if (kopf >= 50)
                    schalter = false;
            }
            else
            {
                cout<<"Zahl ";
                zahl++;
    
                if (zahl >= 50)
                    schalter=false;
            }
        }
        cout <<"\n\nKOPF: "<< kopf <<endl;
        cout <<"ZAHL: " <<zahl;
    }
    

    danke für die hilfe 😃



  • er will es ja mit dem bool

    int main() 
    { 
        int zahl=0, kopf=0; 
        srand(time(NULL)); 
        bool schalter = false; 
    
        while(!schalter) 
        { 
            if ( rand() % 2 == 0 ) 
            { 
                cout<<"Kopf "; 
                kopf++;
            } 
            else 
            { 
                cout<<"Zahl "; 
                zahl++; 
            }
    
            if (zahl >= 50 || kopf >= 50)
                schalter = true;
        } 
    
        cout <<"\n\nKOPF: "<< kopf <<endl; 
        cout <<"ZAHL: " <<zahl; 
    }
    

  • Mod

    So, hier noch die ultimative TMP-Lösng (außer, dass man den Zufallsgenerator natürlich auch noch zur Compilezeit auswerten könnte, aber dann wäre der mehrfache Aufruf des Programms etwas witzlos):

    #include <cstdlib>
    #include <iostream>
    #include <ctime>
    
    const unsigned limit = 50;
    
    template<unsigned kopf, unsigned zahl> struct muenzwurfzaehler
    {
      void operator()()
      {
        if (std::rand() %2)
          muenzwurfzaehler<kopf+1, zahl>()();
        else
          muenzwurfzaehler<kopf, zahl+1>()();
      }
    };
    
    template<> template<unsigned kopf> struct muenzwurfzaehler<kopf, limit>
    {
      void operator()()
      {
        std::cout << "Abgebrochen, da " << limit << "xZahl. Zählerstand für Kopf ist " << kopf << '\n';
      }
    };
    
    template<> template<unsigned zahl> struct muenzwurfzaehler<limit ,zahl>
    {
      void operator()()
      {
        std::cout << "Abgebrochen, da " << limit << "xKopf. Zählerstand für Zahl ist " << zahl << '\n';
      }
    };
    
    int main()
    {
      std::srand(std::time(0));
      muenzwurfzaehler<0,0>()();
    }
    

    Das Programm ist auch ein wunderbarer Compilerkiller. 50 geht als Spitzenwert noch gut in ein paar Sekunden, aber bei 500 kam mein Rechner schon ganz gut ins Schwitzen.

    edit: Benutzer von MSVC müssen glaube ich noch ein bisschen was an der Syntax der partiellen Spezialisierungen ändern, damit das Programm bei ihnen übersetzt, da MSVC sich da nicht strikt an den Standard hält. Wie genau, dass müsst ihr nachschlagen oder auf jemanden warten, der MSVC und TMP benutzt. camper? pumuckl?



  • Treadtitel schrieb:

    Anfänger

    ich denke das ist ein wenig überfordernd, wenn er noch nichtmal richtig mit bools umgehen kann^^
    zumal hier ebenso sein condition bool fehlt 😛


  • Mod

    anti-freak schrieb:

    Treadtitel schrieb:

    Anfänger

    ich denke das ist ein wenig überfordernd, wenn er noch nichtmal richtig mit bools umgehen kann^^
    zumal hier ebenso sein condition bool fehlt 😛

    Ja, das war auch nicht wirklich für ihn, sondern eher für andere, damit man mal sieht, was so alles möglich ist. Und für mich selbst zur Übung. TMP braucht man in der Praxis so selten, ist aber so cool 🕶 , da möchte ich drin fit bleiben. Da sind solche Beispiele gerade recht.



  • ok, wenn das für alle ist, dann komme ich gerade an einen punkt, zu fragen, für was man sowas braucht^^
    sehe da eher keine verwendungszwecke, für was sowas sinnvoll sein soll.

    und ja, ich weiß was templates sind, aber sehe nicht was es für einen sinn hat, sowas einfaches so zu verkomplizieren (außer natürlich der übung).



  • Templates nutzt man (normalerweise) auch eher für Typen. Aber auch andere Dinge können nützlich sein:

    template<typename T, unsigned int N>
    class Vector
    {
      T data_[N];
    public:
      ...
    };
    

    Die Lösung von SeppJ war natürlich eher scherzhaft gemeint.


Anmelden zum Antworten