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
- Obsłuż sekundy. To ćwiczenie szczególnie pomoże w zrozumieniu metody wykonywania obliczeń.
- Dodaj porównywanie godzin.
- 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.
- 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.
- 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.
- Dodaj - w C++ - własne operatory
+
oraz-
dla godzin (i ew. dat z ćw. 3). - Wypisuj godziny w formacie 12-godzinnym.
- Wypisz listę dzwonków w szkole, zakładając, że szkoła jest otwierana o 8:00, lekcja trwa 45 minut, a przerwa 10.