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

question-closed Struktura opisująca czas (porę dnia)

0 głosów
1,006 wizyt
pytanie zadane 26 października 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)
zamknięte 26 października 2021 przez MKolaj15

Witam, miałem za zadanie stworzenie struktury opisującej czas, która miała składać się z pól godzina, minuta, sekunda oraz funkcji składowych oddzielnie zwiększających każde pole o 1, plus funkcji składowej wyświetlającej czas w formacie HH:MM:SS. Teraz mam następujące zadanie:

Do struktury opisującej czas dodać funkcję składową ‘time_of_day() const’ zwracającą
porę dnia (rano, dzień, wieczór, noc). Pora dnia powinna być opisana typem
wyliczeniowym enum class Time_of_day.
Napisać funkcję to_string(Time_of_day) zwracającą std::string, która zamieni
wartość wyliczeniową na napis.
W funkcji main dodać kod pozwalający na zweryfikowanie działania dodanych funkcji.
Kod źródłowy w plikach include/s1234/Time.h (nagłówek) i src/s03-Time.cpp (implementacja i funkcja
main).

Tak wygląda mój plik nagłówkowy:

#include <iostream>
#include <string>

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

    auto to_string() const -> std::string; // funkcja zwracająca godzinę w podanym formacie
    auto next_hour() -> void;
    auto next_minute() -> void;
    auto next_second() -> void;
   
    enum class Time_of_day 
    { 
     Rano,
     Dzien,
     Wieczor,
     Noc
    };

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

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

A tak plik główny:

#include <s25441/Time.h>

#include <iomanip>
#include <iostream>
#include <string>

Time::Time(int godz, int min, int sek)
        : godzina{godz}, minuta{min}, sekunda{sek}
{}

auto ::Time::next_hour() -> void
{
    if (godzina < 23) {
        godzina++;
    } else {
        godzina = 0;
    }
}

auto ::Time::next_minute() -> void
{
    if (minuta < 59) {
        minuta++;
    } else {
        next_hour();
        minuta = 0;
    }
}

auto ::Time::next_second() -> void
{
    if (sekunda < 59) {
        sekunda++;
    } else {
        next_minute();
        sekunda = 0;
    }
}


auto ::Time::to_string() const -> std::string
{
    std::string godz = std::to_string(godzina);
    std::string min  = std::to_string(minuta);
    std::string sek  = std::to_string(sekunda);

    if (godzina < 10) {
        godz = "0" + godz;
    }

    if (minuta < 10) {
        min = "0" + min;
    }

    if (sekunda < 10) {
        sek = "0" + sek;
    }


    return godz + ":" + min + ":" + sek;
}


auto::Time::time_of_day() const -> Time_of_day
{
    if ((godzina >= 23) && (godzina <= 5)) {
        return Time_of_day::Noc;
    } else if ((godzina >= 6) && (godzina <= 10)) {
        return Time_of_day::Rano;
    } else if ((godzina >= 11) && (godzina <= 16)) {
        return Time_of_day:: Dzien;
    } else if ((godzina >= 17) && (godzina <= 22)) {
        return Time_of_day::Wieczor;
    }
}

auto::Time::to_string(Time_of_day t) -> std::string
{
    if (t ==Time_of_day:: Rano) {
       return "Rano";
    }
    else if(t ==Time_of_day:: Dzien){
        return "Dzien";
    }
    else if(t ==Time_of_day:: Wieczor){
        return "Wieczor";
    }
    else{
        return "Noc";
    }
}

auto main() -> int
{
    auto czas = Time(23, 59, 59);
   
    std::cout << czas.to_string() << std::endl;
    czas.next_minute();
    
    std::cout<<czas.to_string(Time_of_day)<<std::endl;
    
    std::cout << czas.to_string() << std::endl;
    czas.next_second();
    std::cout << czas.to_string() << std::endl;
    czas.next_hour();
    std::cout << czas.to_string() << std::endl;
    return 0;
}

Poprzednie zdanie działa poprawnie. Problem mam z wywłaniem funkcji to_string(TIme_of_day) w funkcji main, ponieważ wyświetla mi błąd, że "‘Time_of_day’ was not declared in this scope", co jest zrozumiałe, bo enum class znajduje się w pliku nagłówkowym, ale przecież musi tam być, aby zadeklarować funkcję time_of_day() zwracającą Time_of_day. Czy ktoś byłby w stanie pomóc mi rozwiązać ten problem? Z góry dziękuję!

