Formatierung mit fprintf und Wertebereich für Fibonacci?

tobbbbi

Grünschnabel
Hallo!

Ich muss die Fibonaccizahlen bis zu einem maximalen Wert von 1000 (vorgegeben durch Aufrufparameter) in einer Textdatei formatiert ausgeben.

Nun meine zwei Fragen dazu:

1. Wie erreiche ich, dass von den Zahlen maximal die ersten 10 Stellen ausgegeben werden, alles rechtsbündig da steht und die fehlenden Zahlen NICHT mit Nullen aufgefüllt werden?
Also in etwa so:
Code:
         0
         1
         1
         2
         3
         5
         8
        13
        21
        34
usw.....


2. Außerdem müsste ich wissen ,welchen Wertebereich ich bei solch großen Zahlen nehmen soll. Reicht int aus oder muss ich auf double umsteigen?
 
Moin,

also - zu (2) :
int reicht auf jeden Fall - Erklärungen findest hier (sind übrigens auch über Google zu finden ;) ) :
http://de.wikipedia.org/wiki/Integer_(Datentyp)

zu (1) :
- Rechtsbündigkeit erreicht Du durch eine entsprechende Formatierung Deiner Ausgabe! Da müsstest Du uns schon mal ein bisschen Code posten, falls Deiner nicht funktioniert!
- die anderen beiden Fragen verstehe ich nicht wirklich!
Sollst Du nun alle Zahlen bis 1000 ausgeben oder nur die ersten 10? :confused:
- und was heißt "fehlenden Zahlen NICHT mit Nullen füllen"? :confused:
Du gibst dich (hoffentlich) nur die gewünschten Zahlen aus, oder?

Wie gesagt, poste Deinen Code, dann kann man schauen, was ggf. schief läuft! So ist es nur reine Kaffeesatz-Leserei!

Gruß
Klaus
 
Hallo Klaus,
danke für deine Hilfestellungen.
Das mit dem Rechtsbündig hab ich nun hinbekommen, allerdings geht das ja nur bei int Werten, nicht bei double.

Moin,

also - zu (2) :
int reicht auf jeden Fall - Erklärungen findest hier (sind übrigens auch über Google zu finden ;) ) :
http://de.wikipedia.org/wiki/Integer_(Datentyp)

Leider bringt mir das so nichts, weil ich nicht weiß, wie ich das in C implementieren muss. Verwende ich eine unsigned int Ausgabe über

Code:
 printf("Fibonaccizahl: %u" , zahl);

berechnet er ab der ca. 50. Zahl nicht mehr richtige Werte. Scheinbar reicht dann der Integerraum nicht mehr für die langen Fibonaccizahlen aus?



zu (1) :
- Rechtsbündigkeit erreicht Du durch eine entsprechende Formatierung Deiner Ausgabe! Da müsstest Du uns schon mal ein bisschen Code posten, falls Deiner nicht funktioniert!
- die anderen beiden Fragen verstehe ich nicht wirklich!
Sollst Du nun alle Zahlen bis 1000 ausgeben oder nur die ersten 10? :confused:
- und was heißt "fehlenden Zahlen NICHT mit Nullen füllen"? :confused:
Du gibst dich (hoffentlich) nur die gewünschten Zahlen aus, oder?

Wie gesagt, poste Deinen Code, dann kann man schauen, was ggf. schief läuft! So ist es nur reine Kaffeesatz-Leserei!

Gruß
Klaus
Das hier ist das entscheidende Stück Code:

Code:
void Vector::WriteVector(void)
{

	FILE *fp = fopen("c:\\Temp\\vector.txt","w");
	for (int i = 0; i < Size; i++)
	{
		fprintf(fp, "Vector[%5d]=%.0f \n", i+1,Buffer[i]);
	}
	fclose(fp);

}

Hier wird ein Vector mit double Werten (den Fibonaccizahlen) durchlaufen und in eine Textdatei geschrieben.
Diese soll in jeder Zeile folgende Ausgabe haben:
Code:
Vector[xxxxx]=yyyyyyyyyy

wobei: x maximal 5 Stellen, y maximal 10 Stellen und alles beide rechtsbündig.



-Sollst Du nun alle Zahlen bis 1000 ausgeben oder nur die ersten 10? :confused:
1000! Es sollen maximal 1000 Fibonaccizahlen berechnet, also max. 1000 Zeilen in die Textdatei geschrieben werden.

