Ć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;

Podobne dokumenty