C++ Wahlprogramm



  • 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