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

Klasa opisująca czas stopera i suma czasów

Object Storage Arubacloud
0 głosów
643 wizyt
pytanie zadane 15 października 2018 w C i C++ przez air855 Nowicjusz (220 p.)
edycja 15 października 2018 przez air855

Dobry wieczór!
Mam duży problem na uczelni z programowaniem z klasami. Mam takie zadanie do przećwiczenia:

Zdefiniuj klasę opisująca czas na stoperze. Klasa ta ma zawierać trzy pola typu całkowitego, które
będą przechowywały liczbę godzin, minut i sekund. Zakładamy, że godziny są dodatnie a minuty i
sekundy zawsze pochodzą z zakresu od 0 do 59.

W klasie tej zdefiniuj konstruktor bezparametrowy, który zainicjalizuje wszystkie pola na wartość 0.
Klasa stopera ma być wyposażona w metody zwiększające pamiętany czas o 1 sekundę, 1 minutę i 1
godzinę (trzy różne funkcje składowe).

Zdefiniuj też funkcję, która dostanie jako argumenty dwa stopery i zwróci stoper ustawiony na sumę
czasów pamiętanych w argumentach.

Na koniec napisz program rzetelnie testujący zdefiniowany przez ciebie stoper i funkcję dodającą
czasy na stoperach.

Jak najlepiej zabrać się za to zadanie? Czego najlepiej użyć do odliczania czasu, aby móc potem dodać do siebie dwa stopery? I niestety nie rozumiem - na jakiej zasadzie ma działać program sprawdzający?

Mam już to, jednak nie wiem, czy poprawnie rozumuję:
 

#include <iostream>

using namespace std;

class stoper
{
public:
    int Godz;
    int Min;
    int Sek;
    stoper()
    {
        Godz=0;
        Min=0;
        Sek=0;
    }
    void ZwiekszGodz()
    {
        Godz++;
    }
    void ZwiekszMin()
    {
        if(Min>=59)
        {
            Min=0;
            Godz++;
        }
        else
        {
            Min++;
        }
    }
    void ZwiekszSek()
    {
        if(Sek>=59)
        {
            Sek=0;
            Min++;
        }
        else
        {
            Sek++;
        }
    }
    void Wyswietl()
    {
        cout<<Godz<<":"<<Min<<":"<<Sek<<endl;
    }
};

    stoper dodaj(stoper a, stoper b)
    {
    stoper c;
    c.Sek=a.Sek+b.Sek;
    if(c.Sek>=60)
    {
        c.Min++;
        c.Sek-=60;
    }
    c.Min=a.Min+b.Min+c.Min;
    if(c.Min>=60)
    {
        c.Godz++;
        c.Min-=60;
    }
    c.Godz=a.Godz+b.Godz+c.Godz;
    c.Wyswietl();
    }
int main()
{
    stoper a;
    stoper b;
    for(int i=0;i<195;i++)
    {
     a.ZwiekszGodz();
     b.ZwiekszMin();
    }
    for(int i=0;i<164;i++)
    {
     a.ZwiekszMin();
     b.ZwiekszSek();
    }
    for(int i=0;i<267;i++)
    {
     a.ZwiekszSek();
     b.ZwiekszGodz();
    }
    a.Wyswietl();
    b.Wyswietl();
    dodaj(a,b);
    return 0;
}

 

komentarz 15 października 2018 przez Tomasz Rogalski Bywalec (2,800 p.)
To zadanie z C++ nie Javy, sorry nie wnikam:D Pomyliłem działy.

1 odpowiedź

+1 głos
odpowiedź 15 października 2018 przez PanRik Gaduła (4,510 p.)
wybrane 15 października 2018 przez air855
 
Najlepsza

Wydaje mi się, że te zadanie nie polega na tym, aby fizycznie odliczać czas. Tutaj bardziej chodzi o to, żeby stworzyć klasę z pewnymi zależnościami
 

class Timer
{
    uint sec; //uint bo zawsze są dodatnie prawda :)?
    uint min;
    uint hours;

    void addSec();
    void addMin();
    void addHours();

    //pamiętaj jeszcze o konstruktorze.
};

