Potenzfunktion mittels while- und for Schleife und rekursiv lösen
-
Dann fangen wir doch mal mit der for-Schleife an. Beantworte die folgenden Fragen:
1. Was macht eine for-Schleife?
2. Was genau macht jedes einzelne Feld im Kopf einer for-Schleife?
3. Wie würdest du auf dem Papier eine Potenz ausrechnen?
4. Wie kannst du 3. auf 1. und 2. übertragen?
-
1. Also die Bedingungen werden dabei im Kopf gesetzt und vor jedem Durchgang geprüft, und nach jedem Durchgang erfolgt die veränderung der Zählvariable.
2.Es gibt einen Startwert, Bedingungen und eine Zählvariable
3. Ich würde die Basis, so oft mit sich mal nehmen wie der Exponent lautet.
Beispiel: 7^3=7*7*74. Genau das bekomme ich nicht gebacken
-
Bei 7^3 würdest du also von 1 bis 3 zählen und bei jedem Schritt dein bisheriges Ergebnis mal sieben nehmen. Fällt dir vielleicht jetzt etwas auf?
-
Ah... Mein Startwert dürfte also 0 sein, und meine Bedingung gleich dem Exponenten, so richtig ? Und in der Schleife muss ich jedesmal mein Ergebnis mit der Basis multiplizieren...
-
2Good4This schrieb:
Ah... Mein Startwert dürfte also 0 sein, und meine Bedingung gleich dem Exponenten, so richtig ? Und in der Schleife muss ich jedesmal mein Ergebnis mit der Basis multiplizieren...
Das klingt doch gar nicht mal so verkehrt, schreib das mal als konkreten Code, damit ich sehe, ob ich dich auch richtig verstanden habe. Denk daran, dass du zwei Werte brauchen wirst: Einen Zähler wie oft du schon multipliziert hast und einen Wert für das Ergebnis dieser Multiplikationen.
-
[cpp]#include <stdio.h> //Einbinden von Bibliotheken
#include <conio.h>int potenz (int , int );
int main(void)
{
int x=0;
int y=0;
int i=0;
int e=x;
printf("Bitte geben Sie eine Basis ein: ");
scanf("%i", &x);
printf("Bitte geben Sie einen Exponenten ein: ");
scanf("%i", &y);}
int potenz (int x, int y)
{
int i;
for (i=0; i=y, i+=1)
{
e=e*x
}
}
in der Zeile mit dem bösen Smiley haut er noch nen Fehler raus
-
1. Die for-Schleife wird solange abgearbeitet, wie die Bedingung wahr ist, nicht so lange, bis die Bedingung wahr ist.
2. i=y ist kein Vergleich, sondern eine Zuweisung. Aber nach 1. ist diese Bedingung ohnehin falsch.
3. Wie dir dein Compiler schon gesagt haben wird, fehlt eine Deklaration von e. Die Variablen aus der main haben nichts mit den Variablen in potenz zu tun.
4. Du willst doch etwas zurückgeben, da fehlt ein return. Auch das sollte dir dein Compiler sagen.
5. Zum Testen wäre es vielleicht auch eine gute Idee, die Funktion zu benutzen.
6. Du machst C, kein C++. Da die Frage nicht C-spezifisch ist, lasse ich es aber trotzdem mal im C++ Forum, solange keine speziellen C Fragen auftauchen.
-
int potenz (int x, int y)
{
int i;
int e=x;
for (i=0; i<=y, i+=1)
{
e=e*x
}
return e;
}hmm, so besser ? den fehler in der for Zeile hat er aber immer noch.
Deinen Punkt 5. verstehe ich nicht
Zu 6. Wieso programmiere ich c ? Ich bin bisher davon ausgegangen das das c++ ist
-
Was für einen Fehler meldet der Compiler denn?
2Good4This schrieb:
Zu 6. Wieso programmiere ich c ? Ich bin bisher davon ausgegangen das das c++ ist
printf() und scanf() sind aus C geerbt, die kannst du zwar noch nutzen, aber in C++ verwendet man cin und cout für die Ein-/Ausgabe.
PS: Und die Schleifenbedingungen solltest du auch nochmal überprüfen.
-
2Good4This schrieb:
hmm, so besser ? den fehler in der for Zeile hat er aber immer noch.
Semikolons! Das Komma hat eine andere Bedeutung.
Deinen Punkt 5. verstehe ich nicht
Du solltest dein Ergebnis kontrollieren. Du wirst feststellen, dass es nicht ganz stimmt. Wenn du ein bisschen mit den Werten herumspielst wird dir sicher auch klar, was nicht stimmt.
Zu 6. Wieso programmiere ich c ? Ich bin bisher davon ausgegangen das das c++ ist
Es ist C. Das sieht man daran, dass du
1. Überhaupt kein einziges der Zusatzfeatures von C++ benutzt. Hier würde sich z.B. die Möglichkeit Variablen im Kopf von for-Schleifen zu deklarieren anbieten. Oder die Möglichkeit, Variablen überall im Programm zu deklarieren, nicht nur am Anfang von Funktionen.
2. Teile von C benutzt für die es in C++ kompletten Ersatz gibt, so dass es äußerst ungewöhnlich wäre, diese in C++ noch zu benutzen. Hier sind dies die C Ein-/Ausgabefunktionen die in C++ komplett überarbeitet wurden.Das soll aber kein Vorwurf sein, C ist auch eine gute Sprache, wenn man es vernünftig lernt (was auch einfacher sein dürfte als bei C++ weil es einfach weniger zu lernen gibt). Man sollte nur nicht den Fehler machen, beides gleichzeitig zu lernen, dann lernt man nämlich erfahrungsgemäß keines von beidem.
Falls du nach einem Buch lernst, dass C/C++ lehren will oder dass dir das bisher gelernte als C++ verkaufen wollte, schmeiß es weg.
-
Achso, gut zu wissen... Unser Prof sagte wir machen c++
Aber naja... ALso funktionieren tut es nun dank des semikolons aber komisch ist, das immer 0 raus kommt, nehme ich bei der deklaration von x das =0 weg kommt bei jeder zahlenkombi der wert 1968414260 raus =(... Weiß nur leider nicht wo der Feherteufel versteckt ist... Ich hab gerade keine ahnugn wie die anweisungen bei der for schleife sonst lauten sollten...
-
2Good4This schrieb:
Achso, gut zu wissen... Unser Prof sagte wir machen c++
Aber naja... ALso funktionieren tut es nun dank des semikolons aber komisch ist, das immer 0 raus kommt, nehme ich bei der deklaration von x das =0 weg kommt bei jeder zahlenkombi der wert 1968414260 raus =(... Weiß nur leider nicht wo der Feherteufel versteckt ist... Ich hab gerade keine ahnugn wie die anweisungen bei der for schleife sonst lauten sollten...
Bei solchen Fehler wird dir (im Gegensatz zu plumpen fragen nach Hausaufgaben) hier sehr gerne geholfen. Zeig den Code und eine genaue Beschreibung des Fehlverhaltens jemand wird dir den Fehler zeigen.
-
Hallo,
rufst du in deiner 'main'-Funktion überhaupt die 'potenz'-Funktion mit korrekten Parametern auf (im obigen Code fehlt dieser Aufruf nämlich
?
So wie SeppJ schon schrieb, zeig mal deinen gesamten Code (aber packe ihn korrekt in CPP-Tags).
-
Zudem ist ein
foo = foo * bar;
äquivalent zu
foo *= bar;
Und ein
foo += 1;
ist äquivalent zu
++foo;
MfG, EOutOfResources
-
Hallo.
Ich hatte mal langeweile, doch mehr vorkauen will ich es wirklich nicht.
// Main.cpp #include <iostream> using namespace std; int power_of(int base, int power); int main() { int b,p,erg; cout << "Basis: "; cin >> b; cout << "Potenz: "; cin >> p; erg = power_of(b,p); cout << "Ergebnis: " << erg << endl; return 0; } int power_of(int base, int power) { int temp = base; for(int i=1 ; i<power ; i++) { temp *= base; } return temp; }
Ich denke, daraus solltest du auch die Lösung für das Whilekonstrukt ableiten können.
Mfg Micha.
-
Micha321 schrieb:
int power_of(int base, int power) { int temp = base; for(int i=1 ; i<power ; i++) { temp *= base; } return temp; }
Kleiner Flüchtigkeitsfehler, x^0 = 1, nicht x
Aber ohne den Code vom Threadersteller kann man fast nur spekulieren, wo momentan sein Problem liegt...
-
2Good4This schrieb:
[cpp]#include <stdio.h> //Einbinden von Bibliotheken
#include <conio.h>int potenz (int , int );
int main(void)
{
int x=0;
int y=0;
int i=0;
int e=x;
printf("Bitte geben Sie eine Basis ein: ");
scanf("%i", &x);
printf("Bitte geben Sie einen Exponenten ein: ");
scanf("%i", &y);}
int potenz (int x, int y)
{
int i;
for (i=0; i=y, i+=1)
{
e=e*x
}
}
in der Zeile mit dem bösen Smiley haut er noch nen Fehler rausin deiner Lösung liegt der Fehler auch daran, das die Variable e nur lokal in dem main() block gilt.
ein weiterer fehler liegt in deinem for schleifen kopf, dieser wurde ja schon genannt, = ist eine zuweisung an dieser stelle, und das komma müsste ein semikolon sein.
in der for schleife verwendest du das e, das geht schonmal nicht, da wird der compiler meckern
wenn du hier x verwendest, ist dieser wert der basis ja nach dem ersten durchlauf verloren, also sollte man ihn retten in eine lokale variable.
als letztes fehlt ein rückgabewert deiner funktion.
Irgendwas brauchst du ja als ergebnis, wie du ja im Prototyp eigentlich schon angekündigt hattest.Was allerdings machst du für den sonderfall x^0 ?
Diesen solltest du Frühzeitig z.b. mit einer Prüfung von y in den ersten zeilen checken.
ich hoffe ich konnte helfen :o
-
Schade, dass natürlich mal wieder jemand die Lösung gepostet hat.
Bisher haben sich 2Good4This und SeppJ schön Schritt für Schritt der Lösung durch Frage-Antwort Spielchen genähert, was sicherlich einiges an Mehrwert in Bezug auf den Lernfortschritt hat als eine fertige Lösunge vorgesetzt zu bekommen.
-
dabei ist die "Lösung" auch nicht 100% korrekt
-
Hier mal ne rekursive Lösung: http://ideone.com/G6qEl