Potenz in C++
-
hi
kann mir bitte jemand von euch da draußen sagen,wie man die Potenz berechnet also halt mit Hochzahlen?
Zbsp.:22 = 4
42 = 16
..
..Mit einer For-Anweisung hab ich das versucht,aber irgendwie kein Plan,wie man es machen sollte:
int zahl = 2; int eingabe; cin>>eingabe; for(int ix = 0; ix != eingabe; ++ix) cout<<zahl*ix; [cpp] naja auch so ergibt das keinen Sinn,aber was soll's^^
MfG
Daniel
-
Meinst du die Standardbibliotheks-Funktion pow( basis, explonent) ?
Mit freundlichen Grußen
RhombicosidodecahdronP.S.: Zu dem Code sage ich nur: 3 error(s), 2 warning(s) and 1 better way
-
hi
Rhombicosidodecahedron schrieb:
Meinst du die Standardbibliotheks-Funktion pow( basis, explonent) ?
Naja dazu könnte ich ja auch noch mehr erfahren,als bsp. welche Standardbibliothek,<iostream>?
Eigentlich würde ich das selber machen und nicht mit pow(),da würde mir ja den Spaß an der Sachen wegnehmen..
Rhombicosidodecahedron schrieb:
P.S.: Zu dem Code sage ich nur: 3 error(s), 2 warning(s) and 1 better way
Ja,wer kompiliert schon noch einen Code mit CPP Tags oder mit einem riesen Satz,den ich falsch reingegeben hab ^^
MfG Daniel
-
:Daniel: schrieb:
hi
Rhombicosidodecahedron schrieb:
Meinst du die Standardbibliotheks-Funktion pow( basis, explonent) ?
Naja dazu könnte ich ja auch noch mehr erfahren,als bsp. welche Standardbibliothek,<iostream>?
Eigentlich würde ich das selber machen und nicht mit pow(),da würde mir ja den Spaß an der Sachen wegnehmen..
Die Funktion pow liegt im namespace std im Header <cmath>.
Möchtest du wirklich eine allgemeine pow-Funktion selber schreiben (wo z.B. soetwas wie 2.5^0.1 erlaubt ist) oder reicht dir erstmal eine Funktion, um mit einer ganzen Zahl zu potenzieren? Das könntest du am einfachsten mit einer Schleife realisieren:
Starte mit Ergebnis = 1. Bei negativem Exponent x durch 1/x ersetzen und das Vorzeichen des Exponenten weglassen. Dann so oft den Eingangswert x auf das Ergebnis multiplizieren, wie der Exponent angibt.
-
hi Christoph!
Christoph schrieb:
Die Funktion pow liegt im namespace std im Header <cmath>.
Danke,das werde ich später durchstudieren^^
Christoph schrieb:
Möchtest du wirklich eine allgemeine pow-Funktion selber schreiben (wo z.B. soetwas wie 2.5^0.1 erlaubt ist) oder reicht dir erstmal eine Funktion, um mit einer ganzen Zahl zu potenzieren? Das könntest du am einfachsten mit einer Schleife realisieren:
Starte mit Ergebnis = 1. Bei negativem Exponent x durch 1/x ersetzen und das Vorzeichen des Exponenten weglassen. Dann so oft den Eingangswert x auf das Ergebnis multiplizieren, wie der Exponent angibt.//Funktion nur,weil ich das mit main() schon kann ^^ int potenz(int x) { cin>>x; for(; x != -x; x*=2) cout<<x; return x; }
hab folgendes gemacht,aber das mit
Bei negativem Exponent x durch 1/x ersetzen und das Vorzeichen des Exponenten weglassen.
überhaupt nicht verstanden
Sorry,aber solche Sachen sind für mich verwirrend ^^
Daniel
-
:Daniel: schrieb:
//Funktion nur,weil ich das mit main() schon kann ^^ int potenz(int x) { cin>>x; for(; x != -x; x*=2) cout<<x; return x; }
Diese Schleife sieht nicht ganz korrekt aus. Was ist die Startbedingung, was ist die Abbruchbedingung?
Deine Schleife läuft so lange wie x ungleich -x ist. Also so lange bis x gleich 0 wird. Du multiplizierst aber x ständig mit 2, d.h. es wird nur 0 aufgrund des undefinierten int-Überlaufs; das Ergebnis wird irgendwann zu groß für int und "fällt raus".
Was soll potenz(2) überhaupt machen? Um a hoch b ausrechnen zu können, muss die Funktion potenz doch zwei Parameter bekommen?
:Daniel: schrieb:
hab folgendes gemacht,aber das mit
Bei negativem Exponent x durch 1/x ersetzen und das Vorzeichen des Exponenten weglassen.
überhaupt nicht verstanden
Sorry,aber solche Sachen sind für mich verwirrend ^^
Nimm mal eine Funktion der folgenden Signatur:
// liefert "base hoch exponent" double my_pow(double base, int exponent) { /* ... */ return result; }
Und da drin führst du die Schritte aus, die ich oben beschrieben habe. Du setzt result am Anfang auf 1, dann kommt (*) und dann eine Schleife, die result so oft mit base multipliziert, wie exponent angibt.
Die Variable base wird dabei an keiner Stelle verändert.(*) ist die Sache mit dem negativen Exponenten. Die kannst du auch erstmal komplett weglassen, dann funktionieren eben nur positive Exponenten. Ansonsten musst du dir überlegen, was ein negativer Exponent bedeutet: base^(-exponent) = (1/base)^exponent.
-
hi,
könntest du es mir bitte ein wenig anders erklären,sonst komm ich nicht weiter,eventuell könntest du mir ja die Lösung verspoilern,aber dann würde ich es ja nur abschreiben,aber ich kann es echt nicht,bitte hilf mir Christoph
ich versuche überall etwas zu machen,doch ohne Erfolg,sorry
-
:Daniel: schrieb:
hi,
könntest du es mir bitte ein wenig anders erklären,sonst komm ich nicht weiter,eventuell könntest du mir ja die Lösung verspoilern,aber dann würde ich es ja nur abschreiben,aber ich kann es echt nicht,bitte hilf mir Christoph
An welcher Stelle hängst du denn? Sehr viel ausführlicher kann ich kaum werden, ohne den Code explizit aufzuschreiben. Ein wenig musst du auch selber nachdenken.
Wenn du dir mit der C++-Syntax unsicher bist, solltest du dir vielleicht erstmal ein gutes C++-Buch suchen.
-
oder du kannst einfach benutzen. dann brauchst du nur exp() und ln() zu implementieren.
-
Christoph schrieb:
An welcher Stelle hängst du denn? Sehr viel ausführlicher kann ich kaum werden, ohne den Code explizit aufzuschreiben. Ein wenig musst du auch selber nachdenken.
Also ich hab
int my_pow(int base, int exponent) { // 2*2 for(int result = 1; result >= exponent; result *= base) return result; } int main() { int base = 2; int exponent = 2; int sum = my_pow(base, exponent); cout<<sum; return 0; }
geschrieben,doch ich verstehe echt nicht wie das funktioniert.. ich kann selbst keinen Sinn darin lesen,ich brauche echt mal einen Kurs xD
Nein,aber ich hab kein MathevorstellungsvermögenIrgendwie verstehe ich das nicht,aber "exp und ln" hat echt recht,mit solch einer Formel und Funktionen könnte das auch gut klappen^^
Christoph schrieb:
Wenn du dir mit der C++-Syntax unsicher bist, solltest du dir vielleicht erstmal ein gutes C++-Buch suchen.
Hab ich,nähmlich diese C++ Primer 4th.
exp und ln schrieb:
oder du kannst einfach benutzen. dann brauchst du nur exp() und ln() zu implementieren.
Ich habe es so versucht zu machen,aber trodzdem nichts daraus geworden :(..:
int exponent(int ix); int potenz(int pot) { int ix; int zahl; pot = exponent(ix); return pot; } int main() { int pot; int ix = 2, zahl = 4; cout<<potenz(pot); return 0; } int exponent(int ix, int zahl) { zahl *= ix; return zahl; }
Ich kann ja noch keine Funktionen eigentlich so ganz genau,ist erst im übernächsten Kapitel meines Buches,deswegen dauerts noch ein bisschen ^^
Aber die Fehler oder so könntest du mir erklären,wenn du nur könntest
Bzw. wie ich es richtig machen könnte.@Christoph:
Könntest du mir bitte die Lösung von meinem ersten Problem schreiben und von diesem,wenn ich es noch nicht verstanden hab?
Bzw. könntest du es mir ausführlicher erklären(also deins war sehr gut beschrieben,doch ich kann solche Worte einfach nicht begreifen :()Mit freundlichen Grüßen
Daniel
-
:Daniel: schrieb:
Also ich hab
int my_pow(int base, int exponent) { // 2*2 for(int result = 1; result >= exponent; result *= base) return result; } /* ... */
geschrieben,doch ich verstehe echt nicht wie das funktioniert..
Das funktioniert so auch nicht. Die main()-Funktion ist in Ordnung, aber my_pow hat noch einen Bug.
Deine for-Schleife hat als Rumpf den Befehl "return result;". Das wird exakt einmal ausgeführt, weil ein return die Funktion sofort beendet. Vermutlich wolltest du noch ein Semikolon hinter das for(...) setzen.Die Abbruchbedingung ist aber auch seltsam: Solange result >= exponent ist, mache result*=base. Die Beziehung zwischen result und exponent spielt hier aber gar keine Rolle. exponent ist eine Zahl, und dein Ziel ist es den Befehl "result *= base;" so oft auszuführen, wie diese Zahl angibt. Wenn exponent z.B. 5 ist, dann muss 5 Mal der Befehl "result *= base;" ausgeführt werden.
Wie sieht das Standard-Vorgehen für eine Schleife aus, die n Mal ausgeführt wird?
-
hi,
danke für deine Antwort
Also ich würde das gerne so machen(weiß aber nicht wie),sodass "base" so oft multipliziert wird,wie es der Exponent angibt,also eine Potenz ist,nur kA wie ich das in C++ machen könnte.Christoph schrieb:
Wie sieht das Standard-Vorgehen für eine Schleife aus, die n Mal ausgeführt wird?
Bitte sag es mir,wie die Lösung auf diese Frage heisst,dann mach ich neuen Code und stell ihn wieder vor ^^
Daniel
-
:Daniel: schrieb:
Christoph schrieb:
Wie sieht das Standard-Vorgehen für eine Schleife aus, die n Mal ausgeführt wird?
Bitte sag es mir,wie die Lösung auf diese Frage heisst,dann mach ich neuen Code und stell ihn wieder vor ^^
for(int i = 0; i < n; ++i) {...}
Ich verschieb das mal nach C++, weil du damit anscheinend mehr Probleme als mit Mathematik hast.
-
Dieser Thread wurde von Moderator/in Christoph aus dem Forum Mathematik in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Die Fehler waren zunächst, dass die Eingabe überprüft nicht wurde und danach, dass du den falschen Wert multipiziert hast: Die Variable iar anfangs 0 und dann wird mit ihr multipliziert==> Das ergebnis wird immer null sein.
Das was ich anzumerken habe, war, dass du das "==" Zeichen (anstatt "<="/ ">=")in der For-Bedingung benutzt (eigendtlich kein Fehler aber, falls du kompliziertere Algorithmen erstellen solltest ist das eine mögliche Fehlerquelle)
Den besseren Weg,wenn du nur Zweierpotenzen benutzen wolltest(so wie es in dem ersten Beitrag stand) ist folgendes:
int /*BYTE*/ shift; cin >> shift; if (shift >= 0 && shift <= 0x40 /*kann auch was anderes sein*/) long result = 0x01 << shift; else cout << "Wrong input";
Außerdem hatte ich das "Kommentar" und den cpp-Code-tag nicht brücksichtigt...
Mein Weg:
// "int b": Die Basis // "char e": Der Exponent long my_pow(int b, char e) { if (e > 0x40) /* oder etwas anderes */ return 0; // oder melde Fehler /* bei "int e" if (e < 0) return 0; // oder melde Fehler if (b == 0) return 0; if (c == 1) /* Fehler korrigert, siehe nächsten Post */ return b; for(long i = 2, r = 1; i++ > e; r *= b); return r; }
Mit freundlichen Grüßen
Rhombicosidodecahedron^Fehler: |^
-
Und noch ein Fehler in der Schleife...
Hier die richtige Lösung:
for(int i = 1, r = 1; i <= e; r *= b; i++); return r;
-
Th schrieb:
Und noch ein Fehler in der Schleife...
Hier die richtige Lösung:
for(int i = 1, r = 1;/*1*/ i <= e;/*2*/ r *= b;/*3*/ i++); return r;
Drei Semikolions sind nicht erlaubt
... richtig ...richtig relativ
Aber danke
-
hi
danke,aber das funktioniert noch immer nicht:
int e = 2; int b = 5; int i = e = 2; for(int i = 1, r = 1; i <= e; r *= b, i++); cout<<i;
habs nähmlich in main() geschrieben,um eine Funktion daweil zu vermeiden.
was ist überhaupt r?
-
Fuck you really:
pow( x, y );
http://www.cplusplus.com/reference/clibrary/cmath/pow.html
http://www.learn-line.nrw.de/angebote/zeus/woche05_01/ndusnahm.htm
-
r steht hier wohl fuer resultat, also musst du auch cout<<r schreiben.
Etwas expliziter:
int exponent=6; int resultat=1; int basis=4; for(int i=0;i<exponent;++i) resultat=resultat*basis; cout<<resultat;
So besser verstaendlich?
EDIT: Das entspraeche jetzt 4^6.