dila Geschrieben 18. April 2013 Geschrieben 18. April 2013 Ich bitte um Hilfe! Ich habe die Folgende Aufgabenstellung : Ändern Sie die Implementierung des Euklidischen Algorithmus in rekursiven Stil um. & Implementieren Sie eine Funktion in der Programmiersprache C zur Berechnung von f(n)=n! , wobei f(0):=1 gilt. mittels rekursiven Aufrufes. Testen Sie ihre Funktion in einem Programm für die Werte n=10,0,-5,100. Also ich habe schon ein Programm geschrieben, was auch sehr gut funktioniert ABER nur bei den Werten 10,0,-5. Bei der Zahl 100 kommt leider 0 raus, was natürlich falsch ist. Das ist das , was ich geschrieben habe: #include<stdio.h> int factorial(int n) { if (n == 1) return 1; else return n*factorial(n-1); } int main () { int m; int n; printf("Zahl eingeben:"); scanf("%d", &m); printf("m lautet %d\n",m); printf("Zahl eingeben:"); scanf("%d", &n); printf("n lautet %d\n",n); return 0; } Zitieren
flashpixx Geschrieben 18. April 2013 Geschrieben 18. April 2013 Bitte verwende Code-Tags. Der Code sollte bei 0 und -5 einen Laufzeitfehler produzieren, denn beide Zahlen führen zu einer Endlosrekursion, bei 0 wäre die if-Bedingun im ersten Schritt false, geht somit in den else Zweig und dann steht dort 0*factorial(-1), factorial von -1 ist ebenfalls der else Zweig und liefert -1*factorial(-2), d.h. die Abbruchbedingung wird niemals für Werte < 1 erreicht. Weiterhin wird Deine Funktion nirgends im Hauptprogramm aufgerufen, Du gibst lediglich die Zahlen aus, die Du auch einliest und das sind 2 Zitieren
Klotzkopp Geschrieben 18. April 2013 Geschrieben 18. April 2013 Also ich habe schon ein Programm geschrieben, was auch sehr gut funktioniert ABER nur bei den Werten 10,0,-5.Was gibt deine Funktion denn für -5 zurück? Die Fakultät ist ja nun nur für nichtnegative Zahlen definiert Bei der Zahl 100 kommt leider 0 raus, was natürlich falsch ist.Das Problem ist, dass der richtige Wert viel zu groß ist, als dass er in einen int (oder irgendeinen anderen Ganzzahltyp) hineinpassen würde. Möglicherweise ist das das gewünschte Ergebnis des Tests. Du könntest auch mit Fließkommatypen rechnen, dort passen so große Werte eher hinein, allerdings auf Kosten der Genauigkeit. Zitieren
dila Geschrieben 18. April 2013 Autor Geschrieben 18. April 2013 Was gibt deine Funktion denn für -5 zurück? Die Fakultät ist ja nun nur für nichtnegative Zahlen definiert Das Problem ist, dass der richtige Wert viel zu groß ist, als dass er in einen int (oder irgendeinen anderen Ganzzahltyp) hineinpassen würde. Möglicherweise ist das das gewünschte Ergebnis des Tests. Du könntest auch mit Fließkommatypen rechnen, dort passen so große Werte eher hinein, allerdings auf Kosten der Genauigkeit. Also für den Wert -5 kommt auch Null raus, und ich habe mir gedacht, dass es soweit richtig ist. Also für negative Zahlen rechnet das Programm den Wert niht aus. Ich weiß das bei meinem Programm 1-2 Ziffern fehlen, damit ich den Wert 100 Berechne.Aber was es genua ist weiss ich leider nicht. Zitieren
dila Geschrieben 18. April 2013 Autor Geschrieben 18. April 2013 Wenn ich in mein Programm noch Schleifentypen reintue, würde es dann theoretisch den Wert 100 ausrechnen? Weil bei der zweiten Aufgabe soll ich Schleifentypen einbauen und die Werte nochmal testen. Zitieren
flashpixx Geschrieben 18. April 2013 Geschrieben 18. April 2013 Du könntest auch mit Fließkommatypen rechnen, dort passen so große Werte eher hinein, allerdings auf Kosten der Genauigkeit. Wenn ich nicht irre, müsste ein long bzw long long die Fakultät von 100 darstellen können, damit sind keine Fließkommazahlen notwendig, da die Fakultät nur für positive Zahlen definiert ist, kann man einen unsigned Datentyp verwenden, so dass der Zahlenbereich durchaus passen müsste. Ein Fließkommatyp ist nur notwendig, wenn man die Fakultät durch die Stirlingformel approximiert Zitieren
Klotzkopp Geschrieben 18. April 2013 Geschrieben 18. April 2013 Also für den Wert -5 kommt auch Null raus, und ich habe mir gedacht, dass es soweit richtig ist.Nein, das ist falsch. Die Fakultät ist für negative Zahlen nicht definiert. Da du aber beim Rückgabetyp int nicht "nichts" zurückgeben kannst, könntest du eine Fehlermeldung ausgeben oder das Programm abbrechen. Ich weiß das bei meinem Programm 1-2 Ziffern fehlen, damit ich den Wert 100 Berechne.Da dürfte erheblich mehr fehlen. Du benutzt int, das ist auf heute üblichen Systemen 32 Bit groß. Die größte damit darstellbare Zahl ist 2.147.483.647, das reich noch nicht einmal für 13!. Selbst wenn dein int 64 Bit hat, kommst du nur bis 20!. Deine Funktion liefert dafür zwar noch Ergebnisse, aber sie sind alle falsch. Zitieren
dila Geschrieben 18. April 2013 Autor Geschrieben 18. April 2013 Nein, das ist falsch. Die Fakultät ist für negative Zahlen nicht definiert. Da du aber beim Rückgabetyp int nicht "nichts" zurückgeben kannst, könntest du eine Fehlermeldung ausgeben oder das Programm abbrechen. Da dürfte erheblich mehr fehlen. Du benutzt int, das ist auf heute üblichen Systemen 32 Bit groß. Die größte damit darstellbare Zahl ist 2.147.483.647, das reich noch nicht einmal für 13!. Selbst wenn dein int 64 Bit hat, kommst du nur bis 20!. Deine Funktion liefert dafür zwar noch Ergebnisse, aber sie sind alle falsch. Oh super dann ist ja ziemlich alles falsch durch was kann ich denn int ersetzen? (tut mir Leid für die dumen fragen ) Zitieren
Klotzkopp Geschrieben 18. April 2013 Geschrieben 18. April 2013 Oh super dann ist ja ziemlich alles falsch durch was kann ich denn int ersetzen?Vielleicht ist der Sinn dieser Aufgabe auch, dass dir die Grenzen der Wertebereiche der Datentypen bewusst werden. Für 100! brauchst du einen Ganzzahltyp mit einer Größe von über 500 Bit. Es gibt spezielle Bibliotheken, die das können, aber ich glaube nicht, dass das der Sinn der Aufgabe ist. Du kannst wie gesagt auch einen Fließkommatyp wie double benutzen. Hätte den zusätzlichen Vorteil, dass du bei negativem Argument die Möglichkeit hättest, im Rückgabewert ein ungültiges Ergebnis anzuzeigen. Allerdings wäre der Wert dann nicht genau. Fließkommatypen erkaufen sich die großen Wertebereiche durch verringerte Genauigkeit. P.S.: Was ist ein "Schleifentyp"? Das habe ich noch nie gehört. Zitieren
dila Geschrieben 18. April 2013 Autor Geschrieben 18. April 2013 Vielleicht ist der Sinn dieser Aufgabe auch, dass dir die Grenzen der Wertebereiche der Datentypen bewusst werden. Für 100! brauchst du einen Ganzzahltyp mit einer Größe von über 500 Bit. Es gibt spezielle Bibliotheken, die das können, aber ich glaube nicht, dass das der Sinn der Aufgabe ist. Du kannst wie gesagt auch einen Fließkommatyp wie double benutzen. Hätte den zusätzlichen Vorteil, dass du bei negativem Argument die Möglichkeit hättest, im Rückgabewert ein ungültiges Ergebnis anzuzeigen. Allerdings wäre der Wert dann nicht genau. Fließkommatypen erkaufen sich die großen Wertebereiche durch verringerte Genauigkeit. P.S.: Was ist ein "Schleifentyp"? Das habe ich noch nie gehört. Also die 2te Aufgabe lautet so: Programmieren Sie in der Programmiersprache C zwei weitere Funktionen zur Berechnung von n!mit Hilfe von Schleifen. Wählen Sie sich dazu zwei Schleifentypen aus, die sie in der Vorlesung kennengelernt haben. (Für-Schleife, Abweisenden-Schleife, Nicht-Abweisenden- Schleife). Zitieren
Klotzkopp Geschrieben 18. April 2013 Geschrieben 18. April 2013 (Für-Schleife, Abweisenden-Schleife, Nicht-Abweisenden- Schleife).Ach so, ich dachte, Schleifentyp hätte etwas mit Datentyp zu tun Welche Art von Schleife du in einer iterativen Lösung benutzt, ändert allerdings auch nichts daran, dass das Ergebnis nicht in einen int passt. Zitieren
Gast Geschrieben 20. April 2013 Geschrieben 20. April 2013 Eine kleine Ungenauigkeit steckt in deiner Funktion bei der Berechnung der Fakultät noch drin, mathematisch wird 0! auch als 1 definiert, dies wird in deiner Implementation jedoch nocht berücksichtigt. Zitieren
dila Geschrieben 20. April 2013 Autor Geschrieben 20. April 2013 Eine kleine Ungenauigkeit steckt in deiner Funktion bei der Berechnung der Fakultät noch drin, mathematisch wird 0! auch als 1 definiert, dies wird in deiner Implementation jedoch nocht berücksichtigt. Also ? hihi sorry kenne mich mit solchen sachen nicht gut aus. Zitieren
flashpixx Geschrieben 21. April 2013 Geschrieben 21. April 2013 Also ? hihi sorry kenne mich mit solchen sachen nicht gut aus. Du solltest, bevor Du etwas programmierst Dir erst einmal anschauen was Du inhaltlich zu machen hast, siehe Fakultät (Mathematik) Schau Dir den Abschnitt "Definition" an und schau Dir dazu Deinen Quellcode an. Du hast Deinen Algorithmus nicht vollständig umgesetzt. Du solltest Dich mit diesen "Sachen" in soweit auskennen, damit Du überhaupt einen Algorithmus in einer Sprache programmieren kannst Zitieren
Empfohlene Beiträge
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.