05 Prodedury i funkcje

background image

Wstęp

do programowania

Wykład

5 – procedury i funkcje

background image

Podprogramy

Często wygodnie jest zapisać część

programu jako

podprogram

czyli jako

funkcje

lub

Procedurę

Podprogram -

wyodrębniona część programu, stanowiąca

całość (tzw.blok), posiadająca nazwę

i ustalony sposób wymiany informacji z pozostałymi

częściami programu.

background image

Cechy

Funkcje

i

procedury

.

umieszcza się je w części deklaracyjnej programu

lub w odrębnej jednostce kompilacyjnej

funkcja zazwyczaj operuje na pewnych

argumentach (nie modyfikując ich) i zwraca

pewną obliczoną wartość (jedną)

procedura zazwyczaj operuje na pewnych

argumentach, może je modyfikować i w ten

sposób zwrócić pewną wyliczoną wartość lub

wartości

background image

Deklaracja procedury

nagłówek
procedury

End;

begin

ciąg instrukcji

Część
deklaracyjna

Blok
procedury

Procedura

-

podprogram wykonujący jedną lub więcej czynności i

zwracający od jednego do kilku wyników;
lub nie zwracająca żadnego wyniku

nazwa używana jest w charakterze instrukcji w programie.

Procedure

nagłółwek_proc

Cześć deklaracyjna

{const type var

– zmienne

lokalne}

Begin

Ciąg instrukcji

end;

....

Wywołanie procedury

{użycie jako instrukcja w

programie}

background image

Deklaracja procedury

Nagłówek procedury

Procedure

nazwa_procedury

(lista parametrów formalnych);

Procedure

nazwa_procedury (

var

lista; parametrów; formalnych);

Wywołanie

nazwa_procedury

( lista, parametrów, aktualnych);

•Lista parametrów formalnych pozwala w sposób jawny przekazywać dane do
procedury lub funkcji.

•W wywołaniu podprogramu listę

parametrów formalnych

zastępuje lista

parametrów aktualnych

•Parametr aktualny

musi być takiego samego typu

jak odpowiadający mu na

liście parametr formalny.

•Parametry aktualne w wywołaniu podprogramu oddzielone są

przecinkami

.

background image

Deklaracja procedury

Procedure

nazwa_procedury

(lista parametrów formalnych);

Są dwa sposoby przekazywania parametrów do procedury

Parametry przekazywane przez wartość

(lista parametrów formalnych)=

=(Identyfikator_1: typ1; Identyfikator_2,..., Identyfikator_n :

Typ);

Parametry przekazywane przez zmienną

var

lista parametrów formalnych=

=

(

var

Identyfikator_1: typ1

;

var

Identyfikator_2

,

...

,

Identyfikator_n:

Typ);

background image

procedury

Parametry przekazywane przez

wartość

:

(przekazywanie w jedną stronę, praca na kopii parametru)

procedure

dodaj

(a: integer; b: Single);

procedure

generator

(x: real);

procedure

napisy

;

//procedura bez parametrów

Type Matrix

=array[1..5,1..4] of Double;

procedure

wypisz

(M: Matrix);

// zła deklaracja: procedure

wypisz

(M: array[1..5,1..4] of Double);

W wyniku wywołania procedury lub funkcji parametrom formalnym zostaje
przypisana wartość początkowa równa wartościom odpowiednich parametrów
aktualnych.
Operacje wykonywane w treści funkcji lub procedury wykonywane
są na kopii umieszczonej na stosie i w związku z tym nie powodują zmian
wartości odpowiadających im parametrów aktualnych.

background image

procedury

Parametry przekazywane przez

zmienną

:

(przekazywanie w obie strony, praca na oryginale parametru)

procedure

zapisz

(var x: byte);

procedure

dodaj

(var a: integer; var b: Single);

procedure

dodaj

(a, b: integer; var c: Single);

Type Matrix

=array[1..5,1..5] of byte;

procedure

dodajM

(A, B : Matrix; var M : Matrix);

Operacje wykonywane w treści funkcji lub procedury wykonywane są
bezpośrednio na przekazywanych do procedury lub funkcji parametrach
aktualnych.

Efektem takiego działania jest zmiana wartości parametrów aktualnych po

wywołaniu procedury lub funkcji.

background image

Parametry procedury/funkcji

Parametry formalne

-

pojawiają się w nagłówku deklaracji funkcji bądź

