Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

ich brauch nur die Berechnung von der Fakultät,

Ansatz wollte ich mit For-Schleife machen.

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

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

ich habs falsch geschrieben meine schleife lautet:

for(a=1;n=a;a++);

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

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

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ß

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

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.

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;

}

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

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

  • 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?

Weis nicht ob ich das darf, da wir unsigned noch nicht hatten.

Gibt es keine andere Möglichkeit, den Wertebereich zu steigern?

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

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

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.