Obliczenia zegarowe

Manna5

Pokażę tutaj, jak wykonywać w programach pisanych w języku C tzw. obliczenia zegarowe, których uczyliśmy się w II klasie podstawówki (przykładowy problem z zakresu obliczeń zegarowych to Która godzina jest kwadrans po 23:50?). Działania tego rodzaju mogą być przydatne w programach realizujących funkcjonalność terminarza lub podobną.

Pełną godzinę (liczbę godzin i minut) najlepiej "zamknąć" w strukturze. Pole dni oznacza przesunięcie w dniach w rezultacie obliczeń.

struct zegar
{
int godziny, minuty, dni;
};

Jeśli twój kompilator nie obsługuje struktur, musisz poradzić sobie inaczej - choćby przekazując za każdym razem zestaw wskaźników na liczbę godzin i minut. Dalej przyjmę jednak, że struktury są dostępne.

Najpierw przyda nam się procedura inicjalizująca naszą strukturę (jeżeli nie korzystasz ze struktur - patrz powyższy akapit - to w twoim przypadku taka procedura nie ma zastosowania).

struct zegar utwzegar (int g, int m)
{
struct zegar zeg;
if (g < 0)
        g = 0;
else if (g > 23)
        g = 23;
zeg.godziny = g;
if (m < 0)
        m = 0;
else if (m > 59)
        m = 59;
zeg.minuty = m;
zeg.dni = 0;
return zeg;
}

Dodatkowo przeprowadzona została kontrola zakresów.

Teraz czas na właścwe procedury odpowiedzialne za obliczenia.

struct zegar dodajzeg (struct zegar zeg1, struct zegar zeg2)
{
zeg1.minuty += zeg2.minuty;
if (zeg1.minuty >= 60)
        {
        zeg1.minuty -= 60;
        ++(zeg1.godziny);
        }
zeg1.godziny += zeg2.godziny;
if (zeg1.godziny >= 24)
        {
        zeg1.godziny -= 24;
        ++(zeg1.dni);
        }
zeg1.dni += zeg2.dni;
return zeg1;
}

struct zegar odejmzeg (struct zegar zeg1, struct zegar zeg2)
{
zeg1.minuty -= zeg2.minuty;
if (zeg1.minuty < 0)
        {
        zeg1.minuty += 60;
        --(zeg1.godziny);
        }
zeg1.godziny -= zeg2.godziny;
if (zeg1.godziny < 0)
        {
        zeg1.godziny += 24;
        --(zeg1.dni);
        }
zeg1.dni -= zeg2.dni;
return zeg1;
}

Drugą procedurą pomocniczą, szczególnie przydatną do testów, będzie wyświetlanie godzin na konsoli.

void wyswzeg (struct zegar zeg)
{
printf ("%d:%02d", zeg.godziny, zeg.minuty);
if (zeg.dni)
        printf (", %+d dni", zeg.dni);
putchar ('\n');
}

Oto przykład obliczeń. Widać, że dzięki zastosowaniu procedur i struktur, zapis obliczeń jest równie prosty jak przy zwykłych liczbach.

struct zegar A, B;
A = utwzegar (9, 50);
wyswzeg (A);
B = utwzegar (0, 55);
wyswzeg (B);
wyswzeg (dodajzeg (A, B));
wyswzeg (odejmzeg (B, A));

Ćwiczenia

  1. Obsłuż sekundy. To ćwiczenie szczególnie pomoże w zrozumieniu metody wykonywania obliczeń.
  2. Dodaj porównywanie godzin.
  3. Obsłuż pełne daty, tj. miesięce i lata. Zwróć uwagę na zmienną długość miesięcy, w tym lata przestępne. Zadbaj przy tym o wydajność. Ćwiczenie zaawansowane.
  4. Kontynuacja poprzedniego. Konwertuj znaczniki czasu (znacznik czasu - data jako jedna liczba, w formie ilości sekund od północy 1 stycznia 1970 r.) na strukrturę daty i odwrotnie. Albo użyj uproszczonych znaczników czasu - przechowujących tylko godzinę, jako minuty od północy.
  5. Zapoznaj się z biblioteką time.h, umożliwiającą nie tylko same obliczenia, ale też dostęp do zegara systemowego. Pobieraj czas systemowy (za pomocą tej biblioteki) i zwracaj go jako własną strukturę opisaną tutaj.
  6. Dodaj - w C++ - własne operatory + oraz - dla godzin (i ew. dat z ćw. 3).
  7. Wypisuj godziny w formacie 12-godzinnym.
  8. Wypisz listę dzwonków w szkole, zakładając, że szkoła jest otwierana o 8:00, lekcja trwa 45 minut, a przerwa 10.

0 komentarzy