Funkcja addSec będzie dodawać +1 do zmiennej sec, funkcja addMin będzie dodawać +1 ... i tak dalej. Oczywiście pamiętając o zakresie <0;59> musisz w środku napisać odpowiedniego if`a np.
 

if( sec == 60 )
{
    sec = 0;
    min = min + 1; //lub addMin() , co w sumie byłoby bardzo wygodne.
}

Potrzebujesz jeszcze jednej funkcji wewnątrz klasy, która będzie przyjmować jako argumenty dwa stoper, ta funkcja powinna zwracać nowy obiekt , który jest sumą dwóch stoperów( mógłby to w sumie być konstruktor, ale nie ma tego napisanego w zadaniu , więc zrobimy to jako funkcje ):
 

Timer makeNewTimer( Timer &t1, Timer &t2 )
{
   Timer t3;
   t3.sec = t1.sec + t2.sec;
   ... //i tak dalej i tak dalej
}

Można by było pokusić się o gettery i settery, ale nie będziemy utrudniać.

 

Program testujący, chodzi pewnie o to, żeby w funkcji main() , posprawdzać , czy to co zrobiliśmy działa jak należy,  czyt. po wyświetlać na konsole.

komentarz 15 października 2018 przez air855 Nowicjusz (220 p.)
Z tego co mi wiadomo to konstruktor w klasie powinien spełniać warunki:
Identyczna nazwa jak nazwa klasy
Nie zwraca żadnej wartości (nawet void) - i tu nie jestem pewien czy ten fragment przy klasie będzie dobry. Ale powiem szczerze, że z programowania jestem noga :D
komentarz 15 października 2018 przez PanRik Gaduła (4,510 p.)

Jest dokładnie tak jak mówisz:
 

Timer()
{
//ciało konstruktora dla klasy Timer
}

 

komentarz 15 października 2018 przez air855 Nowicjusz (220 p.)

Mam też rozwiązanie po swojemu, ale nie wiem czy dobrze rozumuję:
 

#include <iostream>

using namespace std;

class stoper
{
public:
    int Godz;
    int Min;
    int Sek;
    stoper()
    {
        Godz=0;
        Min=0;
        Sek=0;
    }
    void ZwiekszGodz()
    {
        Godz++;
    }
    void ZwiekszMin()
    {
        if(Min>=59)
        {
            Min=0;
            Godz++;
        }
        else
        {
            Min++;
        }
    }
    void ZwiekszSek()
    {
        if(Sek>=59)
        {
            Sek=0;
            Min++;
        }
        else
        {
            Sek++;
        }
    }
    void Wyswietl()
    {
        cout<<Godz<<":"<<Min<<":"<<Sek<<endl;
    }
};

    stoper dodaj(stoper a, stoper b)
    {
    stoper c;
    c.Sek=a.Sek+b.Sek;
    if(c.Sek>=60)
    {
        c.Min++;
        c.Sek-=60;
    }
    c.Min=a.Min+b.Min+c.Min;
    if(c.Min>=60)
    {
        c.Godz++;
        c.Min-=60;
    }
    c.Godz=a.Godz+b.Godz+c.Godz;
    c.Wyswietl();
    }
int main()
{
    stoper a;
    stoper b;
    for(int i=0;i<195;i++)
    {
     a.ZwiekszGodz();
     b.ZwiekszMin();
    }
    for(int i=0;i<164;i++)
    {
     a.ZwiekszMin();
     b.ZwiekszSek();
    }
    for(int i=0;i<267;i++)
    {
     a.ZwiekszSek();
     b.ZwiekszGodz();
    }
    a.Wyswietl();
    b.Wyswietl();
    dodaj(a,b);
    return 0;
}

 

komentarz 15 października 2018 przez PanRik Gaduła (4,510 p.)

1. ZwiekszSek ma w sobie Min++ , a co jeśli zmienna Min jest już równa 59?
2.

c.Sek-=60;

Nie lepiej po prostu:
 

c.Sek = 0

3. Dobra praktyką jest:
3.1 Pisać nazwy funkcji camelCase lub PascalCase( czyt. trzymać się jednej konwencji ).
3.2 Zmienne zaczynać od małych liter.
3.3 Nazwy klas zaczynać z dużych liter.

4. Zmienne przetrzymujące czas miały być dodatnie, w C++ mamy typy ze znakiem(signed) oraz typy bez znaku (unsigned). Twoje zmienne powinny być typu: uint , czyli właśnie bez znaku.

5. Polecam prosty test case:
Stwórz dwa stopery i przypisz im tak, aby godziny,minuty oraz sekundy miały wartość 59.
Stwórz trzeci stoper za pomocą funkcji dodaj, zobacz czy wynik jest poprawny.

komentarz 15 października 2018 przez air855 Nowicjusz (220 p.)
Bardzo dziękuję za porady, poprawiłem i w przyszłości postaram się do nich wszystkich stosować :D

5. Tak ustawiłem, wynik jest poprawny

Podobne pytania

0 głosów
0 odpowiedzi 181 wizyt
0 głosów
2 odpowiedzi 254 wizyt
+1 głos
1 odpowiedź 742 wizyt
pytanie zadane 3 stycznia 2022 w Python przez hajscker Nowicjusz (180 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!

...