AUSGBE MANIPULATION
-
moin Leude,
hab folgendes Problem:hab fibonacci zahlen zu progammiern. die Ausgabe muss leserlich in Dreiziffergruppen ausgegeben werden z.B.
12.258.999wie kann man die ausgabe in Dreiergruppen ausgeben

mein quelltext
#include <iostream> using namespace std; int main(){ long double f0, f1, f2, h,n,i; cin>>n; if(n >1) { f0=0; f1=1; cout<<"0."<<f0<<"\n"<<"1."<<f1<<"\n"; for(i=2;i<n+1;i++) { h=f1; f1=f0+f1; f0=h; cout<<i<<"."<<f1<<"\n"; } } return 0; }so nebenbei, wie kann man das verlassen der zahlen bereich vermeiden?
-
benutze die header
#include <iomanip.h>dazu
-
fdgfdg schrieb:
benutze die header
#include <iomanip.h>dazu
NEIN, es heißt <iomanip>, und das schon seit Jahren!
-
Sorry, der komische SQL-Server hat Müll gemacht, deshalb der Doppelpost.
Diese Dreierausgabe würde ich in eine Funktion packen, allerdings bin ich mir über dein Problem noch nicht ganz im Klaren.
-
Also, habe hier mal was sehr unsauberes. NUR ZUM VERSTEHEN (bitte nicht meckern
)Ist es das, was du ungefähr suchst?
#include <iostream> using namespace std; int main() { long double f0, f1, f2, h,n,i; int Anzahl, Rest, Count; cin>>n; if(n >1) { f0=0; f1=1; cout<<"0."<<f0<<"\n"<<"1."<<f1<<"\n"; for(i=2;i<n+1;i++) { h=f1; f1=f0+f1; f0=h; char buffer[256] = {0}; sprintf (buffer,"%.0lf%.0lf", i, f1); Anzahl = strlen(buffer); Count = Anzahl/3; if (Anzahl%3 == 0) Count--; int Anzahl2 = Anzahl + Count; char buffer2[256] = {0}; buffer[Anzahl2] = '\0'; strcpy(buffer2, buffer); Anzahl--; Anzahl2--; for (int j=0; j<Count; j++) { buffer2[Anzahl2] = buffer[Anzahl]; Anzahl2--; Anzahl--; buffer2[Anzahl2] = buffer[Anzahl]; Anzahl2--; Anzahl--; buffer2[Anzahl2] = buffer[Anzahl]; Anzahl2--; Anzahl--; buffer2[Anzahl2] = '.'; Anzahl2--; } //cout<<i<<"." <<f1<<"\n"; cout << buffer2 << endl; } } return 0; }In Funktionen packen und verfeinern etc kann man immernoch
Gruß
Horst
-
.filmor schrieb:
Sorry, der komische SQL-Server hat Müll gemacht, deshalb der Doppelpost.
Diese Dreierausgabe würde ich in eine Funktion packen, allerdings bin ich mir über dein Problem noch nicht ganz im Klaren.
Also,
Sei die Fibonacci Zahl 62.Grades = 1234567891011
diese Zahl sollte der Anwender so auf dem Schirm sehen 1.234.567.891.011Die Aufgabe hielt ein Hinweis auf vector<int>; und wir sollten auf das mögliche Verlassen des Zahlenbereiches achten.
hoffe ist dadurch klarheit verschafft worden
-daroox
-
ok, denke so sollte es funktionieren.
#include <iostream> #include <vector> using namespace std; int GetNumber (char *string); int main() { long double f0, f1, f2, h,n,i; int Anzahl, Count; vector<int> theVector; cin>>n; if(n >1) { f0=0; f1=1; cout<<"0."<<f0<<"\n"<<"1."<<f1<<"\n"; for(i=2;i<n+1;i++) { h=f1; f1=f0+f1; f0=h; char buffer[256] = {0}; char buffer2[256]; sprintf (buffer,"%.0lf%.0lf", i, f1); strcpy(buffer2, buffer); Anzahl = strlen(buffer); Count = Anzahl/3; if (Anzahl%3 == 0) Count--; theVector.push_back(GetNumber(buffer)); for (int j=0; j<Count; j++) { theVector.push_back(GetNumber(buffer)); } printf("buffer: %s\nvector: ", buffer2); printf("%d", theVector.back()); theVector.pop_back(); while (!theVector.empty()) { printf(".%03d", theVector.back()); theVector.pop_back(); } printf("\n"); } } return 0; } int GetNumber (char *string) { int ret = 0; char *pointer; if (strlen(string) > 2) pointer = &string[strlen(string)-3]; else pointer = string; sscanf (pointer, "%d", &ret); *pointer = '\0'; return ret; }
-
daroox schrieb:
Also,
Sei die Fibonacci Zahl 62.Grades = 1234567891011
diese Zahl sollte der Anwender so auf dem Schirm sehen 1.234.567.891.011Die Aufgabe hielt ein Hinweis auf vector<int>; und wir sollten auf das mögliche Verlassen des Zahlenbereiches achten.
Hmm, also ich würde das mit den C++ Locales machen, dafür sind sie schließlich da, und nicht mit einem komischen vector<int>. Das mit dem Zahlenbereich lässt sich durch einen kleinen Vergleich in der Schleife implementieren:
#include <locale> #include <iostream> #include <iomanip> struct my_punctuation : public std::numpunct<char> { char do_thousands_sep () const { return '.'; } std::string do_grouping () const { return "\3"; } }; template <typename T> void show_fib (unsigned int i, T n) { my_punctuation* p = new my_punctuation; const std::locale loc (std::cout.getloc ()); const std::locale newloc (loc, p); std::cout << "f(" << std::setw(3) << i << ") = " << std::setw (30); std::cout.imbue (newloc); std::cout << std::fixed << std::setprecision(0) << std::right << n << std::endl; std::cout.imbue (loc); } template <typename T> void do_fib (int n) { T i = 1, j = 1; for (int h = 0; h < n + 1; ++h) { show_fib (h, i); T foo = i; i = i + j; j = foo; if (i < j) { std::cerr << "Wertebereich ueberschritten." << std::endl; break; } } } int main () { int bla; std::cin >> bla; do_fib<long double> (bla); return 0; }
-
daroox schrieb:
Die Aufgabe hielt ein Hinweis auf vector<int>; und wir sollten auf das mögliche Verlassen des Zahlenbereiches achten.
hoffe ist dadurch klarheit verschafft worden
-daroox
-
Hinweis != Arbeitsanweisung;