Zum Inhalt springen

Fakultät in C


kuub

Empfohlene Beiträge

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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 5 Jahre später...

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...