zu kompliziert --Kontrollstruktur



  • DIe Aufgabe hab ´mich schon mal genervt, aber die Antworten waren mir alle zu komplex, deswegen stelle ich sie nochmal... und hoffe jemand kann mir helfen.

    Also, den ersten Teil der Aufgabe hab ich schon... Der Nutzer soll solange Zahlen eingeben bis er 0 eingibt. Dann soll das Programm alle eingegebenen Zahlen zusammenzählen und genau da liegt mein Problem. WIe bau ich einen Zähler ein, oder geht das mit einer vernünftigen For Schleife???

    int main()
    {
    	int zahl;
    
    	do
    	{
    		cout << "Geben Sie eine Zahl ein: ";
    		cin >> zahl;
    
    	}
    	while (zahl > 0);
    
    	return 0;
    }
    

    😕



  • int count=0;
    
    if(zahl!=0)count++;
    
    cout << count;
    

    Jetzt einsetzen.



  • int zahl;
    for(int i=1;zahl!=0;i++)
    {
        cin>>zahl;
    }
    


  • So vielleicht:

    #include <iostream>
    
    int main()
    {
        using namespace std;
        int anzZahlen = 0;
        for( int z; cout << "Eine Zahl bitte: ", cin >> z && z != 0; ++anzZahlen )
        {
            // mache hier was mit 'z'
        }
        return 0;
    }
    

    Gruß
    Werner



  • 😕 😕 😕 😕



  • int main()
    {
    	int zahl;
    
    	cout << "Geben Sie eine Zahl ein!";
    	cin >>zahl;
    
    	for (int i=1;zahl!=0;i++)
    	{
    		cout << "Das Ergebnis ist: " << i;
    	}
    
    	return 0;
    


  • Visual Newbie schrieb:

    😕 😕 😕 😕

    .. könntest Du das mehr konkretisieren 😉



  • Meine letzte Ausgabe produziert eine endlosschleife...



  • Visual Newbie schrieb:

    Meine letzte Ausgabe produziert eine endlosschleife...

    richtig! so steht's im Code. Was hast Du erwartet?



  • Und was mache ich nun falsch?? WIe soll ich denn was lernen, wenn ich nicht weiß was ich falsch mache???



  • Du lernst am Besten, wenn Du hier für jede Zeile erklärst, was der zugehörige Code in Deinem Ausschnitt bewerkstellig. Wenn Dir dann der Fehler nicht einfällt, kann man Dir gezielt Deinen Fehler erklären und man sieht schnell, was Du verstanden/nicht verstanden hast & kann Dir gezielt helfen.

    Ein C++ Kurs in einem Forum wäre ansonsten ein bissel viel verlangt...

    Probiers mal! Nur Mut! 🙂



  • Visual Newbie schrieb:

    Und was mache ich nun falsch?? WIe soll ich denn was lernen, wenn ich nicht weiß was ich falsch mache???

    Äh.. - wenn Du was falsch machst, so solltes ja etwas geben, was richtig ist. Da Du - zumindest in Deinen letzen Postings - nicht geschrieben hast, was Du von Deinem Programm erwartest, so wissen wir nicht was richtig sein sollte und demzufolge auch nicht was falsch ist.

    .. aber lassen wir das.
    Oben schreibst Du:

    Visual Newbie schrieb:

    Der Nutzer soll solange Zahlen eingeben bis er 0 eingibt. Dann soll das Programm alle eingegebenen Zahlen zusammenzählen und genau da liegt mein Problem. Wie bau ich einen Zähler ein, oder geht das mit einer vernünftigen For Schleife???

    Jetzt schlage ich Dir folgende Lösung vor:

    #include <iostream>
    
    int main()
    {
        using namespace std;
        double sum = 0.0;
        int anzZahlen = 0; // hier ist der Zähler
    
        // die for-Schleife wird bei fehlerhafter Eingabe oder Eingabe einer 0 abgebrochen
        for( int z; cout << "Eine Zahl bitte: ", cin >> z && z != 0; ++anzZahlen )
        {                                     // in der for-Schleife wird der Zähler inkrementiert
            sum += z;
        }
        cout << "Die Summe der " << anzZahlen << " ist " << sum << endl;
        return 0;
    }
    

    In wie weit kommst Du jetzt damit nicht zurecht?

    Gruß
    Werner



  • Naja, ich hab mit Mühe den Sinn einer For schleife verstanden. Wenn du jetzt cout und cin in die for schleife schreibst ist das ein bisschen merkwürdig...



  • @Werner Salomon
    Ich hoffe du schreibst nicht ernsthaft so einen unleserlichen Code oder hat es irgendeinen tieferen Sinn den Forschleifen-Kopf derart zu verschandeln. Also das würde ich weder einem Anfänger so zeigen wollen, noch in meinen eigenen Programmen so anwenden.
    Und wofür die Summe als double speichern, wenn eh nur ganze Zahlen eingelesen werden?

    EDIT:
    Um konstruktive Kritik zu geben, so würde ich es lösen:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int zahl, summe=0;
    
        do
        {
            cout << "Bitte Zahl eingeben: ";
            cin >> zahl;
            summe+=zahl;
        }while(zahl != 0);
        cout << "Die Summe ist: " << summe << endl;
    }
    

    Ich denke eine do-while Schleife ist hier am besten geeignet, da sie genau ausdrückt was ich eigentlich machen will. Lass den Benutzer solange Zahlen eingeben, bis er eine 0 eingibt.



  • Also ...der Anfangswert ist 0; und dann kommt die Bedingung unter der die Schleife läuft und dann was mit i passieren soll, wenn die Bedingung erfüllt ist, oder hab ich da was falsch verstanden?

    i=0,i!=0;i++



  • KPC schrieb:

    @Werner Salomon
    Ich hoffe du schreibst nicht ernsthaft so einen unleserlichen Code oder hat es irgendeinen tieferen Sinn den Forschleifen-Kopf derart zu verschandeln.

    doch das ist mein Ernst und es hat auch einen Sinn. 😉

    KPC schrieb:

    Also das würde ich weder einem Anfänger so zeigen wollen, ..

    da hast Du sicher Recht. Habe ich dem armen Visual Newbie wohl zu viel zugemutet; wie er ja selber schreibt (s.u.).

    KPC schrieb:

    Und wofür die Summe als double speichern, wenn eh nur ganze Zahlen eingelesen werden?

    Nun weil Visual Newbie in seinem vorangegengenen Thread gechrieben hat, dass er den Durchschnitt berechnen wollte. Als Ergebnis hat er dort eine Fließkommazahl erwartet.

    Visual Newbie schrieb:

    Naja, ich hab mit Mühe den Sinn einer For schleife verstanden. Wenn du jetzt cout und cin in die for schleife schreibst ist das ein bisschen merkwürdig...

    Ok! Frage an Visual Newbie: hast Du den Code-Vorschlag von KPC verstanden?

    Gruß
    Werner



  • KPC schrieb:

    @Werner Salomon
    Ich hoffe du schreibst nicht ernsthaft so einen unleserlichen Code oder hat es irgendeinen tieferen Sinn den Forschleifen-Kopf derart zu verschandeln. Also das würde ich weder einem Anfänger so zeigen wollen, noch in meinen eigenen Programmen so anwenden.
    Und wofür die Summe als double speichern, wenn eh nur ganze Zahlen eingelesen werden?

    EDIT:
    Um konstruktive Kritik zu geben, so würde ich es lösen:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int zahl, summe=0;
    
        do
        {
            cout << "Bitte Zahl eingeben: ";
            cin >> zahl;
            summe+=zahl;
        }while(zahl != 0);
        cout << "Die Summe ist: " << summe << endl;
    }
    

    Ich denke eine do-while Schleife ist hier am besten geeignet, da sie genau ausdrückt was ich eigentlich machen will. Lass den Benutzer solange Zahlen eingeben, bis er eine 0 eingibt.

    So is es zu verstehen! 👍
    aber....was genau erziehlst du mit summe+? In welchem Moment wird ist Summe nicht mehr 0??



  • Visual Newbie schrieb:

    Also ...der Anfangswert ist 0; und dann kommt die Bedingung unter der die Schleife läuft und dann was mit i passieren soll, wenn die Bedingung erfüllt ist, oder hab ich da was falsch verstanden?

    i=0,i!=0;i++

    Ist im Prinzip richtig.
    Der erste Teil im for-Statement wird am Anfang genau einmal durchlaufen. Danach wird vor jedem Versuch in die Schleife hinzugehen die zweite Code-Sequenz durchlaufen. Diese wird als Bedingung interpretiert und abhängig vom Ergebnis (wahr oder falsch) verzweigt der Code in die Schleife hinein (wahr) oder bricht sie ab (falsch). Nach Ende jedes Druchlaufs wird die dritte Code-Sequenz durchlaufen.

    Daraus folgt, dass die mittlere Code-Sequenz genau einmal mehr aufgerufen wird als der Inhalt der Schleife. In Deinem Fall muss auch eine Eingabe mehr passieren als Zahlen eingegeben werden - nämlich die abschließende 0. Und genau das ist der Grund, warum ich die Eingabe in die zweite Code-Sequenz des for-Statements gesteckt habe.

    Ok; Das mag für einen Anfänger verwirrend sein, ich halte es für eine Lösung, die dem Problem angemessen ist. Im übrigen hast Du nach einer Lösung mit for gefragt.

    Gruß
    Werner

    EDIT: Rechtschreibung



  • @Werner das nächste mal muss aber ne rekursive lösung für das Problem her.



  • Visual Newbie schrieb:

    aber....was genau erziehlst du mit summe+? In welchem Moment wird ist Summe nicht mehr 0??

    Summe+=Zahl; bedeutet das gleiche wie

    Summe = Summe + Zahl;
    

    Also zur aktuellen Summe wird einfach die neu eingegebene Zahl addiert.
    Beispiel:
    Der Benutzer gibt als erste Zahl eine 5 ein. Summe ist am Anfang mit 0 initialisiert. Dann wird 5 zu Summe dazu addiert. Die Abbruchbedingung zahl == 0 ist nicht erfüllt, somit beginnt die Schleife von vorne. Diesmal gibt der Benutzer eine 3 ein. Zur Summe (im Moment 5) wird also 3 dazu addiert. So geht es weiter bis der Benutzer irgendwann eine 0 eingibt. Dann wird 0 zur Summe dazu addiert, die Schleife wird verlassen und die Summe ausgegeben.
    Hast du es jetzt verstanden oder wo hapert es noch?



  • <aywxsecdrvtfgbzhun schrieb:

    @Werner das nächste mal muss aber ne rekursive lösung für das Problem her.

    ... da mangelt's wohl am nötigen Ernst 😃 😃


Anmelden zum Antworten