C++ Wahlprogramm



  • Division durch 0 geht ja bekanntlich nicht.
    Du kannst aber den Fehler abfangen.

    Außerdem empfehle ich dir für Zeichenketten std::string zu benutzen.

    case 4:
    			for ( int i = 0; i<4; i++)
    			{
    			alle_stimmen += partei[i].stimmen;
    			}
    			for ( int i = 0; i<4; i++)
    			{
    				if (alle_stimmen == 0) {
    					cout << "Division durch 0. Error\n";
    					break;
    				}
    			prozent = partei[i].stimmen/alle_stimmen * 100; 
    			cout << partei[i].name << ": "<< prozent << " " << "\n"; 
    			}
    


  • Vielen Dank!

    Ich möchte nun eine kleine grafische Darstellung einbauen.

    case 5:
    				for (int i=0; i<4; i++)
    				{
    					alle_stimmen += partei[i].stimmen;
    				}
    
    				 for ( int i = 0; i<4; i++)
                {
                        if (alle_stimmen == 0) {
                        cout << "Bitte erst eine Stimme abgeben.\n";
                        break;
                    }
    
    			ergebnis = prozent (partei[i].stimmen, alle_stimmen); 
    			//cout <<  ergebnis;
    
    				if ( ergebnis >90 && ergebnis <100 )
    			{ 
    				cout <<  "###########" << endl;
    			}
                          ............
    
    			}
    

    Die Variabel "ergebnis" gibt allerdings den Wert 0000 (vier Parteien, keine gewählt) aus. Wenn ich die letzte Partei wählen würde, dann wäre 000100 die ausgegebene Zahl.

    Nun weiß ich allerdings nicht, wie ich einen Wert rausbekomme, mit dem die if-Anweisung arbeiten kann. Die Methode ist im Endeffekt auch nicht gerade genau.

    Ich habe an so etwas ähnliches gedacht (ist natürlich Schwachsinn):

    if ( partei[i].name, ergebnis >90 && partei[i].name,  ergebnis <100 )
    

    oder vielleicht so (das geht aber nicht, Fehlermeldung: error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt):

    ausgabe = ergebnis(partei[i].name);
    cout << ausgabe;
    
    if (ausgabe <90...)
    

    Also die Prozentwerte der einzelnen Parteien überprüfen.



  • Abendbrot schrieb:

    Vielen Dank!

    Ich möchte nun eine kleine grafische Darstellung einbauen.

    case 5:
    				for (int i=0; i<4; i++)
    				{
    					alle_stimmen += partei[i].stimmen;
    				}
    				
    				 for ( int i = 0; i<4; i++)
                        {
                        if (alle_stimmen == 0) {
                        cout << "Bitte erst eine Stimme abgeben.\n";
                        break;
                        }
                 prozent = partei[i].stimmen/alle_stimmen * 100; //Jetzt hast du die Prozentwerte 
          //Hier muß jetzt ne Schleife rein die eine # pro Prozent ausgibt
    
    			    }
    


  • Ich verstehe die Logik dahinter nicht.
    Wenn ich "prozent" ausgebe, erhalte ich vier Prozentwerte. Ich weiß nicht wie ich die voneinander trennen soll. Wenn ich etwas schreibe wie "cout << partei[i].name << per;", dann werden die geteilt, aber der Parteiname steht davor. Wenn ich das "partei[i].name" durch ein "i" ersetzte, steht die jeweilige Zahl davor.

    Es gibt ja auch nicht die Möglichkeit es mit "per[i]" zu lösen, fände ich verständlich.

    Daher weiß ich leider nicht, wie ich die Schleife aufbauen soll.



  • Du sollst ja auch nicht die Prozentwerte ausgeben. Die Prozentwerte sind die obere Grenze. Pro Prozent eine # ausgeben. D.h. bei 5% steht dort #####.

    case 5:
                    for (int i=0; i<4; i++)
                    {
                        alle_stimmen += partei[i].stimmen;
                    }
    
                     for ( int i = 0; i<4; i++)
                        {
                        if (alle_stimmen == 0) {
                        cout << "Bitte erst eine Stimme abgeben.\n";
                        break;
                        }
                 prozent = partei[i].stimmen/alle_stimmen * 100; 
                 cout << partei[i].name << ":\n"; //Jetzt steht der Parteiname über den #
    //Ich machmal Pseudocode. 
    Zählvaribale definieren
    Schleife: wiederhole solange wie Zählvaribale kleiner Prozent ist. Prozent noch zum Int casten. //Tip: static_cast<int>(prozent) => 
    //Schleifen durchläufe mit Gleitkommazahlen sind fehleranfällig
              eine # ausgeben
              Zählvaribale erhöhen
    Schleifenende
    
            }
    


  • Vielen Dank für deine Hilfe, so funktoniert es:

    static_cast<int>(prozent);
    
    	 for (int i = 0; i<100; i++)
         {
    			while (i<prozent)
    				{
    				i++;
    				cout << "#" <<endl;
    				}
    	 }
    

    Leider werden die # alle untereinander angezeigt, was das Programm sehr lang zieht. Wie kann man die alle nebeneinander positionieren?



  • 1. Wozu noch die for-Schleife? Die ist doch unnötig.
    2. Was passiert denn bei << endl?



  • Ohne die for-Schleife wird nur noch die erste Partei angezeigt.
    "endl", stimmt, danke! 😉



  • ...



  • make_vector( 
            party_t( "CDU" ) ), 
            party_t( "SPD" ), 
            party_t( "GRUENE" ), 
            party_t( "FPD" ) 
        )
    

    Das ist furchtbar. 😉 👎

    party_t parties[] = { party_t("CDU"),
                              party_t("SPD"),
                              party_t("GRUENE"),
                              party_t("FPD") };
    
        election_t election( std::vector<party_t>(parties, parties + sizeof(parties) / sizeof(*parties)) );
    

    Und: Du nutzt Templates für deine "Krücke", machst aber keinen Iteratoren-Paar Ctor für election_t ?
    Wieso ist der party_t Konstruktor nicht explicit? Wieso hast du void in main() s leerer Parameterliste stehen?
    Und: Die C++11-Krücke ist in dem Code sinnfrei, da du range-based for verwendest.

    for( unsigned i = 5; i < static_cast< unsigned >( percent + .5 ); i += 5 ) // static_cast dafür? 
                os.put( '#' );
    

    ➡

    os << std::string( std::max<int>(0, percent / 5 - 0.9) , '#'); // Hmm. Hier bin ich mir nicht ganz sicher. Richtig umgeformt... ?
    

    Außerdem teilst du durch 0 wenn total_votes in Zeile 76 null ist.



  • Sone schrieb:

    os << std::string( std::max<int>(0, percent / 5 - 0.9) , '#'); // Hmm. Hier bin ich mir nicht ganz sicher. Richtig umgeformt... ?
    

    NEIN! Das ist unnötige Speicherverschwendung!

    Besser:

    // bin mir auch nicht sicher
    std::fill_n(std::ostreambuf_iterator<char>(std::cout), std::max<int>(5, percent + .5) - 5, '#');
    

    Ich finde es auch komisch, Jeder Partei eine Zahl zu geben. Ich wähle für DMP (deutsche Musterpartei), nicht für die Zahl 3.



  • ...



  • Swordfish schrieb:

    Sone schrieb:

    Außerdem teilst du durch 0 wenn total_votes in Zeile 76 null ist.

    Wer Wahlen mit 0 Wahlbeteiligung auswerten will gehört bestraft.

    YMMD 👍



  • Swordfish schrieb:

    Sone schrieb:

    Außerdem teilst du durch 0 wenn total_votes in Zeile 76 null ist.

    Wer Wahlen mit 0 Wahlbeteiligung auswerten will gehört bestraft.

    Sag das mal Deutschland. Huehuehue! 🙂

    Swordfish schrieb:

    Sone schrieb:

    make_vector( 
            party_t( "CDU" ) ), 
            party_t( "SPD" ), 
            party_t( "GRUENE" ), 
            party_t( "FPD" ) 
        )
    

    Das ist furchtbar. 😉 👎

    weil ... ?

    Die Klammersetzung ist unintuitiv. Das Teil hat einen Overhead, weil mehrere male neu allokiert werden muss. Der Konvertierungsoperator gibt eine Kopie zurück, ist aber nicht const -qualifiziert.
    (Gib eine Referenz zurück. Dann kann auch gemoved werden).

    Weil ich den rest des Tages am C-frickeln bin.

    Du geilst mich an.

    Wichtig?

    Perfektionist?

    Erzähl das dem MSVC CTP Nov '12 ...

    Kann ich nicht. Ich arbeite unter Linux. Ab gestern. Huehuehue! 🙂
    (Auf Windows ist aber natürlich auch das CTP druff)

    std::fill_n(std::ostreambuf_iterator<char>(std::cout), std::max<int>(5, percent + .5) - 5, '#');

    Das ist tatsächlich schöner. Merk ich mir. ( fill_n habe ich aber auch schon vergessen)



  • ...



  • Gib eine Referenz zurück. Dann kann auch gemoved werden

    Doch, ist richtig. Dann, und nur dann kann auch gemoved werden. Sonst wird min. 1 mal kopiert.

    Falls das irgendwie was bringen soll - wenn der Compiler schon RValue-Referenzen und Move-Semantik unterstützt...



  • explicit election_t( party_t const * first,  party_t const * last )
    

    Mit party_t Konstruktor meinte ich den von party_t .
    Mit initializer-lists geht es allerdings auch hier implizit. Daher macht es evt. auch hier Sinn.

    void vote_for() { ++votes; }
    

    Ok, ich hab einen - wie wäre es mit überladen des Inkrement-Operators? 😃



  • ...


Anmelden zum Antworten