procedury i są używane w instrukcjach funkcji lub procedury jak zwykłe
zmienne.
•Liczba parametrów formalnych nie jest ograniczona i ich kolejność
występowania jest dowolna. Parametr formalny jest obowiązkowo
zmienną.

Parametry aktualne

-

są parametrami występującymi w bloku, z

którego wywoływana jest funkcja lub procedura i używane są podczas
wywołania procedury lub funkcji.

•Liczba parametrów aktualnych musi być taka sama jak liczba
parametrów formalnych i należy pamiętać o zgodności typów.

Parametrem aktualnym

może być wyrażenie, zmienna bądź stała.

Wywołanie procedury

– polega na wpisaniu nazwy procedury z

odpowiednią listą parametrów aktualnych jako instrukcji programu.
np.:

wypisz(a,b,c);

background image

Przykłady procedur

program Podpr1;
{$APPTYPE CONSOLE}
uses SysUtils;

procedure www(k, m :Integer);
begin

writeln('k=',k);
k := k+m;
writeln('k=',k);

end;

procedure zzz(var k, m :Integer);
begin

writeln('k=',k);
k := k+m;
writeln('k=',k);

end;

var

var

a, b :Integer;

begin

a := 1; b := a+1;

www(a, b+1);

writeln('a=',a);

www(a, b+1);

writeln('a=',a);

zzz(a, b);

writeln('a=',a);

zzz(a, b);

writeln('a=',a);

readln;

end.

background image

Procedura z domyślną wartością

parametru wywołania

program Podpr2;
{$APPTYPE CONSOLE}

Procedure demo(

const

napis:

string

=‘Wartosc domyslna demo’

);

Begin

writeln(napis);

end;
Var s: string;
begin

s:=‘ procedura demo’;

demo(s);
demo;
demo(‘dowolny napis’)

readln;
end.

W Delphi istnieje możliwość podania

domyślnej wartości parametru

wywołania procedury lub funkcji.

poprzez użycie słowa kluczowego

Const

w nagłówku procedury

przed nazwą parametru oraz
podanie jego wartości po znaku

=

background image

Przykłady procedur

wyświetlanie macierzy

program Podpr2;
{$APPTYPE CONSOLE}
uses SysUtils;
Const RM=5;
Type matrix=array[1..RM,1..RM]of
Byte;

procedure gener(var M : matrix);

Var i, k :byte;

//zmienne lokalne

Begin
Randomize;

for i:=1 to RM do

for k:=1 to RM do

M[i,k]:=random(10);

end;

procedure wypisz(M :matrix);

Var i,k: byte;
begin

for i:=1 to RM do

begin

for k:=1 to RM do

write(M[i,k]:4);

writeln;

end;
writeln;

End;

Var A, M : Matrix;
Begin

//cz. wykonawcza

wypisz(M);
gener(M);
wypisz(M);

gener(A);
wypisz(A); readln;

end.

background image

Przykłady procedur

zmienne globalne

-zmienne globalne

to zmienne

zdefiniowane

przed def. Procedur

użwane wewnątrz

z możliwością ich

zmiany.

Powinno się unikać

używania zm.

Globalnych

przez używanie

zm. Lokalnych i

parametrów

formalnych

i przekazywanie ich

przez zmienną

program proc2;
{$APPTYPE CONSOLE}
uses sysutils;
var zm_globalna :integer;
Procedure proc_glob;
Var zm_lok :Integer;
Begin

zm_lok:=1;
zm_globalna:=zm_globalna+1;
writeln('zm_lok=',zm_lok);
writeln('zm_glob=',zm_globalna);

end;

var zm_globalna1 :integer;
begin
zm_globalna:=5;
writeln('zm_glob=',zm_globalna );

proc_glob;

writeln('zm_g=',zm_globalna );// 6

zm_globalna:=9;
writeln(zm_globalna ); //9
proc_glob; //10

writeln(zm_globalna ); //10

readln;
END.

background image

Deklaracja Funkcji

nagłówek funkcji

end

.

begin

ciąg instrukcji

Część
deklaracyjna

Blok
funkcji

Funkcja

-

podprogram wykonujący jedną lub więcej czynności i

zwracający dokładnie jedną wartość.

nazwa używana jest w charakterze wyrażenia lub instrukcji.

Result := wyrażenie

background image

Deklaracja Funkcji

Funkcja

-

podprogram wykonujący jedną lub więcej czynności i

