Unterprogramme - Rechner
-
ergebnis = add(ergebnis,zahl); ... //Definition der Additions-Funktion int add(int x, int y) { return x + y; }
Du mußt schon verstehen (wollen), was die Parameter und Rückgabewerte einer Funktion sind.
Und entferne die globalen Variablen und packe sie in die main-Funktion:
int main() { int zahl; int ergebnis=0; ... }
Und mein Tipp mit dem Debugger gilt immer noch -)
-
int add(int, int) //Definition einer Funktion { return zahl + ergebnis; }
was soll add machen?
richtig, sie(die funktion) soll die beiden parameter, die ihr übergeben wurden, addieren - aber deine addiert einfach 2 globale variablen(die du dazu noch nicht mal brauchst!)int add(int lhs, int rhs) { return lhs + rhs; } int main() { int a = 23; int b = 3; int x = add(a, b); }
so wird eine funktion aufgerufen...
bb
-
okay die funktionsaufrufer funktionieren nun, vielen dank dafür
hab nun versucht eine hochrechnung einzubauen, allerdings bekomme ich folgende fehlermeldung, die ich *tadaa* natürlich nicht versteh:Fehler 1 error C2668: 'pow': Mehrdeutiger Aufruf einer überladenen Funktion c:\Users\sezai11\Documents\Visual Studio 2008\Projects\Uni_Prog1\testing\testing.cpp 58
#include <iostream> #include <math.h> using namespace std; int plus(int, int); int minus(int, int); int mal(int, int); int durch(int, int); int hoch(int, int); int main() { int ergebnis=0; int zahl; bool abfrage=true; char zeichen; while(abfrage) { cout << ergebnis; cin >> zeichen; switch(zeichen) { case '+':cin >> zahl;ergebnis=plus(ergebnis, zahl); break; case '-':cin >> zahl;ergebnis=minus(ergebnis, zahl); break; case '*':cin >> zahl;ergebnis=mal(ergebnis, zahl); break; case '/':cin >> zahl;if(zahl!=0){ergebnis=durch(ergebnis, zahl);}else{cout << "nicht durch 0 teilen\n";} break; case '^':cin >> zahl;ergebnis=hoch(ergebnis, zahl); break; case 'c':ergebnis=0; break; case 'e':abfrage=false; break; default:cout << "bitte Rechenzeichen eingeben\n";break; } } } int plus(int lhs, int rhs) { return lhs + rhs; } int minus(int lhs, int rhs) { return lhs - rhs; } int mal(int lhs, int rhs) { return lhs * rhs; } int durch(int lhs, int rhs) { return lhs / rhs; } int hoch(int lhs, int rhs) { return pow(lhs,rhs); }
-
sezai11 schrieb:
okay die funktionsaufrufer funktionieren nun, vielen dank dafür
np - ich hoffe, du hast dir das kapitel in deinem buch noch ma durchgelesen, sonst weist du es das nächste mal wieder nicht!?
hab nun versucht eine hochrechnung einzubauen, allerdings bekomme ich folgende fehlermeldung, die ich *tadaa* natürlich nicht versteh:
Fehler 1 error C2668: 'pow': Mehrdeutiger Aufruf einer überladenen Funktion c:\Users\sezai11\Documents\Visual Studio 2008\Projects\Uni_Prog1\testing\testing.cpp 58
du rufst eine fkt(pow) auf und der compiler weiß nicht, welche version du meinst - es gibt mehrere, die gleich gut(schlecht^^) passen ;o)
#include <iostream> #include <math.h>
der header heißt
cmath
und nichtmath.h
int plus(int, int); int minus(int, int); int mal(int, int); int durch(int, int); int hoch(int, int);
hier ists zwar noch nicht das problem, aber normalerweise solltest du auch in prototypen die parameternamen mitschreiben...
in C++ deklariert man variablen überigens so lokal wie möglich...
also steck dasint zahl
undchar zeichen
mal in die schleife an den anfang...
ergebnis
würde ich außerhalb lassen, weil man idR erst das ergebnis ausgibt, wenn man fertig ist, aber ist ok^^switch(zeichen) { case '+':cin >> zahl;ergebnis=plus(ergebnis, zahl); break; case '-':cin >> zahl;ergebnis=minus(ergebnis, zahl); break; case '*':cin >> zahl;ergebnis=mal(ergebnis, zahl); break; case '/':cin >> zahl;if(zahl!=0){ergebnis=durch(ergebnis, zahl);}else{cout << "nicht durch 0 teilen\n";} break; case '^':cin >> zahl;ergebnis=hoch(ergebnis, zahl); break; case 'c':ergebnis=0; break; case 'e':abfrage=false; break; default:cout << "bitte Rechenzeichen eingeben\n";break; }
rück das doch mal vernünftig ein...
int plus(int lhs, int rhs) { return lhs + rhs; }
dir ist klar, dass du die parameter auch anders nennen kannst?
falls du dich fragst, was das bedeutet:
lhs = left hand side = linker parameter
rhs = right ........ = rechter parameter
(sind imho sehr übliche bezeichner bei solchen fkt)
die namen machen aber spätestens bei hoch keinen sinn mehr ;o)int hoch(int lhs, int rhs) { return pow(lhs,rhs); }
hier ist das problem: er kennt kein pow, was 2 int`s als parameter möchte, also musst du mind. einmal casten(den rest macht dann der compiler für dich und warnt dich ggf. davor, dass er das tut) oder ne eigene fkt schreiben...
kannst dich ja mal versuchen!?bb
-
ja hab mich nochmal durchgegoogled hab da so 3 sources im netz mit denen ich mich befasse zum lernen. das das ergebnis übrigends am anfang ausgegeben wird war teil der aufgabe, darum stehst vorn das mit den parameternamen hab ich mir gedacht, aber bin da manchmal bissl denkfaul...
eine kurze frage was meinst du mit "casten".?
//edit schon gefunden
-
habs
int hoch(int lhs, int rhs) { return (double) pow((double)lhs,(double)rhs); }
-
Gut!
Ich würde allerdings statt
(double)lhs
static_cast<double>(lhs)
schreiben. Ist "moderner" und dank Klammern besser zu überblicken, was gecastet wird...
-
Mr X schrieb:
Gut!
Ich würde allerdings statt
(double)lhs
static_cast<double>(lhs)
schreiben. Ist "moderner" und dank Klammern besser zu überblicken, was gecastet wird...
Oder
double(lhs)
Ist "auch moderner" und dank der Klammern und wenig Drumherumfug auch noch besser zu überblicken, was gecastet wird...
-
sezai11 schrieb:
habs
int hoch(int lhs, int rhs) { return (double) pow((double)lhs,(double)rhs); }
ja - klar fangt wieder an, zu erzählen, wie er casten soll, bevor ihr den code anguckt...
ein cast ist komplett dumm, einer ist nicht notwendig und der andere ist zumindest fragwürdig
wieso willst du das ergebnis von pow noch nach double casten? (was es ohnehin schon ist, obwohl du nen int zurückgibst)
wieso reicht nicht auch float sondern muss es double sein?
die richtige pow überladung wärefloat pow(float, int)
;Pich bevorzuge auch den ctor-cast, also:
int hoch(int basis, int exponent) { float r = pow(float(basis), exponent); return int(r); }
das kann man natürlich auch in eine zeile schreiben, aber das sind mir persönlich zu viele klammern^^
ich wäre noch immer dafür, die fkt selbst zu schreiben - wieso sollte man sich die beiden casts und deren nachteile einhandeln, wenn es auch ohne geht? Oo
schneller wird es so auch nicht unbedingt sein...bb
-
Vor allem wird int(r) des öfteren mal nicht das liefern was man erwartet, weil konsequent abgerundet wird. Wenn man Integerpotenzen haben will, ist es doch leicht die eben selbst zu programmieren.