Funktionen und Rückgabewerte
-
Hallo,
erst einmal die eine Frage ( ich hab noch ne andere)
als Beispiel.#include <iostream> using namespace std; int add(int a, int b) { cout << " a und b" << endl; int r = a + b; return r; } int main(){ add(4, 5); cout << r << endl; return 0; }
Wie kann ich das Ergebnis "r" aus der Funktion add außerhalb der Funktion
weiternutzen? muss ich "r" global zuweisen ? Weil so funktioniert es ja nicht.Hat wer ein paar Worte?
Danke
Lou
-
int r = add( 4, 5 );
-
@Lou-Cyphr3 infdem du den Rückgabewert einer Variablen zuweist. Die muss nicht r heissen.
-
okay.
kann der Rückgabewert von Funktion A von Funktion B genutzt werden?
Wahrscheinlich bloß wie?
-
@Lou-Cyphr3
Du meinst so?int functionA( int x ) { return x * x; } int functionB( int y ) { return y * 2; } int main() { int test = 42; std::cout << functionB( functionA( test ) ); return 0; }
oder so
int main() { int test = 42; int resultA = functionA( test ); std::cout << functionB( resultA ); return 0; }
-
@Lou-Cyphr3: Du solltest doch Funktionen aus der Mathematik kennen (und wie man diese verschachtelt aufruft).
-
@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);
-
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 mitreturn
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 einreturn
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. -
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. Weilswitch(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, schreibeAlso 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 (undswitch
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