Ćw 3. Delphi – Podprogramy (procedury i funkcje) Procedury
Transkrypt
Ćw 3. Delphi – Podprogramy (procedury i funkcje) Procedury
Informatyka II – MPZI 2 Ćw 3. Delphi – Podprogramy (procedury i funkcje) Procedury Procedury (podprogramy) mogą wykonać sekwencję działań na wartościach wprowadzonych do jej "wnętrza" i wyprowadzać wiele obliczonych wartości. Definicja procedury umieszczana jest w części deklaracyjnej programu głównego. Procedura wymienia dane z instrukcją wykonania procedury jedynie przez parametry definiowane w nagłówku. Definicja procedury ma znaną nam strukturę blokową: procedure nazwa_procedury (parametry formalne); opcjonalne definicje, deklaracje begin instrukcje wykonawcze procedury end ; Parametry formalne służą do przekazywania danych pomiędzy sekcją, w której wykonywana jest procedura, a samą procedurą. Niektóre z nich przekazują dane wejściowe do procedury, inne mogą zwrócić wyliczone w podprogramie wartości do programu głównego (lub nadrzędnego podprogramu). Deklaracje parametrów formalnych są oddzielane średnikami, każda deklaracja składa się z listy zmiennych i nazwy typu. Typy deklaracji parametrów formalnych w nagłówku: lista_zmiennych:typ - przekazanie przez wartość var lista_zmiennych:typ - przekazanie przez zmienną Przekazanie przez wartość stosuje się w celu wprowadzenia danych wejściowych do podprogramu. Przekazanie przez zmienną ma przede wszystkim na celu zwrot wyników działania procedury do miejsca wywołania. Procedura może obliczyć i zwrócić wiele wyników. Przekazanie przez wartość traktowane jest jako nadanie wartości początkowej zmiennej lokalnej wewnątrz procedury, istniejącej tylko w trakcie wykonywania podprogramu, a usuwanych z pamięci w momencie jego zakończenia. Wykonanie procedury jest odrębną instrukcją. nazwa_procedury(parametry_aktualne); Liczba, typ i kolejność (!) parametrów aktualnych musi być zgodna z parametrami formalnymi w deklaracji procedury. W instrukcji wykonującej procedurę parametry aktualne oddzielamy przecinkami. Bardzo istotny jest fakt, iż: - parametry aktualne odpowiadające pozycji wywołania przez wartość mogą być stałymi, zmiennymi lub wyrażeniami, - parametry aktualne, odpowiadające przekazaniu przez zmienną, muszą być identyfikatorami (nazwami) zmiennych. Przykład użycia prostej procedury sumującej dwie liczby rzeczywiste: program p12; {$APPTYPE CONSOLE} uses SysUtils; var a, b, c : real ; {definicja procedury} procedure suma(liczba1,liczba2:real;var wynik:real); begin wynik := liczba1 + liczba2 ; end ; {koniec definicji procedury} //program główny begin a := 2 ; b := 2 ; {przykładowe wykonania procedury} suma (6.7, 2*a, c) ; {trzeci parametr aktualny musi być zmienną} writeln(c:10:2); {jest równe 6.7+2*2=10.7} suma (a, b, c) ; writeln(c:10:2); {c jest równe 2+2=4} suma (c, c, c) ; writeln(c:10:2); {c jest równe 4+4=8} suma (c, b, a) ; writeln(a:10:2); {a jest równe 8+2=10} readln; end. Zadania 1. Sprawdzić działanie powyższego przykładu. Wykonać program krokowo (F7) obserwując kolejne odwołania do definicji procedury, przekazywanie danych wejściowych do procedury i zwrot wartości do miejsca wywołania. 2. Zdefiniować procedurę obliczającą objętość i pole powierzchni prostopadłościanu. Do procedury przekazywać przez wartość wymiary odpowiednich boków, a przez zmienną wyprowadzać obliczane wartości. Wyświetlać wyniki w konsoli. Funkcje Definicja funkcji umieszczana jest w części deklaracyjnej programu głównego, jej struktura jest podobna do struktury programu głównego: function nazwa_funkcji (parametry formalne):typ_funkcji; //opcjonalne definicje, deklaracje lokalne begin .... nazwa_funkcji := wyrażenie ; // lub result := wyrażenie end ; Definicja funkcji W nagłówku definicji funkcji muszą się znaleźć identyfikatory parametrów(argumentów) formalnych, służących do przekazania danych do wnętrza funkcji z określeniem ich typów (elementy listy – parametry formalne - oddzielane są średnikami) oraz typ funkcji (prosty). Funkcja zapewnia w zasadzie zwrot pojedynczej wartości poprzez jej nazwę (obiekt określonego typu prostego), chociaż można również stosować przekazanie przez zmienną (jak w procedurze). W sekcji wykonawczej funkcji musi zatem znaleźć się instrukcja nadająca wartości funkcji (np. instrukcja przypisania dla nazwy funkcji lub dla zmiennej result). Przykładowe nagłówki definicji funkcji: function suma(x1,x2:real):real; function sprawdzaj(x1, x2:real;y1,y2:integer):boolean; Wywołanie (wykonanie) funkcji odbyć się może: • w wyrażeniu odpowiedniego typu (funkcje typów liczbowych w wyrażeniach arytmetycznych, funkcje logiczne w wyrażeniach logicznych), podobnie jak funkcje standardowe. • jako parametr innej funkcji lub procedury (w tym standardowej, np. writeln) z zachowaniem zgodności typu. Parametry wywołania (wykonania) funkcji, zwane parametrami aktualnymi lub argumentami, mogą być stałymi, zmiennymi lub wyrażeniami, oddzielane są przecinkami. Tak jak w procedurze liczba, typ i kolejność parametrów aktualnych musi być zgodna z parametrami formalnymi w deklaracji funkcji. Parametry aktualne (po ewentualnym obliczeniu wartości wyrażeń) przekazywane są do definicji funkcji (kopiowane na parametry formalne), następnie wykonywane są instrukcje funkcji i wartość obliczona zwracana jest do miejsca wywołania. Przykładowo, funkcje o nagłówkach zdefiniowanych powyżej mogą być wykonane: x:= suma(3,5.6); if sprawdzaj(x+2.9,-3.56,7,1) then ... Przykład 1: program f1; {$APPTYPE CONSOLE} uses SysUtils; //definicja funkcji function pole_tr (podst, wys: real): real ; {definicja funkcji} begin pole_tr := podst*wys/2; {nadanie wartości funkcji} //zamiast pole_tr można użyć result end ; {koniec definicji funkcji} //pomocnicze zmienne var a,b,c : real ; //program glowny begin write('Podaj podstawe:'); readln(a); write('Podaj wysokosc:'); readln(b); c := pole_tr (a, b); writeln(c:10:3); writeln(pole_tr(a,3):10:2); if pole_tr(a, b+4)< 10 then writeln('Pole jest mniejsze od 10') else writeln('Pole jest większe od 10'); readln; end. Wykonać program krokowo (F7) obserwując kolejne odwołania do definicji funkcji, przekazywanie danych wejściowych do funkcji i zwrot wartości do miejsca wywołania. Poniższy kod tabelaryzuje wartości funkcji opisanej przedziałami, w 21 punktach zakresu (0.0, 2.0): program f2; {$APPTYPE CONSOLE} uses SysUtils; var i : 0..20 ; function fun(x: real): real ; {definicja funkcji} var xkw : real ; begin xkw := x*x ; if x <= 0.5 then fun := 0.2*xkw-x+0.1 else fun := xkw/(xkw–0.1) end ; {koniec definicji funkcji} //program glowny begin writeln('Tabela wartości funkcji') ; writeln('x':15,'f(x)':10) ; for i := 0 to 20 do writeln(i:15, fun(i):10:5); readln; end. Wykonać program krokowo (F7) – zrozumieć działanie. Zadania 1. Napisać program zawierający definicję funkcji do obliczania objętości kuli według wzoru: 4 ܸ = ߨ ݎଷ 3 Program powinien wykorzystywać funkcję dla wyznaczenia objętości kilku kul o promieniach zmieniających się od wartości 1 do 2 z krokiem 0.1. 2. Zdefiniować funkcje obliczające wartości wyrażeń: y = 3x2 + x − 5 y = |2x − 5| Wykorzystać funkcje w programie, zakładając wybrane wartości parametrów aktualnych. 3. Wykonać aplikację w której zdefiniowana jest funkcja, której argumentem jest tablica 1wymiarowa zawierająca 10 liczb całkowitych. Zadania programu: • wypełnienie tablicy losowymi wartościami (dodatnie i ujemne) i przekazanie jej do funkcji, • funkcja oblicza i wyprowadza liczbę elementów dodatnich w tablicy, • program wyświetla wartość obliczoną przez funkcję. UWAGA: Wcześniej zdefiniować typ tablicowy (type tablica=array...itd.). W nagłówku funkcji użyć deklaracji parametru formalnego: var t:tablica;