zwracający dokładnie jedną wartość.

nazwa używana funkcji jest w charakterze wyrażenia lub wartości.

Function

nazwa_funkcji :

typ_wyniku

//Cześć deklaracyjna

{const type var

– zmienne lokalne}

Begin

Ciąg instrukcji

Result := wyrażenie;

end;

Function

nazwa_funkcji :

typ_wyniku

Begin

Ciąg instrukcji

nazwa_funkcji

:= wyrażenie;

end;

background image

Deklaracje funkcji

Nagłówek funkcji

Function

nazwa_funkcji

(lista; parametrów; formalnych) :

typ;

Wywołanie funkcji

– polega na wpisaniu nazwy funkcji z

odpowiednią listą parametrów aktualnych w wyrażeniu.

nazwa_funkcji

( lista, parametrów, aktualnych);

• Lista parametrów formalnych pozwala w sposób jawny przekazywać

dane do funkcji.

• W wywołaniu funkcji listę

parametrów formalnych

zastępuje lista

parametrów aktualnych

• Parametr aktualny

musi być takiego samego typu

jak odpowiadający

mu na liście parametr formalny.

background image

Zwracanie wyniku przez funkcję

Zwracanie wartości funkcji odbywa się za

pomocą instrukcji

Result

Która jest zamienna lokalną

:

Result

:= zwracany_wynik

Wykonanie takiej instrukcji kończy działanie funkcji

(//pascasl -dalsze jej instrukcje, jeśli istnieją, nie będą

wykonywane).

Jeśli typ wyrażenia

zwracany_wynik

nie zgadza się z typem

zwracanego wyniku podanym w deklaracji funkcji, to

zwracany_wynik

jest odpowiednio konwertowany,

jeśli jest

to możliwe.

background image

Deklaracje funkcji

Parametry przekazywane przez

wartość

:

(przekazywanie w jedną stronę)

function

dodaj

(a: byte; b: single) : single;

Begin

Result:=a+b;

// dodaj:=a+b;

end;

//Wywołania

Var a, x : byte;

b, y : single;

.....

Wynik:=dodaj(x,y);

Writeln(wynik);

Writeln( dodaj(a,b));

background image

Deklaracje funkcji

przekazywanie tablic do funkcji

Type Tablica=array[1..10]of Samllint;

function

Iloczyn_skalarny

(A,B:Tablica ) : SmallInt;

//Wywołania

Var A, B : Tablica;

wynik : SamllInt;

.....
Wynik:=

Iloczyn_skalarny

(A,B);

lub

Writeln(‘wynik=‘, Iloczyn_skalarny(A,B));

background image

Przykłady funkcji

program Podpr2;
{$APPTYPE CONSOLE} {$O-,Q+,R+}
uses SysUtils;

function suma2(k, m :Integer) : Integer;
Begin

Result := k+m;
Result := Result *2;
//suma2 := suma2*4; //nie polecane

end;
Var a, b, x :Integer;

Begin

x:=suma2(1,4);

Writeln('suma=',x);
A:=2; b:=3;
writeln(suma2(2,3));
writeln(suma2(a,b)); readln;
end.

background image

program Podpr3;
{$APPTYPE CONSOLE} {$O-,Q+,R+}

function jaka_wartosc : Integer;
Begin

Result := 1; {niejdnozancze okrerlenie wartosci funkcji}
jaka_wartosc:= 2;
Result :=3 ; //ta wartość zostanie zwrócona

