• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program liczący czas reakcji. FALSTART

Object Storage Arubacloud
+1 głos
282 wizyt
pytanie zadane 13 stycznia 2021 w C i C++ przez Bandyta Początkujący (270 p.)
edycja 13 stycznia 2021 przez Bandyta
#include <iostream>
#include <time.h>
#include <windows.h>
#include <conio.h>

using namespace std;



int main()
{
    clock_t start, stop;
    int oczekuj;
    double czasReakcji;

    srand(time(NULL));
    oczekuj=rand()%6000+500; /// Sleep(oczekuj)- czas oczekiwania od 0.5 do 6 sek.

    cout << "Wcisnij klawisz."<<endl;
    getch();
    system("cls");

    Sleep(oczekuj);
    /*if(kbhit()==1)   ///dodac w tym miejscu (lepszą) opcje falstartu 
    {
        cout<<"FALSTART!";
        Sleep(3000);
        exit(0);
    }*/

    cout<<"TERAZ!\a";
    start=clock();
    getch();
    stop=clock();
    system("cls");

    czasReakcji=(double)(stop-start)/CLOCKS_PER_SEC;
    cout<<"Twoj czas reakcji: "<<czasReakcji<<" sek.";
    getch();

    return 0;
}

Cześć! Postanowiłem napisać program liczący czas reackji użytkownika. Zastosowałem funkcję Sleep i rand do wylosowania czasu oczekiwania na sygnał. Generalnie program działa, ale postanowałem dodać do niego opcję FALSTARTU i tu pojawia się wyzwanie. W komentarzu napisałem część która jako tako spełnia swoją funckję i wykrywa kiedy użytkownik zareaguje przed sygnałem, ale informacje o przewinieniu zwraca dopiera w momencie kiedy skończy się czas oczekiwania (int oczekuj) na sygnał. Domyślam się że chodzi tu o funkcję Sleep która usypia program na dany czas co jest konsekwencją że program nie reaguje na inne instrukcje. 
Macie pomysł jaką inną funckję zastosować (zamiast sleep) żeby program od razu zareagował na FALSTART?

Ps; To mój pierwszy post na forum i dopiero zaczynam z programowaniem. Apeluje o wyrozumiałość ;) 

2 odpowiedzi

+1 głos
odpowiedź 13 stycznia 2021 przez tangarr Mędrzec (154,860 p.)
wybrane 13 stycznia 2021 przez Bandyta
 
Najlepsza

Zamiast jednego długiego sleepa możesz stwożyć pętlę, w której będziesz sprawdzał bufor klawiatury funkcją kbhit i dopiero później zrobisz krótkiego sleepa.

oczekuj = ...
int minelo = 0;
while (minelo < oczekuj) {
   if (kbhit()) {
      // koniec !
   }
   minelo += 100;
   sleep(100);
}

 

komentarz 13 stycznia 2021 przez Bandyta Początkujący (270 p.)
Wielkie dzięki! Sam bym na to nie wpadł. Miłego dnia :D
+1 głos
odpowiedź 13 stycznia 2021 przez TOM_CPP Pasjonat (22,640 p.)

Możesz zrezygnować z funkcji sleep oraz użyć generatora liczb losowych z biblioteki random

#include <iostream>
#include <time.h>
#include <random>
#include <windows.h>
#include <conio.h>

using namespace std;

int main()
{
    mt19937 mt(random_device{}());
    uniform_int_distribution<int> dist(1000,4000); // losowany czas oczekiwania od 1 do 4 sekund
    int delay {dist(mt)};

    cout << "Wcisnij klawisz po sygnale."<<endl;

    clock_t mtime {clock()};
    bool display {true};

    while( !kbhit() )
    {
        if( clock()-mtime > delay && display )
        {
            cout << "TERAZ!" << endl;
            mtime = clock();
            display = false;
        }
    }
    system("cls");

    if( display ) cout << "Falstart" << endl;
    else cout << "Twoj czas reakcji: " << clock()-mtime << " msek." << endl;

    getch();
}

 

