Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Formatierung mit fprintf und Wertebereich für Fibonacci?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
19.11.2008, 08:36 Uhr
tobbbbi



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?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.11.2008, 11:54 Uhr
ao

(Operator)


long number = .... ; // Wert zuweisen
fprintf (file, "%10ld\n", number);

Falls die Zahlen zu groß werden:
__int64 number = .....;
fprintf (file, "%10I64\n", number);

double würde ich nicht empfehlen, wegen der drohenden Rundungsfehler.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.11.2008, 12:37 Uhr
~tobbbbi
Gast



Zitat von ao:
long number = .... ; // Wert zuweisen
fprintf (file, "%10ld\n", number);

Falls die Zahlen zu groß werden:
__int64 number = .....;
fprintf (file, "%10I64\n", number);

double würde ich nicht empfehlen, wegen der drohenden Rundungsfehler.


Geht leider beides nicht.

Beim ersten geht es nur bis zu 10 Stellen oder so und beim zweiten kommt gar keine Ausgabe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.11.2008, 16:14 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von tobbbbi:
Ich muss die Fibonaccizahlen bis zu einem maximalen Wert von 1000 ... ausgeben.

das verstehe ich so, das die grösste Fibonacci-Zahl, die ausgegeben werden soll, die 1000 bzw. ein Wert daraunter ist. In dem Fall reicht int aus.


Zitat von tobbbbi:

[quote ao]
long number = .... ; // Wert zuweisen
fprintf (file, "%10ld\n", number);



Geht leider beides nicht.

Beim ersten geht es nur bis zu 10 Stellen
[/quote]
klar, denn die Vorgabe besagt doch, das 10 stellen auszugeben sind.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.11.2008, 19:06 Uhr
tobbbbi



Sorry, dann hab ich mich wohl etwas missverständlich ausgedrückt.
Mir geht es darum, dass man eine Obergrenze eingibt und eine entsprechende Anzahl von Fibonaccizahlen ausgegeben kriegt. Bei 10 zB. dann 0,1,1,2,3,5,8,13,21,34.

Jetzt ist halt das Problem, dass ab ca. 50 Zahlen der int-Bereich ausgeschöpft ist und ich nicht weiß was ich dann nehmen soll. Immer unter der Berücksichtigung, dass die Zahlen bei der Ausgabe maximal 10 Stellen haben dürfen, also bei mehr als 10 Stellen einfach abgeschnitten werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.11.2008, 20:45 Uhr
Hans
Library Walker
(Operator)


Hi,

gut, dann meintest du oben also die 1000. Zahl in der Reihe der Fibonacci-Zahlen.

Zitat von tobbbbi:
Jetzt ist halt das Problem, dass ab ca. 50 Zahlen der int-Bereich ausgeschöpft ist und ich nicht weiß was ich dann nehmen soll.

Also da wären noch die long integer (long int, aktuell bis zu 64 Bit breit), oder long long (in C99) die auf aktuellen Systemen auch 128 Bit breit sein können. Ansonsten gibt es noch Bibliotheken für grosse Zahlen. Bei den Besseren davon können die Zahlen beliebig viele Stellen haben, die Grenzen werden da lediglich durch den verfügbaren Speicherplatz und die Rechenzeit bestimmt.


Zitat von tobbbbi:
Immer unter der Berücksichtigung, dass die Zahlen bei der Ausgabe maximal 10 Stellen haben dürfen, also bei mehr als 10 Stellen einfach abgeschnitten werden.

In diesem Fall würde ich zu double wechseln, denn da hast Du insgesamt auch nur 12 Stellen, mit denen Du rechnen kannst, alles andere wird durch Potenzen dargestellt. Die Ausgabe erstellst Du dann Sinnigerweise auch in Potenzschreibweise, wozu printf auch eine Formatvorgabe kennt.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.11.2008, 21:14 Uhr
0xdeadbeef
Gott
(Operator)


Rechne halt modulo 100000000000.

C++:
#include <stdint.h>

// ...

uint64_t x, y, z;

// ...

z = x + y % UINT64_C(100000000000);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.11.2008, 00:11 Uhr
tobbbbi



Sind ja mal ne Menge interessante Ansätze.
Das mit long int, long long muss ich morgen mal ausprobieren. Frage mich nur, wie ich das dann im fprintf parametriesieren muss, naja mal sehn.
Das mit den Bibliotheken schließe ich mal von vornherein aus, weil ich nicht glaube, dass unser Dozent, das von uns verlangt. Schließlich ist es eher ien C/C++ Einführungskurs und dies ist die erste Übungsaufgabe.
Auch das mit der Exponentendarstellung wäre sicherlich eine Möglichkeit, die aber laut der Aufgabenstellung eher nicht gewünscht ist.

Die Lösung mit dem Moduloansatz sieht echt gut aus, nur frage ich mich wie das dann mit dem Rechtsbündig ausgeben usw. hinhaut.

Am besten ich poste euch nun auch noch die komplette Aufgabenstellung:


Zitat:

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.
[B]Achten sie auf den nötigen Wertebereich der Zahlen, Fibonacci Zahlen werden sehr lang.[/B] (<- (!))

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



