Wiederhole bis Eingabe

Liebe wwwler

Ich möchte ein Programm machen, das eine Anzeige (mit printf) solange wiederholt, bis der Benutzer etwas eingibt, also in etwa:

while(keine Eingabe)
{
 mache dies&das
}

geht das?
und wie?

Danke
Kalsan

Hallo Kalsan,

Ja, und was ist der Zweck von dem, bitte?
Vielleicht so:

Ihre Eingabe bitte:
Ihre Eingabe bitte:
Ihre Eingabe bitte:
Ihre Eingabe bitte:
Ihre Eingabe bitte:
Ihre Eingabe bitte:
Ihre Eingabe bitte:
Ihre Eingabe bitte:

etc.

Ist es das? Willst du deinen Benutzern/innen Stress machen?
lG
Martin B

Hallo Martin

Nicht ganz. Eher so:

--- Inhalt der Datei "Schuelermeldungen.txt" ---
(Diese Liste wird jede Sekunde aktualisiert.)
Druecken Sie den C, um die Runde abzubrechen.
----------------------------------------
-in-\> Fritz Strohmann
-in-\> Hans Soehnle
GO\>\>\> Signal erhalten: Fitz Strohmann
GO\>\>\> Signal erhalten: Hans Soehnle
1 Rechnung(en) geschafft: Fitz Strohmann
2 Rechnung(en) geschafft: Fitz Strohmann
1 Rechnung(en) geschafft: Hans Soehnle
3 Rechnung(en) geschafft: Fritz Strohmann
\>\>] Fertig! Fritz Strohmann
2 Rechnung(en) geschafft: Hans Soehnle
3 Rechnung(en) geschafft: Hans Soehnle
\>\>] Fertig! Hans Soehnle
----------------------------------------
Alle angemeldeten Schueler haben fertig.
Druecken Sie E, um das Programm zu beenden.

In diesem Falle handelt es sich um ein Rechenprogramm, bei welchem die Schüler dem Lehrer ihre Meldungen zukommen lassen (automatisch).
Das tönt jetzt sinnlos, man kann aber ganz gute Sachen daraus machen.

Die Anzeige wiederholt sich im Normalfall alle 1 sek, aber falls während dem Warten, bis 1sek. verstrichen ist, „C“ eingegeben wird, wird die Aktualisierung unterbrochen, der Befehl Abbruch() wird ausgeführt, anschliessend beendet sich das Programm.

Das Problem ist, dass ich so etwas wie

while(((time(NULL)-zeit)bräuchte. Mit TopPascal lässt sich Eingabe\_gemacht durch keyPressed ersetzen. In C kenne ich noch keine entsprechende Funktion. Wie lautet sie?

Danke 
Kalsan


> <small>[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]</small>

Hallo

Das Problem ist, dass ich so etwas wie

while(((time(NULL)-zeit)bräuchte. Mit TopPascal lässt sich Eingabe_gemacht
durch keyPressed ersetzen. In C kenne ich noch keine
entsprechende Funktion. Wie lautet sie?

Das ist Systemspezifisch. Welchen Compiler
unter welchem OS verwendest Du denn?

Grüße

CMБ

Wenn du Windows benutzt fielen mir zwei Möglichkeiten ein. Wenn du dich nur auf ein Konsolenprogramm beschränkst nur mehr eine und wenn du nebenbei noch etwas anderes machen willst keine mehr. Trotzem:

Wenn du ein Fenster hast, kannst du in der WindowProcedur bei der Message WM_KEYDOWN überprüfen, ob eine Taste gedrückt wurde und dan einen globalen bool auf einen Wert setzten, der die Schleife abbricht.

Weiters gibt es die Möglichkeit die gedrückten Tasten auf der Tastatur abzufragen. Leider geht das ganze nur systemweit, also betrifft alle Eingaben, auch wenn sie in einem anderen Programm stattfinden. Die Funktion heißt GetAsyncKeyState(int vKey) und nimmt einen von 256 möglichen Virtual-key Codes. (http://msdn.microsoft.com/en-us/libra…(VS.85).aspx) Sie liefert dann bestimmte Rückgabewerte ob die mit vKey festgelegte Taste gedrückt wurde oder nicht.

Ist leider beides nicht perfekt für dein Problem, aber vielleicht eine Hilfe.

mfg dixxi

Hallo Semjon

Ich verwende Windows XP SP 3 und den Standartcompiler von Dev-C++.

Gruss
Kalsan

Hallo Dixxi

Vielen Dank für deine Hilfe. Genau sowas habe ich gesucht, deshalb hab’ ich dir auch gleich ein * gegeben.

  • Zu Vorschlag 1: Leider finde ich nirgens, wie ich die Funktion anwenden kann. Ist es ganz einfach so:

    while(not(WM_KEYDOWN))

?

  • Zu Vorschlag 2: Der Link zu MSDN ist ungültig, auch nachdem ich versucht habe, ihn wieder zusammenzubasteln. Bitte gib ihn doch ohne http:// an.

Gruss
Kalsan

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Kalsan

Auf Windows geht es so: die _kbhit() gibt zurueck, ob irgendeine Taste gedrueckt ist, aber nicht welche, die kriegen wir mit getch():

#include 

int main()
{
 char ch;
 while (1)
 {
 while (\_kbhit())
 { ch = getch();
 if (ch == 27) {break;}
 // mit ch etwas machen
 } 
 while (! \_kbhit())
 { /\*\* was du eben brauchst, Timer abfragen, etc. \*\*/
 }
 }

 return 0;
}

Bei MS und MingW (also Dev-C++) schreibt sich das so, bei Borland aber ohne den ‚_‘, also nur „kbhit()“.

lG
Martin B

1 Like

Das ist die Lösung! Herzlichen Dank!!
*4you

Gruss Kalsan