komentarz 13 stycznia 2021 przez Bandyta Początkujący (270 p.)
Dzięki za materiał do nauki. Mam dzisiaj co robić :)
komentarz 13 stycznia 2021 przez Bandyta Początkujący (270 p.)

@TOM_CPP, 

Troche poszperałem w internecie ale nadal do końca nie rozumiem tego losowania. 
Generator liczb losowych który zailmpementowałeś nie działa dokładnie tak jak bym chciał, bo losuje liczby tylko raz.  Jak zrestartujemy program to pojawiają się te same które zostały wylosowane wcześniej. Jak to obejść?  


Jak szperałem w internecie to nawet znalazłem twój wpis na forum na ten sam temat :)

#include <random>
#include <iostream>
 
using namespace std;
 
int main()
{
    mt19937 mt(random_device{}()); // generator liczb pseudolosowych
    uniform_int_distribution<int> dist(10, 110); // rozkład wylosowanych liczb wraz z zakresem
 
    int table[20];
 
    for( int i=0; i<20; ++i ) table[i] = dist(mt); // losowanie liczb 
}

 

komentarz 14 stycznia 2021 przez TOM_CPP Pasjonat (22,640 p.)

Generator liczb losowych który zailmpementowałeś nie działa dokładnie tak jak bym chciał, bo losuje liczby tylko raz.  Jak zrestartujemy program to pojawiają się te same które zostały wylosowane wcześniej. Jak to obejść?

Zobacz przykład w którym wylosowana liczba jest inna(*), za każdym razem kiedy program zostanie na nowo uruchomiony (po naciśnięciu przycisku Run).

(*) Oczywiście może zdarzyć się sytuacja w której wylosowana zostanie taka sama liczba, ale jest to mało prawdopodobne i wynika z rachunku prawdopodobieństwa.

komentarz 14 stycznia 2021 przez Bandyta Początkujący (270 p.)

Musi być jakaś różnica pomiędzy twoim IDE, a moim bo kiedy przekopiowałem kod z podanego przykładu (przykład) to nadal przy uruchomieniu pokazuje tą samą liczbę którą wylosowano za pierwszym razem. 

komentarz 14 stycznia 2021 przez TOM_CPP Pasjonat (22,640 p.)

Prawdopodobnie jest to błąd występujący w starszych wersjach kompilatora (zakładam że używasz gcc). Spróbuj ściągnąć najnowszą wersję.

komentarz 18 stycznia 2021 przez Bandyta Początkujący (270 p.)
Trochę czasu minęło, ale w skońcu uporałem się z zainsalowaniem nowszej wersji gcc. (8.1.0).
Losowanie nadal nie pokazuje ten sam wynik. Możesz coś poradzić?
1
komentarz 18 stycznia 2021 przez TOM_CPP Pasjonat (22,640 p.)

Najnowsza stabilna wersja gcc to 10.2. Jeżeli używasz Windowsa to możesz zainstalować ją przy użyciu msys .

 

komentarz 18 stycznia 2021 przez Bandyta Początkujący (270 p.)

Dzięki za radę! Zaktualizowałem do najnowszej wersji i algorytm (? nie jestem pewnie jak to nazwać, popraw mnie jeśli to zobaczysz) działa tak jak powinien. :)  

Podobne pytania

0 głosów
1 odpowiedź 268 wizyt
pytanie zadane 18 marca 2020 w C i C++ przez Downoodle Nowicjusz (240 p.)
0 głosów
1 odpowiedź 326 wizyt
pytanie zadane 12 września 2020 w C i C++ przez lujasjeden Użytkownik (860 p.)
0 głosów
1 odpowiedź 270 wizyt
pytanie zadane 27 października 2018 w C i C++ przez ZByszko Nowicjusz (140 p.)

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...