Rozdział 4. • Zagadnienia trudniejsze 107
która powoduje wydanie dźwięku o zadanej częstotliwości i długości.
program cw4_18;
{ Program jest prostym zegarkiem, wyświetlającym }
{ aktualna godzinę, az do wciśnięcia klawisza przez }
uses
Crt,
Dos;
var
Godzina, Minuta, Sekunda, SlOO : Word;
OstatniaDzwonionaGodzina : Word;
function UzupO (N : Word) : String;
{ Funkcja zwraca łańcuch reprezentujący podana liczbę }
{ uzupełniony z przodu zerem, o ile liczba jest mniejsza }
{ od 10. }
var
StrPom : String; begin
Str (N ; 2, StrPom);
if StrPom[l] - ' ' then StrPom[l] 'O';
UzupO StrPom;
end; {------------------------------------------- UzupO -}
begin
ClrScr;
OstatniaDzwonionaGodzina 0;
repeat
GetTime (Godzina, Minuta, Sekunda, SlOO);
GotoXY (37, 12);
Write (UzupO(Godzina), , UzupO(Minuta), UzupO(Sekunda));
if ((Minuta-0) and (Godzina <> OstatniaDzwonionaGodzina)) then begin
OstatniaDzwonionaGodzina Godzina;
Sound (1000); Delay (200); NoSound; end;
Delay (200); until Keypressed; end.
W wypadku, kiedy godzina jest jednocyfrowa (a więc odczytana zmienna Godzina też), wypisanie jej po prostu na ekranie wyglądałoby nie najlepiej (nie wspomnę już o minutach i sekundach). Dlatego korzystamy z funkcji, która w takich przypadkach uzupełnia je zerem z przodu (oczywiście jej wynikiem jest już String).
Warto zauważyć, że aby uniknąć kilkukrotnego sygnalizowania nadejścia nowej godziny (zmienna Minuta będzie miała przez wiele przebiegów pętli w ciągu pierwszej minuty każdej godziny wartość 0), wykorzystujemy zmienną pamiętającą, czy zegar już ją wybijał
Próbuj zmieniać długość przerwy (parametru procedury Delay) i obserwować wyświetlanie czasu.
Ten sposób wyświetlania czasu ma jedną wadę — program jest całkowicie zaabsorbowany obliczaniem aktualnej godziny, a reszta programu (gdybyśmy ją dopisali) musiałaby zostać podporządkowana temu stylowi programowania. Użycie instrukcji Readln zablokowałoby