Veröffentlicht 13. Oktober 200519 j hi, ich versuche schon seit studen eine einfache fakultätsberechnung in C zu programmieren nur leider klappt das die ganze zeit irgendwie nicht. weiß einer von euch vielleicht, wie ich eine fakultätsberechnung in C programmieren kann??????
13. Oktober 200519 j Was klappt denn nicht? Wie sieht dein Ansatz aus? Weißt du wie die Fakultät berechnet wird?
13. Oktober 200519 j ich brauch nur die Berechnung von der Fakultät, Ansatz wollte ich mit For-Schleife machen.
13. Oktober 200519 j Ansatz wollte ich mit For-Schleife machen.Dann berichte uns doch einfach mal, was du bisher schon hast, und zeig mal genau die Stelle auf, an der es hakt. Hast du generell noch Probleme mit dem Verstehen des Konzepts "Fakultät" oder bei der genauen Umsetzung? Also lass mal was Input raus, es ist schließlich deine Hausaufgabe, nicht unsere
13. Oktober 200519 j okey, bis jetzt habe ich nur: (muss dazu sagen ich bin ein Anfänger:-) ) #include <stdio.h> #inlcude <math.h> void main() { unsigned int n, a, fakultat; printf("Bitte geben Sie eine natuerliche Zahl ein:"); scanf("%d",&n); for (a=0;n=0;a++) { fakultat =n*a; } printf("Fakultaet ist: %d\n",fakultat); } ich hoffe du kannst mir irgendwie weiter helfen...
13. Oktober 200519 j rechne mal Deine Schleife mit der Hand RICHTIG durch. Tip: bei was fängt dein a & n an? Und wie wird die Fakultät berechnet?
13. Oktober 200519 j for(a=1;n=a;a++); Eine for-Schleife läuft, solange ihre Bedingung wahr ist. Ich habe die Bedingung in deinem Code mal gekennzeichnet. Was du da machst, ist eine Zuweisung. Für einen Vergleich musst du == benutzen. Aber selbst dann passt's noch nicht. Formulier es doch mal auf deutsch: Die Schleife soll laufen, solange ...
13. Oktober 200519 j Hallo, die Berechnung der Fakultät im Schleifenkörper solltest Du auch nochmal überdenken. Bei jedem Durchlauf wird der Variablen "fakultaet" einer neuer Wert zugewiesen (n*a). Die Fakultät berechnet sich aber anders: 1! = 1 2! = 1*2 3! = 1*2*3 4! = 1*2*3*4 usw. usf. Nic
13. Oktober 200519 j Fakultät in C mir Rekursion: int fak(int n){ int erg; if(n == 0){ erg = 1; }else{ erg = n * fak(n-1) ; } return(erg); } Gruß
14. Oktober 200519 j blister ist zwar nett das du die lösung postest aber ich denke nicht das er es so lernt.
14. Oktober 200519 j Sorry aber ich wusste nicht das das hier der Klassenraum ist. Ich hab die Frage so verstanden, dass er eine Fakultät in C haben möchte und keinen seelischen Beistand für das Erstellen einer solchen. Da stand ja: weiß einer von euch vielleicht, wie ich eine fakultätsberechnung in C programmieren kann? und nicht sowas wie: "kann mir jemand einen Tipp geben/helfen etc." Aber gut, ich bin ja auch lernfähig und werd in Zukunft zweimal nachdenken
15. Oktober 200519 j also ich bin eine Sie und kein er. und mr blister danke sehr deutlicher hätte ich es nicht ausdrücken können, ich sagte ja bereits auch, dass ich eine Anfängerin bin und nicht weiß wie ich es machen soll. Vielen Dank du hast mir sehr geholfen.
15. Oktober 200519 j Du kanst die Fakultät natürlich auch mit einer Schleife ohne rekursive Funktionsaufrufe berechnen (jeder rekursive Algorithmus lässt sich in einen nicht-rekursiven umwandeln). Beispiel für eine mögliche Umsetzung mit einer Schleife: unsigned int fak(int eingabe) { if(eingabe<=1) return 1; // da fak(0) gleich 1 ist und fak(1) ebenfalls 1 ist int ergebnis=1; do { ergebnis = ergebnis * eingabe; eingabe--; }while(eingabe>1); return ergebnis; }
20. Oktober 200519 j bei der berechnung in eurer Art kommt es schnell zu numerischen Fehlern, (Überlauf etc), also sollte man die Eingabe nur von einem bestimmten Wertebereich zulassen. Oder auf andere Möglichkeiten der Fakultätsberechnung zugreifen. statt int würde ich aber gleich long verwenden
20. Oktober 200519 j Hallo, statt int würde ich aber gleich long verwenden Das hilft auch nicht, da damit das generelle Problem nicht behoben wird. Zumal bei vielen Architekturen/Compilern "sizeof(long)==sizeof(int)" gilt. Abhilfe schafft in diesem Fall eine Bignum-Bibliothek. Aber ich denke mal, es ging dem Fragesteller ja generell um den Algorithmus. Nic
3. November 201014 j Hallo zusammen! Hoffe, der Thread ist noch nicht tot. Habe jetzt auch ein Problem mit der Fakultät. Meine Programmierung sieht wie folgt aus: #include <stdio.h> void main () { /*Deklaration der Variablen*/ double n, faktor, ergebnis; printf("Bitte Zahl fuer n-Fakultaet eingeben! "); /*Benutzereingabe wird von Tastatur genommen und der Variablen n zugeteilt*/ scanf("%lf",&n); /*Für Variable ergebnis wird der Anfangswert 1 festgelegt*/ ergebnis = 1; /*Schleife: Für den faktor wird der Anfagswert 1 festgelegt*/ /*Endekriterium = MN*/ for(faktor = 1; faktor <= n; faktor++) { /*Reihe: Multiplizieren von m mit p zu p (ergebnis=ergebnis*faktor)*/ ergebnis *= faktor; /*Ausgabe der drei ersten Teilsummen und des Ergebnisses für n!*/ if (faktor == 1) { printf("\nTeilsumme Nr. 1 lautet: %lf\n", ergebnis); } else if (faktor == 2) { printf("Teilsumme Nr. 2 lautet: %lf\n", ergebnis); } else if (faktor == 3) { printf("Teilsumme Nr. 3 lautet: %lf\n", ergebnis); } } printf("\nDas Ergebnis der n-Fakultaet lautet: %lf\n\n\n",ergebnis); } Die Aufgabenstellung sieht eine solche arithmetische Lösung leider vor. Wenn ich jetzt eine größere Zahl eingebe, kann er diese nicht mehr darstellen sondern gibt aus: "1.#inf00". Die Aufgabenstellung sieht nämlich weiterhin vor, dass ich dort meine 6-Stellige Matrikelnummer eingeben soll..... Kann mir wer helfen?
3. November 201014 j printf - Wikipedia, the free encyclopedia Vesuche mal von den double-Werte loszukommen. Verwende mal statt dessen unsigned long. Noch ein Tip: printf("Teilsumme Nr. %x lautet: %lf\n",faktor, ergebnis);
3. November 201014 j Weis nicht ob ich das darf, da wir unsigned noch nicht hatten. Gibt es keine andere Möglichkeit, den Wertebereich zu steigern?
3. November 201014 j Vesuche mal von den double-Werte loszukommen. Verwende mal statt dessen unsigned long.Hast du dafür auch eine Begründung? In double passen erheblich größere Zahlen als in irgendeinen Integer-Typ. Die Aufgabenstellung sieht nämlich weiterhin vor, dass ich dort meine 6-Stellige Matrikelnummer eingeben soll.....Bist du ganz sicher, dass du die Aufgabenstellung richtig verstanden hast? Die Fakultät einer sechsstelligen Zahl kann locker auf über 1 Million Stellen kommen, da hilft dir kein noch so großer eingebauter Datentyp weiter, dafür gibt es spezielle Bibliotheken.
3. November 201014 j Weis nicht ob ich das darf, da wir unsigned noch nicht hatten. Gibt es keine andere Möglichkeit, den Wertebereich zu steigern? Es gibt noch long double. Der Wertebereich von long ist i.A. kleiner als der von double. U.U. war es der Sinn hinter der Aufgabe, eine 6stellige Zahl einzugeben, auf die numerischen Grenzen aufmerksam zu machen.
3. November 201014 j Der Einwand von Klotzkopp ist berechtigt. Ich glaube, das die Aufgabe eine andere ist. Die Fakultät einer Zahl mit Hilfe arithmetischer Operationen zu lösen ist aber tortzdem Bestandteil. Soweit läuft das ja. Danke erstmal an euch alle. Bei weiteren Fragen werde ich euch nochmal versuchen zu konsultieren
5. November 201014 j Naja du hättest dir ja auch mal den Artikel in Wikipedia zur Fakultät durchlesen können, da ist oft auch Pseudocode dabei. Durch die fertige Lösung hat sie vermutlich 0 Lerneffekt. Denn das schwierige beim Programmieren ist nicht die Syntax, sondern sich Algorithmen zum Lösen von Problemen auszudenken.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.