[C++] wie kann ich "cout" in meine if Bedningung eibauen

DaPsylo

Lt. Commander
Registriert
Okt. 2002
Beiträge
1.159
Hi, nachfolgen Code von einem kleinen Tool, welches mir die ersten 100 Quadratzahlen berechnet und nach jeder 10. Zahl zur eingabe der Enter-Taste aufrufen soll. Soweit läuft das Programm und er stopt auch nach der 10. Zahl, allerdings soll er dann auch Text ausgeben, so dass der Anwender weiss das er die Enter-Taste drücken muss um fortzufahren.

MFG Psylo
Code:
/* die ersten 100 Quadratzahlen ausgeben
und bei jeder 10en Zahl eine Eingabe fordern */
#include <iostream>
#include <cstdio>

using namespace std;

int main ()
	{
	int loop;
	int quadr;
	
	for (loop = 1; loop <=100; ++loop)
		{
		quadr = loop * loop;
		cout << "Das Quadrat von " <<loop<< " ist: " <<quadr <<endl;
		
	if ( loop % 10 == 0)
		getchar(); //hier soll der Text stehten, mit cout <<"Bitte Enter druecken"<<endl;  funktioniert es aber leider nicht
		
			
	}
	
	return 0;
}
 
bei getchar reicht auch jedes andere zeichen...
warum nicht std::cin >> tmp; oder std::cin.getline() oder readline() oder wie das heisst..?
 
Du kannst - glaube ich - wenn es nur mit betätigen der Entertaste weiter gehen soll, den ASCII-Code der Entertaste benutzen.

Ungfähr so: getchar(013)

MfG

Matthias
 
cin >> tmp; funkioniert nur dann, wenn auch tatsächlich etwas eingetippt wurde, und nicht einfach nur Enter gedrückt wurde. Was geht ist :
Code:
std::string s;
getline (cin, s);
Allerdings hat das unter Windows stellenweise eigenartige Nebenwirkungen, wie z.B. dass man 2x Enter drücken muss.

Besser ist hier cin.get();. (Rückgabewert wird verworfen) Allerdings sollte man sich hier bewusst sein, dass im Eingabepuffer noch restliche Zeichen stehen können, die dann promt an die nächste Eingabe weitergereicht werden.

getchar solltest Du nicht verwenden, wenn Du cin/cout benutzt, da Konflikte mit stdin und stdout auftreten können.


Einen standardisierten, plattformunabhängigen Weg, um nur eine einzige Taste abzufragen, gibt es nicht.


Mal Dein Programm komplett:
Code:
/* die ersten 100 Quadratzahlen ausgeben
und bei jeder 10en Zahl eine Eingabe fordern */
#include <iostream>

int main (void)
{
	using namespace std;
	int loop;
	
	for (loop = 1; loop <=100; ++loop)
	{
		const int quadr = loop * loop;
		cout << "Das Quadrat von " <<loop<< " ist: " <<quadr <<endl;
		
		if ( loop % 10 == 0)
		{
			cout << "Bitte Enter druecken" << endl;
			cin.get ();
		}	
	}
	
	return 0;
}
 
Zuletzt bearbeitet:
Harrold schrieb:
Dann tippst du über dem getchar(); einfach "cout << "Hier steht ein Text" << endl;

Dann kommt erst der Text und du kannst danach Enter drücken

leider hatte das nicht bei mir Funktioniert :(


@7H3 N4C3R
deine Version klappt wunderbar :)
wozu ist den der Punkt zwischen "cin.get"

Das mit dem normalen "getchar()" hatte ich durch zufall gefunden alls ich nen einfach mal nen Kapitel weiter in meinem C++ Einsteigerbucg geschaut habe und es hatte den zweck erfüllt. Nur für leute, die nicht wissen, dass sie dann die Enter- Taste drücken sollen ist es ohne Textausgabe etwas blöde weil die dann denken das es nicht weiter geht.

Ich danke euch für die schnelle Hilfe und werde mich wieder an mein Buch setzten.

MFG Psylo
 
DaPsylo schrieb:
@7H3 N4C3R
deine Version klappt wunderbar :)
wozu ist den der Punkt zwischen "cin.get"?

Also zuerst, jedes C-Programm hat eine Standardeingabe stdin. (Das ist meistens die Tastatur)
cin ist ein Objekt, dass diese Standardeingabe einfach steuern kann. (Deshalb darf man auch nicht direkt mit der Standardeingabe arbeiten, weil cin sonst durcheinander kommen kann)
cin.get() ist jetzt eine Methode dieses Objektes cin. (... genauergesagt der Klasse basic_istream) Deshalb auch der Punkt dazwischen, weil get zu cin gehört.
Wenn Du das alles (Objekte, Klassen, Methoden) noch nicht kennst, mach Dir da nicht so den Kopf drum. ;) So funktioniert es auf jeden Fall.


