C++ double zahl runden und ausgeben



  • Guten Abend Liebes Forum,

    ich bin neu in diesem Forum. Ich mache gerade eine Ausbildung zum IT-Systemkaufmann. Ich schreibe nach den Ferien eine Klausur in C++ und bin seit einigen Tagen fleißig am lernen. Ich bin ein echter Loser, was C++ angeht. Ich schreibe mir gerade ein kleines Programm, welches Lohn/Gehalt ausrechnen soll.
    Ich habe aber ein Problem beim Runden einer double Zahl. Ich möchte sie in eine int umwandeln, um später per switch und case eine Bonuszahlung drauf zurechnen. Das ganze möchte ich für 2 Personen in einem Feld und Struktur anlegen, hinterher möchte ich dann sämtliche Ergebnisse ausgeben und evtl. noch per bubblesort sortieren. Die Ein- und Ausgaben funktioniern ohne Probleme, bis ich bei der ersten Eingabe eine Kommazahl eingebe, dann rundet das Programm diese Zahl zwar und gibt sie mir am Ende auch wie gewollt aus, aber das Programm bricht dann ab und ich kann keine zweite Zahl eingeben.

    Hier mal ein mein Hauptprogramm:

    #include <iostream>
    #include <string>
    #include <math.h>
    .
    .
    .
    int round[2];
    .
    int main()
    {
    	struct person {
    		string name[2];
    		double brutto[2];
    		double netto[2];}pers;
    	willkommen();
    
    	pers.name[0]=name();
    	pers.name[1]=name();
    	pers.brutto[0]=lohn();
    	pers.brutto[1]=lohn();
    
    	round [0]=float( pers.brutto[0] * 100 ) / 100;
    	round [1]=float( pers.brutto[1] * 100 ) / 100;
    
    	cout <<pers.brutto[0]<<" und "<<round[0]<< endl;
    	cout <<pers.brutto[1]<<" und "<<round[1]<< endl;
    	cout <<pers.name[0]<<" und "<<pers.name[1]<< endl;
    }
    

    Vielleicht kann mir ja wer helfen.Ich wollte gern alles, was ich in der Schule gelernt habe, in ein Programm packen. Hab in der ersten Klausur schon eine 4 geschrieben, will damit nicht nochmal bei meinem Chef ankommen.

    Danke schon mal für lesen! 🙂

    Gruß



  • Du solltest die problematische Stelle Deines Programms extrahieren, in ein kleines, kompilierbares, funktionierendes Beispielprogramm packen und hier posten, so daß man das Problem nachvollziehen kann.
    Sonst weiß man nicht, was Problemursache sein kann.
    Etwa so wie das hier:

    #include <iostream>
    #include <sstream>
    #include <string>
    
    int main()
    {
    	std::string eingabe; 
    
    	std::cout << "Gib was ein! (ende fuer Programmende)\n";
    	std::cin >> eingabe;
    
    	while(eingabe != "ende")
    	{
    		std::stringstream ioStream;
    		double brutto;
    
    		ioStream << eingabe;
    		ioStream >> brutto;
    
    		int round = brutto;
    
    		std::cout << "Brutto gerundet: " << round << "\n\n\n";
    
    		std::cout << "Gib was ein! (ende fuer Programmende)\n";
    		std::cin >> eingabe;
    
    	} 
    
    }
    


  • Belli schrieb:

    Du solltest die problematische Stelle Deines Programms extrahieren, in ein kleines, kompilierbares, funktionierendes Beispielprogramm packen und hier posten, so daß man das Problem nachvollziehen kann.
    Sonst weiß man nicht, was Problemursache sein kann.
    Etwa so wie das hier:

    Danke für deine Antwort.
    Das ist was ich bis jetzt geschrieben habe, will das natürlich noch erweitern:

    #include 
    #include <iostream>
    #include <string>
    #include <math.h>
    
    using namespace std;
    
    void willkommen()
    	{
    		cout <<"Dieses Programm rechnet Ihren Lohn aus" << endl;
    	}
    double lohn()
    	{
    			double x;
    			cout <<"Bitte geben Sie Ihren Lohn ein: " << endl;
    			cin >> x;
    
    		return x;
    	}
    string name()
    				{
    				string name;
    				cout<<"Bitte geben Sie Ihren Namen ein"<< endl;
    				cin >> name;
    
    				return name;
    				}
    
    int round[2];
    
    int main()
    
    {
    	struct person {
    		string name[2];
    		double brutto[2];
    		double netto[2];
    		string bonus[2];}pers;
    
    	willkommen();
    
    	pers.name[0]=name();
    	pers.name[1]=name();
    	pers.brutto[0]=lohn();
    	pers.brutto[1]=lohn();
    
    	round [0]=float( pers.brutto[0] * 100 ) / 100;
    	round [1]=float( pers.brutto[1] * 100 ) / 100;
    
    	cout <<pers.brutto[0]<<" und "<<round[0]<< endl;
    	cout <<pers.brutto[1]<<" und "<<round[1]<< endl;
    	cout <<pers.name[0]<<" und "<<pers.name[1]<< endl;
    
    }
    

    Hoffe es ist jetzt nicht zu viel.
    Gruß



  • Okay ...
    Du benutzt std::cin, um eine Variable vom Typ double einzulesen. Eingeben tust Du dann aber zum Beispiel:

    5,36

    und das ist kein double - Wert, weil das Dezimaltrennzeichen des PC kein ",", sondern ein "." ist. Gib also zum Beispiel ein:

    5.36

    und alles wird bestens funktionieren.

    Ich habe hier Dein Beispiel noch mal so gekürzt, wie ich es oben erwähnt habe ... die Namenseingabe spielt für das Problem ja keine Rolle, deshalb habe ich die rausgenommen.
    Das Array round musste ich umbenennen, weil mein Compiler eine gleichnamige Funktion kennt.
    Ansonsten habe ich mal in der Funktion lohn() versucht, das Problem deutlich zu machen:
    Wenn man zB 5,36 (mit dem falschen Komma) eingibt, dann wird nur die 5 eingelesen, weil das Komma für den PC nicht zu einem double - Wert gehören kann. Wenn man danach noch ein cin mit einem String als Ziel ausführt, dann sieht man, daß in dem String ",36" ankommt, der erste cin hat also nur den für den PC numerischen Anteil aus dem Eingabestrom 'weggelesen'.

    #include <iostream>
    #include <string>
    #include <math.h>
    
    using namespace std;
    
    double lohn()
        {
                double x;
    
                cout <<"Bitte geben Sie Ihren Lohn ein: " << endl;
                cin >> x;
    
                cout << "eingegeben: " << x << endl;
    
                string t;
                cin >> t;
                cout << "t = " << t << endl;
    
            return x;
        }
    
    int round_[2];
    
    int main()
    
    {
        struct person {
            string name[2];
            double brutto[2];
            double netto[2];
            string bonus[2];}pers;
    
        pers.brutto[0]=lohn();
        pers.brutto[1]=lohn();
    
        round_ [0]=float( pers.brutto[0] * 100 ) / 100;
        round_ [1]=float( pers.brutto[1] * 100 ) / 100;
    
        cout <<pers.brutto[0]<<" und "<<round_[0]<< endl;
        cout <<pers.brutto[1]<<" und "<<round_[1]<< endl;
    
    }
    

    In Deiner Version der Funktion befindet sich beim zweiten Aufruf der Rest ",36" immer noch im Eingabestrom, cin versucht den zu lesen, weil das Ziel eine double - Variable ist, die mit dem Komma aber nix anfangen kann, macht cin gar nix und als Rückgabewert kommt das zurück, was zufällig in x gerade steht.



  • Belli schrieb:

    Okay ...
    Du benutzt std::cin, um eine Variable vom Typ double einzulesen. Eingeben tust Du dann aber zum Beispiel:

    5,36

    und das ist kein double - Wert, weil das Dezimaltrennzeichen des PC kein ",", sondern ein "." ist. Gib also zum Beispiel ein:

    5.36

    und alles wird bestens funktionieren.

    Ich habe hier Dein Beispiel noch mal so gekürzt, wie ich es oben erwähnt habe ... die Namenseingabe spielt für das Problem ja keine Rolle, deshalb habe ich die rausgenommen.
    Das Array round musste ich umbenennen, weil mein Compiler eine gleichnamige Funktion kennt.
    Ansonsten habe ich mal in der Funktion lohn() versucht, das Problem deutlich zu machen:
    Wenn man zB 5,36 (mit dem falschen Komma) eingibt, dann wird nur die 5 eingelesen, weil das Komma für den PC nicht zu einem double - Wert gehören kann. Wenn man danach noch ein cin mit einem String als Ziel ausführt, dann sieht man, daß in dem String ",36" ankommt, der erste cin hat also nur den für den PC numerischen Anteil aus dem Eingabestrom 'weggelesen'.

    In Deiner Version der Funktion befindet sich beim zweiten Aufruf der Rest ",36" immer noch im Eingabestrom, cin versucht den zu lesen, weil das Ziel eine double - Variable ist, die mit dem Komma aber nix anfangen kann, macht cin gar nix und als Rückgabewert kommt das zurück, was zufällig in x gerade steht.

    Vielen Dank, für deine sehr hilfreiche Unterstützung. Das hilft mir weiter. Top-Erklärung!!!! 🙂 Darauf bin ich gar nicht gekommen.

    Gruß


Anmelden zum Antworten