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

Zwykły stoper - problem z godzinami C++

Object Storage Arubacloud
0 głosów
3,053 wizyt
pytanie zadane 6 listopada 2016 w C i C++ przez Konrad Nabożny Stary wyjadacz (13,460 p.)

Witam. Nudziło mi się w nocy to napisałem sobie prostą interpretację stopera w C++.

Mój problem polega na tym, że liczba godzin przy pierwszej sekundzie zwiększa się z niewiadomych powodów do 1, zamiast pozostać zerem do czasu osiągnięcia przez program 60 minut. Kombinuję już 20 minut i nie mogę znaleźć błędu. Konstruktor Stoper jasno deklaruje zmienną hours na 0, więc nie wiem o co chodzi. Dziękuję za odpowiedzi. 

 

#include <iostream>
#include <cstdlib>
#include <windows.h>

using namespace std;

class Stoper
{
private:
    short hours;
    short minutes;
    short seconds;
public:

    Stoper()
    {
        short hours=0;
        short minutes=0;
        short seconds=0;
    }

    void seconds_count()
    {
        if (seconds >= 10)
        {
            cout<<seconds;
        }
        else
        {
            cout<<0<<seconds;
        }

        seconds++;

    }
    void minutes_count()
    {
        if (minutes >= 10)
        {
            cout<<minutes;
        }
        else
        {
            cout<<0<<minutes;
        }

        if (seconds >= 60)
        {
            minutes+=1;
            seconds=0;
        }
    }
    void hours_count()
    {
        if (hours >= 10)
        {
            cout<<hours;
        }
        else
        {
            cout<<0<<hours;
        }

        if (minutes >= 60)
        {
            hours+=1;
            minutes=0;
        }
    }
    void time_count()
    {
        system("cls");

        hours_count();
        cout<<":";
        minutes_count();
        cout<<":";
        seconds_count();

        Sleep(1000);
    }
};

int main()
{
    Stoper stoper1;

    for(;;)
    {
        stoper1.time_count();
    }

    return 0;
}

 

1 odpowiedź

+4 głosów
odpowiedź 6 listopada 2016 przez obl Maniak (51,280 p.)
wybrane 6 listopada 2016 przez Konrad Nabożny
 
Najlepsza

W konstruktorze powinieneś ustawić wartości pól klasy na zero, zamiast tego tworzysz zmienne lokalne i je zerujesz. Tak to powinno wyglądać:

    Stoper()
    {
        hours=0;
        minutes=0;
        seconds=0;
    }

A nie tak:

    Stoper()
    {
        short hours=0; // zmienna lokalna, nie ustawiasz wartości pola hours
        short minutes=0;
        short seconds=0;
    }

 

komentarz 6 listopada 2016 przez Konrad Nabożny Stary wyjadacz (13,460 p.)
Ku mojemu zdziwieniu to działa. Dziękuję. Bardzo interesuje mnie to, dlaczego program tak się przez to zachowywał i tylko godzina zwiększała się do 1, a np. minuty już nie. Masz jakiś pomysł?
komentarz 6 listopada 2016 przez Konrad Nabożny Stary wyjadacz (13,460 p.)
Poza tym zauważyłem że program w ciągu minuty gubi około 1-2 sekund. To wina tego że musi jeszcze wywoływać metody, inkrementować zmienne itp, prawda?
1
komentarz 7 listopada 2016 przez obl Maniak (51,280 p.)

Poza tym zauważyłem że program w ciągu minuty gubi około 1-2 sekund.

To wina tego, że używasz funkcji sleep, która nie odmierza dokładnie czasu, a jest wywoływana co przybliżony odstęp czasu. Dlatego nie powinieneś w stoperze tej funkcji używać. Aby poprawnie to obsłużyć powinieneś zapamiętać czas początkowy i pobierać czas końcowy (co interwał) i obliczać różnicę, którą należy zapisywać w pamięci pod polami twojej klasy. Najprostszym rozwiązaniem mogłaby być funkcja time z biblioteki time.h

Zapytaj wujka Google o więcej szczegółów, gdyż każda funkcja niepoprawnie wykorzystywana jest przyczyną powstawania niepotrzebnych wątków na tym forum.

Dziękuję. Bardzo interesuje mnie to, dlaczego program tak się przez to zachowywał i tylko godzina zwiększała się do 1, a np. minuty już nie. Masz jakiś pomysł?

U mnie program się nieco inaczej zachowywał w twojej pierwotnej wersji, ale to zależy od tego, jaka losowa liczba stoi za danym polem obiektu klasy. Ponieważ jak już wcześniej wspominałem nie ustawiałeś tych pól hours, minutes i seconds na zero to za nimi mogły stać liczy ujemne, dodatnie a (mało prawdopodobne ale możliwe) i zero mogło się szczęśliwie napatoczyć. 

komentarz 7 listopada 2016 przez Konrad Nabożny Stary wyjadacz (13,460 p.)

Zanim jeszcze popatrzę do googli w sprawie tej funkcji time, to zgaduję że będę musiał kombinować z czymś takim: 

<time.h>
<cstdlib>

clock_t start, stop;

start = clock();

//
//
//

stop = clock();

int czas = (double)(stop-start) / CLOCK_PER_SEC;


 

komentarz 11 listopada 2016 przez obl Maniak (51,280 p.)

Nie musisz tego tak robić, funkcji  sleep możesz używać ale nie do zliczania czasu (trochę nieprecyzyjnie się wyraziłem) a jedynie do odświeżania danych. Na początku musisz zapamiętać czas początkowy, a później w pętli pobierasz czas aktualny i obliczasz ile sekund, minut i godzin upłynęło od początku działania stopera.

Podobne pytania

0 głosów
0 odpowiedzi 181 wizyt
0 głosów
2 odpowiedzi 254 wizyt
0 głosów
2 odpowiedzi 239 wizyt

92,584 zapytań

141,434 odpowiedzi

319,671 komentarzy

61,968 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!

...