Podprogramy Turbo Pascala
Turbo Pascal - jedna z popularniejszych implementacji kompilatorów języka Pascal, zintegrowane środowisko programistyczne, produkt firmy Borland International dla procesorów Z-80 (system CP/M) oraz rodziny Intel 80x86 i nowszych.
Pascal jest językiem programowania nie narzucającym programiście żadnych wymagań co do formy zapisu instrukcji i deklaracji. Z punktu widzenia kompilatora programista może umieścić w jednej linii tyle instrukcji (deklaracji), ile tylko może pomieścić i może zacząć pisanie instrukcji od dowolnej kolumny (za wyjątkiem ciągu znaków stanowiących tekst).
Rys.1 Okno programowania w Turbo Pascalu
Podprogram – stanowi wydzieloną część programu, która posiada unikalną nazwę i stanowi logiczną całość realizującą określone zadanie. Jeśli zadanie ma być wykonane w pewnym miejscu programu, to podprogram jest wywoływany w tym miejscu z odpowiednimi parametrami.
Do podprogramu można przekazać argumenty wejściowe, które są wykorzystywane do realizacji pewnych działań. Wyniki działania podprogramu mogą być przekazane do programu głównego za pośrednictwem parametrów wyjściowych lub wejściowo / wyjściowych (dane wejściowe ulegające modyfikacji wewnątrz podprogramu).
W języku Turbo Pascal podprogramy mogą być zrealizowane za pomocą:
· procedur,
· funkcji,
· modułów.
W języku Pascal istnieje grupa podprogramów, które są dostępne jako:
· podprogramy standardowe,
· podprogramy wbudowane.
Podprogramy standardowe są zawarte w bibliotekach nazywanych modułami. Użycie każdego modułu należy w programie zapowiedzieć umieszczając za nagłówkiem programu dyrektywę: uses nazwa_modułu; np. uses crt. Po takiej deklaracji można korzystać ze wszystkich procedur i funkcji zawartych w module (np. clrscr).
Podprogramy wbudowane nie wymagają wcześniejszych zapowiedzi użycia. W całym programie można używać wszystkich procedur i funkcji w nich zdefiniowanych (np. procedury obsługi wejścia i wyjścia – read, write).
Definicja procedury i funkcji
Definicja procedury składa się z nazwy, po której mogą wystąpić ujęte w nawiasy okrągłe parametry formalne procedury. Za pomocą listy parametrów można przekazać do procedury dane wejściowe lub odebrać wyniki. Procedura może zwracać wiele wyników. Liczba argumentów procedury jest dowolna a ich typy mogą być różne. Instrukcja wywołania procedury może być bezparametrowa (np. clrscr) lub może posiadać zmienną liczbę parametrów o różnym typie (np. writeln(x, y, ’tekst’)). Procedurę wywołuje się podając jej nazwę uzupełnioną o parametry aktualne, zastępujące wszystkie parametry formalne.
Program wykorzystujący procedury.
Program P61;
uses crt;
Var a, b: integer;
Begin
clrscr; { procedura bezparametrowa }
write(’Podaj a = ’); { procedura z parametrem łańcuchowym }
readln(a); { procedura z parametrem, który jest modyfikowany }
write(’Podaj b = ’); { procedura z parametrem łańcuchowym }
readln(b); { procedura z parametrem, który jest modyfikowany }
writeln(’ Obliczanie iloczynu a * b = ’, a*b); { wiele parametrów }
readln; { procedura bezparametrowa }
End.
Definicja funkcji składa się z nazwy, po której mogą wystąpić ujęte w nawiasy okrągłe parametry formalne funkcji. Funkcja zwraca przez nazwę jeden z wyników obliczeń. Typ wyniku jest podawany po dwukropku, za listą parametrów funkcji. Za pomocą listy parametrów można przekazać do funkcji dane wejściowe lub odebrać wyniki. Funkcja może być wywoływana w wyrażeniach, z prawej strony instrukcji przypisania lub bezpośrednio w innych procedurach lub funkcjach. Funkcję wywołuje się podając jej nazwę uzupełnioną o parametry aktualne, zastępujące wszystkie parametry formalne. Funkcja może być bezparametrowa (np. z:= readkey).
Program wykorzystujący funkcje.
Program P62;
Var a, b, d: real;
d:= sqr(a) + sqr(b); { sqr funkcja podnoszenia do kwadratu }
d:= sqrt(d); { sqrt funkcja obliczania pierwiastka kwadratowego }
writeln(’Odległość (a,b) od (0,0) d = ’, d : 8 : 2);
readkey; { funkcja bezparametrowa }
Procedura
Definicja procedury składa się z nagłówka i bloku procedury. Blok procedury składa się podobnie jak każdy program z części deklaracyjnej i części wykonawczej.
W nagłówku procedury podawane są nazwy i typy parametrów formalnych przekazywanych do procedury. Podczas wywołania procedury wszystkie parametry formalne są zastępowane parametrami aktualnymi o takich samych typach.
Funkcja
Definicja funkcji składa się z nagłówka i bloku funkcji. Blok funkcji składa się z części deklaracyjnej i części wykonawczej, których zawartość jest taka sama jak w przypadku procedury. W nagłówku funkcji dodatkowo po liście parametrów formalnych podaje się po dwukropku typ wartości zwracanej przez funkcję (inne wyniki mogą być zwracane za pośrednictwem parametrów funkcji).
Podczas wywołania funkcji wszystkie parametry formalne są zastępowane parametrami aktualnymi o takich samych typach. Zmienne, stałe, procedury i funkcje lokalne są widoczne tylko wewnątrz funkcji.
Ostatnią instrukcją w części wykonawczej funkcji musi być instrukcja, która przypisuje nazwie funkcji wartość obliczoną wewnątrz funkcji. Podczas wywołania funkcji obliczona wartość jest jednym z wyników odbieranych z funkcji (np. y = sin(pi); y – przyjmuje wartość obliczoną wewnątrz funkcji dla parametru wejściowego pi).
Zalety stosowania podprogramów
Program, w którym występują podprogramy składa się z szeregu wywołań tych podprogramów, rozdzielonych instrukcjami przygotowującymi argumenty niezbędne do wywołania następnego podprogramu, lub instrukcjami, które wykorzystują wyniki otrzymane z wcześniej wywoływanych podprogramów.
Do najważniejszych zalet stosowania podprogramów należą:
· możliwość podziału programu na łatwiejsze do analizy fragmenty;
· skrócenie kodu źródłowego poprzez wielokrotne odwołania do
tego samego podprogramu;
· lepsze wykorzystanie pamięci dzięki możliwości deklarowania zmiennych lokalnych podprogramów, dla których pamięć jest rezerwowana tylko podczas działania podprogramów;
· możliwość projektowania i testowania odrębnych fragmentów programu;
· czytelność i łatwość modyfikacji programu;
· możliwość tworzenia bibliotek podprogramów i udostępniania ich innym użytkownikom.
W praktyce podprogramy realizują obliczenia częściowe i przekazują ich wyniki przez wartość zwracaną przez nazwę funkcji lub przez zmienne do programu głównego, w którym są one wykorzystywane przez kolejne procedury i funkcje.
Stosowanie podprogramów do realizacji krótkich obliczeń, które są często wywoływane, może prowadzić do wydłużenia czasu działania programu. Podczas testowania programu należy określić procedury i funkcje mające znaczący wpływ na czas jego realizacji. Skrócenie czasu działania tych podprogramów lub wstawienie ich treści bezpośrednio w kod programu może prowadzić do znacznego skrócenia czasu realizacji całego programu.
Moduły
Moduły służą przede wszystkim do grupowania typów, stałych, zmiennych, procedur i funkcji w biblioteki, a także do dzielenia dużych programów na powiązane logicznie części. Każdy moduł musi być przed użyciem skompilowany. Powstaje wówczas blok kodowy o rozszerzeniu nazwy:
· nazwa.TPU - tryb rzeczywisty;
· nazwa.TPP - tryb chroniony;
· nazwa.TPW - środowisko MS Windows.
Użycie modułu w programie wymaga jego deklaracji za pomocą derektywy uses. Nazwa modułu, oraz nazwa pliku, w którym jest on pamiętany, powinny być identyczne i unikatowe, gdyż są one jego identyfikatorem.
UNIT nazwa;
INTERFACE
deklaracje innych modułów
definicje stałych i typów
deklaracje zmiennych
lista nagłówków procedur i funkcji
IMPLEMENTATION
deklaracje modułów wzajemnie zależnych
definicje procedur i funkcji wymienionych w części "interface"
deklaracje etykiet, stałych, zmiennych, definicje typów,
procedur i funkcji wewnętrznych (tzn. dostępnych tylko
w module)
BEGIN
część inicjująca modułu (wykonywana tylko raz)
END.
Właściwy dobór w programie funkcji i procedur jest istotną częścią dobrze zaprojektowanego programu. Podprogramy w postaci funkcji bądź procedur powinny być dostępne w postaci czarnych skrzynek, tzn. opis ich funkcjonowania oraz opis parametrów wejściowych i wyjściowych powinien wystarczyć do poprawnego ich wykorzystania. Nie powinna zatem zachodzić konieczność zaglądania do wnętrza podprogramu i analizowania jego instrukcji w celu określenia co dany podprogram robi i czego wymaga dla swojego prawidłowego działania. Stąd mamy kolejną zasadę dobrego programowania:
Każda procedura (funkcja) powinna mieć do wykonania ściśle określone zadanie i to zadanie powinno być w zupełności opisane w procedurze (funkcji).
W celu ułatwienia korzystania z podprogramów przez innych użytkowników lub w innych programach należy unikać używania odwołań do zewnętrznych zmiennych, tj. takich zmiennych, które nie są ani lokalne w procedurze (funkcji), ani nie zostały przekazane do jej wnętrza poprzez jej parametry. Jeśli już trzeba to zrobić, to fakt ten powinien być wyraźnie zaznaczony w opisie podprogramu. Czasami może się zdarzyć, że poprawne funkcjonowanie podprogramu zależy od wartości pewnych zmiennych; mówimy wówczas, że ten podprogram zależy od tych zmiennych. W zasadzie należy dążyć do usuwania zależności tego typu np. poprzez dodanie do podprogramu odpowiednich instrukcji sprawdzających czy są spełnione warunki poprawnego jego funkcjonowania. W przypadku ich niespełnienia program nie powinien kończyć się błędem, lecz stosownym komunikatem objaśniającym powód niepoprawnego zakończenia się programu. W podprogramach należy unikać zewnętrznych odwołań i zależności.
6
akunseth