- und was heißt "fehlenden Zahlen NICHT mit Nullen füllen"? :confused:
Du gibst dich (hoffentlich) nur die gewünschten Zahlen aus, oder?
Ich meinte hiermit wieder die Formatierung. Die unterschiedliche Länge der Zahlen sollen nicht durch 0en sondern Leerzeichen ausgeglichen werden. Also schön alle untereinander, rechtsbündig angeordnet. (siehe Beispiel im 1. Posting)
 
Zuletzt bearbeitet:
Hi.
Leider bringt mir das so nichts, weil ich nicht weiß, wie ich das in C implementieren muss. Verwende ich eine unsigned int Ausgabe über

Code:
 printf("Fibonaccizahl: %u" , zahl);

berechnet er ab der ca. 50. Zahl nicht mehr richtige Werte. Scheinbar reicht dann der Integerraum nicht mehr für die langen Fibonaccizahlen aus?
Allerdings. Das stand aber auch bei dem Link den vfl_freak gepostet hat.
Das hier ist das entscheidende Stück Code:

Code:
void Vector::WriteVector(void)
{

	FILE *fp = fopen("c:\\Temp\\vector.txt","w");
	for (int i = 0; i < Size; i++)
	{
		fprintf(fp, "Vector[%5d]=%.0f \n", i+1,Buffer[i]);
	}
	fclose(fp);

}
Erstmal solltest du dort natürlich erstmal prüfen ob die Datei überhaupt geöffnet werden konnte, also fp != NULL ist.
Hier wird ein Vector mit double Werten (den Fibonaccizahlen) durchlaufen und in eine Textdatei geschrieben.
Diese soll in jeder Zeile folgende Ausgabe haben:
Code:
Vector[xxxxx]=yyyyyyyyyy

wobei: x maximal 5 Stellen, y maximal 10 Stellen und alles beide rechtsbündig.
Double ist als Datentyp für die Berechnung von Fibonaccizahlen ungeeignet. Du solltest einen ganzzahligen Datentyp verwenden.
1000! Es sollen maximal 1000 Fibonaccizahlen berechnet, also max. 1000 Zeilen in die Textdatei geschrieben werden.
Das wirst du mit C/C++ Bordmitteln nicht erreichen können. Du könntest höchstens den Datentyp unsigned long long (falls dein Compiler das unterstüzt) verwenden, damit kannst du dann so ca. die 90. Fibonaccizahl ausrechnen - alle größeren Fibnonaccizahlen sind nicht mehr darstellbar.

Ansonsten müßtest du eine Bibliothek wie GNU MP oder MAPM (such mal hier im Forum) verwenden.

Gruß
 
Hi.
Allerdings. Das stand aber auch bei dem Link den vfl_freak gepostet hat.
Tschuldigung, aber hat er nicht vor dem Link geschrieben,dass int für mein Vorhaben ausreichen müsste?

Double ist als Datentyp für die Berechnung von Fibonaccizahlen ungeeignet. Du solltest einen ganzzahligen Datentyp verwenden.

Das wirst du mit C/C++ Bordmitteln nicht erreichen können. Du könntest höchstens den Datentyp unsigned long long (falls dein Compiler das unterstüzt) verwenden, damit kannst du dann so ca. die 90. Fibonaccizahl ausrechnen - alle größeren Fibnonaccizahlen sind nicht mehr darstellbar.

Ansonsten müßtest du eine Bibliothek wie GNU MP oder MAPM (such mal hier im Forum) verwenden.
Nunja das kann ich mir beim besten Willen nicht vorstellen. Ich bin hier in einem C/C++ Einsteiger Wahlpflichtfach an meiner FH und das ist die erste Übung, die wir bearbeiten sollen. Er kann doch nicht voraussetzen, dass wir uns das mit dem Bibliotheken alles selbst erarbeiten, von einem unsigned long long war auch nie die Rede.

Hier mal die ganze Aufgabenstellung, vielleicht hab ich auch irgendwas falsch interpretiert:
Es ist eine Zahlenfolge von n Zahlen zu berechnen und in einem Vektor ablegen. Der so entstandene Vektor ist formatiert in einer Textdatei abzulegen, danach einzulesen und anzuzeigen.

Mittels der nachfolgenden Definition ist eine beliebige Anzahl von Fibonacci Zahlen zu berechnen und in einem Vektor zu speichern. Die zu berechnende Anzahl wird über einen Kommandozeilenparameter vorgegeben. Nach der Berechnung sind die Ergebnisse in einer Textdatei zu speichern. Dazu ist für jede Zahl ein Laufindex und der Wert formatiert in eine Zeile zu schreiben. Zum Ende ist diese Datei einzulesen und zeilenweise anzuzeigen.
Achten sie auf den nötigen Wertebereich der Zahlen, Fibonacci Zahlen werden sehr lang. (<- (!))

