Professional Documents
Culture Documents
Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
O autorach .................................................................................... 9
Wprowadzenie ............................................................................ 11
I
1
Liczby .......................................................................................... 41
2.1. Odczytywanie liczby na podstawie wartoci znakowej
2.2. Wywietlanie poprawnych form liczby mnogiej
2.3. Konwersja danych liczbowych na liczby rzymskie
2.4. Obliczanie odsetek
2.5. Symulacja rzutw komi
2.6. Obliczenia dugoci i szerokoci geograficznej
2.7. Konwersja jednostek metrycznych na angielskie
2.8. Konwersja temperatury
2.9. Tworzenie pakietu funkcji statystycznych
24
26
27
28
29
31
32
34
36
37
38
39
43
44
45
46
51
52
56
59
60
66
68
68
69
PHP 5 w praktyce
3.5. Obsuga znacznikw czasu w bazach danych lub plikach
3.6. Wyznaczanie liczby dni roboczych
3.7. Generowanie kalendarza dla okrelonego miesica
Zmienne ...................................................................................... 77
4.1. Sprawdzanie, czy zmienna jest rwna innej zmiennej
4.2. Dostp do zmiennych spoza funkcji (zmienne globalne)
4.3. Utrzymywanie trwaych wartoci w obrbie funkcji (zmienne statyczne)
4.4. Odwoania do zmiennych (referencje)
4.5. Wykorzystywanie zmiennej do zapisania nazwy innej zmiennej
4.6. Deklaracje staych zamiast zmiennych
4.7. Przegldanie listy wartoci w celu znalezienia pierwszej,
ktra ma warto rn od false
85
92
93
95
97
99
103
104
106
78
80
81
82
83
84
Tablice ........................................................................................ 87
5.1. Tablice superglobalne i ich zastosowanie
5.2. Implementacja stosu
5.3. Implementacja kolejki
5.4. Sortowanie z wykorzystaniem porwna definiowanych przez uytkownikw
5.5. Sortowanie z wykorzystaniem rnych algorytmw
5.6. Rekurencyjna obsuga tablic wielowymiarowych
5.7. Wykonywanie operacji na zbiorach z wykorzystaniem tablic
5.8. Operacje na macierzach z wykorzystaniem tablic
71
72
74
114
115
117
118
120
121
122
123
129
132
133
134
135
137
139
140
144
147
149
Spis treci
II
9
168
170
174
178
181
183
11
158
159
162
164
165
167
10
212
213
215
216
218
221
223
224
226
231
233
234
PHP 5 w praktyce
11.4. Liczby
11.5. Numery kart kredytowych
11.6. Daty
11.7. Adresy e-mail
11.8. Adresy URL
12
13
267
268
269
272
273
278
279
284
286
287
289
290
292
293
294
296
16
253
255
258
260
15
244
247
250
14
235
236
238
239
240
302
303
305
307
308
312
321
323
Spis treci
16.4. Implementacja prostego programu obsugi list mailingowych
16.5. Ochrona adresw e-mail przed automatami pobierajcymi je
w celu przesyania spamu
16.6. Utworzenie procesu Watchdog wysyajcego wiadomo e-mail
w przypadku modyfikacji strony
17
20
III
A
330
335
336
338
341
343
344
350
354
356
357
364
369
371
374
376
378
382
383
385
388
329
19
327
18
394
394
CLI i CGI
395
395
396
397
400
402
PHP 5 w praktyce
404
Iteratory rekurencyjne
Definiowanie klasy umoliwiajcej rekurencyjn iteracj
404
405
407
408
PLIKACJE, KTRE WYKONUJ operacje zwizane z czasem, s szczeglnie czsto uywane w internecie. Godziny przesania formularza, dane wprowadzane przez uytkownikw, na
przykad data urodzenia, a take aktualizacja i usuwanie stron w przypadku, gdy s przestarzae to zaledwie kilka przykadw. Chocia obliczenia dotyczce dat w PHP mog
wydawa si skomplikowane, w rzeczywistoci s do proste.
W tym rozdziale gwnie opisano podstawowe funkcje przetwarzania dat i godzin.
Funkcje te zapewniaj wykonywanie wszystkich podstawowych operacji na datach i godzinach, takie jak pobieranie, formatowanie i konwersja dat. W PHP jest dostpne take
inne rozszerzenie Calendar, ktre suy do konwersji midzy rnymi systemami kalendarzy, na przykad midzy kalendarzem gregoriaskim i ydowskim. S to na przykad
funkcje cal_to_jd() i cal_from_jd() opisane w punkcie Szybkie wskazwki.
Zagadnienie planowania zada na przykad tworzenie harmonogramu spotka i zdarze wykracza poza zakres tego rozdziau. Wasnoci te s dostpne dziki rozszerzeniu
MCAL. Wicej informacji na ten temat mona znale pod adresem http://php.net/mcal.
Aby w peni wykorzysta moliwoci przetwarzania dat i godzin w PHP, trzeba wiedzie,
w jaki sposb w rodowisku PHP mierzy si czas. Interpreter PHP odlicza czas w postaci
liczby sekund, jakie upyny od pnocy 1 stycznia 1970 roku tzw. epoki Unix. W zwizku z tym kady moment w czasie jest zapamitywany w postaci prostej liczby typu integer.
Czas zapisany w ten sposb to tzw. znacznik czasu (ang. time stamp). Jak si przekonamy, wiele funkcji albo zwraca znacznik czasu albo wykorzystuje go jako argument. Naley
jednak zachowa ostrono w przypadku czytania dokumentacji lub komentarzy w kodzie. W zalenoci od kontekstu, termin znacznik czasu moe by uywany take w sensie
bardziej oglnym: jako czas, kiedy co si wydarzyo. Gdy mowa na przykad o plikach
dziennikw serwera WWW, terminem znacznik czasu okrela si czas, w ktrym zarejestrowano zdarzenie.
Szybkie wskazwki
Odczytanie znacznika czasu dla biecej godziny:
$timestamp = time();
Funkcja nie pobiera parametrw. Zwraca biecy czas, tzn. czas, w ktrym wywoano funkcj time().
Pena dokumentacja: http://php.net/time.
64
Zwraca znakow reprezentacj podanego znacznika czasu z wykorzystaniem zdefiniowanego formatu. Jeli nie okreli si argumentu $timestamp, funkcja wykorzystuje biecy czas.
Pena dokumentacja: http://php.net/date.
Sformatowanie daty i godziny. Dostosowanie wynikw do formatu Greenwich
Mean Time (GMT):
$string = gmdate ($format, $timestamp);
Funkcja rwnowana do date(). Jednak czas jest przedstawiany jako reprezentacja GMT podanej godziny.
Pena dokumentacja: http://php.net/gmdate.
Odczytanie rnych informacji na temat podanego czasu:
$time_array = getdate($timestamp);
Zwraca tablic rnych wartoci dotyczcych podanego znacznika czasu. Indeksami tablicy s seconds, minutes, hours, mday, wday, mon, year, yday, weekday
i month.
Pena dokumentacja: http://php.net/getdate.
Odczytywanie i ustawianie strefy czasowej uywanej
w funkcjach czasowych:
$string = date_default_timezone_get();
date_default_timezone_set($string);
65
Funkcja pobiera tekstowy opis daty i godziny w jzyku angielskim i zwraca odpowiadajcy jej znacznik czasu.
Pena dokumentacja: http://php.net/strtotime.
Sprawdzenie poprawnoci daty wedug kalendarza gregoriaskiego:
$isvalid = checkdate($month, $day, $year);
Powysza para funkcji zwraca godziny wschodu i zachodu soca dla wskazanej
lokalizacji. Uycie staej SUNFUNCS_RET_TIMESTAMP powoduje, e funkcja zwraca godzin w postaci znacznika czasu.
Pena dokumentacja: http://php.net/date.sunrise i
http://php.net/date.sunset.
Konwersja daty midzy rnymi kalendarzami a kalendarzem juliaskim:
$jday count = cal_to_jd($calendar, $rnonth, $day, $year);
$date_array = cal_from_jd($jday_count, $calendar);
66
W programach bardzo czsto trzeba znale liczb tygodni, dni, a nawet sekund dzielcych dwie daty. W niektrych systemach baz danych s dostpne procedury umoliwiajce porwnywanie dat i wykonywanie dziaa arytmetycznych na datach. Jednak w PHP
takie operacje trzeba wykonywa samodzielnie.
Jak powiedziano we wprowadzeniu, w PHP daty s reprezentowane w formacie epoki
UNIX. Oznacza to, e s zapisywane w postaci liczby sekund, jaka upyna od pnocy
1 stycznia 1970 roku. Dziki temu mona z atwoci obliczy liczb sekund, jaka upyna midzy dwoma punktami w czasie. Wystarczy odj od siebie dwa znaczniki czasu.
Wykonanie popularniejszego dziaania obliczenie liczby dni wymaga jednak dodatkowych czynnoci.
Podczas dziaa arytmetycznych na datach trzeba pamita o latach przestpnych,
miesicach o rnej liczbie dni, miesicach obejmujcych pi tygodni, latach z 53. tygodniem, zmianie czasu z letniego na zimowy i innych tego rodzaju zagadnieniach. W przeciwnym razie algorytm bdzie obsugiwa jedynie wikszo przypadkw nie wszystkie.
Rozpocznijmy od omwienia czstego problemu wyznaczenia liczby dni dzielcych
dwie daty. Zwrmy uwag, e w kodzie z listingu 3.1.1 do utworzenia znacznikw czasu
wykorzystano funkcj strtotime(). Funkcja umoliwia pobranie wielu rnych postaci
tekstowej reprezentacji daty i przeksztacenie jej na znacznik czasu.
Uwaga
Poczwszy od wydania PHP w wersji 5.1, przed wywoaniem jakiejkolwiek funkcji operacji na datach trzeba wywoa funkcj date_default_timezone_set(),
ktra suy do okrelenia strefy czasowej, dla jakiej maj by wykonane obliczenia. W innym przypadku generowany jest bd trybu STRICT, poniewa interpreter prbuje odgadn stref czasow. Wicej informacji na temat stref
czasowych mona znale w podrozdziale 3.4, Obsuga stref czasowych w dalszej czci tego rozdziau. Jeli tworzony kod ma dziaa zarwno w rodowisku
PHP 5.0, jak i PHP 5.1, powstaje problem, poniewa w PHP 5.0 funkcja date_
default_Timezone_set() jest niedostpna. Z tego wzgldu mona uy funkcji
function_exists() i za jej pomoc sprawdzi, czy funkcja date_default_
Timezone_set() istnieje. Jeli tak, mona j wywoa. Alternatywnie mona
ustawi domyln stref czasow w pliku konfiguracyjnym na serwerze PHP 5.1.
W takiej sytuacji nie trzeba si martwi ustawieniami strefy czasowej.
Listing 3.1.1. Liczba dni midzy dwoma datami
<?php
// Ustawienie domylnej strefy czasowej na Europe/Warsaw.
date_default_timezone_set('Europe/Warsaw');
// Funkcja zwraca liczb dni midzy dwoma przekazanymi datami.
function count_days($a, $b) {
// Najpierw naley przeksztaci daty na czci skadowe:
$a_dt = getdate($a);
$b_dt = getdate($b);
67
Problem z pozoru wydaje si prosty: odjcie dwch liczb i podzielenie przez liczb sekund
przypadajc na dzie. To prawda i w ten sposb uzyskamy prawidowe wyniki, jeli interesuje nas cile matematyczna definicja dnia. Wemy jednak za przykad dwie daty: 11
listopada, godz. 23.00 i 12 listopada, godz. 1.00. Zgodnie z oglnie przyjt interpretacj
dat, rni je jeden dzie. Jednak jeli odejmiemy od siebie znaczniki czasowe odpowiadajce obu datom, okae si, e wymienione daty dziel tylko dwie godziny.
Rozwizanie polega na sprowadzeniu dat do wsplnej godziny na przykad poudnia. Teraz mona odj od siebie znaczniki czasu. Aby kolejno dat nie miaa znaczenia,
mona posuy si wartoci bezwzgldn. Aby otrzyma liczb dni, uzyskany wynik
naley podzieli przez liczb sekund przypadajc na dzie (86 400). Byoby to niemal
doskonae rozwizanie, gdyby nie to, e nie uwzgldnia zmiany czasu z letniego na zimowy bd odwrotnie. Jeli midzy datami, dla ktrych wykonujemy obliczenia, nastpia zmiana czasu, dokadny wynik moe si rni o jedn lub dwie godziny. Aby pozby si bdu spowodowanego zmian czasu, wystarczy zaokrgli wynik do najbliszej
liczby cakowitej.
Podobn strategi mona rwnie wykorzysta do obliczenia liczby tygodni, miesicy
i lat dzielcych dwie daty. Spotyka si jednak dwa rne punkty widzenia na te wiksze
jednostki czasu. Na przykad mwimy czasami, e co miao miejsce tydzie temu, majc
na myli siedem dni. W takim przypadku, by obliczy liczb tygodni midzy dwiema datami, wystarczy skorzysta z utworzonej przed chwil funkcji count_days() i podzieli
uzyskany wynik przez 7. Innym razem pod tym samym pojciem rozumie si zdarzenie,
ktre miao miejsce w ubiegym tygodniu. W takiej sytuacji naley skorzysta z podobnego
mechanizmu, jak w przypadku obliczania rnicy w liczbie dni, kiedy sprowadzilimy oba
dni do tej samej godziny. Mona sprowadzi daty do niedzieli danego tygodnia i wtedy
wykona obliczenia. Przykad podobnej operacji zamieszczono w podrozdziale 3.6 Wyznaczanie liczby dni roboczych, w dalszej czci tego rozdziau.
68
Czasami trzeba sprawdzi, jaki jest ostatni dzie okrelonego miesica. Do sprawdzenia
dnia mona wykorzysta tabel przegldow (cho w dalszym cigu trzeba uwzgldni lata przestpne dla lutego), ale czsto potrzebny jest znacznik czasu szukanego dnia. Na
szczcie dziki funkcji mktime() uzyskanie znacznika czasu nie jest trudne. Funkcja pobiera argumenty okrelajce kolejno godzin, minut, sekund, miesic, dzie i rok. Zalet funkcji mktime() jest automatyczna prawidowa obsuga argumentw ujemnych lub
zerowych.
Tak wic, jeli wprowadzimy argument dla miesica rwny 3 (marzec), a dla dnia
rwny 1, uzyskamy prawidowy znacznik czasu dla 1 marca. W przypadku wprowadzenia parametru dnia rwnego 0 otrzymamy znacznik czasu poprzedniego dnia, czyli ostatni dzie lutego. Na listingu 3.2.1 pokazano, jak mona wykorzysta funkcj mktime() do
obliczenia znacznikw czasu ostatniego dnia miesica.
Listing 3.2.1. Wyznaczanie znacznika czasu ostatniego dnia miesica
<?php
// Ustawienie domylnej strefy czasowej na Europe/Warsaw.
date_default_timezone_set('Europe/Warsaw');
// Funkcja zwraca znacznik czasu ostatniego dnia miesica podanego roku
function last_day($month, $year) {
// Wykorzystanie funkcji mktime do utworzenia znacznika czasu dla nastpnego miesica, ale o jeden dzien
// wczeniej.
// Ustawienie godziny na blisk pnocy, tak by
// uzyskany znacznik mona byo wykorzysta jako granic miesica.
return mktime(23, 59, 59, $month + 1, 0, $year);
}
// Wyznaczenie znacznika czasu dla ostatniego dnia lutego 2006 roku.
$stamp = last_day(2, 2006);
// Wywietlenie wynikw: 28
echo '<p>Ostatni dzie lutego 2006 roku przypada na: ', date('d', $stamp) ,'</p>';
?>
Czsto wykonywanym zadaniem, dla ktrego w PHP nie ma wbudowanej funkcji, jest
sprawdzenie, czy okrelony rok jest przestpny. Cho mona to wyliczy z prostego wzoru, wiele osb zapomina o niektrych jego elementach. Rok jest przestpny tylko wtedy,
jeli dzieli si przez 4, ale nie dzieli si przez 100, chyba e dzieli si przez 400. Funkcj
sprawdzajc, czy okrelony rok jest przestpny, zaimplementowano na listingu 3.3.1.
69
Obsuga stref czasowych moe sprawia wiele problemw. Na szczcie w PHP dostpne
s mechanizmy, ktre j uatwiaj. Wiele z nich wykorzystuje wasno rodowiska PHP
w wersji 5.1 polegajc na wykorzystaniu funkcji date_default_timezone_get() w celu
okrelenia strefy czasowej, dla ktrej s wykonywane obliczenia. W tym punkcie omwimy
kilka innych metod. Kada z nich doskonale nadaje si do wykonywania rnych zada.
We wszystkich tych przykadach zaoymy, e bieca strefa czasowa to Europe/Warsaw
(GMT+1:00), a strefa czasowa, dla ktrej wykonujemy obliczenia, to Asia/Tokyo (GMT+9:00).
Aby dowiedzie si, jaki jest odpowiednik okrelonego czasu w innej strefie czasowej,
mona skorzysta z kombinacji funkcji ustawiajcej domyln stref czasow i funkcji
mktime(), ktra umoliwia wygenerowanie czasu w innej strefie czasowej i wywietlenie
go w strefie domylnej (listing 3.4.1).
Listing 3.4.1. Obliczanie czasu w rnych strefach czasowych
<?php
// Sprawdzenie, ktra godzina jest w Warszawie w czasie, gdy w Tokio jest 8 rano.
// Ustawienie domylnej strefy czasowej na czas tokijski.
date_default_timezone_set('Asia/Tokyo');
// Wygenerowanie znacznika czasu w tej strefie czasowej dla 1 stycznia 2000 roku.
$stamp = mktime(8, 0, 0, 1, 1, 2000);
// Ustawienie domylnej strefy czasowej z powrotem na Europe/Warsaw.
date_default_timezone_set('Europe/Warsaw');
// Wywietlenie daty w formacie standardowym (RFC1123). Funkcja wywietli nastpujcy cig:
// Fri, 31 Dec 1999 18:00:00 EST
echo '<p>', date(DATE_RFC1123, $stamp) ,'</p>';
?>
70
71
Znaczniki czasu czsto zapisuje si w plikach. Ich format jest poza nasz kontrol, jednak
trzeba je odczyta w rodowisku PHP i zinterpretowa jako daty. Daty mona przetwarza za pomoc wyrae regularnych, jednak w wielu przypadkach format czasu powinien by zgodny z funkcj strtotime(). TakZdarza si tak bardzo czsto, poniewa funkcja
strtotime() obsuguje wiele formatw czasu. Na listingu 3.5.1 zamieszczono przykad je
uycia do przetwarzania daty odczytanej z pliku dziennika serwera Apache:
127.0.0.1 - - [02/Nov/2005:22:04:41 -0500] "GET / HTTP/1.1" 200 41228
Listing 3.5.1. Przetwarzanie wierszy z pliku dziennika serwera Apache za pomoc funkcji
strtotime()
<?php
// Ustawienie domylnej strefy czasowej na Europe/Warsaw.
date_default_timezone_set('Europe/Warsaw');
// Symulacja odczytu wiersza z pliku dziennika serwera Apache.
$logline =
'127.0.0.1 - - [02/Nov/2005:22:04:41 -0500] "GET / HTTP/1.1" 200 41228';
// Odczytanie fragmentu dotyczcego daty za pomoc wyraenia regularnego.
$matches = array();
preg_match('/\[(.*?)\]/', $logline, $matches);
// Pobranie daty i jej konwersja.
$timestamp = strtotime($matches[1]);
// Ponowne wywietlenie daty w celu potwierdzenia jej prawidowego odczytania:
echo date(DATE_RFC1123, $timestamp);
?>
Podobnym problemem, z jakim czsto spotykaj si programici, jest zapisywanie dat w bazach danych i odczytywanie ich z baz danych. Kada baza danych charakteryzuje si wasn
preferowan metod prezentacji dat.
Na szczcie wikszo formatw dat mona przetworzy za pomoc funkcji strtotime()
(w bazach danych wystpuj rwnie specyficzne komendy pozwalajce na zwracanie dat
w formatach wskazanych przez uytkownikw). Format dat rni si w zalenoci od baz
danych. W zwizku z tym szczegowych informacji dotyczcych formatu baz danych
naley szuka w dokumentacji okrelonej bazy danych.
Prawdziwy problem wystpuje podczas zapisywania dat ze rodowiska PHP do bazy
danych. W kadej bazie danych obowizuje specyficzny format dat. Naley jednak zwrci uwag, e niemal we wszystkich typach baz danych domylny format daty mona
zmieni na serwerze. Z tego wzgldu bezpieczniej korzysta z wasnych funkcji konwersji
cigw znakw na daty. W ten sposb zyskuje si pewno, e za kadym razem zapiszemy do bazy danych prawidow warto daty. Poniej wyszczeglniono kilka przykadw
instrukcji date() w PHP, ktre formatuj cigi znakw na domylny format dat w rnych typach baz danych:
72
Cho w podrozdziale 3.1 Obliczanie rnicy czasu midzy dwiema datami zaprezentowano sposb obliczania liczby dni midzy dwiema datami, skrypt ten na niewiele si zda
w wiecie biznesu, w ktrym wane s dni robocze w wikszoci miejsc na wiecie s to
dni od poniedziaku do pitku. Dni robocze czasami uwzgldniaj wita, a jeli ich nie
uwzgldniaj, szczegowe zasady s rne dla rnych firm. Z tego wzgldu skoncentrujemy si na podstawowej definicji.
Jednym ze sposobw obliczania liczby dni roboczych midzy dwiema datami jest
przetwarzanie w ptli wszystkich dni midzy datami i sprawdzanie, czy okrelony dzie
nie naley do weekendu. Metoda ta jest jednak nieefektywna. Istniej lepsze rozwizania,
na przykad to, ktre zaimplementowano w listingu 3.6.1. Wiemy, e tydzie roboczy ma
pi dni. W celu obliczenia liczby dni roboczych wystarczy obliczy liczb penych tygodni
midzy dwiema datami i pomnoy przez 5. Nastpnie naley doda liczb dni w pierwszym i ostatnim tygodniu.
Listing 3.6.1. Obliczanie liczby dni midzy dwiema datami
<?php
// Ustawienie domylnej strefy czasowej na Europe/Warsaw.
date_default_timezone_set('Europe/Warsaw');
// Funkcja zwracajca liczb dni roboczych midzy dwiema datami.
function count_business_days($a, $b) {
// Sortowanie dat. Trzeba si dowiedzie, ktra z dat przypada wczeniej.
if ($a < $b) {
$first = $a;
$second = $b;
} else {
$first = $b;
$second = $a;
}
// Rozoenie znacznikw czasu na skadowe.
$f = getdate($first);
$s = getdate($second);
// Obliczenie liczby pozostaych dni roboczych w pocztkowym tygodniu.
// W tym celu naley odj numer dnia w tygodniu od piciu.
$f_days = 5 - $f['wday'];
// W przypadku soboty lub niedzieli uzyskamy wynik -1 lub 5, ale wtedy przyjmujemy do oblicze warto 0.
if (($f_days == 5) || ($f_days < 0)) { $f_days = 0; }
// Wykonanie podobnej operacji dla kocowego tygodnia, z t rnic, e liczymy od
// pocztku tygodnia. Trzeba si tylko upewni, e sobota liczy si jako 5.
$s_days = ($s['wday'] > 5) ? 5 : $s['wday'];
// Obliczenia znacznika czasu dla poudnia w niedziel pocztkowego tygodnia.
73
Jak wida z powyszego listingu, najpierw wyznaczono liczb dni midzy niedzielami
przypadajcymi po dacie pocztkowej i przed dat kocow. Na tej podstawie obliczono
liczb penych tygodni midzy dwiema datami. Aby to zrobi, wystarczy podzieli liczb
sekund, jakie dziel obie niedziele, przez liczb sekund w tygodniu. Wynik naley zaokrgli do najbliszej liczby cakowitej. Zaokrglenie jest potrzebne, jeli midzy dat pocztkow a kocow wystpia zmiana czasu z zimowego na letni lub odwrotnie. Jei nie
przeprowadzono by operacji zaokrglania, wystpiby bd godziny lub dwch.
Na koniec naley doda dni robocze z pierwszego i ostatniego tygodnia i otrzymujemy
wynik. Wzr jest poprawny nawet wtedy, gdy oba dni nale do tego samego tygodnia.
Co prawda, najpierw s liczone dni pozostae do koca tygodnia i dni od pocztku tygodnia, co powoduje liczenie niektrych dni kilka razy. W zwizku z tym wynik zawsze jest
wikszy o 5 dni. Jednak z oblicze liczby penych tygodni uzyskuje si -1. W zwizku z tym
odejmujemy nadmiarowe 5 dni, uzyskujc poprawny wynik.
Do zaimplementowanego algorytmu mona wprowadzi modyfikacj polegajc na
uwzgldnieniu dni witecznych. Naleaoby za pomoc odpowiedniego algorytmu obliczy liczb dni witecznych midzy podanymi datami, a nastpnie odj j od kocowego
wyniku.
74
75
76
boty (0 do 6), nie byoby problemu. Poniewa jednak kalendarz mona rozpocz od dowolnego dnia tygodnia, funkcja musi okreli porzdek przetwarzania ptli. Na przykad,
jeli kalendarz ma si zacz od rody, dni tygodnia powinny by przetwarzane w nastpujcej kolejnoci: 3, 4, 5, 6, 0, 1, 2.
Aby to byo moliwe, funkcja tworzy w ptli tablic zawierajc te liczby, poczwszy
od wskazanego dnia pocztkowego. Ptla wykonuje si 7 razy. W kadej iteracji wykonywana
jest operacja licznika ptli modulo 7.
Do odczytania nazw miesicy i dni tygodnia wykorzystano wbudowane funkcje.
Dziki temu funkcja zawsze drukuje kalendarz we waciwej wersji jzykowej. Pozostaa
jeszcze ptla przetwarzajca tygodnie i wywietlajca kolejne dni.
Trzeba zadba o to, by pierwszy dzie wywietli na waciwej pozycji. Wczeniej wywietlamy puste komrki. Odpowiedni liczb pustych komrek trzeba take wywietli
w ostatnim wierszu.