writeln('funkcja

– jaka_wartosc ');

end;

Var x :Integer;
Begin

x:= jaka_wartosc; //wywołanie funkcji jak funkcji i zwrot wartości

Writeln('x=',x);

jaka_wartosc ;
readln;

//wywołanie funkcji jak procedury, bez zwrotu wartości

Writeln(jaka_wartosc ); readln;
end.

Wywołanie funkcji

background image

Przeciążanie funkcji

program Podpr4;
{$APPTYPE CONSOLE} {$O-,Q+,R+}

function dodaj(a,b :byte) : byte; Overload;
Begin

Result := a+b;

end;

function dodaj(a,b :string) : string; Overload;
Begin

Result := a+b;

end;

Begin
Writeln('dodaanie liczb=',dodaj( 1, 2 ));
Writeln('dodawanie łancuchow =',

dodaj('1','2'));

readln;
end.

Przeciążanie –

wielokrotne

Definiowanie funkcji lub

procedur o tych samych nazwach

różniących się zestawem

parametrów formalnych

wywołania.

W takim przypadku trzeba

użyć dyrektywy

overload

w nagłówku każdej przeciążonej

funkcji lub procedury.

Przeciążone funkcje w działają

odpowiednio w zależności

od aktualnych parametrów

Wywołania.

background image

Przykłady funkcji +oper na tablicach

program Podpr3;
{$APPTYPE CONSOLE} {$O-,Q+,R+}
uses SysUtils;
type

TArr=array[1..10]of Integer;

function wypelniacz(x :Integer):TArr;
var

i: Integer;

begin

for i := 1 to 10 do

Result[i] := x;

end;
Var A :TArr;

i:byte;

begin

A := wypelniacz(2);

for i:=1 to 10 do write(A[i], ' ');

readln;

end.

background image

Przykład- funkcja

ZAMIANY liczby

całkowitej na kod 2-10

program CardStr1;
{$APPTYPE CONSOLE} {$O-,Q+,R+}
uses SysUtils;
const MaxPodst = 10;
type TPodst=2..MaxPodst;

function Card2Str(x :Cardinal; p:TPodst):string;

type

TCyfra = 0..MaxPodst-1;

var

cyfra :TCyfra;

begin

Result := '';
repeat

cyfra := x mod p;
x := x div p;
Result := char(cyfra+byte('0')) + Result;

until x = 0;

end;

var

a :Cardinal;

b :TPodst;

begin

write('a=');readln(a);

write('podstawa systemu ');

readln(b);

writeln(Card2Str(a, b));

readln;

end.

background image

Przykład- funkcja ZAMIANY

–efekty uboczne

program CardStr3efUbocz;
{$APPTYPE CONSOLE} {$O-,Q+,R+}
uses SysUtils;
const MaxPodst = 36;
type TPodst=2..MaxPodst;

var

x :Cardinal; p :TPodst;

function Card2Str:string;

type

TCyfra = 0..MaxPodst-1;

function CyfraZnak(c :TCyfra):char;
begin

if c <= 9 then

Result := char( c + byte('0') )

else

Result := char( c-10 +byte('A') );

end;

var

cyfra :TCyfra;

begin

Result := '';

repeat

cyfra := x mod p;

x := x div p;

Result := CyfraZnak(cyfra)

+ Result;

until x = 0;

end;

begin

write('x=');readln(x);

write('podstawa systemu

liczenia:');readln(p);

writeln(Card2Str);

writeln(Card2Str);

readln;

end.

background image

program Sortowanie;
{$APPTYPE CONSOLE} {$O-

,Q+,R+}

uses SysUtils;
const MaxN=5;
var

N,x :Integer;
A :array[1..MaxN] of

Integer;

i :1..MaxN+1;

begin
//Read(N, A[1],..., A[N]);

write('N=');readln(N);
//czytanie rom. tab
for i := 1 to N do
begin

write('A[',i,']=');
readln(A[i]);

end;

if N > 1 then

begin

i := 2;
repeat

while A[i] < A[i-1] do
begin

x := A[i];
A[i] := A[i-1];
A[i-1] := x;
if i > 2 then

i := i-1;

end;
i := i+1;

until i > N;

end;
writeln('posortowane');

for i := 1 to N do

Writeln('A[',i,']=',A[i]);

readln;
end.

background image

Wywołanie funkcji przez inną funkcję

W czasie wykonywania funkcji może nastąpić

wywołanie innej funkcji.

Wykonywanie bieżącej funkcji jest wówczas chwilowo

przerywane, a rozpoczyna się wykonywanie drugiej.
Po zakończeniu wykonania funkcji drugiej sterowanie

wraca do pierwszej funkcji, do miejsca gdzie została

przerwana.

W treści programu w funkcji można

umieścić wywołanie innej funkcji, która

została zdefiniowana wcześniej

background image

Wywołanie funkcji przez inną funkcję

Zagnieżdżanie –

funkcja wywołujący

inną funkcję

function A;
begin

...

end;

Function B;
begin

...
x:=

A;

...

end;

Zagnieżdżanie –

podprogram

wywołujący inny

podprogram

procedure A;
begin

...

end;

procedure B;
begin

...

A;

end;

Zagnieżdżanie – funkcja

wywołujący inną

funkcję

function A;

Function B;

begin

...

end;

begin

...
x:=

B

;

...

end;

background image

Przykład- fukcjA ZAMIANY

liczby całkowitej na Hex

program CardStr2;
{$APPTYPE CONSOLE} {$O-,Q+,R+}
uses SysUtils;
Const MaxPodst = 36;
type

TPodst=2..MaxPodst;

function
Card2Str(x :Cardinal; p:TPodst):string;

type

TCyfra = 0..MaxPodst-1;

function CyfraZnak(c :TCyfra):char;
begin

if c <= 9 then

Result := char( c + byte('0') )

else

Result := char( c-10 +byte('A') );

end;

Var cyfra :TCyfra;

begin

Result := '';

repeat

cyfra := x mod p;

x := x div p;

Result := CyfraZnak(cyfra)

+ Result;

until x = 0;

end;

var a :Cardinal; b :TPodst;

begin

write('a=');readln(a);

write('podstawa systemu:=');

readln(b);

writeln(

Card2Str(a, b)

);

readln;

end.

background image

Zmienne globalne i lokalne

Możemy zdefiniować pewne zmienne, które

będą widoczne we wszystkich funkcjach

danego programu – są to tzw

zmienne

globalne

Wewnątrz funkcji można definiować zmienne,

które są

zmiennymi lokalnymi

tej funkcji

Jeśli w obrębie funkcji definiujemy jakieś zmienne,

to są one zazwyczaj pamiętane na tzw.

stosie

(czyli w obszarze „podręcznym”).

background image

Przykład- funkcja ZAMIANY

–efekty uboczne

program CardStr3efUbocz;
{$APPTYPE CONSOLE} {$O-,Q+,R+}
uses SysUtils;
const MaxPodst = 36;
type TPodst=2..MaxPodst;

var

x :Cardinal; p :TPodst;

function Card2Str:string;

type

TCyfra = 0..MaxPodst-1;

function CyfraZnak(c :TCyfra):char;
begin

if c <= 9 then

Result := char( c + byte('0') )

else

Result := char( c-10 +byte('A') );

end;

var

cyfra :TCyfra;

begin

Result := '';

repeat

cyfra := x mod p;

x := x div p;

Result := CyfraZnak(cyfra)

+ Result;

until x = 0;

end;

begin

write('x=');readln(x);

write('podstawa systemu

liczenia:');readln(p);

writeln(Card2Str);

writeln(Card2Str);

readln;

end.

background image

Podsumowanie

jeśli podprogram ma zwracać więcej niż jedną wartość, bądź

modyfikować wartości parametrów aktualnych użyj procedury;

jeśli ma być zwrócona dokładnie jedna wartość użyj funkcji;
jeśli oba typy podprogramów są dopuszczalne użyj tego, który jest ci

łatwiej zastosować

zmienne mające w podprogramie charakter roboczy należy

deklarować jako zmienne lokalne; bardziej bezpieczne zalecane jest

przekazywanie parametrów przez wartość (chroni przed

niepotrzebnymi zmianami tych parametrów)

jeśli parametr służy do komunikowania otoczeniu efektów wykonania

podprogramu to musi być przekazywany przez zmienną;
jeśli mamy do przekazania duże struktury danych to unikamy ich

przekazywania przez wartość –

pozwoli to na lepsze

gospodarowanie pamięcią (dla parametrów przekazywanych przez

wartość tworzona jest ich kopia na stosie);


Wyszukiwarka

Podobne podstrony:
05 Charakteryzowanie funkcji narządów organizmu człowieka 2
05 Zastosowanie funkcji w formułach
05 Charakteryzowanie funkcji narządów organizmu człowieka
07 Rozdział 05 Całka funkcji dwóch zmiennych
retoryka, Wykład 3[1].Funkcje języka.08.05.2005, Funkcje języka
1997 05 Generator funkcji, część 1
05 Charakteryzowanie funkcji narządów organizmu człowieka
tabicowanie funkcji, 2004-01-05
Matematyka III (Ćw) - Lista 05 - Rachunek rózniczkowy funkcji wielu zmiennych, Odpowiedzi
05 Wyklad 5. Rozkład funkcji zmiennej losowej i dwuwymiarowe zmienn e losowe
05 Rozdział 03 Wzór Taylora i ekstrema funkcji
05??7 samodzielne funkcje tech
05 funkcje rozwiązania
05 Wyklad 5 Rozkład funkcji zmiennej losowej i dwuwymiarowe zmienn e losoweid 5873

więcej podobnych podstron