Definition der Fibonacci-Folge:
Fn = F(n-1)+F(n-2) für n > =2
F0 = 0; F1=1

Format der Ausgabe:
Vector[iiiii]=zzzzzzzzzz
iiiii = Laufindex 5 Stellen
zzzzzzzzzz = Zahl mit 10 Stellen rechtsbündig

Beispiel:
Vector[ 0]= 0
Vector[ 1]= 1
Vector[ 2]= 1
Vector[ 3]= 2

Kommandozeilenparameter von Wert 2 bis 1000
 
Tschuldigung, aber hat er nicht vor dem Link geschrieben,dass int für mein Vorhaben ausreichen müsste?
Und?! ;-]
Nunja das kann ich mir beim besten Willen nicht vorstellen. Ich bin hier in einem C/C++ Einsteiger Wahlpflichtfach an meiner FH und das ist die erste Übung, die wir bearbeiten sollen. Er kann doch nicht voraussetzen, dass wir uns das mit dem Bibliotheken alles selbst erarbeiten, von einem unsigned long long war auch nie die Rede.
Was kannst du dir nicht vorstellen? Das die Zahlen so groß werden? Das es mit C/C++ Bordmitteln nicht berechnet werden kann?
Hier mal die ganze Aufgabenstellung, vielleicht hab ich auch irgendwas falsch interpretiert:
Du scheinst schon ganz richtig gelesen zu haben. Evtl. möchte euer Dozent euch auch nur die Begrenzung der Datentypen vor Augen führen? Schließlich hat ein unsigned int max. 10 Stellen, so dass er genau in das Format der Datei passen würde? Evlt. möchte er nicht die richtigen Ergebnisse bekommen, sondern nur die Werte, die durch den Überlauf eben herauskommen?

Gruß
 
Hallo,

Tschuldigung, aber hat er nicht vor dem Link geschrieben,dass int für mein Vorhaben ausreichen müsste?
Ja, hatte ich ... weil ich Deine Frage so verstanden hatte, dass Du alle F.-Zahlen bis 1000 ausgeben sollst :rolleyes:

zum unsigned long:
unsigned long (32 Bit): niedrigster Wert ist 0, höchster 4.294.967.295

Also die ersten 38 F.-Zahlen sehen lt. Internetsuche :suspekt: so aus :
die ersten 38
[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
1597,2584,4181,6765,10946,17711,28657,46368,75025,
121393,196418,317811,514229,832040,1346269,
2178309,3524578,5702887,9227465,14930352,24157817,
39088169]
Von daher hat Deepthroat mit seinen Ausführungen zur Länge sicher Recht ....

tschüss
Klaus
 
Was kannst du dir nicht vorstellen? Das die Zahlen so groß werden? Das es mit C/C++ Bordmitteln nicht berechnet werden kann?
Letzteres...weil damit die ganze Aufgabenstellung zu kompliziert für unseren Leistungsstand wäre.

Du scheinst schon ganz richtig gelesen zu haben. Evtl. möchte euer Dozent euch auch nur die Begrenzung der Datentypen vor Augen führen? Schließlich hat ein unsigned int max. 10 Stellen, so dass er genau in das Format der Datei passen würde? Evlt. möchte er nicht die richtigen Ergebnisse bekommen, sondern nur die Werte, die durch den Überlauf eben herauskommen?

Wäre ne Idee...aber wozu dann der spezielle Hinweis auf die richtige Wahl des Wertebereichs? Das ist doch dann total irreführend.
 
Dann schau dir doch einfach den Wertebereich der integralen Datentypen an. Die 94. Fibonaccizahl hat bereits 21 Stellen und liegt somit außerhalb jeglicher vorhandener Datentypen.
Wäre ne Idee...aber wozu dann der spezielle Hinweis auf die richtige Wahl des Wertebereichs? Das ist doch dann total irreführend.
Vielleicht ist damit nur die Auswahl von "unsigned" / "signed" int gemeint?

Gruß
 
Dann schau dir doch einfach den Wertebereich der integralen Datentypen an. Die 94. Fibonaccizahl hat bereits 21 Stellen und liegt somit außerhalb jeglicher vorhandener Datentypen.

Also ist auch mit double nix zu machen?


Vielleicht ist damit nur die Auswahl von "unsigned" / "signed" int gemeint?
Gruß

Das wär ja wohl ein Witz :eek: Da probiert und überlegt man sich nen Wolf und dann ist es nur sowas.
Naja ich denke mal, dass ich es dann wohl mit int abgeben werde.
 
Zurück