Achso, kleines Update, schreib mal lieber das hier:

while (cin.get () != '\n') {};

Wenn man ansonsten "abc<Enter>" eingibt, werden sofort 4 Schleifendurchläufe gemacht, weil cin.get() ja einfach nur ein Zeichen von der Tastatur liest.
Btw, mit 13 zuvergleichen anstatt von '\n' ist eine trügerische Falle, da '\n' unter Windows ja 13 10 (CRLF) ist. cin macht diese Behandlung automatisch.
 
Zuletzt bearbeitet:
o.k. ich habe es jetzt mal aktualisiert.

ich bin gerade bei Struktur und danach kommt die Klasse. Der Autor meinte zwar das man die Struktur nichtmehr wirklich braucht, da es ja jetzt die Klasse gibt, man aber um die Klasse besser verstehen zu können einmal kurz die Struktur angeschaut haben sollte.vor der Klasse kommt noch kurz ein Kapitel wo Objekte vorkommen.

Die Methoden gehören ja auch zur Klasse wenn ich da gerade richtig in mein Buch geschaut habe. Ich glaube das Kapitel der Klasse ist das längste in dem Buch.
Verstehe ich es auch richtig, dass die Klassen schon zu objektorientierten Programmierung gehören?

MFG Psylo

edit: In einem weiteren Teil des Buches hat der Autor folgende Codezeile um das Programm anzuhalten werwendet, deshalb bin ich auch auch "getchar()" gekommen.


Code:
 //warten bis Anwender die return- Taste drückt
fflush(stdin);
getchar();
} //ende von while
 
Zuletzt bearbeitet:
Hab jetzt auch mal ein wenig suchen müssen... das fflush(stdin) erfüllt dort seinen Zweck, allerdings sollte man es nicht verwenden, wenn man mit den Standard-Streams cin und cout arbeitet. Diese Lösung hier tut's aber bei mir prima:

Code:
/* die ersten 100 Quadratzahlen ausgeben
und bei jeder 10en Zahl eine Eingabe fordern */
#include <iostream>

int main (void)
{
	using namespace std;
	int loop;
	
	for (loop = 1; loop <=100; ++loop)
	{
		const int quadr = loop * loop;
		cout << "Das Quadrat von " <<loop<< " ist: " <<quadr <<endl;
		
		if ( loop % 10 == 0)
		{
			cout << "Bitte Enter druecken" << endl;
			cin.sync ();
			while (cin.get () != '\n') {};
		}	
	}
	
	return 0;
}
 
Warum ist bei dem letzten von dir eigentlich 2 mal cin+ eine Methode drin und was hat das "!" bei der while- Schleife zu bedeuten?

Muss jetzt erstmal wech. Bye Bye
 
cin.sync (); sollte letztendlich das selbe machen wie fflush (stdin); . Im Klartext, es sollte dafür sorgen, dass alle Tasten, die vorher gedrückt wurden, "vergessen" werden.

cin.get (); schließlich liest die eigentlich gedrückt Taste von der Tastatur aus.
Das ! in der while-Bedingung gehört zu dem = . != bedeutet in C/C++ 'ungleich'. Also, solange das zuletzt eingegebene Zeichen ungleich Enter ist, mache genau garnichts.
 
AUf das "!=" hätte ich eigentlich selber kommen müssen ich depp aber Gott sei dank ist ja noch kein Meister vom Himmer gefallen.

Danke für deine Hilfe und deine guten Erklärungen :)
 
Da ich kürzlich drauf gestoßen bin, hier mal ein kleines Update. Sync auf einen Eingabestream zu machen ist unzulässig. Noch "unzulässiger" ist es aber, ein fflush auf stdin zu machen, da inputstreams nicht geflusht werden können. Folgender Code kann einen Stream leeren:

Code:
std::cin.clear();
std::streambuf* pbuf = std::cin.rdbuf();
std::streamsize size = pbuf->in_avail();
std::cin.ignore(size);

Also in obigem Code das cin.sync durch diesen Codeschnipsel ersetzen.
 
7H3 N4C3R schrieb:
Da ich kürzlich drauf gestoßen bin, hier mal ein kleines Update. Sync auf einen Eingabestream zu machen ist unzulässig. Noch "unzulässiger" ist es aber, ein fflush auf stdin zu machen, da inputstreams nicht geflusht werden können. Folgender Code kann einen Stream leeren:

Code:
std::cin.clear();
std::streambuf* pbuf = std::cin.rdbuf();
std::streamsize size = pbuf->in_avail();
std::cin.ignore(size);

Also in obigem Code das cin.sync durch diesen Codeschnipsel ersetzen.
-grummel- so einfach ist das also, die Grösse eines Input-Streams rauszubekommen, ja? >:/

Thx :/
 
Zurück
Oben