Podprogramy Procedury

Transkrypt

Podprogramy Procedury
Podprogramy
Turbo Pascal oferuje metody ułatwiające tworzenie struktury programu, szczególnie dotyczy to większych programów. Przy
tworzeniu większego programu stosuje się jego podział na kilka mniejszych programów zwanych podprogramami. Komunikacja
pomiędzy podprogramami a pozostałą częścią programu odbywa się w ściśle określony sposób.
Do tego celu wykorzystywane są zmienne bądź stałe globalne, zadeklarowane w programie głównym lub parametry, w
definicji podprogramu nazywane parametrami formalnymi, a przy wywoływaniu podprogramu parametrami aktualnymi.
Wybór sposobu przekazywania danych procedurze zależy od konkretnej sytuacji. Bardzo często stosowane są jednocześnie
obie metody.
Podprogram może być wielokrotnie wywoływany z głównej części programu lub z innych podprogramów. Podprogramy mogą
zarówno wczytywać dane, jak i wyprowadzać wyniki. W treści programu muszą być one umieszczone przed częścią główną
programu. Musi zostać zachowana określona kolejność deklaracyjna.
W Turbo Pascalu występują dwa rodzaje podprogramów: procedury i funkcje.
Procedury
Ogólna postać procedury jest następująca:
Procedure nazwa (lista parametrów formalnych);
.............
............. (* deklaracja stałych, zmiennych i typów *)
BEGIN
............. (* treść procedury *)
END;
Po nazwie procedury lista parametrów formalnych może wystąpić lub nie.
Wywołanie procedury polega na podaniu nazwy procedury wraz z listą parametrów aktualnych (o ile takie istnieją).
Dla lepszego zrozumienia istoty procedury wykonamy najpierw następne ćwiczenie.
Ćwiczenie 56
Napisać program obliczający sześcian dowolnej liczby naturalnej. Program ma tytuł „Szescian_n_1". Zapisać program na dysku w
pliku o nazwie nszesc_1.pas.
Dla przejrzystości programu świadomie zrezygnowano z wielokrotnego powtarzania sekwencji, które uzasadniałyby od razu
potrzebę zastosowania procedur.
Cały program został przedstawiony poniżej:
PROGRAM Sześcian_n_1;
USES
Crt;
VAR
n, wynik : LONGINT;
Tak Nie : CHAR;
BEGIN
REPEAT
CIrScr;
Writeln (' Obliczenie sześcianu liczby naturalnej n ');
Writeln;
Write (' Podaj liczbę naturalna n, n= ');
Readln (n);
wynik:=n*n*n;
Writeln;
Write (' Dla n = ',n, ' wynik = ',wynik:10);
Writeln;
Writeln ('JeszcAaz ?(T)ak');
TakNie: =UpCase(ReadKey)
UNTIL NOT (Tak_Nie='T')
END.
Program ,,Sześcian_n_1 zawierał tylko jeden blok strukturalny. Był to blok programu głównego. Blok ten nazywamy
blokiem zewnętrznym.
Zmienne zadeklarowane w bloku programu głównego (blok zewnętrzny) noszą nazwę zmiennych globalnych.
W programie głównym mogą wystąpić odpowiednio zdefiniowane bloki (np. procedury, funkcje), które są blokami
wewnętrznymi. Podobnie w przypadku dwóch bloków, z których jeden zawiera drugi, mamy do czynienia z blokiem zewnętrznym
i blokiem wewnętrznym.
Zmienne zadeklarowane w danym bloku strukturalnym zachowują swoją ważność nie tylko w nim (lokalnie), ale również we
wszystkich blokach wewnętrznych (globalnie).
W następnym ćwiczeniu blok instrukcji związany z obliczeniem sześcianu dowolnej liczby naturalnej zostanie przedstawiony
w postaci procedury (podprogramu) wykorzystującej zmienne globalne do przekazania parametrów.
Ćwiczenie 57
Napisać program zawierający procedurę obliczania sześcianu dowolnej liczby naturalnej. Procedura ma wykorzystywać zmienne
globalne. Program ma tytuł „Procedura_szescian_1". Zapisać program na dysku w pliku o nazwie proced_1.pas.
Program zawiera dwa bloki strukturalne: program główny (blok zewnętrzny) oraz procedurę (blok wewnętrzny).
Po słowie kluczowym PROCEDURE i po nazwie procedury (Sześcian) nie występuje lista parametrów formalnych. Zmienna n oraz
wynik (zadeklarowane w programie głównym) są zmiennymi globalnymi dla procedury Sześcian, czyli dostępne dla tej
procedury. Mamy tutaj do czynienia z przekazywaniem danych przez zmienne globalne.
Cały program został przedstawiony poniżej:
PROGRAM Procedura_szescian_1;
USES
Crt;
VAR
n, wynik : LONGINT; (* deklaracja zmiennych globalnych*)
Tak Nie : CHAR;
(*****************************************************)
PROCEDURE Sześcian;
BEGIN
Writeln;
Writeln (' Obliczenie sześcianu liczby naturalnej n ');
Writeln;
Write ('Podaj liczbę naturalna n, n = ');
Readln (n);
wynik:=n*n*n;
Writeln;
Write (' Dla n = ',n,' wynik = ',wynik);
Writeln;
END;
BEGIN
(* program główny *)
REPEAT ClrScr;
Sześcian;
(* wywołanie procedury *)
Writeln ('Jeszcze raz ?(T)ak');
Tak_Nie:=UpCase(ReadKey)
UNTIL NOT (Tak Nie='T')
END.
W poprzednim programie wykorzystaliśmy w procedurze zmienne globalne zadeklarowane w bloku programu głównego.
Podobnie jak program, procedura może posiadać swoje własne struktury (zmienne, stałe, typy, procedury, funkcje). Deklaruje się je
tak jak w programie.
Zasięg nazw deklarowanych w obrębie danych procedur rozciąga się tylko na obszary procedur, w których zostały
zadeklarowane. Zmienne zadeklarowane w procedurze (blok wewnętrzny) noszą nazwę zmiennych lokalnych.
W następnym ćwiczeniu przedstawiono program zawierający procedurę z własnym blokiem deklaracyjnym (zmienne lokalne).
Ćwiczenie 58
Napisać program zawierający procedurę obliczania sześcianu dowolnej liczby naturalnej. Procedura ma zawierać blok
deklaracyjny (własną strukturą). Program ma tytuł „Procedura_szescian_2". Zapisać program na dysku w pliku o nazwie
prod_2.pas.
Program zawiera dwa bloki strukturalne: program główny (blok zewnętrzny) oraz procedurę (blok wewnętrzny).
Po słowie kluczowym PROCEDURE i po nazwie procedury (Sześcian) nie występuje lista parametrów formalnych. Zmienna n oraz
wynik, zadeklarowane w procedurze, są zmiennymi lokalnymi dla procedury Sześcian, czyli dostępne tylko dla tej procedury.
Mamy tutaj do czynienia z przekazywaniem danych przez zmienne lokalne.
Cały program został przedstawiony poniżej :
PROGRAM Procedura_szescian_ 2;
USES
Crt;
VAR
Tak_Nie:CHAR;
(****************************)
PROCEDURE Sześcian;
VAR
n, wynik : LONGINT;
(* Zmienne lokalne *)
BEGIN Writeln;
Writeln (' Obliczenie sześcianu liczby naturalnej n ');
Writeln;
Write (' Podaj liczbę naturalna n, n = ');
Readln (n);
wynik:=n*n*n;
Writeln;
Write (' Dla n = ',n,' wynik = ',wynik);
Writeln;
END;
(*************)
BEGIN
REPEAT
ClrScr;
Sześcian;
Writeln ('Jeszcze raz ?(T)ak');
Tak_Nie:=UpCase(ReadKey)
UNTIL NOT (Tak Nie='T')
END.
Korzystanie ze zmiennych (stałych itp.) globalnych ogranicza w znacznej mierze rozbudowę poszczególnych części programu
(konieczność analizy obcej procedury ze względu np. na typ użytych tam zmiennych globalnych).
Bardziej uniwersalnym i częściej stosowanym rozwiązaniem jest koncepcja bezpośredniego przekazywania danych
procedurom, tj. z wykorzystaniem parametrów formalnych. Parametry te mogą być przekazywane przez wartość lub zmienne.
Parametry przekazywane przez wartość służą jedynie do wprowadzania wartości danych do wnętrza procedury.
Parametry te są dostępne tylko dla danej procedury i jej wszystkich ewentualnych bloków wewnętrznych, lecz nie są dostępne
dla bloku zewnętrznego, a więc nie można za ich pomocą wyprowadzać wyników z procedury.
W następnym ćwiczeniu zajmiemy się programem zawierającym procedurę wykorzystującą parametry formalne przekazywane
przez wartość do komunikacji pomiędzy podprogramem a pozostałą częścią programu.
Ćwiczenie 59
Napisać program zawierający procedurę obliczającą sześcian dowolnej liczby naturalnej. Procedura zawiera deklaracje
odpowiednich parametrów formalnych przekazywanych przez wartość. Program ma tytuł „Procedura_szescian_3". Zapisać
program na dysku w pliku o nazwie proced_3.pas.
W programie zastosujemy procedurę zawierającą deklaracje odpowiednich parametrów formalnych przekazywanych przez
wartość. Po słowie kluczowym PROCEDURE i po nazwie procedury (Sześcian) zadeklarowany został parametr a. Jest to
parametr formalny przekazywany przez wartość.
Wywołując procedurę należy podać dokładnie tyle parametrów, ile zadeklarowano.
Przy wywołaniu procedury wartość aktualnego parametru n zostaje przekazana procedurze Sześcian:
Szescian(n);
Formalny parametr a służy tu tylko do rezerwacji miejsca przeznaczonego do wpisania wartości przesyłanej przez parametr
aktualny.
Wyniki przeprowadzanych w procedurze operacji na parametrach przekazywanych przez wartość są dostępne tylko dla danej
procedury i jej wszystkich ewentualnych bloków wewnętrznych, lecz nie są dostępne dla bloku zewnętrznego.
Uwaga:
Parametry formalne użyte w danej procedurze mogą być definiowane w dowolnej kolejności. Przy wywoływaniu takiej procedury w
programie należy uważać, by przekazywane jej wartości parametrów aktualnych odpowiadały kolejności deklaracyjnej
parametrów formalnych.
Cały program został przedstawiony poniżej:
PROGRAM Procedura_szescian_3;
USES
Crt;
VAR
n, wynik : LONGIN;
Tak Nie : CHAR;
(**************************)
PROCEDURE Szescia( a:LONGINT);
(* przekazywanie parametrów do procedury przez wartość *)
BEGIN
Writeln;
wynik:=a*a*a;
Write (' Dla n = ',a,' wynik = ',wynik);
Writeln;
END;
(**********************************)
BEGIN
REPEAT
(* program glowny *)
ClrScr;
Writeln (' Obliczanie sześcianu liczby naturalnej n ');
Writeln;
Write (' Podaj liczbę naturalna n = ');
Readln (n);
Szescian(n);
Writeln (' Jeszcze raz ?(T)ak');
Tak Nie:=UpCase(ReadKey)
UNTIL NOT (Tak_Nie='T')
END.
W następnym ćwiczeniu zajmiemy się procedurą wykorzystującą parametry formalne przekazywane przez zmienną. Ten
sposób przekazywania parametrów umożliwia przesyłanie przez procedurę do programu wywołującego więcej niż jedną wartość.
Parametry przekazywane przez zmienne mogą służyć do wprowadzania wartości danych do wnętrza procedury, ale główne ich
zadanie polega na przekazywaniu wyników działania procedury na zewnątrz.
Ćwiczenie 60
Napisać program zawierający procedurę obliczającą sześcian dowolnej liczby naturalnej. Procedura zawiera deklaracje
odpowiednich parametrów formalnych przekazywanych przez zmienne. Program ma tytuł „Procedura_szescian_4". Zapisać
program na dysku w pliku o nazwie proced_4.pas.
Po słowie kluczowym PROCEDURE i po nazwie procedury (Sześcian) zadeklarowane zostały zmienne: a i iloczyn:
PROCEDURE Sześcian ( a:LONGINT; VAR iloczyn :LONGINT);
Parametr formalny a występujący w procedurze służy jedynie do przekazania wartości aktualnego parametru n do procedury. Jest to
przekazywane parametru przez wartość.
Parametr iloczyn, występujący w procedurze, został poprzedzony w nagłówku słowem kluczowym VAR.
Oznacza to, że jest on parametrem przekazywanym przez zmienną i służy do wyprowadzenia wyniku obliczeń do bloku
zewnętrznego programu głównego). W tym przypadku parametry aktualne muszą być nazwami zmiennych odpowiedniego typu.
Cały program został przedstawiony poniżej;
PROGRAM Procedura_szescian_4;
USES
Crt;
VAR
n, wynik : LONGINT;
Tak Nie : CHAR;
(********************************)
PROCEDURE Sześcian (a:LONGINT; VAR iloczyn:LONGINT);
BEGIN
(* przekazywanie parametrów przez zmienne*)
Writeln;
iloczyn:=a*a*a;
Write (' Dla n = ',a,'
Writeln;
END;
wynik = ',iloczyn);
(*****************************)
BEGIN
REPEAT
ClrScr;
Writeln;
Writeln (' Obliczenie sześcianu liczby naturalnej n ');
Writeln;
Write (' Podaj liczbę naturalna n = ');
Readln (n);
Szescian(n,wynik);
Writeln ('Jeszcze raz ?(T)ak');
Tak_Nie:=UpCase(ReadKey)
UNTIL NOT (Tak Nie='T')
END.
Ćwiczenie 61
Uruchomić program Turbo Pascal. Napisać program zawierający procedurę rozwiązania układu trzech równań liniowych z trzema
niewiadomymi x, y, z:
ax + by + cz = m,
dx + ey + fz = n,
gx + ky + lz = p.
Procedura wykorzystuje zmienne globalne. Program ma tytuł „ Układ_liniowy". Zapisać program na dysku w pliku o nazwie
uklad_1.pas. Wykonać obliczenia dla następujących danych: a-1, b=1, c=1, m=4, d=3, e= -1, f=6, n=14, g=4, k=5, l=-7, p=-5.
Ćwiczenie 62
Napisać program zawierający procedurę obliczającą sumę składników następującego szeregu:
1+22+333+4444+55555+...
Procedura zawiera deklaracje odpowiednich parametrów formalnych przekazywanych przez wartość i zmienne. Program ma tytuł
„Szereg_1". Zapisać program na dysku w pliku o nazwie szereg_1.pas. Wykonać obliczenia sumy dla 7 składników tego szeregu.
Ćwiczenie 63
Napisać program zawierający procedurę obliczającą pierwiastki równania kwadratowego ax2 +bx + c = 0. Procedura zawiera
deklaracje odpowiednich parametrów formalnych przekazywanych przez wartość i zmienne. Program ma tytuł
„Równanie_kwadratowe". Zapisać program na dysku w pliku o nazwie rkwad_1.pas.
Uwaga:
W programie przyjąć za wartość zerową (do sprawdzenia delty) liczbę bardzo małą np. 1e-6.
Ćwiczenie 64
Napisać program zawierający procedurę obliczania ułamka zwykłego, którego rozwinięcie dziesiętne jest ułamkiem w postaci
0,(abc) (np. 0,(123)). Program ma tytuł „Ulamek_zwykly". Zapisać program na dysku w pliku o nazwie uzwyk_1.pas.
•
Ćwiczenie 65
Napisać program zawierający procedurę uzyskiwania „lustrzanego odbicia" danej liczby naturalnej. Program ma tytuł
„Odbicie_lustrzane". Zapisać program na dysku w pliku o nazwie lustro_1.pas. Wykonać obliczenia dla 31245.
Uwaga:
Patrz ćwiczenie 53 (plik scdn_1.pas).
Ćwiczenie 66
Napisać program zawierający procedurę wyznaczania największego wspólnego podzielnika dowolnej liczby liczb naturalnych
(NWD). Program ma tytuł „Procedura_NWD_1". Zapisać program na dysku w pliku o nazwie pnwd_1.pas.
Uwaga:
Patrz ćwiczenie 51 (plik nwd_1.pas).
Ćwiczenie 67
Napisać program zawierający procedurę wyznaczania najmniejszej wspólnej wielokrotności dowolnej liczby liczb naturalnych
(NWW). Program ma tytuł „Procedura_NWW_1". Zapisać program na dysku w pliku o nazwie pnww_1.pas.
Uwaga:
Patrz ćwiczenie 52 (plik nww_1.pas).
Funkcje
Ogólna postać funkcji jest następująca:
Function nazwa_funkcji (lista parametrów formalnych ): typ wyniku;
………..
............ (* deklaracja stałych, zmiennych i typów *)
………..
BEGIN
............ (* treść funkcji *)
END;
Po słowie kluczowym Function i po nazwie funkcji występuje lista parametrów formalnych zawierająca nazwy
parametrów i nazwy ich typów.
W treści funkcji musi być umieszczone przypisanie:
nazwa_funkcji := wynik;
Przypisanie to nadaje nazwie_funkcji zmienną lub stałą określającą przekazywaną wartość. W odróżnieniu od procedury w
nagłówku funkcji musi wystąpić typ wyniku.
Wywołanie funkcji polega na przypisaniu pewnej zmiennej nazwy funkcji wraz z listą parametrów aktualnych:
zmienna : = nazwa_funkcji (lista parametrów formalnych);
lub też umieszczeniu nazwy funkcji w określonym wyrażeniu.
Umożliwia to przekazanie wartości funkcji w miejsce wywołania tej funkcji.
Z powyższego zapisu wynika, że funkcja pełni rolę zmiennej.
W gruncie rzeczy procedury i funkcje są bardzo do siebie podobne. Jedne i drugie posługiwać się mogą parametrami
formalnymi. Jednak w przeciwieństwie do procedur, funkcje mają zawsze określony rezultat o typie określonym przez typ
wyniku funkcji.
W następnym ćwiczeniu blok instrukcji, związany z obliczeniem sześcianu dowolnej liczby naturalnej, zostanie przedstawiony
w postaci funkcji (podprogramu) wykorzystującej zmienne globalne do przekazywania parametrów. Jak pamiętamy, zmienne
zadeklarowane w bloku programu głównego (blok zewnętrzny) noszą właśnie nazwę zmiennych globalnych.
Ćwiczenie 68
Napisać program zawierający funkcję wyznaczania mniejszej liczby z dwóch podanych liczb. Funkcja wykorzystuje zmienne
globalne. Program ma tytuł „Funkcja_mniejsza". Zapisać program na dysku w pliku o nazwie f_min_1.pas.
Program zawiera dwa bloki strukturalne: program główny (blok zewnętrzny) oraz funkcję (blok wewnętrzny).
Po słowie kluczowym FUNCTION i po nazwie funkcji (Mniejsza) nie występuje lista parametrów formalnych, lecz jedynie typ
wyniku:
Mniejsza :LONGINT;
Brak parametrów formalnych wynika z faktu korzystania ze zmiennych globalnych przez funkcję. Zmienne a, b, min, mniej
(zadeklarowane w programie głównym) są zmiennymi globalnymi dla funkcji Mniejsza, czyli są dostępne dla tej funkcji. Mamy
tutaj do czynienia z przekazywaniem danych przez zmienne globalne.
Istotnym elementem, jak pamiętamy, w treści każdej funkcji jest instrukcja przypisania nazwie funkcji jej wartości. W treści
naszej funkcji wystąpi więc instrukcja przypisania:
Mniejsza:=min;
Umożliwia to przekazanie wartości funkcji w miejsce wywołania tej funkcji.
Cały program został przedstawiony poniżej:
PROGRAM Funkcja_mniejsza;
USES
Crt;
VAR
a, b, min, mniej : LONGINT;
Tak Nie
: CHAR;
(************************************)
FUNCTION Mniejsza:LONGINT;
BEGIN
REPEAT
ClrScr;
Writeln (' Wyznaczenie liczby mniejszej ');
Writeln (' Podaj dwie niezerowe rożne liczby naturalne:');
Writeln;
Write (' Podaj liczbę naturalna a= ');
Readln (a);
Write (' Podaj liczbę naturalna b= ');
Readln (b);
Writeln;
UNTIL a<>b;
IF a>b THEN min:=b
Else min:=a;
Mniejsza:=min; (* nadanie funkcji wartości min *)
END;
(****************************************)
BEGIN
REPEAT
ClrScr;
Writeln;
mniej:=Mniejsza; (* przypisanie wyniku funkcji zmiennej *)
Writeln('Z liczb ',a ,' i ',b ,' liczba mniejsza to ',mniej);
Writeln;
Writeln (' Jeszcze raz ?(T)ak');
TakNie: =UpCase(ReadKey)
UNTIL NOT (Tak Nie='T')
END.
W poprzednim programie wykorzystaliśmy w funkcji zmienne globalne zadeklarowane w bloku programu głównego.
Podobnie jak program czy też procedura, funkcja może posiadać swoje własne struktury (zmienne, stałe, typy, procedury, funkcje).
Deklaruje się je tak jak w programie.
Zasięg nazw deklarowanych w obrębie danych funkcji rozciąga się tylko na obszary funkcji, w których zostały
zadeklarowane i na bloki wewnętrzne tych funkcji (o ile one istnieją). Zmienne zadeklarowane w funkcji (blok wewnętrzny) noszą
nazwę zmiennych lokalnych.
W następnym ćwiczeniu przedstawiono program zawierający funkcję z własnym blokiem deklaracyjnym (zmienne lokalne).
Ćwiczenie 69
Napisać program zawierający funkcję wyznaczania wartości n-tej potęgi liczby 2 . Funkcja zawiera zmienne lokalne. Program ma
tytuł „Funkcja_potegi_liczby_2". Zapisać program na dysku w pliku o nazwie pot_2.pas.
Program zawiera dwa bloki strukturalne: program główny (blok zewnętrzny) oraz funkcję (blok wewnętrzny).
Po słowie kluczowym FUNCTION i po nazwie funkcji nie występuje lista parametrów formalnych, lecz jedynie typ wyniku:
Potęga_dwa: LONGINT;
Zmienna n oraz X, zadeklarowane w funkcji, są zmiennymi lokalnymi tej funkcji. Mamy tutaj do czynienia z przekazywaniem
danych przez zmienne lokalne. W treści funkcji wystąpi instrukcja przypisania nazwie funkcji jej wartości:
Potęga_dwa:=X;
Umożliwia to, jak wiemy, przekazanie wartości funkcji w miejsce wywołania tej funkcji. W celu obliczenia danej potęgi liczby 2
wykorzystano wzór rekurencyjny X:=X*2. Każda następna wartość X jest dwukrotnie większa od poprzedniej.
Cały program został przedstawiony poniżej:
Program Potegi_liczby_2;
USES
Crt;
VAR
wynik : LONGINT;
Tak Nie : CHAR;
(***********************************)
FUNCTION Potęga_dwa : LONGINT;
(* Obliczanie wyrażenia 2 do potęgi n*)
VAR n, X : LONGINT;
BEGIN
WHILE n>30 DO
BEGIN
Write (' Podaj wykładnik potęgi ( n<=30), n= ');
Readln(n);
END;
X:=1;
Writeln;
Write(' 2 do potęgi ',n);
BEGIN
FOR n:=1 to n DO
X:=X*2
(* rekurencja *)
END;
Potega_dwa:=X;
END;
(***********************************)
BEGIN
REPEAT
ClrScr;
Writeln;
WritelnC Obliczenie wyrażenia: 2 do potęgi n ');
Writeln;
wynik:=Potega_dwa;
Write(' = ',wynik);
Writeln; Writeln;
Writeln (' Jeszcze raz ?(T)ak');
TakNie: =UpCase(ReadKey)
UNTIL NOT (Tak Nie='T')
END.
Bardziej uniwersalnym i najczęściej stosowanym rozwiązaniem, zarówno dla procedur, jak i funkcji, jest koncepcja
bezpośredniego przekazywania danych funkcjom (tj. wykorzystując parametry formalne).
Przekazywanie parametrów w przypadku funkcji odbywa się na dokładnie takich samych zasadach jak w procedurach.
W następnym ćwiczeniu zajmiemy się funkcją przekazującą parametry przez wartość. Jak pamiętamy, parametry
przekazywane przez wartość służą tylko i wyłącznie do przekazywania parametrów aktualnych do wnętrza funkcji.
Ćwiczenie 70
Napisać program z zastosowaniem funkcji wyznaczającej rekurencyjnie silnię z dowolnej liczby naturalnej. Funkcja zawiera
deklaracje odpowiednich parametrów formalnych przekazywanych przez wartość. Program ma tytuł „Silnia_rekurencyjna_1".
Zapisać program na dysku w pliku o nazwie silnia_1.pas.
Symbolem n! oznaczamy iloczyn wszystkich liczb naturalnych od 1 do n. Nazywamy to silnią liczby n. Np. 3! = 1 * 2 * 3 , czyli
3!=6. Silnia jest również liczbą określająca liczbę wszystkich możliwych ustawień n symboli, na przykład liczb od 1 do n. Liczby 1,
2, 3 możemy ustawić na 6 sposobów (3!=6):
123
132
213
231
312
321.
Należy pamiętać, że dla n=0 mamy 0!=1.
W programie na obliczenie n! zastosujemy wzór rekurencyjny:
n! = n*(n-l)!
Po słowie kluczowym FUNCTION i po nazwie funkcji (Silnia) zadeklarowany został parametr n wraz z określeniem jego typu (n :
BYTE). Jest to parametr formalny przekazywany przez wartość. Wartość aktualnego parametru a zostaje przekazana funkcji
Silnia:
Silnia (a) ;
Formalny parametr n posłużył tu, podobnie jak w procedurze, tylko do rezerwacji miejsca przeznaczonego do wpisania wartości
przesyłanej przez parametr aktualny. Wyniki przeprowadzanych w funkcji operacji na parametrach przekazywanych przez
wartość są dostępne tylko dla danej funkcji i jej wszystkich ewentualnych bloków wewnętrznych, nie są jednak dostępne dla bloku
zewnętrznego.
W zastosowanym rozwiązaniu funkcji przyjęto operowanie nazwą funkcji (Silnia), stąd też wyeliminowana została konieczność
zastosowania instrukcji przypisania nazwie funkcji jej wartości.
Uwaga:
Parametry formalne użyte w danej funkcji mogą być definiowane w dowolnej kolejności. Przy wywoływaniu takiej funkcji w
programie należy uważać, by przekazywane jej wartości parametrów aktualnych odpowiadały kolejności deklaracyjnej
parametrów formalnych.
Poniżej został przedstawiony cały program:
PROGRAM Silnia_rekurencyjna_1;
USES
Crt;
VAR
a
: BYTE;
Tak Nie : CHAR;
(*********************************)
FUNCTION Silnia (n:BYTE): LONGINT;
BEGIN
IF n=0 THEN
Silnia:=l;
IF n>0 THEN
Silnia:=n*Silnia (n-1);
END;
(********************************)
BEGIN
REPEAT
ClrScr;
Writeln (' Obliczenie wyrażenia a! (a silnia)1);
Writeln;
Write (' Podaj liczbę naturalna z zakresu: 1 - 10 : a= ');
Readln (a);
Writeln;
Write (' ', a,'! = ',Silnia(a));
Writeln;
Writeln (' Jeszcze raz ?(T)ak');
Tak Nie:=UpCase(ReadKey)
UNTIL NOT (Tak Nie='T')
END.
W następnym ćwiczeniu zajmiemy się funkcją wykorzystującą parametry formalne przekazywane przez zmienną.
Parametry przekazywane przez zmienne, tak jak w przypadku procedur, mogą służyć do wprowadzania wartości danych do
wnętrza funkcji, ale główne ich zadanie polega na przekazywaniu wyników działania funkcji na zewnątrz.
Ćwiczenie 71
Napisać program zawierający funkcję obliczającą sumę sześcianów dwóch liczb naturalnych wg wzoru:
z = x3 + y 3 .
Funkcja zawiera deklaracje odpowiednich parametrów formalnych przekazywanych przez zmienne. Program ma tytuł
„Funkcja_z_szescian_4". Zapisać program na dysku w pliku o nazwie func_4.pas.
Napisać program zawierający funkcję (z parametrami formalnymi przekazywanymi przez zmienne) obliczającą sumę sześcianów
dwóch liczb naturalnych wg wzoru:
z = x3 + y 3 .
W treści funkcji możemy umieścić wyrażenie, w którym obliczony sześcian pierwszej liczby staje się wartością tej liczby, czyli:
a: = a * a * a .
Podobnie w przypadku drugiej liczby:
b:=b*b*b .
Wartość funkcji Sześcian da nam obliczoną wartość wyrażenia a+b, czyli sumę sześcianów dwóch liczb a i b.
Po słowie kluczowym FUNCTION i po nazwie funkcji (Sześcian) zadeklarowane zostały zmienne: a oraz b:
FUNCTION Szescian(VAR a, b :INTEGER) :INTEGER;
Parametry formalne a i b występujące w funkcji służą do przekazania wartości aktualnych parametrów x oraz y do funkcji (zostały
one poprzedzone słowem kluczowym VAR).
Oznacza to, że są one parametrami przekazywanymi przez zmienne, a tym samym dostępnymi dla bloku zewnętrznego. W
programie głównym będą dostępne nowe, obliczone wartości x oraz y. W tym przypadku parametry aktualne muszą być nazwami
zmiennych odpowiedniego typu. W treści funkcji wystąpi instrukcja przypisania nazwie funkcji jej wartości:
Sześcian :=a+b;
Cały program został przedstawiony poniżej:
PROGRAM Funkcja_szescian_4;
USES
Crt;
VAR
x, y
: LONGINT;
z
: LONGINT;
TakNie : CHAR;
(********************************)
FUNCTION Szescian(VAR a, b:LONGINT): LONGINT;
BEGIN
Writeln;
a:=a*a*a;
b:=b*b*b;
Sześcian :=a+b;
END;
(*********************************)
BEGIN
REPEAT
ClrScr;
Writeln('Obliczenie sumy sześcianów dwóch liczb całkowitych');
Writeln;
Write (' Podaj liczbę naturalna x= ');
Readln (x);
Write (' Podaj liczbę naturalna y= ');
Readln (y);
Writeln;
Writeln('Obliczenie sumy sześcianów dwóch liczb: x= ',x,' ','i y= ',y);
z:=Szescian(x,y);
Writeln (' Wartość wyrażenia x*x*x = ',x);
Writeln (' Wartość wyrażenia y*y*y = ',y);
Writeln (' Wartość wyrażenia x*x*x + y*y*y = ',z);
Writeln;
Writeln (* Jeszcze raz ?(T)ak');
Tak_Nie:=UpCase (ReadKey)
UNTIL NOT (Tak_Nie='T')
END.
Ćwiczenie 72
Napisać program zawierający funkcję obliczającą sumę wszystkich podzielników dowolnej liczby naturalnej. W programie
wykorzystać parametry formalne do przekazywania danych do funkcji. Program ma tytuł „Funkcja_czynniki_1". Zapisać program
na dysku w pliku o nazwie f_czyn_1.pas.
Ćwiczenie 73
Napisać program zawierający funkcję obliczającą iloraz dwóch liczb rzeczywistych. Program ma wykorzystywać zmienne lokalne
do przekazywania danych do funkcji. Program ma tytuł „Funkcja_iloraz_2". Zapisać program na dysku w pliku o nazwie
funilo_2.pas.
Ćwiczenie 74
Napisać program zawierający funkcję obliczania przybliżonej wartości sumy nieskończonego szeregu postaci:
Funkcja ma wykorzystywać parametry formalne do przekazywania danych. Obliczenia zostają zakończone w momencie, gdy
wartość kolejnego wyrazu szeregu będzie mniejsza od zadanej dokładności eps=1e-6. Program ma tytuł „Funkcja_Suma_ szeregu"
. Zapisać program na dysku w pliku o nazwie f_szereg.pas.
Ćwiczenie 75
Napisać program zawierający funkcję obliczania przybliżonej wartości pierwiastka kwadratowego z liczby rzeczywistej a (a>0).
Dokładność obliczenia eps=le-6. Funkcja ma wykorzystywać parametry formalne do przekazywania danych. Program ma tytuł
„Funkcja JPierwiastek". Zapisać program na dysku w pliku o nazwie f_pierw.pas.
Uwaga:
Do wyznaczenia pierwiastka kwadratowego z zadanej liczby a zastosujemy algorytm Herona. W pierwszym kroku przybliżymy
wartość
a liczbą b. Przyjmujemy b1, =a. Jeśli b,<
a , to a/b> a i odwrotnie: jeśli b1> a , to a/b< a . Wynika stąd, że
dokładna wartość pierwiastka leży między wartościami b1 i a/b,. Kolejne przybliżenie pierwiastka to średnia arytmetyczna obu
krańców przedziału b2=( b1+ a/b1)/2. Kolejne przybliżenia mają postać bn+1= ( b n + a / b n ) / 2 . Dokładność obliczenia eps=1e-6
jest różnicą między wartościami bn i a/bn.

Podobne dokumenty