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

Funkcja zwracająca czas pozostały do północy

Object Storage Arubacloud
0 głosów
424 wizyt
pytanie zadane 31 października 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)

Witam, mam za zadanie stworzyć funkcję składową do mojej struktury opisującej czas, która będzie zwracała czas jaki pozostał do północy.

Tak wygląda moja struktura w pliku nagłówkowym:

#include <iostream>
#include <string>

struct Time {
    int godzina;
    int minuta;
    int sekunda;

/* funkcje potrzebne do poprzednich zadan

    auto to_string() const -> std::string;
    auto next_hour() -> void;
    auto next_minute() -> void;
    auto next_second() -> void;

    enum class Time_of_day { Niezdefiniowany, Rano, Dzien, Wieczor, Noc };

    auto time_of_day() const -> Time_of_day;
    auto to_string(Time_of_day) -> std::string;

    auto operator+ ( Time const& ) const -> Time ; 
    auto operator- ( Time const& ) const -> Time ;
    auto operator< ( Time const& ) const -> bool ;
    auto operator> ( Time const& ) const -> bool ;
    auto operator== ( Time const& ) const -> bool ;
    auto operator!= ( Time const& ) const -> bool ;

    auto count_seconds () const -> uint64_t ; 
    auto count_minutes () const -> uint64_t ;
*/

    auto time_to_midnight () const -> Time ;       // deklaracja funkcji zwracajacej czas pozpstaly do polnocy
   

    Time(int godzina, int minuta, int sekunda);
};

Definicja mojej funkcji obecnie wygląda tak:

auto :: Time :: time_to_midnight () const -> Time 
{
   return Time(23-godzina, 59-minuta, (59-sekunda)+1);
}

Jest ona oczywiście błędna, ponieważ, jeżeli stworzymy obiekt, który będzie wyglądał np. tak: "12:42:00", to funkcja zwróci coś takiego: "11:17:60", czyli będziemy mieli 60 sekund a nie następną minutę. Mógłbym niby użyć funkcje, które stworzyłem (next_minute), ale funkcja time_to_midnight ma zwracać "Time", więc nie mogę napisać w niej np. minuta++. Czy ma ktoś pomysł jak rozwiązać ten problem. Będę wdzięczny za wszelkie wskazówki i z góry dziękuję!

2
komentarz 31 października 2021 przez j23 Mędrzec (194,920 p.)
edycja 31 października 2021 przez j23

IMO Time powinna trzymać czas w sekundach, wtedy łatwiej robić tego typu obliczenia.

struct Time {
    unsigned time_in_secs = 0;
    
    Time() = default;
    
    Time (unsigned h, unsigned m, unsigned s)
        : time_in_secs(h * 3600 + m * 60 + s)
    {
        const unsigned day_in_sec = 3600 * 24;
        if(time_in_secs == 0) time_in_secs = day_in_sec;
        else if(time_in_secs > day_in_sec) time_in_secs = day_in_sec;
  }
    
    Time operator-(const Time &tm_) const
    {
        Time tm(*this);
        tm.time_in_secs -= tm_.time_in_secs;
        return tm;
    }
    
    Time time_to_midnight() const 
    {
        return Time(24, 0, 0) - *this;
    }
    
    std::string to_string() const 
    {
        std::ostringstream os;
        
        os << time_in_secs / 3600;
        unsigned x = time_in_secs % 3600;
        os << ':' << x / 60;
        x = x % 60;
        os << ':' << x;

        return os.str();
    }
};

int main()
{
    Time t(12, 42, 02);
    std::cout << t.time_to_midnight().to_string() << '\n';
}

 

komentarz 31 października 2021 przez MKolaj15 Bywalec (2,270 p.)
Dzięki, spróbuję to zrobić takim sposobem.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 216 wizyt
0 głosów
3 odpowiedzi 283 wizyt
pytanie zadane 31 sierpnia 2018 w PHP przez damian9901 Bywalec (2,140 p.)
0 głosów
1 odpowiedź 573 wizyt
pytanie zadane 26 października 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 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!

...