C++ Wahlprogramm



  • Versuchs mal mit richtiger Prozentrechnung 😉

    Anteil / Gesamt * 100


  • Mod

    12345 schrieb:

    Versuchs mal mit richtiger Prozentrechnung 😉

    Anteil / Gesamt * 100

    Da kommt sicher auch 0 raus.



  • Der obige Beitrag ist quatsch 😉

    Du mußt das trennen.

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

    Setz mal die Werte ein. Was passiert da bei dem Schleifendurchlauf?

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


  • ...



  • Du bildest erst die Summer aller Stimmen.

    Und dann in einer separaten Schleife bildest du dann die Prozentanteile.

    edit: Außerdem ist es int. D.h du es wird bei 0,456 nur die 0 ausgegeben. Und bei der Rechnung wird der Nachkommateil glaube ich auch abgeschnitten. Deshalb wohl immer die 0.



  • Danke!

    Ich habe nun "alle_stimmen" und "prozent" den Datentyp "float" zugewiesen.

    Hier ist mein Code:

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

    So wird, wenn ich noch keine Partei ausgewählt habe, und den Menüpunkt "Prozent" öffne, "-1. #IND" bei den jeweiligen Parteien angezeigt.



  • Versuchs mal mit Anteil / Gesamt mal 100 => 1 / 1 * 100 = 100%
    Du rechnest

    1 / 100 => 0,01 * 1 = 0,01



  • So funktioniert es, danke!
    Allerdings wird, wenn ich noch keine Partei ausgewählt habe, und den Menüpunkt "Prozent" öffne, "-1. #IND" bei den jeweiligen Parteien angezeigt.



  • Bestimmt ist partei[i].stimmen noch nicht initialisiet. Initialisiere die mal mit 0. Dann sollte überall 0% rauskommen.



  • eddi0815 schrieb:

    Bestimmt ist partei[i].stimmen noch nicht initialisiet. Initialisiere die mal mit 0. Dann sollte überall 0% rauskommen.

    Doch, initalisiert ist diese:

    for ( int i = 0; i < 4; i++ )
    {
    partei[i].stimmen = 0;
    }
    

    Und alle_stimmen sowie prozent auch.

    Sobald ich für irgendeine Partei eine Stimme abgegeben habe, funktioniert es.



  • Dann zeig nochmal deinen ganzen Code. So wie du geschrieben hast, stimmt der von Seite 1 wohl nicht mehr.



  • Hier ist der Code:
    http://uni----.de/---/cplusplus.txt



  • Setzt bitte deinen Code in Zukunft ins Forum. Dann ist er für alle sichtbar auch dann noch, wenn dein Link irgendwann mal nicht mehr existiert.

    #include <iostream>
    #include <conio.h>
    #include <limits>
    using namespace std ;
    
    char partei_namen[100][10];
    char partei_stimmen[100];
    
    struct partei
    {
        char name[10];
        int stimmen;
    };
    
    partei partei[100];  //Parteinformationen. partei[1] wird genutzt
    
    void wahl_rueckmeldung(int p)
    {
    			cout << "Sie haben " << partei[p].name << " gewaehlt\n";
    			partei[p].stimmen++;
    }
    
    int gewaehlte_operation()
    {
    	while (true)
    	{
    		int operation;
            cout << "Waehlen Sie eine Operation aus:" << endl;
            cout << " [1] Stimme abgeben" << endl;
            cout << " [2] Stimmen auszaehlen" << endl;
            cout << " [3] Alle abgegebene Stimmen" << endl;
    		cout << " [4] Prozente" << endl;
            cout << " [5] Beenden" << endl;
            cout << "Geben Sie die Zahl fuer die gewuenschte Operation ein: ";
            cin >> operation;
    
            //if (operation == 1 || operation == 2 || operation == 3 || operation == 4 || operation == 5 || operation == 6)
            //{
    
            int gewaehlte_partei;
    		float alle_stimmen = 0;
    		float prozent = 0;
            switch(operation)
            {
                case 1:
                cout << "Waehlen Sie eine Partei aus:" << endl;
                    for ( int i = 0; i<4; i++)
                    {
                        cout << "[" << i <<"] Stimme abgeben fuer " << partei[i].name << endl;
                    }
                    cin >> gewaehlte_partei;
                    wahl_rueckmeldung(gewaehlte_partei);
                break;
    
                case 2:
    				for ( int i = 0; i<4; i++)
                    {
                        cout << partei[i].name << ": "<< partei[i].stimmen << " " << "\n";
                    }
    
                    break;
    			case 3:
    			for ( int i = 0; i<4; i++)
    			{
    			alle_stimmen += partei[i].stimmen; // alle ausgewählten Stimmen werden berechnet
    			}
    				cout << "Stimmen insgesamt: " << alle_stimmen << " \n";
    				break;
    			case 4:
    			for ( int i = 0; i<4; i++)
    			{
    			alle_stimmen += partei[i].stimmen;
    			}
    			for ( int i = 0; i<4; i++)
    			{
    			prozent = partei[i].stimmen/alle_stimmen * 100; //aus allen Stimmen wird der prozentuale Anteil berechnet
    			cout << partei[i].name << ": "<< prozent << " " << "\n"; //Ausgabe der jeweiligen Prozentwerte aller Parteien
    			}
    				break;
    			case 5:
    				exit(0);
    				return 0;
    				break;
                default:
                    cout << "Die Operation " << operation << " ist nicht definiert!" << endl;
    
            }
            //}
            //else
            //{
            //	cout << "Zahl nicht vorhanden! ";
            //}
    	}
    	return 0;
    }
    
    int main( void )
    {
    	int test = 0;
    	strcpy( partei[0].name, "CDU" );
    	strcpy( partei[1].name, "SPD" );
    	strcpy( partei[2].name, "Gruene" );
    	strcpy( partei[3].name, "FDP" );
    
    	for ( int i = 0; i < 4; i++ )
    	{
    		partei[i].stimmen = 0;
    	}
    
        gewaehlte_operation();
        getch();
        return 0 ;
    }
    


  • 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?


Anmelden zum Antworten