WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Funktion Fakutrielle (http://www.wcm.at/forum/showthread.php?t=47285)

coolbininet 22.02.2002 11:19

Funktion Fakutrielle
 
@All

Hi Leutz!

Brauche die Möglichkeit in einem C/C++ Programm die Fakturelle einer Zahl zu berechnen, gibt es da ne Funktion, oder muss ich mich mit Source-Code quälen, wenn zweiteres (mit Source Code) bitte ich höflichst mir mit dem (Teil)Code auszuhelfen. :)

Mit freundlichen Grüßen

Coolbininet

ReiniBugman 22.02.2002 11:51

double fact( unsigned long n )
{
double retval;
retval=1.0;
while (n>0)
retval=retval*n--;
return retval;
}

coolbininet 22.02.2002 11:55

Frage konkretisiert
 
@ReiniBugman

Hi und danke für die schnelle Antwort, aber, da ich noch Programmieranfänger bin, noch ne kurze Frage:

Muss ich da jetzt den Source-Code ganz einfach in das Programm integrieren oder muss ich da noch Veränderungen machen.

Mit freundlichen Grüßen

Coolbininet

kikakater 22.02.2002 12:00

Zuerst einmal kommt es auf den Datentyp an, double wäre schwer angezeigt, sprich ratsam. Da es sonst bei 2 Milliarden bei longs gleich einen Überlauf gibt.

Code:

Tja, Code oder nicht Code, das ist hier die Frage:

double fac (int n)
{
 int i;
 double result= 1.0;

 if(n<0) return 0.0;

 for(i=1;i<=n;i++) result= result * (double) i;

 return result;
}

Übrigens heißt es Faktorielle, cool :cool: bin I nett :D

ReiniBugman 22.02.2002 12:07

am einfachsten ist es sicher du kopierst die function in dein projekt.

du kannst sie natürlich auch in einem eigenen file lassen und eine header datei erzeugen wo die function deklariert wird
d.h. in deinem hauptprogramm hast du dann bspw. zu beginn ein

#include "mymathfunc.h"

und in 'mymathfunc.h'

steht dann sowas wie

#ifndef __MYMATHFUNC
#define __MYMATHFUNC

double fact( unsigned long n );

#endif

dann musst du noch 'mymathfunc.c' in dein projekt aufnehmen.

coolbininet 22.02.2002 12:24

Frage konkretisiert!
 
@kikakater

Danke lieber Kikakater für die Antwort, aber mein Standartspruch: Ich bin Anfänger und kenn mich leider nicht so aus, soll bis nächste Stunde für das Kolleg ein Mini-Programm schreiben, das mich eine Zahl fragt einzugeben und von dieser eingelesene Zahl soll dann die Faktorielle (vorher falsch Fakturielle bezeichnet truly sorry) berechnet und am Bildschirm ausgeben werden.

Mit feundlichen Grüßen

Coolbininet

kikakater 22.02.2002 12:55

@ReiniBugman: Wenn beispielsweise das Literal -1L, sprich der Wert -1, an die Funktion übergeben wird, so setzt es Bomben und Granaten. Der Wert wird für die Funktion fact (da der Parameter 'n' als "unsigned" deklariert worden ist) zu 4 Milliarden und noch ein bißchen etwas, eben 2 ^ 32 - 1. Deswegen bitte nicht mit unsigned bei einem solchen Parameter auffahren !!!

Wenn ein negativer Wert übergeben wird, so muß Null (0.0) zurückgeliefert werden. if(!fac(-1)) printf("A/C error (according to the pocket calculator)\n"); Alles andere ist unsaubere Programmierung, bitte dann nicht wundern, wenn das eigene Programm instabil ist.

Die Funktion schreibt man in eine Datei mymath.c

Einen entsprechenden Prototyp in mymath.h: double fac (int n);

In das Hauptprogramm bzw. die Datei mit der aufrufenden Funktion der Funktion fac schreibt man #include <mymath.h> bzw. #include "mymath.h" wenn sich mymath.h im selben Verzeichnis wie das C/C++ Projekt befindet.

Jaguar 22.02.2002 13:02

sowas.. lauter lösungen mit schleifen .. mag hier keiner rekursive funktionen :D

double fac (int n)
{
if (n<0) return (-1);
if (n==0) return 1;
return n*fac(n--);
}

kikakater 22.02.2002 13:52

@Jaguar: Hallo ! Ich werde sicher keine Kritik üben, aber rekursive Dinge sind wenn es irgendwie geht zu meiden. Man kann nämlich sogar den sehr effektiven Quicksort Algoritmus ebenso ohne Rekursion lösen. Rekursion bedeutet - grundsätzlich, und das ist die Problembereitung bei diesem Prinzip - sämtliche Parameter und die Rücksprungadresse zwischenzuspeichern !

Deswegen ist eine Implementation der faktoriellen (Funktion na no na), linear gelöst, eine bessere Realisierung der Aufgabenstellung.

mfg Kikakater

it00x30 23.02.2002 10:29

mit rekursionen kannst du mich schrecken!!!

ich mag die dinger nicht, ausserdem sind sie für mich meistens zu gefährlich, ausserdem solltet ihr berücksichtigen, dass hier ein anfänger (is jetzt nicht abschätzig) seine fragen deponiert, also so C-Syntax-finessen wie:

retval=retval*n--;

sollte man besser ausschreiben.
(es gibt nämlich spezielle regeln zu den x--, bzw --x, ...)


oder wenn schon:

retval*=n--;


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag