Zeit-programmierung



  • Hallo,

    ich habe folgendes Problem.
    Ich möchte gern in C++ ein Programm schreiben das mir innerhalb einer Minute
    die Anzahl der gedrückten Leertaste ausgibt.
    Dabei soll er auf andere Tasten nicht reagieren wobei die Esc-Taste
    das Programm abbricht.

    Kann mir jemand einen leitfaden geben und am besten noch die
    Time - Funktion...

    Vielen Dank im vorraus...

    Gruß Ercan



  • Zum zeitmessen empfiehlt sich ctime, ansonsten sieht der grobe Ablauf doch so aus:

    - Zeit auslesen
    - Auf Eingabe warte, nur Leerzeichen akzeptieren, ansonsten soll nichts passieren
    - Zeit auslesen, überprüfen ob eine Minute vergangen ist, falls nein zu Schritt 2



  • Wenn du in Windows-Programierst und den Header windows.h lädst,
    kannst du auch die API-Funktion "DWORD GetTickCount(void);" verwenden.
    Die gibt die Zeit in Millisekunden zurück, seitdem du Windows gestarted hast.



  • Erstamls danke für die Vorschläge...

    Ich habe das Programm geschrieben, leider bin ich nicht in der
    Lage das Programm während der Laufzeit mit der ESC - Taste zu
    beenden. Kann mir da jemand weiterhelfen?

    Sonstige Verbesserungsvorschläge sind auch willkommen. 🙂

    #include <iostream>
    #include <iomanip>
    #include <ctime>
    using namespace std;
    
    long zeitdiff(void);
    
    static long maxzeit = 60;
    
    int main(void)
    {
    
    START:
    	static int ctr = 1;
    	char ch;
    	int zeit = 0;
    
    	cout <<"Taktzaehler"<<endl;
    	cout <<"=========="<<endl;
    	cout <<"Start mit ENTER-TASTE: ";
    	getchar(ch);
    	cout <<ctr<<" Takte in "<<zeit<<" Sekundenen"<<endl;
    
    	zeitdiff();
    
    	while( getchar(ch) && ch != 0x33) // ch != 0x33 --> ESC (funzt nicht)
    	{		
    		zeit += zeitdiff();
    		if( zeit>=maxzeit )
    			break;
    		ctr ++;
    		cout <<ctr<<" Takte in "<<zeit<<" Sekundenen"<<endl;
    	}
    	cout <<"60 Sekunden sind vergangen"<<endl;
    	cout <<"Der Takt betraegt: "<<ctr<<" pro Minute"<<endl;
    
    	do
    	{
    		cout <<"\nNochmal? (J/N): ";
    		cin  >> ch;
    
    		if( ch == 'J' || ch == 'j' )
    		{
    			ctr = 1;
    			getchar(ch);
    			goto START;
    		}
    		else if( ch == 'N' || ch == 'n' )
    			goto ENDE;
    
    	}while(ch != 'J' || ch != 'j' || ch != 'N' || ch != 'n');
    
    ENDE:
    	return (0);
    }
    
    long zeitdiff()
    {
    	static long sek = 0;
    	long altsek = sek;
    	time( &sek);
    	return (sek - altsek);
    }
    


  • hui

    ehrlich geht

    getchar(ch);
    

    bei dir? ich dachte die fkt ist als getchat(void) deklariert

    also ich habe

    ch = getch();
    

    genommen.

    was dein fehler ist

    while( getchar(ch) && ch != 0x33) // ch != 0x33 --> ESC (funzt nicht)
    

    kann auch nicht gehen. weil http://www.asciitable.com/

    es ist nicht 0x33 ( das bedeutet es ist HEX ) in der tabelle steht 033 ( das ist oktal also im 8er system ) schreib einfach

    ch != 033
    

    hin dann dürfte es gehen. und nochwas. mach bitte keine goto. mach einfach ne funtkion

    void checkezahl();
    und die rufst du dann auf. ist übersichtlicher

    hier ein "idiotencode" den müsste jeder verstehen. bei ESC ist dann auch abbruch 😉

    char ch;
    int zzz = 0;
    	do
    	{
    		ch = getch();
    		if( ch == 033)
    			zzz = 1;
    		cout << ch << endl;
    
    	}while( zzz == 0 );
    


  • die ganzen GOTO brauchst du wirlich nicht. das do-while reicht aus, weil du ja solange machst wie das FLAG zzz = 0 ist. du kannst das ganze do-while in einer fkt stecken und bei deiner frage ( ja/nein ) wieder aufrufen. dann ist der code im int main auch übersichtlicher

    ausserdem ist glaub

    int main()
    

    besser angebracht. einige beharren drauf.

    Ps: nimm besser statt zzz
    ein

    bool ok_flag = true; // kostet dich nur 1 byte

    und dann while(ok_flag) und in der schleife ok_flag = false;



  • Vielen Dank newkid,
    sehr nett von dir, leider funktioniert es mit der ESC - Taste immer noch nicht.
    Erst wenn ich es am Anfang betätige reagiert das Programm drauf, andernfalls
    "hört" es nicht auf die Taste.



  • ähm bitte mach mal Copy und Paste von meinem Code
    wenn das programm in meine sleife kommt, und dann es immer noch nicht geht, dann schmeiss deine tastatur weg 😉

    hab jetzt getchar nicht benutzt sondern getch ( wie du in meinem code sehen kannst )

    da musst du nicht noch enter oder so drücken, sondern der liesst automatisch nur ein zeichen ein, und macht im code weiter.

    probiers ruhig mal aus


Log in to reply