AUSGBE MANIPULATION



  • moin Leude,
    hab folgendes Problem:

    hab fibonacci zahlen zu progammiern. die Ausgabe muss leserlich in Dreiziffergruppen ausgegeben werden z.B.
    12.258.999

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

    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



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

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


Anmelden zum Antworten