Funktion Pow rot unterringelt
-
Hallo liebe Gemeinde.
Ich wollte die Grundrechenarten +, -, * und / (Geteilt), Potenz und Wurzel als Funktion programmieren.
Dabei wurde folgender Teilcode rot unterringelt:
float Pot (float m, float n) { cout << "Funktion Potenz!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> m, n; float o = pow (m,n); return o; }cout, cin, m,n und return wurden rot unterringelt und ich habe keine Ahnung warum???
Der Gesamtcode ist wie folgt:
#include <iostream> #include <math.h> using namespace std; //Funktionen float Add (float a, float b) { cout << "Funktion Add!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> a, b; float c = a + b; return c; } float Sub (float d, float e) { cout << "Funktion Sub!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> d,e; float f = d - e; return f; } float Mul {float g, float h) { cout << "Funktion Mul!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> g,h; float i = g*h; return i; } float Div (float j, float k) { cout << "Funktion Div!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> j,k; float l = j / k; return l; } float Pot (float m, float n) { cout << "Funktion Potenz!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> m, n; float o = pow (m,n); return o; } float Wur (float p) { cout << "Funktion Wurzel" << endl; cout << "Eine Zahl bitte!" << endl; cin >> p; float q = sqrt (p); return q; } int main () { cout << "Taschenrechner!" << endl; cout << endl; cout << "1. Addition!" << endl; cout << "2. Subtraktion!" << endl; cout << "3. Multiplikation!" << endl; cout << "4. Division!" << endl; cout << "5. Potenz!" << endl; cout << "6. Wurzel!" << endl; cout << endl; c=Add(a,b); f=Sub(d,e); i=Mul(g,h); l=Div(j,k); o=Pot(m,n); q=Wur(p); return 0; }Hättet ihr einen Tipp bzw. einen Hinweis, warum es falsch ist??
Vielen Danke im Voraus für die Antworten.
Gruß
Max
-
Deine Klammern passen nicht zusammen. Manchmal benutzt du { und schließt mit ) und ähnliche Scherzchen. Und es ist natürlich immer nur jeweils eines richtig, Konsistenz alleine würde nicht reichen :p .
Außerdem machen Konstrukte wie
cin >> a, b;nicht das, was du vermutlich denkst. Du meinst wohlcin >> a >> b;. Und bei den Funktionen meinst du wohl jeweils:void Add () { float a,b; cout << "Funktion Add!" << endl; cout << "Zwei Zahlen bitte!" << endl; cin >> a, b; float c = a + b; cout << c; }Das andere wäre ziemlicher Unsinn, da du die Funktionparameter gar nicht benutzt. Und den Rückgabewert ebenfalls nicht. Dann ruft man sie auf mit
Add();. Oder du machst es umgekehrt:float Add (float a, float b) { return a + b; }Und liest dann in der main die Zahlen ein und übergibst sie an die Funktion. Dann sieht der Aufruf so ähnlich aus, wie jetzt in der main.
In der main möchtest du vermutlich noch irgendeine Art Kontrollstruktor, vielleicht ein paar if oder ein switch und vielleicht auch eine Schleife, anstatt einfach gar nichts.
Allgemein: Wenn du Fehler hast, einfach mal versuchen zu compilieren. Immer mit höchsten Warnoptionen und Warnungen wie Fehler ansehen. Dann sagt dir der Compiler schon, was nicht stimmt. Diese Fehlermeldungen musst du lesen lernen, um später eigenständig Probleme beheben zu können. Der GCC 4.6 (die Lesbarkeit der Fehlermeldungen dieser Version wurden stark verbessert
) gibt zu deinem Programm beispielsweise aus:test.cc: In function ‘float Add(float, float)’: test.cc:11:17: warning: right operand of comma operator has no effect [-Wunused-value] test.cc: In function ‘float Sub(float, float)’: test.cc:22:16: warning: right operand of comma operator has no effect [-Wunused-value] test.cc: At global scope: test.cc:27:7: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x [enabled by default] test.cc:27:12: error: expected primary-expression before ‘float’ test.cc:27:12: error: expected ‘}’ before ‘float’ test.cc:27:12: error: expected ‘,’ or ‘;’ before ‘float’ test.cc: In function ‘float Div(float, float)’: test.cc:40:16: warning: right operand of comma operator has no effect [-Wunused-value] test.cc: In function ‘float Pot(float, float)’: test.cc:49:17: warning: right operand of comma operator has no effect [-Wunused-value] test.cc: In function ‘int main()’: test.cc:75:5: error: ‘c’ was not declared in this scope test.cc:75:11: error: ‘a’ was not declared in this scope test.cc:75:13: error: ‘b’ was not declared in this scope test.cc:76:5: error: ‘f’ was not declared in this scope test.cc:76:11: error: ‘d’ was not declared in this scope test.cc:76:13: error: ‘e’ was not declared in this scope test.cc:77:5: error: ‘i’ was not declared in this scope test.cc:77:11: error: ‘g’ was not declared in this scope test.cc:77:13: error: ‘h’ was not declared in this scope test.cc:77:14: error: ‘Mul’ cannot be used as a function test.cc:78:5: error: ‘l’ was not declared in this scope test.cc:78:11: error: ‘j’ was not declared in this scope test.cc:78:13: error: ‘k’ was not declared in this scope test.cc:79:5: error: ‘o’ was not declared in this scope test.cc:79:11: error: ‘m’ was not declared in this scope test.cc:79:13: error: ‘n’ was not declared in this scope test.cc:80:5: error: ‘q’ was not declared in this scope test.cc:80:11: error: ‘p’ was not declared in this scopeWas all die Probleme abdeckt, die ich angesprochen habe. Daher habe ich sie ja auch so schnell gefunden. Eine falsche klammer sieht man optisch kaum, aber der Compiler (oder ein Editor mit Klammernzählung) sieht das sofort.
Und noch eine Analyse deiner Fehler: Du scheinst noch nicht den rechten Durchblick bei Funktionen, Skopes und den Grundlagen der Streams zu haben. Dringend nachholen! Insbesondere scheinst du zu glauben, dass die Variablennamen in deinen Funktionen auch sonstwo noch gültig wären. Sind sie aber nicht! Und das ist auch gut so!
P.P.S.: Und
math.hheißt in C++cmath(ohne .h!).
-
So wie ich dich verstanden habe, darf ich alles neu schreiben??
-
silent_max schrieb:
So wie ich dich verstanden habe, darf ich alles neu schreiben??
Refactoring ist manchmal einfach die beste Lösung
(anstatt einfach drumherum zu programmieren bis es irgendwie geht
)Kleiner Tipp zu Scopes:
Wenn du
cout << irgendwas;schreibst, beachte das:
coutbefindet sich im Namensraumstd. Das bedeutet, du kannst insgesamt drei Arten wählen, den Namencout(ausstd) zu verwenden:using std::cout; //Hier teilst du dem Compiler mit, dass ein spezifischer Name //ohne Namensraum + Scope-Operator verwendet werden kann. Also kannst du jetzt //(nur!) cout ohne std:: schreiben. using namespace std;//Die IMO schlechteste Lösung: Einfach den kompletten Namensraum ausschütten. Das ist einfach aber nicht schön, bitte gewöhn dir das nicht an. std::cout << "Hallo!\n";//Die eigentlich einfachste Lösung: Einfach std (der Namensraum-Name ^^) und den sog. Scope-Operator :: vor cout schreiben.Edit: Natürlich gibt es noch mehr möglichkeiten (die aber alle eig. schlechter sind als die oben genannten (und die auch so keiner verwendet)):
std::ostream& cout = std::cout; #define cout std::cout //Wars das?