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--;

kikakater 23.02.2002 14:48

Wie programmiert man eigentlich ? Ha ?

Das Coden ist nur 10 %. Das ist ja das Schockierende für die Leute, die angeblich oder tatsächlich Anfänger sind. Bei was auch immer.

Anfänger, bei was auch immer ...

... ist hier gemeint.

So, wie programmiert man nun in Profi-Qualität, damit es den eigenen Ansprüchen gerecht wird ?

Zuallererst ist das Scheitern der wesentlichste Teil um Profi werden zu können. Egal was man nun tut.

Das Problem ist die mangelnde Determination. Es gibt keinen Bestimmungsort. Kritik wird als Zellen-Selbstmord-Programm ausgelegt. Das ist die Krux dabei, anderen etwas erfolgreich beibringen zu können.

In der Kritik steht der Schüler, nicht der Lehrer. Von Menschen (Lehrern z.B.) darf man sich nicht erwarten, daß sie einem den ganzen Job machen werden, ein Leben lang.

Viele Lehrer, wenn nicht alle, sind doch geradezu darauf angewiesen, daß Schüler Ihnen zuhören. Wer den Bock zum Gärtner macht, braucht sich nicht wundern, wenn das In sich bestehen durch grenzenlosen Respektverfall abgelöst wird. Deswegen ist es wichtig, die Weisheiten, die Detailschärfe des Lehrers anzuerkennen und zu verinnerlichen. Der Lehrer ist nicht dazu da, alles zu tun. Zuhören und reifen durch eigene Aktivität und die Kritik als notwendig und essentiell humanistisch begreifen sollen.

Der Lehrer ist dazu da den Stoff zu vermitteln, wenn der Schüler den Lehrer wegen Animosität und -täten ablehnt, ist das eine Folge des mangelnden Lernwillens und nichts anderes. Da kann man herumdeuteln, es bleibt so. Ändern kann sich erst etwas im Verständnis des Wahren, wenn der Lehrer und die Notwendigkeit der wahren Aussage akzeptiert wird und ein In sich bestehen des Schülers Platz greift. Viele Professoren (an den Universitäten) nennen die Studenten Kollegen. Warum wohl ?

Programmieren ist ein Holzhackerhandwerk, schludrig, undiszipliniert, ohne Konventionen, ... ! ... ?

Es ist eigentlich eine rethorische Frage und keine Feststellung. Die Antwort heißt klarerweise, daß wer so agiert, ein schlechter Programmierer, Systemanalytiker und dergleichen wird und bleibt.

Das Programmieren im eigentlichen Sinn hat sehr viel mit Erfahrung zu tun, mit dem fast automatisierten Heruntercoden von Routinen. Die Organisation birgt das Talent.

Wie ist vorzugehen:

Neben einer Analyse ist der eigentliche Vorgang geprägt von sinnvollen Kommentaren im Programmcode mit Datum Namenskürzel und Titel. Das bezieht sich definitiv auf die einzelne Passage in einer Routine. Weiters ist die Namensvergabe der Symbole, seien das Variablen selbst, oder auch Routinen also Funktionen oder die Parameter der Funktionen von entscheidender Bedeutung. Die Hinführung zum Richtigen und die Mißachtung des Erfahrenen (Wissens) zum Zeitpunkt des Erfahrens stellt das Programmieren dem Einzelkämpfertum gleich. Der, der mir half, den verachte ich danach, weil ich ihn nicht mehr brauche. Ob das zutrifft ? Ich behaupte kühn, das trifft nicht zu.

Deswegen ist das Lernen nur der Anfang des Verstehens, der eigene geistige Abbau, die Reflexion während der Zeit von 25-50 machen es nur allzu deutlich, daß derjenige sich auf dem Holzweg befindet.

Der Mißachter nämlich.

Greetings (neudeutsch) besser Grüße
Kikakater

citizen428 25.02.2002 13:06

@Kikakater: Fully ACK! Schön gesagt auch noch BTW.

@COOLBININET:
Zitat:

Ich bin Anfänger und kenn mich leider nicht so aus, soll bis nächste Stunde für das Kolleg ein Mini-Programm schreiben
Meinst du nicht daß der Lernerfolg eventuell besser wäre wenn du versuchst die dir gestellten Aufgaben auch selber zu lösen? Denn sonst kann es ziemlich leicht passieren daß du Anfänger bleibst...


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:42 Uhr.

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