Fakultät
-
Hi Leute,
Ein benutzer gibt eine Zahl an.
Von dort an wird die Fakultät berechnet.
Und zwar in diesem Fall 10 Schritte weit.Zum realisieren dieses Programms benutze ich rekursive Funktionen.
Leider wird mein Programm beendet, sobald ich eine Zahl eingegeben und [ENTER] gedrückt habe
Fehler gibt es keine - nur eben, dass es nicht funktioniert.cya
DavidPS:
Code:
#include <iostream> using std::endl; using std::cout; using std::cin; void fakul(double); int oft=0; int main() { double f=0; cin >> f; fakul(f); cout << "So das wars" << endl; getchar(); } void fakul(double f) { oft++; cout << f << endl; f *= f; if(oft < 10) fakul(f); else return; }
-
Schau mal die C++ oder Konsolen FAQ an.
-
namespace math { unsigned long factorial(unsigned long value) { return (value == 0 ? 0 : value == 1 ? 1 : factorial(value - 1) * value); } };... naja du musst dir überlegen, dass du das, was du machen willst, einfach dadurch realisieren kannst, dass du !10 / !7 halt bsw. hast: 10 * 9 * 8. der Rest kürzt sich raus ... ist zwar von der Performance nicht soo gut aber naja ...
-
Darf ich dich darauf aufmerksam machen, daß deine Funktion 'fakul()' absolut nichts mit Fakultäten zu tun hat? Die Funktion quadriert f und ruft sich dann (rekursiv) selber auf.
PS: Und die Steuerung über globale Variablen ist auch miserabel ;))
-
Mh- ja richtig.
Quadrieren.
Aber es kommt ja auch nicht auf die Rechnung an, sondern einfach aufs rekursive Aufrufen.
Und das funktioniert irgendwie nicht.
Was ist an den globalen Variablen schlecht?
-
777 schrieb:
Mh- ja richtig.
Quadrieren.
Aber es kommt ja auch nicht auf die Rechnung an, sondern einfach aufs rekursive Aufrufen.
Und das funktioniert irgendwie nicht.Rekursives quadrieren? Cool

-
Wie äußert sich denn dieses "funktioniert nicht"?
Ehe ich es vergesse: An den globalen Variablen ist vor allem eins schlecht - sie sind global (und damit für jeden zugreif- und veränderbar). Wenn du die Möglichkeit hast, solltest du lieber mit Parametern Informationen übergeben.
(und in deinem Beispiel brauchst du nicht einmal Rekursion - eine einfache Schleife reicht auch)
-
Ja- eine einfache Schleife reicht fast immer.
Aber ich wills ja gerne rekursiv machen, ums zu lernen.
Funktioniert deswegen nciht, weil das Programm sobald ich ne Zahl eingebe beendet wird.
-
777 schrieb:
Funktioniert deswegen nciht, weil das Programm sobald ich ne Zahl eingebe beendet wird.
DieFetteElke schrieb:
Schau mal die C++ oder Konsolen FAQ an.
-
Das ganze funktioniert in etwa so
#include<iostream> using namespace std; long fakultaet(int n) //Es kann laut Definition nur die Fakultät einer positiven Ganzzahl bestimmt werden { if(n==0) return(1); //Laut Definition else if(n > 0 && n < 17) // < 17 wegen Zahlenbereichsgrenze der long int return(n * fakultaet(n-1)); else return(0);//Fehler; } int main() { cout<<"3! = "<<fakultaet(3)<<endl; return(0); }Weiß nicht genau ob du da auch den Operator überladen kannst
-
Vox 3D ... vllt. ließt du mal was andere schon Ewigkeiten vor dir gepostet haben ...
-
Ich will ja garnicht die Lösung haben oder Quelltexte, die garantiert funktionieren, sondern eigentlich interessiert mich nur der Fehler in meinem Programm.
Ob es jetzt doof programmiert ist, weil globale Variablen vorkommen ist auch nicht so wichtig... ich meine die reine Logik in meinem Programm scheint ja irgendwo falsch zu sein für den Compiler.
Und diesen Logikfehler suche ich.Und jetzt nochmal die Fakultätsversion:
#include <iostream> using std::endl; using std::cout; using std::cin; void fakul(int); int oft=0; int main() { int f=0; cin >> f; fakul(f); cout << "So das wars" << endl; getchar(); } void fakul(int f) { oft++; cout << f << endl; f = f*(f+1); if(oft < 1000) fakul(f); else return; }
-
Hast du denn endlich den Hinweis der fetten Elke befolgt und dich in der Konsolen-FAQ umgesehen? (dort steht auch drin, warum getch() alleine nicht ausreicht, um die Konsole geöffnet zu halten)
-
Du solltest doch in der FAQ mal nachschauen.
Das Problem ist (von der schlechten Programmierung abgesehen), dass dein Programm zwar durchläuft, aber sofort danach beendet wird. Wenn du genau hinschaust, wirst du vielleicht sehen können, dass die Shell mal kurz aufblitzen wird.
Das ist ein bekanntes Problem. Deswegen -> FAQ
-
Ich dachte schon ich schreib mit unsichtbarer Tinte, aber man kann es anscheinend doch sehen.
-
Dein Hinweis war ja jetzt schon wesentlich detailierter.
Aber wenn fette Elke meint ich sollte mir FAQ's durchlesen... die seitenlang sind - dann ist das nicht gerade hilfereich^^Naja- aber ich kann mir das ja mal anschauen.
cya
David
-
http://www.c-plusplus.net/forum/viewtopic-var-t-is-194851.html
Hab mir den Artikel ja jetzt mal ganz durchgelesen.
Aber da wird eher fumgefetzt als geholfen...-.-
-
Führe das Konsolenprogramm doch einfach in einer Konsole aus. Vielleicht kannst Du anhand des Verhaltens dort sogar selbst herleiten, warum sich das Programm am Ende schließt.
-
Das ist nicht der FAQ-Thread, das ist der Versuch eines (entschuldige den Ausdruck) Wichtigtuers, Halbwissen zu verbreiten. Die Konsolen-FAQ erreichst du hier.
-
Ich führe das Programm in einer Konsole aus.
Zudem der Code von Vox 3d ist fast der selbe, wie meiner und funktioniert auch nicht. ^^
-
Kauf dir ne Playstation 3