Aufgabe zum Reaktionstest



  • Hallo,

    ich habe eine folgende Aufgabe vorliegen:
    Erstellen Sie ein Programm, mit dem Sie Ihre Reaktionszeit testen können. Dazu soll nach einer zufälligen Verzögerungszeit zwischen 1-10 Sekunden, ein Balken auf dem Bildschirm erscheinen. Ihre Reaktion siganlisieren Sie druch einen Tastendruck. Danach soll auf dem Bildschirm Ihre Reaktionszeit in Millisekunden angezeigt werden.
    Nach jedem Durchgang soll gefragt werden, ob man es nochmal versuchen will. Bei der Eingabe "j" wird der Bildschirm gelöscht und das Programm von vorn gestartet und bei der Eingabe "n" wird das Programm beendet.

    Funktionen zur Realisierung:
    srand(time(0)); Initialsierung des Zufallsgenerators
    rand()%5; liefert die Zufallszahl zwischen 0-4
    clock(); liefert die verbrauchten CPU-Ticks seit dem Start des Programm
    CLOCKS_PER_SEC CPU-Ticks pro Sekunde (Konstante)
    getch(); warten auf Tastendruck

    ...Soweit so gut:
    Also mein erstes Problem lag darin, überhaupt erst einmal ein Balken anzeigen zu lassen auf der Konsole. Dies habe ich so gelöst:

    while (i < 50) {
    	putchar(219);
    	i++;
    }
    

    Nun stellt sich die Frage, wie nach der zufälligen Verzögerungszeit eine Aktion gestartet wird, also der Balken nun angezeigt wird.. Ich komme einfach nicht voran..
    Hoffe Ihr könnt mir Tipps geben.

    PS: bin c++ Neuling

    Viele Grüße



  • Bei dieser Aufgabenstellung wird mir schlecht. Geb nicht zu viel, auf deinen Dozenten...

    Also du gibst nach einer zufälligen Zeit den Balken aus. Daraufhin startest du einen Timer. Dann testest du auf _kbhit. Bei erfolgreichem Test hälst du den Timer an. Dann rechnest du Endzeit minus Anfangszeit. Dann solltest du fertig sein.

    Schau dir mal die _kbhit Funktion an.



  • Wie soll ich aber nach einer bestimmten Zeit den Balken ausgeben ?



  • sr4 schrieb:

    while (i < 50) {
    	putchar(219);
    	i++;
    }
    

    Das schreit nach einer for -Schleife:

    for (int i{}; i < 50; ++i)
        putchar(219);
    

    sr4 schrieb:

    Wie soll ich aber nach einer bestimmten Zeit den Balken ausgeben?

    Indem Du dein Programm vor der nächsten Anweisung eine bestimmte Anzahl an Sekunden "nichts" tun lässt. Zb. mit

    #include <ctime>
    
    void sleep(long sec)
    {
    	for (auto start{ std::clock() }; clock() < (start + sec * CLOCKS_PER_SEC););
    }
    

    _kbhit() brauchst Du nicht.



  • Swordfish schrieb:

    for (int i{}; i < 50; ++i)
        putchar(219);
    

    Schmerzen!

    for (int i = 0; i < 50; ++i)
    


  • Was haltet ihr von meiner Lösung ?

    #include<iostream>
    #include<iomanip>
    #include<cstdlib> 
    #include <windows.h>
    
    using namespace std;
    
    void main(){
    
    srand(time(0));
    int zufall = rand() % 11;
    double reaktionszeit;
    char auswahl;
    
    cout << "Wollen Sie den Reaktionstest starten(j/n)?";
    cin >> auswahl;
    getchar();
    
    while(auswahl=='j' || auswahl=='J' )
    {
    Sleep(zufall*1000);
    cout << "----------------------" << endl;
    double davor = clock();
    getchar();
    double danach = clock();
    
    reaktionszeit = (danach - davor)/ CLOCKS_PER_SEC;
    
    cout << "Ihre Reaktionszeit in Sekunden betraegen:" << reaktionszeit<<"s"<<endl;
    cout << "Ihre Reaktionszeit in Millisekunden betragen:" << reaktionszeit / 0.001 << "ms" << endl<<endl;
    
    cout << "Wollen Sie den Reaktionstest erneut starten(j/n)?";
    cin >> auswahl;
    cout << endl;
    getchar();
    }
    
    system("Pause");
    }
    


  • Bei mehrfach Ausführung des Reaktionstest bleibt die Zeit jeweils gleich nach der, der Balken eingeblendet wird.

    Wenn es wirklich c++ sein soll würde ich mir die neueren Zufallsgeneratoren und chrono anschauen.



  • Ja aber das ist doch nur so weil ich das

    int Zufall = rand()%11
    

    nicht in der While schleife hab oder ?



  • Genau.

    Ansonsten: deine Sleep Funktion ist die aus der Windows API? Würde ich anders machen, so läuft dein Code nur auf Windows Maschinen und das lässt sich hier leicht vermeiden.

    In der Aufgabe steht, "Verzögerungszeit zwischen 1 - 10 Sekunden, deine Verzögerungszeit geht von 0 - 10 Sekunden.

    Woher kommt deine clock() Funktion? Aus ctime oder time.h (Oder hat die Windows API sogar noch eine eigene definiert?) CLOCKS_PER_SEC scheint aus ctime zu kommen...

    Ordentlicher Code gehört eingerückt, direkt angewöhnen sonst wird es schnell sehr unübersichtlich.

    Warum System('Pause') am schluss?
    Warum cin und getchar()?

    Ich bleibe dabei, dass ganze sieht nicht sehr nach C++ aus. Aber die Aufgabenstellung liest sich schon mehr nach C.



  • hustbaer schrieb:

    Schmerzen!

    Mir gefällt, wie du so vor Schmerzen schreist und stöhnst, Husti 😃

    Swordfish schrieb:

    [...]Zb. mit

    #include <ctime>
    
    void sleep(long sec)
    {    // ...
    }
    

    Oh mann, ich bin teilweise immer noch im uralt-C++-mode ...
    std::this_thread::sleep_for() tut besser.



  • Swordfish schrieb:

    hustbaer schrieb:

    Schmerzen!

    Mir gefällt, wie du so vor Schmerzen schreist und stöhnst, Husti 😃

    Dir ist aber klar dass die {} Syntax an der Stelle komplett idiotisch ist, ja?
    Ja.
    Hoffentlich.


Anmelden zum Antworten