Przeglądaj wersję html pliku:

wiczenie 16_17


cwicz_16_17

H M P R O G R A M O W A N I E

str. 39
W D E L P H I

ĆWICZENIE 16 – Definiowanie i stosowanie własnych funkcji
Potrafisz: ♦ tworzyć proste programy z wykorzystaniem funkcji konwersji (do obustronnej komunikacji programu z użytkownikiem), ♦ stosować w obliczeniach standardowe funkcje matematyczne. W Delphi jest wiele funkcji. Operują one na liczbach, tekstach, datach, plikach, itd. Niektóre funkcje już poznałeś, inne możesz poznać wywołując pomoc Delphi z menu. Wszystkie funkcje mają tą właściwość, że „zwracają wartość”. Typ tej wartości zależy oczywiście od rodzaju funkcji. Niekiedy zachodzi potrzeba zdefiniowania przez programistę własnej funkcji. Na przykład, jeśli w treści programu często trzeba wyliczać przekątną prostokąta, to zamiast ciągle stosować ciąg instrukcji odzwierciedlający stosowanie twierdzenia Pitagorasa:

wygodniej byłoby mieć funkcję, która wykonuje to obliczenie i w miarę potrzeby wywoływać ją, np. poprzez zapis

x:=a*a; // kwadrat boku a y:=b*b; // kwadrat boku b przek:=sqrt(x+y) // pierwiastek z sumy kwadratów

przek:=pitagor(a,b)
Funkcja pitagor() musi mieć jak widać dwa argumenty (tj. długości obydwu boków prostokąta), a zwraca jedną liczbę typu rzeczywistego. W tym przypadku ta liczba przypisana została do zmiennej przek. Aby zdefiniować własną funkcję trzeba po prostu napisać jej treść językiem programowania. Od miejsca ulokowania tej definicji zależy zakres stosowania funkcji (analogicznie jak przy deklaracji zmiennej). Jeśli definicja umieszczona jest: ♦ wewnątrz modułu, tj. w sekcji implementacji modułu za deklaracjami zmiennych - to można funkcję wywoływać w każdym miejscu modułu, ♦ wewnątrz procedury, to funkcję można stosować tylko w zakresie działania tej procedury. Sposób definiowania funkcji pokazany jest na powyższym przykładzie funkcji pitagor(). Typ argumentów Lista argumentów Nazwa funkcji Słowo kluczowe Typ wyniku

Function pitagor(bok1,bok2: real): real; var x,y: real; Deklaracje zmiennych pomocniczych begin x:=bok1*bok1; // kwadrat boku pierwszego y:=bok2*bok2; // kwadrat boku drugiego pitagor:=sqrt(x+y) // pierwiastek z sumy kwadratów end; Wartość zwracana do programu
39

cwicz_16_17

H M P R O G R A M O W A N I E

str. 40
W D E L P H I

Zwróć uwagę na to, że ostatnia (najczęściej) instrukcja w części wykonawczej (tj. przed słowem end) powinna prowadzić do wyniku funkcji, czyli do wartości zwracanej programowi. Należy przy tym użyć nazwy funkcji po lewej stronie instrukcji przypisania . Z A D A N I E . Utwórz program, który oblicza wartość wyrażenia 3.5 5.7

y=

sin( x ) + (sin x)
5

+ (sin x)

x + x 3.7 + x 5.2

stosując własną funkcję obliczania dowolnej potęgi. Zalecenia ♦ Przy definiowaniu własnej funkcji możesz posłużyć się algorytmem z ćwiczenia 14. ♦ Funkcję zdefiniuj w sekcji implementacji modułu.

ĆWICZENIE 17 – Zastosowanie własnych procedur - przekazywanie danych
przez zmienne globalne. Aby przystąpić do tego zadania musisz doprowadzić do końca (z pełnym zrozumieniem) wszystkie ćwiczenia poprzednie. Zauważ, że w tak banalnych zadaniach liczba linii programu zapisanych Twoimi instrukcjami jest niewielka. Czy w każdej chwili jesteś w stanie powiedzieć, jakie znaczenie ma każda instrukcja programu ? A gdybyś zajrzał do programu kolegi, to także było by tak łatwo odgadnąć przeznaczenie instrukcji ? Aby łatwiej można było czytać (i pisać) duże programy, a także stosować pewne ich sekwencje w wielu miejscach, należy te sekwencje grupować w procedury. Procedura rozwiązuje pewien fragment zadania (czasem wielki, czasem mały). Z pojęciem procedury spotykaliśmy się już od samego początku nauki programowania w Delphi. Nawet wypełnialiśmy je instrukcjami. Tak było dotąd przy oprogramowywaniu reakcji komputera na różne zdarzenia (zwykle kliknięcia na ekranowe przyciski typu TButton). Pamiętasz, że aby zmienna mogła być w programie (lub procedurze) użyta, musi zostać najpierw zadeklarowana. Od miejsca ulokowania tej deklaracji zależy zakres stosowania zmiennej (analogicznie jak przy deklaracji funkcji). Podobnie jest z procedurą. Aby program mógł z procedury skorzystać musi ona być wcześniej zdefiniowana. Jeśli definicja umieszczona jest: ♦ wewnątrz modułu, tj. w sekcji implementacji modułu za deklaracjami zmiennych i przed wszystkimi procedurami obsługi zdarzeń - to można procedurę wywoływać w każdym miejscu modułu, ♦ wewnątrz innej procedury (tj. procedury nadrzędnej), to zdefiniowaną procedurę można stosować tylko w zakresie działania tej procedury nadrzędnej. Struktura najprostszej definicji procedury jest następująca:

