Reading an Unknown Number of Inputs



  • Tach zusammen,

    ich habe vor ein paar Tagen mit C++ angefangen und kämpfe mich gerade durch das Buch "C++ Primer" durch. Die ersten Übungen habe ich soweit verstanden. Allerdings hänge ich nun fest und das obwohl ich nicht sehr weit gekommen bin. 😞

    1.4.3. Reading an Unknown Number of Inputs

    In the preceding sections, we wrote programs that summed the numbers from 1 through 10. A logical extension of this program would be to ask the user to input a set of numbers to sum. In this case, we won’t know how many numbers to add. Instead, we’ll keep reading numbers until there are no more numbers to read:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int sum = 0, value = 0;
    	while (cin >> value)
    		sum += value;
    	cout << "Sum is: " << sum << endl;
    	return 0;
    }
    

    Darunter steht:

    If we give this program the input
    3 4 5 6
    then our output will be
    Sum is: 18

    Wenn ich versuche die Zahlen einzugeben passiert nicht. Und um ehrlich zu sein verstehe ich auch nicht was da ausgeführt werden soll.

    Etwas zuvor gab es dieses Beispiel:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int sum = 0, val = 1;
    		while (val <= 10) 
    	{
    		sum += val; 
    		++val; 
    	}
    	cout << "Sum of 1 to 10 inclusive is " << sum << endl;
    	return 0;
    }
    

    Soweit ich es verstanden habe wird die Schleife also das in den geschweiften Klammern ausgeführt solange das statement nach while wahr ist. Also solange val kleiner oder gleich 10 ist.

    Nun verstehe ich aber nicht was das While in der Aufgabe oben machen soll zumal auch keine Schleife folgt die ausgeführt wird solange die Eingabe (cin) größer als der gepeicherte Wert ist.



  • Zum 1. Programm: Die Konsole geht auf. Dann gibst du beliebig viele Zahlen hintereinander ein, mit Leerzeichen getrennt. Bist du fertig mit deiner Zahleneingabe, drückst du ganz zum Schluss "Enter". Jetzt stehen im Eingabepuffer beliebig viele Zahlen, die der operator>> nach und nach aus dem Eingabepuffer (pro Schleifendurchgang eine Zahl) holt. Ja und im Schleifenrumpf wird die Zahl, die eben im Schleifenkopf geholt wurde, einfach zu sum aufaddiert.

    Ja, solange die Bedingung wahr ist, wird die Schleife ausgeführt. Ja, solange val <= 10 ist.

    cin >> value : Du gibst eine Zahl ein. Die landet im Eingabepuffer. Mit operator>> extrahierst du die Zahl aus dem Eingabepuffer und speicherst sie in value ab. Zum Schluss der Operation wird das Objekt cin zurückgegeben.... operator>> ist ja eine Funktion: istream& operator>>(istream&,T&) . Weil istream den operator bool implementiert, kannst du ein istream-Objekt, also cin , zu bool konvertieren. Ist das cin -Objekt nach einer Operation in einem guten Zustand, ergibt die Konvertierung true , ist es in einem schlechten Zustand ergibt die Konvertierung false (die Schleife wird abgebrochen).



  • out schrieb:

    Zum 1. Programm: Die Konsole geht auf. Dann gibst du beliebig viele Zahlen hintereinander ein, mit Leerzeichen getrennt. Bist du fertig mit deiner Zahleneingabe, drückst du ganz zum Schluss "Enter". Jetzt stehen im Eingabepuffer beliebig viele Zahlen, die der operator>> nach und nach aus dem Eingabepuffer (pro Schleifendurchgang eine Zahl) holt. Ja und im Schleifenrumpf wird die Zahl, die eben im Schleifenkopf geholt wurde, einfach zu sum aufaddiert.

    Ja, solange die Bedingung wahr ist, wird die Schleife ausgeführt. Ja, solang val <= 10 ist.

    cin >> value : Du gibst eine Zahl ein. Die landet im Eingabepuffer. Mit operator>> extrahierst du die Zahl aus dem Eingabepuffer und speicherst sie in value ab. Zum Schluss der Operation wird das Objekt cin zurückgegeben.... operator>> ist ja eine Funktion: istream& operator>>(istream&,T&) . Weil istream den operator bool implementiert, kannst du ein istream-Objekt, also cin, zu bool konvertieren. Ist das cin-Objekt nach einer Operation in einem guten Zustand, ergibt die Konvertierung true, ist es in einem schlechten Zustand ergibt die Konvertierung false (die Schleife wird abgebrochen).

    omg meine Rechtschreibfehler, mal korrigiert.



  • Du musst noch irgendwie sagen, daß die Eingabe abgeschlossen ist. Das erreichst du entweder, in dem du den Stream (hier: std::cin ) in einen Fehlerzustand zwingst ( operator>>() versucht einen int zu extrahieren, du gibst ihm aber einen Buchstaben) oder du gibst EOF ein. Unter windows ist das strg + z , unter UN*X strg + d .



  • Vielen Dank euch beiden. 🙂



  • Sehe ich das richtig, man ist hier zwar oft so pingelig, aber es ist praktisch schnurz ob ich jetzt std::endl oder '/n' fuer eine neue Zeile verwende?

    Ich mein, wenn sogar ein empfohlenes Buch das mit endl macht, wo ich gehoert habe, dass man '/n' nehmen soll



  • Weiß nicht? Hunger? Fang: ><((((°>



  • hardware schrieb:

    Sehe ich das richtig, man ist hier zwar oft so pingelig, aber es ist praktisch schnurz ob ich jetzt std::endl oder '/n' fuer eine neue Zeile verwende?

    Ich mein, wenn sogar ein empfohlenes Buch das mit endl macht, wo ich gehoert habe, dass man '/n' nehmen soll

    Ach das Thema gabs doch schon oft. Nimmst du das, was dich anspricht. Stephan T Lavavej nimmt endl andauernd, wenn er es nimmt darfst du das auch:D



  • Dass von std::endl vor allem bei Dateistreams abzuraten ist und dass man z.B. Logs gerne in Dateien umleitet zweifelt hier hoffentlich niemand an. Und letztlich: Wieso habt ihr einen solchen Drang mehr zu tippen? 🙂

    Edit: Tippfehler.


  • Mod

    asfdlol schrieb:

    Wieso hab ihr einen solchen Drang mehr zu tippen? 🙂

    Vermutlich deutsches Tastaturlayout, wo '\n' eher unbequem zu tippen ist.



  • Findest du das wirklich? Ich tippe einen \ ohne Probleme in Nullkommanix.


  • Mod

    Swordfish schrieb:

    Findest du das wirklich? Ich tippe einen \ ohne Probleme in Nullkommanix.

    Wenn du '\' mit deutschem Layout im Nullkommanix tippen kannst, dann reist du beim Tippen von '\' auf US-Layout sogar in der Zeit zurück 😃 .

    Aber am schlimmsten ist das Gesamtkonstrukt "'\n'" (also mit Hochkommata). Shift+Taste, AtlGr+Taste, Taste, Shift+Taste. Im Gegensatz zu Taste, Taste, Taste, Taste, wenn man das Layout der Leute benutzt, die sich dieses Konstrukt ausgedacht haben.



  • SeppJ schrieb:

    Swordfish schrieb:

    Findest du das wirklich? Ich tippe einen \ ohne Probleme in Nullkommanix.

    Wenn du '\' mit deutschem Layout im Nullkommanix tippen kannst, dann reist du beim Tippen von '\' auf US-Layout sogar in der Zeit zurück 😃 .

    Gut. Ich stell' das Layout um und meld mich gestern wieder. 👍


Anmelden zum Antworten