Switch Case problem



  • Hi Leute
    Ich hätt da mal ne frage zur switch case funktion
    funktioniert die nur mit konstanten oder auch so
    http://codepad.org/rVfyH2B6
    lg Seprim
    PS: Es soll ein Leiterspiel werden (Is wieder ne Schulaufgabe)


  • Mod

    switch geht nur mit Konstanten. Genauso wie in deinem Code. Daher verstehe ich die Frage nicht so ganz. Dein Code enthält aber haufenweise andere Fehler:
    1. Integerliterale haben keine ' ' drumrum.
    2. position + irgendwas ändert position nicht
    3. Viele andere Kleinigkeiten die gegenüber den Punkten 1+2 unwichtig sind



  • wenn du die Anzahl je >1 machst gibt augen trotzdem nur 1 würfelwurf wieder

    int wuerfel()   
    {	int i = 0;              // so spät einführen ie möglich
    	const int ANZAHL = 1;   // statt dem hier besser: int wuerfel(int Anzahl=1)
    	int augen = 0;
    		for (i; i < ANZAHL ; ++i)  // statt dem hier 
    		{
    			augen = (rand() % 6) + 1; // besser += statt =
    			if(augen == 0)            // unnötig da immer >0
    			{ 
    				continue;
    			}
    		}
    	return augen;
    }
    
    int wuerfel(int anzahl=1)   
    {
        int augen = 0;		
    	for (int i=0; i < anzahl ; ++i)
    	{
    		augen += (rand() % 6) + 1;
    	}
        return augen;
    }
    
    // alternativ:
    
    inline int wuerfel(int anzahl=1)   
    {
        if (anzahl <= 1)  
            return(rand() % 6 + 1);
    
        return ( ((rand() % 6) + 1) + wuerfel(--anzahl );
    }
    

    Deine switch funktioniert nicht da a) '.' ein char ist. Der convertiert also das Zeichen '5' in seinen ASCIIwert und vergleicht das. Lass einfach die ' ' weg dann passt es .. und füg unten ein

    default: std::cout << "falscher wert: " << position;break;
    

    ein. Wenns dann nicht tut mach mal ein paar debugaugaben von position, neuerposition usw rein - dann kommstr du drauf achja ... lies mal rand und srand nach 😃



  • neueposition = position + augen;
    position = neueposition;
    

    kann man auch in das hier ändern

    position += augen;
    // oder
    position = position + augen;
    


  • padreigh schrieb:

    Deine switch funktioniert nicht da a) '.' ein char ist.

    in welcher Zeile hast du das denn gefunden???
    Hier noch der geänderte Code aber der springt immer wider über die switch drüber ohne sie auszuführen obwohl er den Int-Wert annimmt aktiviert

    //filename: Leiterspiel.cpp
    
    #include <iostream>
    #include <time.h>
    using namespace std;
    
    //Funktionsdeklarationen
    int wuerfel();
    
    int main()
    {
    	int augen = 0;
    	int position = 0;
    	int spiele = 0;
    	int neueposition = 0;
    	int anzahl = 0;
    	cout << "Geben sie die Anzahl der zu simulierenden Spiele ein: ";
    	cin >> anzahl;
    		for (spiele; spiele < anzahl; ++spiele)
    		{
    			augen = wuerfel();
    			neueposition = position + augen;
    			switch(position)
    			{
    			case '5':
    			{
    				neueposition = position + 21;
    			} break;
    			case '9':
    			{
    				neueposition = position + 9;
    			} break;
    			case '18':
    			{
    				neueposition = position - 9;
    			} break;
    			case '23':
    			{
    				neueposition = position + 22;
    			} break;
    			case '26':
    			{
    				neueposition = position - 21;
    			} break;
    			case '31':
    			{
    				neueposition = position + 5;
    			} break;
    			case '35':
    			{
    				neueposition = position - 5;
    			} break;
    			case '39':
    			{
    				neueposition = position + 27;
    			} break;
    			case '45':
    			{
    				neueposition = position - 22;
    			} break;
    			case '46':
    			{
    				neueposition = position + 8;
    			} break;
    			case '49':
    			{
    				neueposition = position + 5;
    			} break;
    			case '53':
    			{
    				neueposition = position + 28;
    			} break;
    			case '54':
    			{
    				neueposition = position - 5;
    			} break;
    			case '58':
    			{
    				neueposition = position - 8;
    			} break;
    			case '61':
    			{
    			   neueposition = position + 13;
    			} break;
    			case '66':
    			{
    				neueposition = position - 27;
    			} break;
    			case '68':
    			{
    				neueposition = position + 30;
    			} break;
    			case '74':
    			{
    				neueposition = position - 13;
    			} break;
    			case '77':
    			{
    				neueposition = position + 13;
    			} break;
    			case '79':
    			{
    				neueposition = position  + 8;
    			} break;
    			case '81':
    			{
    				neueposition = position - 28;
    			} break;
    			case '87':
    			{
    				neueposition = position - 8;
    			} break;
    			case '90':
    			{
    				neueposition = position - 13;
    			} break;
    			case '98':
    			{
    				neueposition = position - 30;
    			} break;
    			}
    			position = neueposition;
    			cout << "Position: " << position << endl;
    		}
    	return 0;
    
    }
    
    //Funktionsdefinitionen
    int wuerfel()
    {	int i = 0;
    	const int ANZAHL = 1;
    	int augen = 0;
    		for (i; i < ANZAHL ; ++i)
    		{
    			augen = (rand() % 6) + 1;
    			if(augen == 0)
    			{ 
    				continue;
    			}
    		}
    	return augen;
    }
    

    und das mit dem einen Würfelwurf soll ja auch so sein, ich habs anderst nicht implementiert bekommen, dass er bei 0 die überspringt



  • Warum verstehst du die Tipps nicht die dir gegeben wurden?

    Hier mal im Quelltext:

    //filename: Leiterspiel.cpp
    
    #include <iostream>
    #include <ctime> // hier ist der c++ Header angesagt
    using namespace std;
    
    //Funktionsdeklarationen
    int wuerfel();
    
    int main()
    {
        int augen = 0;
        int position = 0;
        int spiele = 0;
        int neueposition = 0;
        int anzahl = 0;
    
        // hier fehlt die Initialisierung von rand()
        cout << "Geben sie die Anzahl der zu simulierenden Spiele ein: ";
        cin >> anzahl;
        for (spiele; spiele < anzahl; ++spiele)
        {
            augen = wuerfel();
            neueposition = position + augen;
            switch(position)
            {
            case 5:  // '.' sollte heissen ohne '
                neueposition = position + 21;
                break;
            case 9:
            {
                neueposition = position + 9;
                break; // wenn schon Klammern, dann so
            }
    

    Bei den ' grösser 9 hat mein Compiler auch Warnungen heraus gegeben!
    Eine Fehlermeldung war auch noch weiter unten - kann aber compilerspezifisch sein.

    MfG f.-th.



  • Dein Programm kompiliert weil intern gecastet wird. Alle einzelnen Zeichen die zwischen zwei ' stehen werden als char (datentyp, google es) angesehen. Die sind problemlos in ein int cast-bar (google c++ cast). Du vergleichst also den ASCII Wert von dem Zeichen '9' mit wasimmer in deiner int variablen steht. Ein char besteht immer nur aus EINEM Zeichen, deshalb motzt der wenn du zwischen zwei ' ZWEI Zeichen packst.

    '.' steht für "genau ein Zeichen zwischen zwei '" -> google RegExp bedeutung . Und was bitte ist an rand()%6+1 IMMER UNGLEICH 0 unverständlich? --> google modulo und spiel mal mit rum.


Log in to reply