Funktion in main () erweitern [gelöst]



  • Danke für eure Antworten. Ich hab das Problem voerst gelöst, indem ich y global deklariere. Hier der Code:

    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    
    bool y;
    
    void RandomNumber (int value) {
        
        int x;
        
        srand(time(0));
        
        x = 1 + (rand() % 20);
        
            if (x<=value)
                y = true; 
                
            else   
                y = false;    
    }
    
    
    int main () {
        
        RandomNumber(10);
            
            if (y)
                std::cout << "Gewonnen!";
                
            else
                std::cout << "Verloren!";
    
        return 0;
    }
    
    

    Der richtige Einsatz der return-Anweisung will mir immer noch nicht in Kopf gehen. Muss wohl mehr lesen...

    Kleine Zusatzfrage: kann man diesen Ausdruck vereinfachen?

    if ((a.find("Ja") != std::string::npos) || (a.find("ja") != std::string::npos))



  • @Richard_Wunsch sagte in Funktion in main () erweitern:

    Ich hab das Problem voerst gelöst, indem ich y global deklariere.

    Das ist große Kacke.

    Mach eine vernünftige Funktion mit Rückgabewert.



  • @DirkB Mache ich, sobald ich verstanden habe wie.



  • Man braucht keine globale Variable, sondern nur das Verständnis von Funktionen. Solche Dinge sind leider so grundlegend, das man nicht weiß, wie man das erklären soll. Dein Code würde funktionierend jedenfalls so aussehen:

    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    
    
    bool RandomNumber (int value)
    {
    
        int x;
        bool y;
    
        srand(time(0));
    
        x = 1 + (rand() % 20);
    
        if (x<=value)
            y = true;
    
        else
            y = false;
    
        return y;
    }
    
    
    int main ()
    {
    
        int value = 10; //oder std::cin >> value;
    
        if ( RandomNumber(value) )
    
            std::cout << "Gewonnen!";
    
        else
            std::cout << "Verloren!";
    
        return 0;
    }
    

    Mit vernünftiger Klammersetzung wäre er auch übersichtlicher.



  • Danke für den Hinweis, habe es mittlerweile so gelöst:

    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    
    bool RandomNumber (int value) 
    {
        
        bool y;
        int x;
        
        srand(time(0));
        
        x = 1 + (rand() % 20);
        
            if (x<=value)
                y = true; 
                
            else   
                y = false;    
      
        return y;
    }
    
    
    int main () 
    {
        
        bool y = RandomNumber(10);
            
            if (y)
                std::cout << "Gewonnen!";
                
            else
                std::cout << "Verloren!";
    
        return 0;
    }
    

    Dachte nur es geht ein wenig "einfacher", also ohne den bool nocheinmal zu deklarieren.



  • Damit kann man leben, aber es ist wenig elegant, nochmal für die Rückgabe einer Funktion extra eine Variable zu deklarieren.

    So etwas lernt man aber vielleicht erst in der Praxis... Wichtiger ist aber erst man die Klammersetzung. Gewöhne es Dir nicht an, Scopes nur durch taps erkennen zu lassen. Früher oder später wirst Du drüberfallen.



  • @Richard_Wunsch srand sollte nur ein einziges mal im ganzen Programm ausgeführt werden.

    Jetzt ist dein Programm so trivial, das das nicht auffällt.
    Sobald die Funktion Randomnummer ein zweites mal aufgerufen wird, wird auch srand nochmal ausgeführt.



  • @lemon03 sagte in Funktion in main () erweitern [gelöst]:

    Damit kann man leben, aber es ist wenig elegant, nochmal für die Rückgabe einer Funktion extra eine Variable zu deklarieren.

    Prinzipiell sehe ich das so wie du, aber ich habe das auch schon anders gesehen und wurde angegangen, da ich sowas direkt mit "return" zurückgebe (zumindest in einem übersichtlichen Fall, wie oben). Das Stichwort dazu ist "Single Point Of Return".
    Meine Erwiderung, dass, wenn mehrere returns den Code zu unübersichtlich machen, die Funktion wahrscheinlich Refactored werden müsse, hätte ich mir besser gespart, das hat das ganze etwas eskaliert.



  • Ein viel größeres "Problem" als Klammern oder eine weitere Variable, wozu man durchaus unterschiedliche Meinungen haben kann, ist hier das Naming der Funktion!

    RandomNumber(int) - was erwatet man da als Rückgabe? Bestimmt nicht bool! Irgendwie ist das auch eine merkwürdige Funktion, deren allgemeinen Nutzen ich mir noch nicht erklären kann. Woher kommt die magische 20?

    Und das hier:

        bool y;
    
            if (x<=value)
                y = true; 
                
            else   
                y = false;
    
        return y;
    

    Dieser Code ist nicht nur merkwürig eingerückt, sondern man kann ihn auch verkürzen zu

        return x <= value; 
    


  • Vielen Dank für euer Feedback, hätte nicht gedacht, dass das noch so hohe Wellen schlägt.

    @DirkB @Schlangenmensch ich merke es mir für die Zukunft!

    @wob Ich habe versucht, die Funktion einem bool entsprechend zu benennen. Die 20 kommt vom modulo Operator. Deine Vereinfachung funktioniert hervorragend - danke dafür! Inwiefern merkwürdig eingerückt?

    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    
    
    
    bool WinOrLose (int value) 
    {
        
        srand(time(0));
        
        int x;
        
        x = 1 + (rand() % 20);
        
        return x <= value; 
    }
    
    
    int main () 
    {
        
        bool x = WinOrLose(10);
            
            if (x)
                std::cout << "Gewonnen!";
                
            else
                std::cout << "Verloren!";
    
        return 0;
    }
    
    
    

  • Mod

    Tolle Namen! WinOrLose ist True. Hat er nun gewonnen oder verloren? x ist False. Hat er nun gewonnen oder verloren?

    Warum ist Zeile 25 tiefer eingerückt als 23?



  • @SeppJ True = gewonnen, false = verloren. Was wäre denn ein aussagekräftigerer Name? TrueWinFalseLose? Danke für den Hinweis, habe es richtig eingerückt.

    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    
    
    
    bool WinOrLose (int value) 
    {
        
        srand(time(0));
        
        int x;
        
        x = 1 + (rand() % 20);
        
        return x <= value; 
    }
    
    
    int main () 
    {
        
        bool x = WinOrLose(10);
            
        if (x)
            std::cout << "Gewonnen!";
                
        else
            std::cout << "Verloren!";
    
        return 0;
    }
    
    
    


  • @Richard_Wunsch sagte in Funktion in main () erweitern [gelöst]:

    @DirkB ich merke es mir für die Zukunft!

    Idt es so schwer Zeile 10 nach 22 zu verschieben?



  • @DirkB Nope, ist es nicht. Here you go:

    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    
    
    
    bool WinOrLose (int value) 
    {
        int x;
        
        x = 1 + (rand() % 20);
        
        return x <= value; 
    }
    
    
    int main () 
    {
        srand(time(0));
        
        bool x = WinOrLose(10);
                
        if (x)
            std::cout << "Gewonnen!";
                    
        else
            std::cout << "Verloren!";
    
        return 0;
    }
    
    

  • Mod

    @Richard_Wunsch sagte in Funktion in main () erweitern [gelöst]:

    @SeppJ True = gewonnen, false = verloren. Was wäre denn ein aussagekräftigerer Name? TrueWinFalseLose? Danke für den Hinweis, habe es richtig eingerückt.

    Optimalerweise liest sich ein Programm wie ein Text. "Falls gewonnen oder verloren, dann gib aus 'gewonnen'". Klingt das sinnvoll? Nein, das ist Nonsens. Wie wäre es mit "Falls gewonnen, dann gib aus 'gewonnen'"?



  • Ah, verstehe. Danke für die Erklärung! Hoffe, so ist es besser:

    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    
    bool HasWon (int value) 
    {
        int x;
        
        x = 1 + (rand() % 20);
        
        return x <= value; 
    }
    
    int main () 
    {
        srand(time(0));
        
        bool x = HasWon(10);
                
        if (x)
            std::cout << "Gewonnen!";
                    
        else
            std::cout << "Verloren!";
    
        return 0;
    }
    
    
    

Anmelden zum Antworten