![]() |
Turbo Pascal.
|
![]() |
Nic nie jest doskonałe...
...a zwłaszcza pierwszy w życiu program w Pascalu. Jeżeli próbowałeś zastanowić się nad pytaniem zamykającym poprzedni rozdział, najprawdopodobniej widzisz już możliwości ulepszenia swego dzieła. Na początek spróbujemy zająć się czytelnością programu, a następnie zastanowimy się, jak uczynić go bardziej praktycznym.
Co właściwie robi nasz program? "Oblicza pole koła" - odpowiesz. Skąd to wiadomo? "Tak było napisane w książce". A jeśli ktoś nie czytał książki? "Może się domyślić po przeczytaniu programu".
Ale po co ma czytać program? Co prawda zrozumienie jednej instrukcji to żaden problem, ale jeśli instrukcji będzie sto...? Znacznie lepiej byłoby umieścić w programie informację opisującą jego przeznaczenie i (ewentualnie) metodę realizacji zadania. Można to zrobić na kilka sposobów: umieszczając odpowiednie zapisy w programie oraz używając stosownej nazwy pliku. Zróbmy to od razu:
program Pole_kola; { Program oblicza pole koła o promieniu 5 }
begin write(Pi*5*5); (* oblicz i wypisz pole koła *) end. W porównaniu do poprzedniej wersji programu pojawiły się w nim trzy nowe elementy: nagłówek, komentarze oraz wcięcia.
Nagłówek (program Pole_kola) pełni wyłącznie funkcję informacyjną i nie ma wpływu na działanie programu, co nie zmienia faktu, że używanie go - chociaż nieobowiązkowe - należy do dobrej praktyki, ułatwia bowiem czytanie osobom trzecim. Składnia nagłówka to
program nazwa;
Zauważ przy okazji, że "Pole koła" to dwa oddzielne wyrazy: ponieważ nazwa jako identyfikator nie może zawierać znaku spacji, zastępuje się go podkreśleniem (_).
Znacznie ważniejsze dla czytelności programu są komentarze. Komentarzem w Pascalu jest dowolny ciąg znaków ujęty w nawiasy klamrowe { i }. Z oczywistych względów ciąg taki nie może zawierać nawiasów klamrowych, natomiast wszystkie inne znaki są dozwolone. Jeżeli koniecznie chcesz umieścić nawiasy klamrowe w komentarzu, musisz użyć jako ograniczniki dwuznakowych symboli (* i *) (co widać w drugim komentarzu). Podobnie jak w przypadku nagłówka, komentowanie programów nie jest obowiązkowe, należy jednak do dobrej praktyki programowania. Oczywiście, komentarze powinny być używane rozsądnie: nie ma sensu ich nadużywanie czy komentowanie rzeczy oczywistych, jak np. słowa begin. Warto jednak zdawać sobie sprawę, że komentarze nic nie kosztują (tj. nie mają wpływu na wielkość skompilowanego programu), a jednocześnie w znaczący sposób poprawiają czytelność programu.
Komentarze bywają również często stosowane do chwilowego wyłączenia fragmentu programu z kompilacji. Pozwala to uniknąć usuwania i powtórnego wpisywania tekstu: zamiast tego wystarczy ująć "niechciany" fragment programu w znaki komentarza, które potem można łatwo usunąć. Ostatnim "kosmetycznym" elementem naszego programu są wcięcia. Nasz program jest co prawda tak mały, że używanie wcięć jest nieco dyskusyjne, jednak w większych programach, którymi zajmiemy się już wkrótce, wcięcia pozwalają na szybkie zlokalizowanie fragmentów tworzących logiczną całość i znajdujących się na tym samym poziomie w strukturze programu. Wcinanie, podobnie jak inne reguły pisania ładnych i czytelnych programów, jest w dużej mierze kwestią stylu (zwykle pojedyncze wcięcie ma głębokość 1 ÷ 3 znaków), warto jednak przyjrzeć się sprawdzonym wzorcom (np. programom przykładowym firmy Borland), a następnie wypracować własny styl i stosować go konsekwentnie.
Tyle spraw "formalnych"; nie będziemy się nad nimi więcej rozwodzić, zostawiając resztę praktyce. Przejdziemy obecnie do znacznie bardziej interesującej części tego rozdziału: co zrobić, żeby nasz program stał się bardziej praktyczny?
Może inaczej: co program robi obecnie? Oblicza i wyświetla pole koła o promienu 5 cm. Ba, ale skąd wiadomo, że to pole koła, a nie np. średnia opadów z ubiegłego półrocza? Żeby się o tym przekonać, musisz zajrzeć do książki (gdzie jest to napisane wprost) lub do programu (nad którym musisz trochę pomyśleć, o ile nie wpisałeś jeszcze odpowiednich komentarzy). Na dodatek wyświetlana liczba ma cokolwiek niestrawny format i niezbyt chętnie nam się pokazuje...
Chwileczkę, nie wszystko naraz. Na początek spróbujmy sformułować listę życzeń, czyli zapisać w uporządkowany sposób to, co nam się w programie nie podoba i co chcielibyśmy zmienić. A zatem:
- program powinien informować użytkownika o tym, co robi;
- wynik działania programu nie powinien znikać, lecz zostawać na ekranie tak długo, jak życzy sobie użytkownik;
- wyświetlana liczba powinna ładniej wyglądać.
Pierwszy problem można rozwiązać wyprowadzając na ekran dodatkową informację w postaci tekstu. Służy do tego znana Ci już procedura write, która tym razem będzie wypisywała na ekranie nie wyrażenie liczbowe, lecz łańcuch (a ściślej rzecz biorąc, tzw. stałą łańcuchową), czyli ciąg znaków. Stałą łańcuchową jest w Pascalu dowolny ciąg znaków ujety w apostrofy (', nie "). Ciąg taki może zawierać dowolne znaki; znak apostrofu (normalnie kończący łańcuch) zapisuje się jako dwa apostrofy (tj. dwa oddzielne znaki ', a nie znak cudzysłowu "). Całość będzie wyglądała następująco:
write('Program oblicza pole kola o promieniu 5 cm.')
Spróbuj teraz przyjrzeć się opisowi procedury write z poprzedniego rozdziału i zastanowić się, jak powinna wyglądać instrukcja wypisująca na ekranie tekst
Pole kola = .....
(w miejscu kropek powinna znaleźć się obliczona przez nasz program liczba). Jeśli nie wiesz, jak to zrobić, rzuć okiem na tekst następnego programu. Zauważ przy okazji, że pojawiła się w nim drobna nowinka, mianowicie procedura writeln, różniąca się od write tylko tym, że po jej wykonaniu kursor przechodzi do nowego wiersza (i tam też wypisywane są kolejne informacje). Aby przekonać się o różnicy w działaniu obu procedur, zamień pierwszą instrukcję writeln na write i wykonaj program.
Sprawa druga, czyli zatrzymanie wyniku na ekranie monitora, również daje się prosto rozwiązać. Wystarczy mianowicie na końcu programu dopisać instrukcję
readln;
i gotowe. Co to takiego readln - to już inna sprawa: procedurą readln i pokrewną jej read zajmiemy się wkrótce, na razie zaś wystarczy Ci wiedzieć tyle, że readln odczytuje z klawiatury dowolny ciąg znaków zakończony znakiem nowego wiersza (kodem klawisza Enter), toteż jej wywołanie powoduje zatrzymanie działania programu do momentu naciśnięcia tegoż klawisza.
Pozostała sprawa ostatnia, tj. zrobienie porządku z mało czytelną reprezentacją wyprowadzanego pola. Na początek rozszyfrujmy zapis
7.8539816340E+01
Jest to nic innego, jak 7.8539816340
101, czyli około 78.5. Zapis x.xxxxEnn oznacza więc liczbę x.xxxx pomnożoną przez 10 do potęgi nn i zwany jest zapisem naukowym. Zauważ przy okazji, że część ułamkowa liczby oddzielona jest od części rzeczywistej nie przecinkiem, lecz kropką (bardzo ważne!). Wykładnik nn jest zawsze dobierany tak, by znajdująca się "przed nim" liczba miała tylko jedną cyfrę przed kropką, tj. zawierała się w przedziale od 1 do 10. Wielkość litery E symbolizującej wykładnik nie ma znaczenia, zaś znak + można pominąć. Oto kilka przykładów:
3.14E+00 =3.14 1.2345e4 =12345 2.78E-3 =0.00278 1,35E12 =błąd! (jaki?) Zapis naukowy pozwala na łatwe i jednolite reprezentowanie bardzo małych i bardzo dużych liczb, jest jednak niezbyt czytelny. Aby uczynić go bardziej strawnym, można użyć tzw. formatowania, polegającego na przekazaniu procedurze write (writeln) dodatkowych informacji opisujących sposób wyprowadzenia liczby. W przypadku liczb rzeczywistych informacje te określają całkowitą szerokość pola zawierającego liczbę oraz ilość pozycji po kropce dziesiętnej i mogą być symbolicznie zapisane jako
wartość:szerokość-pola:liczba-cyfr-po-kropce
Liczba zawierająca mniej cyfr niż określono w szerokości pola jest "dosuwana" do prawej strony i uzupełniana z lewej znakami spacji. Ustalając szerokość pola musisz również uwzględnić miejsce na kropkę dziesiętną i ewentualny znak liczby.
W ten sposób dotarliśmy do kolejnej wersji programu obliczającego pole koła:
program Pole_kola; { Program oblicza pole koła o promieniu 5 } begin writeln('Program oblicza pole kola'); write('Pole = '; Pi*5*5:8:3); (* oblicz i wypisz *) (* pole kola *) readln; end. Skoro już mówimy o formatowaniu, warto jeszcze wspomnieć, że dla liczb całkowitych, nie posiadających części ułamkowej, wystarczy określenie szerokości pola, czyli zapis
wartość:szerokość-pola
W identyczny sposób można również formatować np. łańcuchy, co jednak stosowane jest rzadko. Za przykład niech posłuży kolejny program:
program Formatowanie; { Demonstracja możliwości formatowania wydruków } begin writeln(1.234567:10:1); { za mało miejsca po kropce } writeln(1234567:3:0); { za mało miejsca w ogóle } writeln(1.23:10); { określamy tylko szerokość pola } writeln(123:10); { formatowanie liczby całkowitej } writeln('!':20) { formatowanie łańcucha } end. W ten sposób omówiliśmy podstawowe zabiegi kosmetyczne, którym możemy poddać nasz program. Prezentuje się on już nieco ładniej, jednak zmiany, których dokonaliśmy, mają charakter powierzchowny. Co bowiem zrobisz, żeby obliczyć pole koła o promieniu 3 cm? Poprawisz program i skompilujesz go jeszcze raz? Chyba jednak prościej wziąć kalkulator... a może nie...
Zapamiętaj
- Programy należy pisać czytelnie, gdyż ułatwia to ich zrozumienie i ewentualne wprowadzanie późniejszych zmian.
- Program można opisać nagłówkiem, zaczynającym się od słowa kluczowego program.
- Bardzo ważne dla czytelności programu są komentarze, zapisywane w nawiasach klamrowych, oraz odpowiednie wcinanie poszczególnych instrukcji.
- Aby wyprowadzać informacje w kolejno następujących po sobie wierszach, powinieneś użyć procedury writeln.
- Chcąc wstrzymać działanie programu, możesz użyć procedury readln.
- Aby uczynić wydruk bardziej czytelnym, zastosuj formatowanie wyjścia.
Poprzedni | Spis treści | Następny | Wersja spakowana |