Potenzfunktion mittels while- und for Schleife und rekursiv lösen
-
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
-
0 hoch 0 ist übrigens auch 1
-
einDoof schrieb:
0 hoch 0 ist übrigens auch 1
Das kommt ganz darauf an, wen du fragst
@Pi: Ich glaube, für jemanden der gerade erst gelernt hat, wie man Funktionen verwendet, ist deine TMP-Lösung etwas zu fortschrittlich
-
einDoof schrieb:
0 hoch 0 ist übrigens auch 1
Nein, 0^0 ist nicht definiert. 1 kann höchstens ab und zu praktisch sein, gerade als Konvention in der Programmierung.
Dass es nicht definiert ist, sieht man daran, wenn man unterschiedliche Funktionen konvergieren lässt (z.B. x^x und 0^x für x->0+).
-
ich hab um ganz ehrlich zu sein nur schnell Google gefragt um mich abzusichern.
Jedoch hab ich auch hier in diesem Forum einen Thread gefunden, in dem darüber diskutiert wurde, da einige Sprachen unterschiedliche Lösungen hierzu bieten.Einfach nichts zu tun wie in dem Beispiel erachte ich nicht als ok.
Stell dir mal vor ein Anwender nutzt unwissend pow<0,0>::value.
Also entweder 1 oder 0.
Ich wär für 1
-
einDoof schrieb:
Stell dir mal vor ein Anwender nutzt unwissend pow<0,0>::value.
Also die beste Methode, das zu verhindern, ist ein kontrollierter Compiler-Fehler (was der obige Ansatz auch gut hinbekommt - die Spezialisierung pow<0,0> hat kein value) oder die Rückgabe eines Fehlerwertes (wo möglich).
-
Nexus schrieb:
einDoof schrieb:
0 hoch 0 ist übrigens auch 1
Nein, 0^0 ist nicht definiert. 1 kann höchstens ab und zu praktisch sein, gerade als Konvention in der Programmierung.
Dass es nicht definiert ist, sieht man daran, wenn man unterschiedliche Funktionen konvergieren lässt (z.B. x^x und 0^x für x->0+).
Was hat die Stetigkeit zweier Funktionen mit der Definition von 0^0 zu tun? Ich würde meinen gar nichts. Was man höchstens daran sehen kann, ist, das solch eine Definition nicht wohldefiniert ist. Das heißt aber lange noch nicht, dass es eine solche Definition nicht gibt.
-
einDoof schrieb:
ich hab um ganz ehrlich zu sein nur schnell Google gefragt um mich abzusichern.
Jedoch hab ich auch hier in diesem Forum einen Thread gefunden, in dem darüber diskutiert wurde, da einige Sprachen unterschiedliche Lösungen hierzu bieten.Einfach nichts zu tun wie in dem Beispiel erachte ich nicht als ok.
Stell dir mal vor ein Anwender nutzt unwissend pow<0,0>::value.
Also entweder 1 oder 0.
Ich wär für 1
Ich wär dafür kein Ergebnis anzubieten, sodass der Benutzer den Fall separat abprüfen muss und das Ergebnis 1 setzen muss.
-
Nun also nochmal ich...
mein Quellcode sieht momentan folgendermaßen aus:#include <stdio.h> //Einbinden von Bibliotheken #include <conio.h> int potenz (int , int ); int main(void) { int x; 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); printf("%i", e); getch(); } int potenz (int x, int y) { int i; int e=x; for (i=0; i<=y; i+=1) { e=e*x; } return e; }
Und irgendwie kommt halt immer 0 raus, oder wenn ich x nicht =0 deklariere immer eine reisige zahl
Die vorgegebene Antwort hier hat mir nicht wirklich geholfen, da ich ja anscheinend wie SeppJ sagte eher c programmiere
-
Also ich habe nun ein wenig rumgetestet und festgestellt, je nachdem wie ich in der main Funktion die Werte deklariere kommt ein anderer wert fürs ergebnis raus, aber für alle zahlenkombinationen der gleiche...
-
2Good4This schrieb:
int potenz (int x, int y) { int i; int e=x; for (i=0; i<=y; i+=1) { e=e*x; } return e; }
Der Integer
x
wird ja kopiert (da keine Referenz). Deshalb ist der Integere
völlig überflüssig. Und wieso deklarierst du den Integeri
nicht im Kopf derfor
-Schleife? Der Standard sagt, dass alle Variablen die imfor
-Kopf deklariert werden, nachher nicht mehr existieren.MfG, EOutOfResources
-
Warum rufst du die Funktion nicht auf?
-
2Good4This schrieb:
Also ich habe nun ein wenig rumgetestet und festgestellt, je nachdem wie ich in der main Funktion die Werte deklariere kommt ein anderer wert fürs ergebnis raus, aber für alle zahlenkombinationen der gleiche...
Seppj schrieb:
Zum Testen wäre es vielleicht auch eine gute Idee, die Funktion zu benutzen.
SeppJ schrieb:
Die Variablen aus der main haben nichts mit den Variablen in potenz zu tun.
Vielleicht solltest du dir ein paar Grundlagen über Funktionen und Variablen durchlesen? Bei dir scheint eine ganze Menge zu fehlen. Die Aufgabe scheint (obwohl sie sehr leicht ist) deinen Kenntnisstand weit zu übersteigen (ehrlich gesagt scheint dein Kenntnisstand nahe 0 zu sein
). Dir fehlen irgendwie komplett die ersten beiden Kapitel aus einem C-Buch, während dein Kurs schon in Kapitel 3 oder 4 zu sein scheint.