Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

zatrzymanie czasu

Ostatnio zmodyfikowano 2020-05-14 21:24
Autor Wiadomość
aspartam
Temat założony przez niniejszego użytkownika
zatrzymanie czasu
» 2020-05-06 15:17:28
Witam, mam do zrobienia zadanie polegające na stworzeniu stopera, który będzie odliczał czas biegu zawodnika. Zrobiłem najprostszy możliwy licznik z użyciem funkcji if, problem jest taki, że to się cały czas odlicza i nie mam pojęcia jak sprawić, by zatrzymał się na życzenie użytkownika, bo przecież ten zawodnik musi kiedyś przestać biec...

Dodam, że jestem mniej niż początkujący i równanie kwadratowe w c++ to dla mnie duże osiągnięcie.
P-176832
pekfos
» 2020-05-06 16:07:48
Nie wiadomo co tam masz. Podaj kod.
P-176833
aspartam
Temat założony przez niniejszego użytkownika
» 2020-05-06 16:46:11
dobra, mój licznik jednak nie działa tak, jak należy

Czy może mi ktoś napisać, jak się za to zabrać (ogólnie za zrobienie stopera)
P-176835
pekfos
» 2020-05-06 17:23:18
Pobierz aktualny czas przed i po, oblicz różnicę. W <ctime> i <chrono> masz różne zegary do wyboru.
https://en.cppreference.com/w​/cpp/header/ctime
https://en.cppreference.com/w​/cpp/header/chrono
Do stopera odpowiedni będzie taki:
https://en.cppreference.com/w​/cpp/chrono/steady_clock/now
Masz nawet przykładowy kod.
P-176836
aspartam
Temat założony przez niniejszego użytkownika
» 2020-05-07 12:48:31
Nie mam pojęcia jak to zrobić, a te zegary albo nie działają albo nie umiem ich użyć. Przeczytałem, że pomocna byłaby po prostu funkcja time, ale też nie wiem jak napisać kod z jej użyciem i na czym w ogóle to polega
P-176841
pekfos
» 2020-05-07 17:02:53
Podaj kod.
P-176842
aspartam
Temat założony przez niniejszego użytkownika
» 2020-05-12 16:13:25
Mam coś takiego, jak sprawić, żeby to się zatrzymało?

C/C++
#include <iomanip>
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
using namespace std;

int hours = 0;
int minutes = 0;
int seconds = 0;

void displayClock()
{
   
    system( "clear" );
   
    cout << setfill( ' ' ) << setw( 55 ) << "         STOPER         \n";
    cout << setfill( ' ' ) << setw( 55 ) << " --------------------------\n";
    cout << setfill( ' ' ) << setw( 29 );
    cout << "| " << setfill( '0' ) << setw( 2 ) << hours << " hrs | ";
    cout << setfill( '0' ) << setw( 2 ) << minutes << " min | ";
    cout << setfill( '0' ) << setw( 2 ) << seconds << " sec |" << endl;
    cout << setfill( ' ' ) << setw( 55 ) << " --------------------------\n";
}

void timer()
{
   
    while( true ) {
       
        displayClock();
        sleep( 1 );
       
        seconds++;
       
        if( seconds == 60 ) {
           
           
            minutes++;
           
           
            if( minutes == 60 ) {
               
               
                hours++;
                minutes = 0;
            }
            seconds = 0;
        }
    }
}


int main()
{
   
    timer();
    return 0;
}

Wiem, że można użyć thread, ale nie wiem, jak to działa i gdzie napisać te funkcję.
+ gdy próbuję to zrobić pojawia się taki error: #error This file requires compiler and library support for the \
ISO C++ 2011 standard. This support is currently experimental, and must be \
enabled with the -std=c++11 or -std=gnu++11 compiler options.
Jak na to zaradzić?
P-176858
pekfos
» 2020-05-12 17:46:17
To nie jest nawet poprawna implementacja zegara. Taki stoper będzie zawsze się spóźniać, a jak bardzo, to możesz sam zbadać używając prawdziwego zegara. time() się nada, skoro najwyraźniej nie potrzebujesz dokładności większej niż do jednej sekundy. Przeanalizuj poniższy zmodyfikowany kod:
C/C++
#include <iomanip>
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <ctime>
using namespace std;

int hours = 0;
int minutes = 0;
int seconds = 0;

void displayClock()
{
   
    system( "clear" );
   
    cout << setfill( ' ' ) << setw( 55 ) << "         STOPER         \n";
    cout << setfill( ' ' ) << setw( 55 ) << " --------------------------\n";
    cout << setfill( ' ' ) << setw( 29 );
    cout << "| " << setfill( '0' ) << setw( 2 ) << hours << " hrs | ";
    cout << setfill( '0' ) << setw( 2 ) << minutes << " min | ";
    cout << setfill( '0' ) << setw( 2 ) << seconds << " sec |" << endl;
    cout << setfill( ' ' ) << setw( 55 ) << " --------------------------\n";
}

void timer()
{
    int twoj_zegar = 0;
    time_t start_programu = time( 0 );
   
    while( true ) {
       
        displayClock();
        cout << "Minelo sekund:  " << twoj_zegar << '\n';
        cout << "A tak naprawde: " << time( 0 ) - start_programu << '\n';
        sleep( 1 );
       
        seconds++;
        twoj_zegar++;
       
        if( seconds == 60 ) {
           
           
            minutes++;
           
           
            if( minutes == 60 ) {
               
               
                hours++;
                minutes = 0;
            }
            seconds = 0;
        }
    }
}


int main()
{
   
    timer();
    return 0;
}

Normalnie do zatrzymania tego użyłoby się osobnego wątku, który czeka na blokującym IO, a potem daje sygnał do zakończenia pracy. Jako że jesteś "mniej niż początkujący", takie rozwiązanie odpada. Lepiej poczytaj o New Curses.
https://stackoverflow.com/a​/905101
Tu masz przykład jak pobrać znak od użytkownika z maksymalnym czasem oczekiwania. Tym możesz zastąpić sleep() i użyć ewentualnego pobranego znaku do przerwania pętli. Znajdziesz w tej bibliotece też lepsze rozwiązanie do czyszczenia ekranu niż te system( "clear" ).
P-176860
« 1 » 2 3
  Strona 1 z 3 Następna strona