Funktionen und Rückgabewerte



  • @Th69 sagte in Funktionen und Rückgabewerte:

    Du solltest doch Funktionen aus der Mathematik kennen (und wie man diese verschachtelt aufruft).

    Vorsicht, da kommt dann eine funktionale Programmiersprache bei raus.

    a = b;
    b = 3;
    cout << a
    

    Warum kommt nicht 3 raus? Oft genug nachgefragt.



  • Ich meinte das in etwas so

    unsigned int menu(unsigned int tierwahl){
    
         cout << "Wähle ein Tier?" << endl
              << "1 - Affe" << endl
              << "2 - Hund" << endl;
         unsigned int tierwahl;
    
         do {
              cout << "? ";
              cin >> tierwahl;
              if ( tierwahl != 1 &&  tierwahl != 2)
                  cout << "Unzulässige Auswahl" << endl;
         }while ( tierwahl != 1 && tierwahl != 2);
     return  tierwahl; }
    
       // Dann würde ich gerne mit einem switch weiter machen
    

    also so ungefähr

    switch(tierwahl) {
         case 1 : irgendwas
    
         case 2 : anderes
    
      
    }
      
    
    

    Sollte ich das switch auch in eine Funktion packen oder lieber in der main behalten?



  • @Lou-Cyphr3 sagte in Funktionen und Rückgabewerte:

    Sollte ich das switch auch in eine Funktion packen oder lieber in der main behalten?

    Für eine Übungsaufgabe kannst du es in main() machen.

    Irgendwann wird es zu unübersichtlich.



  • okay danke.

    Wenn ich nun aber doch eine seperate Funktion, nennen wir sie
    switch, schreibe, kennt switch dann die variable tierwahl?



  • @Lou-Cyphr3 sagte in Funktionen und Rückgabewerte:

    nennen wir sie switch,

    Das wäre nicht so gut.

    kennt switch dann die variable tierwahl?

    Nein, das ist eine lokale Variable in tierwahl.
    Dafür gibt es Funktionsparamter.
    Die du im übrigen bei menu nicht brauchst, zumal du sie auch wieder in Zeile 6 überdeckst.



  • @Lou-Cyphr3 sagte in Funktionen und Rückgabewerte:

    unsigned int menu(unsigned int tierwahl){
    

    Wozu der Parameter tierwahl - den verwendest du ja eh nicht?

         do {
              cout << "? ";
              cin >> tierwahl;
              if ( tierwahl != 1 &&  tierwahl != 2)
                  cout << "Unzulässige Auswahl" << endl;
         } while ( tierwahl != 1 && tierwahl != 2);
    
    1. Die Wiederholung von tierwahl != 1 && tierwahl != 2 finde ich schlecht. Alternativ könntest du z.B. testen ob die Eingabe OK ist, und falls ja gleich mit return aus der Funktion rausgehen. Laufbedingung für die Schleife brauchst du dann gar keine mehr -> "Endlosschleife" (nur dass sie natürlich nicht wirklich endlos ist, weil sie ja ein return enthält). Manche Leute finden das doof, aber ich find's doofer die Bedingung zu wiederholen. Und fast genau so doof die Wiederholung der Bedingung mittels einer bool Hilfsvariable zu vermeiden.

    2. Probier mal was passiert wenn du da statt einer Zahl ein Wort eingibst.

       // Dann würde ich gerne mit einem switch weiter machen
    

    Dann mach das.

    switch (menu()) {
         case 1 : irgendwas
         case 2 : anderes
    

    Oder

    unsigned int const tierwahl = menu();
    switch (tierwahl) {
         case 1 : irgendwas
         case 2 : anderes
    

    Ich bevorzuge i.A. die 2. Variante, da sie angenehmer zu debuggen ist (du kannst beim Durchsteppen im Debugger sehr einfach und zuverlässig nachgucken was menu() zurückgegeben hat).

    Sollte ich das switch auch in eine Funktion packen oder lieber in der main behalten?

    Du solltest darauf achten dass deine Funktionen nicht zu gross werden und nicht zu viel tun. Idealerweise sollte eine Funktion halt genau eine Aufgabe haben, und abgrenzbare "Unter-Aufgaben" an Unterfunktionen delegieren. Wobei "eine Aufgabe" leider schwer genauer zu definieren ist. "Eine Aufgabe" kann dabei aber auch sein eine Abfolge von Schritten auszuführen, wobei diese Schritte dann typischerweise die "Unter-Aufgaben" sind. Sonst könnte man ja nie Programme machen die wie in diesem Beispiel erstmal etwas vom Benutzer abfragen (Schritt 1) und dann darauf reagieren (Schritt 2). Es genauer zu beschreiben ist leider nicht ganz einfach, sorry 🙂

    So lange das auf deine main Funktion noch zutrifft, spricht nix dagegen das switch direkt in der main Funktion zu haben. Ist natürlich abhängig von dem was "irgendwas" und "anderes" ist, aber so allgemein würde ich vermutlich eher dazu tendieren es in eine eigene Funktion auszulagern. Weil switch(tierwahl) halt verdächtig danach riecht dass es sich um eine schön abgrenzbare/definierbare "Unter-Aufgabe" handelt.



  • @Lou-Cyphr3 sagte in Funktionen und Rückgabewerte:

    Wenn ich nun aber doch eine seperate Funktion, nennen wir sie
    switch, schreibe

    Also erstmal geht das nicht, weil switch ein Keyword ist, und du kannst keine Funktionen (oder Klassen oder Variablen oder sonstwas) wie ein Keyword nennen. Ausgenommen sind kontextabhängige Keywords, aber von denen gibt's in C++ nicht sehr viele (und switch ist keines).

    Weiters sollte der Name der Funktion das beschreiben was sie tut. Und "switch" beschreibt IMO gar nichts. Ein beschreibender Name wäre z.B. "tierLautAusgeben" - also für eine Funktion die z.B. "Ugh" für Affe und "Wuff" für Hund ausgibt.



  • okay.
    Vielen Dank erstmal @hustbaer .
    Ich habe jetzt mal nachgeahmt, habe aber das Problem das sich menu() zweimal aufruft und erst dann die switch-Anweisung ausführt.

    #include <iostream>
    using namespace std;
    
    unsigned int menu(){
    
         cout << "Wähle ein Tier?" << endl
              << "1 - Affe" << endl
              << "2 - Hund" << endl;
    
         unsigned int tierwahl;
           
              cin >> tierwahl;
              if ( tierwahl != 1 &&  tierwahl != 2)
                  cout << "Das is kein Tier" << endl;
        
     return  tierwahl; }
    
     int main(){
    
       menu();
       unsigned int const tierwahl = menu();
    
       switch(tierwahl) {
         case 1 : cout << "irgendwas"<<endl;
                   break;
    
         case 2 :  cout << "anderes" <<endl;
    
                   break;
                        }
    
          return 0;
    }
    

    Wo habe ich was falsch verstanden?



  • Wieso rufst du denn menu 2x auf?



  • @out
    Der Wald vor lauter Bäumen.
    Danke