Brauche Hilfe - Aufgabe von Stroustrup



  • Hi.
    Stehe gerade vor einem Rätsel.
    Habe mir das Buch "Einführung in die Programmierung mit c++" gekauft.
    Super Buch, aber...
    Nach Kap. 4 gibt es eine Aufgabe, mit der komme ich nicht klar.
    Ich soll ein Programm schreiben, welches zwei int Werte einliest und wieder ausgibt, das Programm soll beendet werden wenn ein '¦' eingegeben wird.

    Ich zerbreche mir schon die ganze den Kopf darüber.
    Ich habe auch eine Lösung gefunden, bin mir aber nicht sicher.
    Ich lese zwei int Werte ein (in einer while schleife). Wenn die ausgegeben werden, lese ich ein char ein (auch mit while) und überprüfe welches Zeichen eingegeben wurde.
    Nun ja, der Rest sollte klar sein. Das funktioniert auch, aber ist das die Rätsels Lösung.

    Danke



  • Ein Codeausschnitt spricht mehr als tausend Worte.



  • Hilft dir das? :p

    int main()
    {
    	int zahl_1;
    	int zahl_2;
    
    	do
    	{
    		cout << "1. Zahl eingeben: ";
    		cin  >> zahl_1;
    		cout << "2. Zahl eingeben: ";
    		cin  >> zahl_2;
    
    		if( !cin ) // Wurden einmal keine Zahlen eingegeben?
    		{
    			cin.clear();
    
    			char c;
    			cin.get( c );
    			if( c == '|' ) // Wurde | eingegeben?
    			{
    				cout << "Programm wird beendet" << '\n';
    				break;
    			}
    			else
    			{
    				cout << "Fehlerhafte Eingaben - versuch es nochmal" << '\n';
    				cin.ignore( 100, '\n' );
    			}
    		}
    		else
    		{
    			cout << "Gut gemacht - nochmal" << '\n';
    		}
    	} while( true );
    }
    


  • Ich kann im Moment keinen Code Posten, bin an der Arbeit. Hole das aber heute Abend nach.
    Zu dem Code von out.
    Das mag funktionieren, aber auf Dinge wir cin.get und .clear usw. Wurde bisher in dem Buch nicht eingegangen. Kann halt nur das verwenden, was ich bis jetzt weiß.
    If Anweisungen, schleifen, vector, Typumwandelung, standarttypen und so anfangerkram eben.
    Bisher konnte ich alle Aufgaben lösen, aber diese bereitet mir Kopfzerbrechen.
    Wenn ich zwei int Werte einlese, wie soll ich dann feststellen können, ob eine dieser beiden Eingaben ein Zeichen ist. (Mit den einfachsten Werkzeugen, weil Anfänger.)

    Ich werde heute Abend nochmal die genaue Aufgabenstellung Posten und den Code, den ich dazu geschrieben habe.
    Aber macht bis dahin fleißig weiter.
    Vielen dank



  • robertko schrieb:

    Das mag funktionieren, aber auf Dinge wir cin.get und .clear usw. Wurde bisher in dem Buch nicht eingegangen. Kann halt nur das verwenden, was ich bis jetzt weiß.

    Ok, macht Sinn, aber bist du sicher, dass clear noch nicht erwähnt wurde? Ohne clear ist es doch... unmöglich 😕



  • Ja, bin mir sicher, da mir clear, garnichts sagt. Aber ich werde das nochmal nachschlagen und im Glossar schauen, wann und wo das erwähnt wird. Aber ich bin mir sicher.
    Wie gesagt, ich werde später nochmal auflisten, was bisher im Buch besprochen wurde und die genaue Aufgabenstellung.
    Also für absolute Anfänger ist das Buch wahscheinlich nicht geeignet. Weil es teilweise wirklich sehr schnell zur Sache geht und die Aufgaben wirklich nicht ohne sind. Ich konnte sie bisher zwar lösen, aber einfach war es keineswegs.
    Das ding ist ja, dass all die Aufgaben nicht nur das gerade abgeschlossene Kapitel beinhalten, sondern alle bisherigen Kapitel ebenfalls, weshalb es immer mehr Aufgaben von Kapitel zu Kapitel werden. Aber es macht echt Laune. Ich habe schon einige Bücher angefangen zu lesen. Die meisten waren einfach nur schlecht aber dieses werde ich fressen. Wirklich super. Nicht einfach, aber sehr gut.



  • So, bin jetzt zu Hause.
    Also, was bisher im Buch besprochen wurde:

    1. Eingabe
    2. Variablen
    3. Eingabe und Typ
    4. Operationen und Operatoren
    5. Zuweisung und Initialisierung
    6. Zusammemgesetzte Zuweisungsoperatoren
    7. Namen
    8. Typen und Objekte
    9. Typsicherheit
    10. Berechnungen
    11. Ziele und Werkzeuge
    12. Ausdrücke
    13. Funktionen
    14. Vector
    15. Sprachkonstrukte

    Nun Die erste Aufgabe:

    Überschrift
    -----------
    Gehen Sie diese Aufgaben Schritt für Schritt durch. Versuchen Sie nicht, schnell fertig zu werden, indem Sie Schritte Übersprichen. Prüfen Sie jeden Schritt, indem Sie mindestens drei Wertepaare eingeben - mehr Werte wären noch besser.

    Aufgabe 1:
    Schreiben Sie ein Programm, das aus einer While-Schleife besteht, die bei jedem Schleifendurchlauf zwei int-Werte einliest und diese dann ausgibt. Verlassen Sie das Programm, wenn zum Beenden ein '|' eingegeben wurde.
    --------------------------------------------------------------------------------
    Das ist mein Code:

    int main()
    {
    	int z1 = 0;
    	int z2 = 0;
    	char c = ' ';
    	while(c != '|'){
    		cout << "Geben Sie zwei Integer-Werte ein: \n";
    		cin>>z1>>z2;
    		cout << "1.Zahl == " << z1 << "\t2.Zahl == " << z2 << endl;
    		cout << endl;
    		cout << "Zum Beenden druecken Sie '|': \n";
    		cout << "oder [w]eiter...";
    		c=' ';
    		while(c!='|' && c!='w'){
    			cin>>c;
    		switch (c){
    			case 'w':
    				break;
    				case '|':
    					cout << "Programm wird beendet!\n";
    					c='|';
    					break;
    				default:
    					cout << "Ungueltige Eingabe!\n"
    						 << "'|' zum beenden oder [w]eiter...\n";
    					continue;
    		}
    		}
    	}
    	return 0;
    }
    

    Das funktioniert zwar, aber ob das die Lösung ist?!?!
    Und was bedeutet "Prüfen Sie jeden Schritt, indem Sie mindestens drei Wertepaare eingeben"?

    Wäre Super wenn mir jemand helfen könnte.



  • Das 'w' steht nicht in der Aufgabenstellung. Außerdem... Was passiert, wenn der Nutzer "Hallo" statt einer Zahl eingibt? Oder nach der ersten Zahl schon ein '|'?
    Ich würde einen string einlesen und dann prüfen, ob es ein '|' oder eine Zahl oder Sonstiges ist.

    So richtig verstehe ich den Teil mit dem schrittweisen Prüfen auch nicht, weil ich nicht weiß welche Schritte da gemeint sind, aber du solltest das Programm schon mit 3 Wertepaaren (also 3 mal 2 Zahlen eingeben) testen. Wahrscheinlich sollst du das bei jeder Programmänderung tun, und die ist dann ein Schritt.



  • Ja, das stimmt, das 'w' steht nicht in der Aufgabenstellung, von String steht da aber auch nichts.
    Was mich irritiert ist:
    Der auffabenteil beinhaltet 10 Aufgaben, die alle aufeinander aufbauen, also, "schreiben sie ein programm..." dann "ändern sie das programm so um, dass..." und so weiter, und in der 8. Aufgabe steht ich soll Werte in einen vector speichern und wenn das abschließende '¦' kommt, sollen alle Werte ausgegeben werden
    Was heißt das "abschließende" ? Ich verstehe die Aufgabe nicht. Vielleicht ist es auch ein übersetzungsfehler.
    Ich bin mit meiner Version bei Aufgabe 7 angekommen. Ich werde versuchen den Rest auch zu lösen, aber ob der Autor das so gemeint hat weiß ich nicht. Hoffe die Aufgaben der anderen Kapitel sind verständlicher.
    Niemand hier der das Buch vielleicht auch hat und einen Rat weiß?



  • Mach Dir nicht so einen Kopp:
    lies ints ein und wenn was anderes kommt - völlig Banane ob '|' oder sonstwas - beende das Einlesen. Es geht ja nicht darum ein User Interface zu basteln, sondern dass simple Einlesen mit operator>>() und die anschließende Weiterverarbeitung.

    Programming principles and practice using C++ schrieb:

    Go through this drill step by step. Do not try to speed up by skipping steps. Test each step by entering at least three pairs of values - more values would be better.

    Write a program that consists of a while-loop that (each time around the loop) reads in two ints and then prints them. Exit the program when a terminating '|' is entered.

    Viel Erfolg!



  • Na hoffentlich. An soeinem Punkt denke ich nur immer, ich habe irgendwo nicht aufgepasst und vielleicht wichtige nicht richtig verstanden. Naja, mal sehen was noch kommt.
    Danke erstmal.



  • Hallo,

    ich habe genau das gleiche Problem. Die Lösung von "out" funktioniert wunderbar. Ich habe nur eine Verständnisfrage:

    [code="cpp"] if( !cin ) // Wurden einmal keine Zahlen eingegeben?
    {
    cin.clear();

    char c;
    cin.get( c );} [code="cpp"]

    Ich dachte, dass man bei der Eingabe das Eingegebene sofort einer Variable zugewiesen werden muss, aus diesem Grund bezieht sich meine Frage darauf, was in dem beschriebenen Teil des Codes genau passiert?

    P.S Enschuldigung, aber bei mir klappt keine schöne Code-Darstellung



  • Perilun schrieb:

    P.S Enschuldigung, aber bei mir klappt keine schöne Code-Darstellung

    Code mit der Maus markieren und auf den C++ Button unter den 😞 :p klicken.
    Oder
    Am Anfang vom Code auf den C++-Button klicken (dann bekommt der einen * [C++*]) und am Ende vom Code nochmal.

    Dann wird der Code zwischen [code="cpp" ] [/code ] (Ohne Leerzeichen in den Klammern) eingefasst.

    Mit welcher Zeile im Code hast du Probleme?



  • Danke für den Tipp

    if( !cin ) // Wurden einmal keine Zahlen eingegeben? 
    { 
    cin.clear(); 
    
    char c; 
    cin.get( c );}
    

    Ich habe mit dem genannten Abschnitt ein Verständigungsproblem.

    Ich verstehe nicht, was bedeutet if(!cin) bedeutet, da keine Variable genannt wird.

    Anschließend wird die Eingabe gelöscht und ist leer. Wieso kann man danach eine Variable c definieren und in dieser die Eingabe (welche vorher ja durch den Befehl cin.clear gelöscht wurde, durch cin.get(c) in c gespeichert??



  • Cin ist eine Variable.
    !cin ist wahr, wenn ein Fehler aufgetreten ist. Dem Kommentar entnehme ich, das eine Zahl erwartet wurde, aber etwas anderes eingegeben wurde.
    Clear setzt den Fehlerstatus zurück. Die Eingabe wird nicht gelöscht. Man kann jetzt also wieder etwas lesen.
    Variablen kann man jederzeit definieren.



  • Könnte man auch cin>>c; schreiben oder anders was ist der unterschied zwischen cin und cin.get?


Log in to reply