Programm zur Noteneingabe



  • Hallo Leute.

    Ich soll ein Programm schreiben das folgendes genau einmal ermöglicht.

    Für die Erstellung der Notenstatistik einer Lehrveranstaltung soll ein Programm erstellt werden:
    -Eingabe der Anzahl der Studierenden
    -Pro Studierenden wird seine Punktezahl eingegeben und einer der folgenden Noten zugeordnet 1. Sehr gut- Punktebereich 88 bis 100
    2. gut - 75 bis 88
    3. befriedigend - 63 bis 75
    4. genügend - 50 bis 63
    5. nicht genügend- 0 bis 50
    Nachdem für alle Studierenden die Punkte eingegeben wurden soll folgendes ausgegeben werden.
    - maximale und minimale Punktezahl
    - Anzahl der Studierenden pro Note

    Ich wollte es zunächst nur mit 2 Punktebereichen testen, jedoch erfolglos, da nur jeweils die erste Bedingung also in dem Fall sehr gut erhöht wird, egal was ich eingebe. Was mache ich falsch und wie ermittle ich max. bzw min. Punktezahl sowie Anzahl der Studierenden pro Note.
    Hier mein Quellcode:

    #include <iostream>
    using namespace std;

    int main(){

    int sehrgut=0;
    int gut=0;
    int Punkte;
    char antwort=' ';
    int Studierende;

    cout << "Bitte geben Sie die Anzahl der Studierenden ein!" << endl;
    cin >> Studierende;

    do{

    cout << "Bitte geben sie die Punktezahl ein!" << endl;
    cin >> Punkte;
    cout << "Wollen sie fortfahren?" << endl;
    cin >> antwort;

    if ( '88' >= Punkte <= '100'){

    sehrgut++;
    }

    else if ('75' >=Punkte <= '88'){

    gut++;
    }

    }while (antwort=='j');

    cout << "Anzahl sehr gut:" << sehrgut <<endl;
    cout << "Anzahl gut:" << gut << endl;

    }



  • Guter Anfang.

    if (Punkte>=88 && Punkte<=100)
    


  • Danke! Wusste nicht dass ich diese Schreibweise anwenden muss.
    Sollen die Studierenden ein Array sein damit die jeweilige Note zugewiesen werden kann?



  • Die Letzte Frage hätte ich mir sparen können, aber wie beschränke ich jetzt die Eingabe der Noten durch die Anzahl der Studierenden? So dass beispielsweise nach 20 Studierenden automatisch die Noten ausgegeben werden? Und wie berechne ich maximale Punktezahl sowie minimale?
    So weit bin ich bereits

    #include <iostream>
    using namespace std;

    int main(){

    int sehrgut=0;
    int gut=0;
    int befriedigend=0;
    int genügend=0;
    int nichtgenügend=0;
    int Punkte;
    char antwort=' ';
    int Studierende;

    cout << "Bitte geben Sie die Anzahl der Studierenden ein!" << endl;
    cin >> Studierende;

    do{

    cout << "Bitte geben sie die Punktezahl ein!" << endl;
    cin >> Punkte;
    cout << "Wollen sie fortfahren?" << endl;
    cin >> antwort;

    if (Punkte<0 || Punkte>100){

    cout << "Punktebereich liegt zwischen 0 und 100" << endl;
    }
    else if (Punkte>=88 && Punkte<=100){

    sehrgut++;
    }

    else if (Punkte >=75 && Punkte<88){

    gut++;
    }
    else if (Punkte >=63 && Punkte <75){
    befriedigend++;
    }
    else if (Punkte>=50 && Punkte <63){
    genügend++;
    }
    else if(Punkte>=0 && Punkte <50){
    nichtgenügend++;
    }

    }while (antwort=='j');

    cout << "Anzahl Studierende Note sehr gut:" << sehrgut <<endl;
    cout << "Anzahl Studierende Note gut:" << gut << endl;
    cout << "Anzahl Studierende Note befriedigend:" << befriedigend << endl;
    cout << "Anzahl Studierende Note genügend:" << genügend << endl;
    cout << "Anzahl Studierende Note nicht genügend:" << nichtgenügend << endl;
    }



  • keine j/n-Frage nach jedem Studenten.

    cin >> anzahlStudierende;
    for(int i = 0; i < anzahlStudierende ; ++i )
    {
    ...
    


  • min und max lass erstmal ganz weg. das läßt sich zufällig sehr gut nachrüsten, nachdem alles andere klappt.



  • Danke! Also abgefragt wird jetzt nicht mehr nach jedem Student aber was ist an der Abbruchbedingung falsch?
    [cpp]
    #include <iostream>
    using namespace std;

    int main(){

    int sehrgut=0;
    int gut=0;
    int befriedigend=0;
    int genügend=0;
    int nichtgenügend=0;
    int Punkte;
    char antwort=' ';
    int Studierende;

    cout << "Bitte geben Sie die Anzahl der Studierenden ein!" << endl;
    cin >> Studierende;

    for(int i = 0; i < Studierende ; ++i )
    {
    do{

    cout << "Bitte geben sie die Punktezahl ein!" << endl;
    cin >> Punkte;
    cout << "Wollen sie fortfahren?" << endl;
    cin >> antwort;

    if (Punkte<0 || Punkte>100){

    cout << "Punktebereich liegt zwischen 0 und 100" << endl;
    }
    else if (Punkte>=88 && Punkte<=100){

    sehrgut++;
    }

    else if (Punkte >=75 && Punkte<88){

    gut++;
    }
    else if (Punkte >=63 && Punkte <75){
    befriedigend++;
    }
    else if (Punkte>=50 && Punkte <63){
    genügend++;
    }
    else if(Punkte>=0 && Punkte <50){
    nichtgenügend++;
    }

    }while (antwort=='j',i <=Studierende);

    cout << "Anzahl Studierende Note sehr gut:" << sehrgut <<endl;
    cout << "Anzahl Studierende Note gut:" << gut << endl;
    cout << "Anzahl Studierende Note befriedigend:" << befriedigend << endl;
    cout << "Anzahl Studierende Note genügend:" << genügend << endl;
    cout << "Anzahl Studierende Note nicht genügend:" << nichtgenügend << endl;
    cin.get();
    }
    }
    [/cpp]



  • TylerDurden0903 schrieb:

    for(int i = 0; i < Studierende ; ++i )
    {
    do{
    // irgendein code
    }while (antwort=='j',i <=Studierende);
    // irgendsone Ausgabe
    }

    Du willst gerade deine while-Schleife solange durchlaufen lassen, wie i <= studierende ist. Jedoch veränderst du den Wert von i niemals in deiner do-while-Schleife.

    Die Abfrage, die du dort wohl machen willst, befindet sich bereits in der for-Schleife:

    for (Initialisierung; Abbruchbedingung; Schleifenaktion)

    Gegenüber deiner while-Schleife:

    while (Abbruchbedingung)

    Du verhädderst dich gerade in einer Endlosschleife, da deine do-while-Abbruchbedingung nie zutrifft.



  • Heißt das, dass ich nur eine while schleife bräuchte? Also while(Studierende <i)? Dann müsste ich auch nicht nach jeder Eingabe abfragen, oder?



  • Wenn ich nur die for schleife einsetze liefert er mir ja nach jeder eingabe schon die Noten.



  • Ah.. 🙂

    #include <iostream>
    using namespace std;

    int main(){

    int sehrgut=0;
    int gut=0;
    int befriedigend=0;
    int genügend=0;
    int nichtgenügend=0;
    int Punkte;
    char antwort=' ';
    int Studierende;

    cout << "Bitte geben Sie die Anzahl der Studierenden ein!" << endl;
    cin >> Studierende;

    for(int i = 0; i < Studierende ; ++i )
    {

    cout << "Bitte geben sie die Punktezahl ein!" << endl;
    cin >> Punkte;

    if (Punkte<0 || Punkte>100){

    cout << "Punktebereich liegt zwischen 0 und 100" << endl;
    }
    else if (Punkte>=88 && Punkte<=100){

    sehrgut++;
    }

    else if (Punkte >=75 && Punkte<88){

    gut++;
    }

    else if (Punkte >=63 && Punkte <75){
    befriedigend++;
    }

    else if (Punkte>=50 && Punkte <63){
    genügend++;
    }

    else if(Punkte>=0 && Punkte <50){
    nichtgenügend++;
    }

    }

    cout << "Anzahl Studierende Note sehr gut:" << sehrgut <<endl;
    cout << "Anzahl Studierende Note gut:" << gut << endl;
    cout << "Anzahl Studierende Note befriedigend:" << befriedigend << endl;
    cout << "Anzahl Studierende Note genügend:" << genügend << endl;
    cout << "Anzahl Studierende Note nicht genügend:" << nichtgenügend << endl;
    cin.get();

    }

    richtig? oder kann man das besser machen?



  • Naja, im Prinzip war das schon ok so.

    for(int i = 0; i < Studierende ; ++i )
    {
    do{
    // irgendein code
    }while (antwort=='j',i <=Studierende);
    // irgendsone Ausgabe
    }
    

    Jedoch ist die do-while-Schleife etwas....naja...Verbesserungswürdig.

    Versuch es mal mit folgendem:

    for(int i = 0; i < Studierende ; ++i )
    {
    do{
    // irgendein code
    }while (punkte < 0 || punkte > 100);
    // irgendsone Ausgabe
    }
    

    Somit haben die beiden Schleifen unterschiedliche Aufgaben:

    for-Schleife
    Sort dafür, dass für eine Beliebige Anzahl an Studenten etwas bestimmtes gemacht wird.

    do-while-Schleife
    Sorgt dafür, dass bei einer fehlerhaften Eingabe, die Eingabe wiederholt wird. Es wird halt solang die Punkteabfrage getätigt, wie die eingegebenen Punkte nicht im gültigem Bereich liegen.



  • Ok so gehts auch.Trotzdem ist mir die for schleife alleine lieber.
    Wie ermittle ich jetzt maximale und minimale Punktezahl. Muss ich dafür nicht die Werte in einem array speichern und dann sortieren?



  • TylerDurden0903 schrieb:

    Ok so gehts auch.Trotzdem ist mir die for schleife alleine lieber.
    Wie ermittle ich jetzt maximale und minimale Punktezahl. Muss ich dafür nicht die Werte in einem array speichern und dann sortieren?

    Nein.
    Wie machste denn per Hand und Kopf selber?
    Finde mal das Maximum:
    43 87 32 45 21 78 76 88 54 32 54 67 89 43 7 3 65 86 3 32

    (Kann funktioniert haben, kann auch mißlungen sein. War Dein Vorgehen so, daß Du es auch einprogrammieren kannst? Oder kannst Du ein Vorgehen finden, das für den Menschen auch noch recht einfach ist und das man einprogrammieren kann?)
    Aber bestimmt geht es ohne gleich alles zu sortieren. Das wäre Dir als Mensch ja auch abwegig.



  • Wenn ich zwei eingegebene Zahlen vergleiche und b>a ist dann müsste ich das maximum also neu definieren oder?
    Jedoch wie vergleiche ich hier zwei eingegebene Punktezahlen?



  • Ich helf dir mal mit Worten. Die Zahlen heißen bei mir A...Z
    1.) A ist das Maximum.
    2.) Das neue Maximum ist das Maximum aus dem momentanen Maximum und B.
    .
    .
    .
    26.) Das neue Maximum ist das Maximum aus dem momentanen Maximum und Z.

    Na, hilft dir das weiter? 😉



  • Danke für die Antworten. Habe es jetzt mit 2 do while schleifen gelöst und minimum und maximum festgelegt. Kann man hier noch was verbessern?

    #include <iostream>
    using namespace std;
    
    int main(){
    
    	int sgut=0;
    	int gut=0;
    	int befriedigend=0;
    	int genügend=0;
    	int ngenügend=0;
    	int Punkte,Studenten;
    	int min=0;
    	int max=100;
    	int i=1;
    	int ZählerPunkte=1;
    
    	cout << "Bitte geben Sie die Anzahl der Studierenden ein!" << endl;
    	cin >> Studenten;
    
    	do{
    		do{
    		cout << "Bitte geben sie die Punktezahl des Studenten ein!" << endl;
    		cin >> Punkte;
    
    		    if (Punkte>=88 && Punkte<=100){
    
    			sgut++;
    			}
    
    			else if  (Punkte >=75 && Punkte<88){
    
    			gut++;
    			}
    
    			else if (Punkte >=63 && Punkte <75){
    				befriedigend++;
    			}
    
    			else if (Punkte>=50 && Punkte <63){
    				genügend++;
    			}
    
    			else if(Punkte>=0 && Punkte <50){
    				ngenügend++;
    			}
    			else {
    				cout << "Punkte liegen nicht im Wertebereich 0-100" << endl;
    			}
    			if(Punkte >= 0 && Punkte < 101 && Punkte >= min)
    		            {
    			            max = Punkte;
    		            }
    		            if(Punkte >= 0 && Punkte < 101 && Punkte <= max)
    		            {
    			            min = Punkte;
    		            }
    
    		}while(Punkte <= 0 || Punkte > 100);
    		i++;
    		ZählerPunkte++;
    
    	}while (ZählerPunkte <=Studenten);
    
    	cout << "Anzahl Studierende Note sehr gut:" << sgut <<endl;
    	cout << "Anzahl Studierende Note gut:" << gut << endl;
    	cout << "Anzahl Studierende Note befriedigend:" << befriedigend << endl;
    	cout << "Anzahl Studierende Note genügend:" << genügend << endl;
    	cout << "Anzahl Studierende Note nicht genügend:" << ngenügend << endl;
    	cout << "Minimale Punkteanzahl:" << min << endl;
    	cout << "Maximale Punkteanzahl:" << max << endl;
    
    }
    

  • Mod

    TylerDurden0903 schrieb:

    Kann man hier noch was verbessern?

    Rück vernünftig ein, teile Funktionalitat sinnvoll in Unterfunktionen auf, deklariere Variablen erst da wo sie gebraucht werden.

    Außerdem bin ich mir ziemlich sicher, dass deine Minimum- und Maximum-Suche alles mögliche findet, aber sicherlich nicht das Minimum noch das Maximum.



  • Habe es mehrmals getestet und es findet minimum und maximum. Warum meinst du dass es nicht funktionieren sollte?



  • Ob man was verbessern kann? *hust*
    Ich hab den Code jetzt mal ziemlich lang gezogen, damit er besser verständlich ist. Er sieht nämlich komplett anders aus und benutzt vieles aus der STL. Sicherlich ist mein Code nicht perfekt und lässt sich noch verbessern, aber ich wollte ihn verständlich halten.

    #include <iostream>
    #include <vector>
    #include <map>
    #include <algorithm>
    
    struct range
    {
            int min, max;
    
            range(int min, int max)
                    : min(min)
                    , max(max)
            {}
    
            bool in_range(int n) const
            {
                    return n > min && n <= max;
            }
    };
    
    struct greater_range
    {
    	bool operator () (const range& first, const range& second)
    	{
    		return first.min > second.min && first.max > second.max;
    	}
    };
    
    int main()
    {
            std::vector<int> all_points;
    
            std::map<range, std::string, greater_range> ranges =
            {
                    { range(87, 100), "Sehr gut"        },
                    { range(74,  87), "Gut"             },
                    { range(62,  74), "Befriedigend"    },
                    { range(49,  62), "Genuegend"       },
                    { range(-1,  49), "Nicht Genuegend" }
            };
    
            std::cout << "Geben sie die Punktezahl eines Studenten ein, oder Mist um abzubrechen\n";
    
            for(;;)
            {
                    int points;
                    std::cin >> points;
    
                    if(!std::cin)
                            break;
    
                    if(points < 0 || points > 100)
                    {
                            std::cout << "Die Punktezahl muss im Bereich 0-100 liegen!\n";
                            continue;
                    }
    
                    all_points.push_back(points);
            }
    
            std::cout << "Ergebnis:\n";
    
            for(auto it = ranges.begin(); it != ranges.end(); ++it)
            {
                    std::cout << it->second << ": ";
    
                    int n =
                    std::count_if
                    (
                            all_points.begin(),
                            all_points.end(),
    
                            [&it](int n)
                            {
                                    return it->first.in_range(n);
                            }
                    );
    
                    std::cout << n << '\n';
            }
    
            if(!all_points.empty())
            {
                    std::cout << "Minimale Punktzahl: " << *std::min_element(all_points.begin(), all_points.end()) << '\n';
                    std::cout << "Maximale Punktzahl: " << *std::max_element(all_points.begin(), all_points.end()) << '\n';
            }
    }
    

    Hier mit Ein- und Ausgabe: http://ideone.com/5W8bO


Log in to reply