Procedure Nazwa_procedury; var lista deklaracji zmiennych pomocniczych; begin ciąg instrukcji end;
Zastosowanie procedury w konkretnym miejscu programu jest bardzo proste i polega na napisaniu jej nazwy w części wykonawczej modułu (lub 40

cwicz_16_17

H M P R O G R A M O W A N I E

str. 41
W D E L P H I

innej procedury), a więc między słowami begin end. Przykład wywołania procedury wyżej zdefiniowanej

begin ... Nazwa_procedury; ... end;
Schemat blokowy rozwiązania zadania z ćw. 15 z zasygnalizowaniem pogrupowania niektórych instrukcji w 3 procedury pokazuje rysunek. Wczyt_danych Wczytanie danych: a, b, c Pokazanie pełnej postaci równania

Obliczenie ∆

Czy ∆≥0 ??? tak Czy ∆>0 ??? tak Obl_x1_x2 Obliczenie pierwiastka kwadratowego z ∆ Obliczenie pierwiastków x1 x2 Wyprowadzenie wyników z pierwiastkami x1 x2

nie

Wyprowadzenie komunikatu o braku rozwiązania

nie

Obl_x12 Obliczenie pierwiastka podwójnego x1,2 Wyprowadzenie wyniku z pierwiastkiem podwójnym x1,2

41

cwicz_16_17

H M P R O G R A M O W A N I E

str. 42
W D E L P H I

Procedury mogą zawierać w sobie zarówno definicje procedur podrzędnych, jak i wywołania innych procedur wcześniej zdefiniowanych w procedurach „nadrzędnych”. Z A D A N I E . Opracuj program do obliczeń pierwiastków równania kwadratowego (analogicznie jak w ćwiczeniu 15) z wykorzystaniem procedur, które zawierają sekwencje działań odpowiednio do powyższego schematu. Zalecenia ♦ Możesz dokonać przeróbki programu z ćwiczenia 15. ♦ Zmienne zadeklaruj w sekcji implementacji modułu poniżej słowa implementation. Będą wprost dostępne dla każdej procedury. ♦ Zdefiniuj procedury także w sekcji implementacji modułu, a przed definicjami procedur obsługi zdarzeń. Okazuje się, że w takim przypadku dostęp do obiektów osadzonych w oknie Form1 możesz uzyskać, gdy przed nazwą obiektu (np. Edit1) wprowadzisz jeszcze nazwę tego formularza, w którym jest on osadzony (czyli musi być Form1.Edit1).

... implementation var a, b, c: real; ...;

zmienne o zakresie modułu

procedure Obl_x1_x2; var ...; begin ... end; ... {$R *.DFM} //--- dyrektywa kompilatora ...


Główną procedurę liczącą (czyli procedurę obsługującą zdarzenie kliknięcia na przycisk OBLICZ) napisz z wykorzystaniem zdefiniowanych procedur.

42

cwicz_16_17

H M P R O G R A M O W A N I E

str. 43
W D E L P H I

♦ Stosowanie własnych funkcji ♦ Stosowanie własnych procedur

Zadania do samodzielnego wykonania

Zadanie 1. Stosując własne definicje funkcji (do obliczania pola powierzchni
koła i obwodu okręgu) opracuj program, który obliczy pole i długość konturu powierzchni zaciemnionej. Jest tylko jedna dana do tego programu. d/3 d/4 d

Zadanie 2. Opracuj program, który oblicza ciężar i pole całkowitej powierzchni
bryły, która pozostanie z sześcianu, gdy wytnie się z niego ostrosłup o podstawie takiej jak ściana sześcianu i wysokości równej bokowi sześcianu oraz odetnie róg płaszczyzną dzielącą 3 sąsiadujące krawędzie sześcianu na połowę. Rozbij ciąg obliczeń na etapy i odpowiednio do nich zastosuj w treści programu procedury. Bok sześcianu i ciężar właściwy, to dane wprowadzane przez użytkownika.

Zadanie 3. Opracuj program, który oblicza wartość wyrażenia dla x>0.

x sin 2 ( x) + x 2 sin 2 ( x 2 ) + 1 z= 2 x sin 2 (2 x) + 2
Zauważ, że wielokrotnie zastosowane jest wyrażenie o postaci

a sin 2 ( a )
Utwórz więc odpowiednią funkcję, która uprości treść programu.
43

 
statystyka