Außerdem hat mir der Prof noch folgendes geschrieben,
als ich ihn darauf hingewiesen habe, dass meine eingesendete Lösung nur int-Werte verarbeitet:
"Nur mit einer Langzahlimplementierung gibt es die "coole" Note."
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.11.2008, 00:57 Uhr
Hans
Library Walker
(Operator)


Hi,

also wenn Du einen Anfängerkurs besuchst, und die Ausgabe mit fprintf erledigen musst, können wir davon ausgehen, das Ihr bisher mit C arbeitet, aber nicht mit C++. Dem entsprechend ist das hier:

C++:
#include <vector>


tabu. Denn das wäre auch C++. (Die Konstruktion, die in der Aufgabenstellung als Vektor bezeichnet wird, wird oft auch Array oder Feld genannt. )
Wenn ihr mit einem Compiler arbeitet, der den C Standard von 1999 (kurz C99 genannt) beherscht, dann sollte long long funktionieren. Ich hab's nicht ausprobiert, aber es spricht einiges dafür, das der Wertebereich von long long trotzdem nicht ausreicht, um die Zahlen ab einer bestimmten Grösse darstellen zu können. Deshalb wird es wohl nötig sein, sich eine Langzahlimplementierung auszudenken, die mit so grossen Zahlen umgehen kann.

Man kann den ersten Satz der Aufgabe auch so deuten, das die einzelnen Ziffern der Zahlen in einem Vektor abzulegen sind. Das wäre der erste Schritt in Richtung einer Ganzzahlimplementierung. Bei dieser musst Du die Formatierung selber erledigen, indem Du vorher bestimmst, wieviele Stellen die Zahl hat, und die übrigen Stellen zuvor mit Leerzeichen füllst.
Bei den Standardtypen wie int oder long kannst Du die Formatierung der Ausgabe mit entsprechenden Bezeichnern im Formatstring von printf erledigen lassen, also mit "%10ld" zum Beispiel.


Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.11.2008, 13:42 Uhr
tobbbbi




Zitat von Hans:
Hi,

also wenn Du einen Anfängerkurs besuchst, und die Ausgabe mit fprintf erledigen musst, können wir davon ausgehen, das Ihr bisher mit C arbeitet, aber nicht mit C++. Dem entsprechend ist das hier:

C++:
#include <vector>


tabu. Denn das wäre auch C++. (Die Konstruktion, die in der Aufgabenstellung als Vektor bezeichnet wird, wird oft auch Array oder Feld genannt. )
Wenn ihr mit einem Compiler arbeitet, der den C Standard von 1999 (kurz C99 genannt) beherscht, dann sollte long long funktionieren. Ich hab's nicht ausprobiert, aber es spricht einiges dafür, das der Wertebereich von long long trotzdem nicht ausreicht, um die Zahlen ab einer bestimmten Grösse darstellen zu können. Deshalb wird es wohl nötig sein, sich eine Langzahlimplementierung auszudenken, die mit so grossen Zahlen umgehen kann.

Man kann den ersten Satz der Aufgabe auch so deuten, das die einzelnen Ziffern der Zahlen in einem Vektor abzulegen sind. Das wäre der erste Schritt in Richtung einer Ganzzahlimplementierung. Bei dieser musst Du die Formatierung selber erledigen, indem Du vorher bestimmst, wieviele Stellen die Zahl hat, und die übrigen Stellen zuvor mit Leerzeichen füllst.
Bei den Standardtypen wie int oder long kannst Du die Formatierung der Ausgabe mit entsprechenden Bezeichnern im Formatstring von printf erledigen lassen, also mit "%10ld" zum Beispiel.


Hans



Puh wow...also ich wäre jetzt von der Aufgabenstellung her nie auf die Idee gekommen, dass man einen Vektor dafür hernehmen soll um die einzelnen Ziffern einer Zahl abzulegen.
Wenn ich das richtig verstehe, dann müsste ich bei diesem Ansatz ja einmal einen Vektor für jede Fibonacci Zahl erstellen und dann nochmal einen Vektor in dem alle Fibonaccizahlen respektive Vektoren abgelegt werden. Sprich Vektoren im Vektor. m Maximalfall wären es dann 1001 Vektoren...1000 für jeweils eine berechnete Fibonaccizahl und einer für die komplette Fibonaccireihe - richtig?
Was für deine Annahme spricht ist, dass er uns eine Teilimplementierung der Vektorklasse gecodet hat, in welcher die "add"-Funktion als Übergabe einen int-Wert erwartet.Aber ob das irgendwas zu sagen hat? Evtl. war es ja nur so ein Grobgerüst, welches wir noch modifizieren sollen?

Und mit dem, was du am Anfnag gesagt hast, hast du teilweise Recht. Wir dürfen keine vorgefertigten Konstrukte verwenden, also auch keinen Vektor...Sinn der Übung ist ja auch grade, mal selbst einen Vektor über Felder zu implementieren.
Allerdings arbeiten wir sind schon auch mit c++ und können auch das Objektkonzept verwenden. Praktisch ein Mischmasch von beidem.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: