Programm zur Noteneingabe



  • 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


  • Mod

    TylerDurden0903 schrieb:

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

    Probier z.B. mal 1,2,3,4,5 aus, dann hast du Minimum und Maximum 5.

    P.S.: Und Umlaute in Bezeichnern sind auch nicht so gut. Das muss nicht mit jedem Compiler funktionieren (und tut es auch mit mindestens einem bekannten (g++) nicht).


Anmelden zum Antworten