komentarz zamknięcia: uzyskałem odpowiedź

1 odpowiedź

+2 głosów
odpowiedź 26 października 2021 przez draghan VIP (106,230 p.)
wybrane 26 października 2021 przez MKolaj15
 
Najlepsza

Masz tutaj dwa problemy.

1. `Time_of_day` jest zadeklarowane wewnątrz klasy `Time`, więc jeśli chcesz się do niej odwołać spoza klasy, potrzebujesz explicite to wyrazić:

std::cout<<czas.to_string(Time::Time_of_day)<<std::endl;

2. Ale tak naprawdę nie musisz tego robić. Powyższy kod również nie zadziała, bo `Time::Time_of_day` to nazwa typu, a Ty chcesz do metody `Time::to_string(Time_of_day)` podać określoną wartość danego typu. Musisz więc np. przekazać tam zmienną, do której wcześniej przypiszesz jakąś wartość enumeracji:

auto time_of_day = czas.time_of_day();
std::cout<<czas.to_string(time_of_day)<<std::endl;

(albo bez posiłkowania się zmienną: `std::cout<<czas.to_string(czas.time_of_day())<<std::endl;`)

komentarz 26 października 2021 przez MKolaj15 Bywalec (2,270 p.)
Cześć, dzięki wielkie za pomoc, zrozumiałem o co chodzi, lecz pojawia się kolejny problem, który nie do końca rozumiem, mianowicie po wporwadzeniu tych zmian wywala taki błąd:

"src/s03-Time.cpp: In member function ‘Time::Time_of_day Time::time_of_day() const’:
src/s03-Time.cpp:75:1: error: control reaches end of non-void function [-Werror=return-type]"
komentarz 26 października 2021 przez draghan VIP (106,230 p.)

Kompilator patrzy na Twoją funkcję i widzi, że ma zwracać `Time::Time_of_day`.

Potem patrzy na ciało Twojej funkcji i widzi, że istnieje hipotetyczna możliwość, że Twoje warunki nie pokryją wszystkich watości typu int, który wykorzystujesz do przechowywania aktualnej godziny.

W takim wypadku, punkt wykonania programu wyjdzie poza ostatni else i... właśnie. I co wtedy? Funkcja miała zwracać `Time::Time_of_day` a znaleźliśmy się w miejscu bez żadnego returna. To właśnie mówi komunikat błędu.

Jest kilka sposobów na który możemy obsłużyć tę sytuację.

Możesz dodać `return Time_of_day::Noc;` na samym końcu funkcji, żeby załatać tę lukę. Nie jest to najlepsze rozwiązanie, bo zwracasz wartość `Noc` która jest zarezerwowana dla określonych wartości godziny w przypadku, w którym nie powinieneś.

Możesz przemodelować odrobinę swój łańcuch `if else if` tak, żeby ostatni `else` był bez części `if` - resztę rozsądnych wartości masz przecież pokrytą poprzednimi warunkami, ale tutaj znów mamy taki sam problem jak poprzednio: "a jeśli godzina będzie spoza oczekiwanego zakresu, to znów zwrócimy wartość która nie powinna być przypisana do danej godziny".

Możesz też wprowadzić kolejną wartość do enuma Time_of_day, np.

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

i zwracać ją właśnie w takich przypadkach.

komentarz 26 października 2021 przez Oscar Nałogowiec (29,360 p.)
Skoro działamy w C++ to w sytuacjach błednych można też wywalić wyjątek. Ale może jeszcze tego nie było.
komentarz 26 października 2021 przez MKolaj15 Bywalec (2,270 p.)

@draghan, Dzięki za pomoc, użyłem tego ostatniego sposobu, dodałem kolejną wartość do enuma i zwracam go w else. Dzięki!

Podobne pytania

0 głosów
0 odpowiedzi 1,220 wizyt
pytanie zadane 20 października 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)
0 głosów
1 odpowiedź 868 wizyt
pytanie zadane 15 października 2018 w C i C++ przez air855 Nowicjusz (220 p.)
0 głosów
0 odpowiedzi 260 wizyt
pytanie zadane 15 sierpnia 2018 w C i C++ przez XezolPL Obywatel (1,530 p.)

93,600 zapytań

142,524 odpowiedzi

322,993 komentarzy

63,085 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

Kursy INF.02 i INF.03
...