1 / 25

Obsah 10 . přednášky

Obsah 10 . přednášky. Funkce - pokra čování funkce s více parametry proměnlivý počet parametrů více návratových hodnot proměnlivý počet návratových hodnot předávání parametrů viditelnost, existence, globální proměnné, perzistentní proměnné rekurzivní volání funkcí

yasuo
Download Presentation

Obsah 10 . přednášky

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Obsah 10. přednášky Funkce - pokračování funkce s více parametry proměnlivý počet parametrů více návratových hodnot proměnlivý počet návratových hodnot předávání parametrů viditelnost, existence, globální proměnné, perzistentní proměnné rekurzivní volání funkcí Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky.

  2. Více vstupních parametrů V minulé přednášce byla definována funkce fmax (je nadbytečná, Matlab umí zjistit maximum vestavěnou funkcí max). Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. REKAPITULACE c:\1\fmax.m function x = fmax(a,b) if a > b x = a; else x = b; end end function x = fmax(a,b) x = b; if a > b x = a; end end >>fmax(1,3) ans = 3 >> funkčně rovnocenná, kratší, ale méně přehledná varianta funkce

  3. Více vstupních parametrů Rožšiřme tuto funkci na větší počet parametrů: Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. c:\1\fmax.m function x = fmax(a,b,c) x = a; if(b > x) x = b; end if(c > x) x = c; end end Po tomto rozšíření funkce na tři parametry nelze funkci zavolat se dvěma parametry. >>fmax(1,3,2) ans = 3 >>fmax(1,3) ??? Input argument "c" is undefined. >>

  4. Více vstupních parametrů Počet skutečně předaných parametrů do funkce lze zjistit funkcí nargin(). Chybějící parametr nevadí, pokud s ním ve volané funkci nebudeme pracovat. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. nargin()– vestavěná funkce, při volání bez parametru (uvnitř funkce) slouží ke zjištění aktuálního počtu parametrů použitých při volání funkce. • Funkci lze rovněž použít ke zjištění maximálního počtu parametrů, které funkce akceptuje. V tomto případě je parametrem jméno funkce. c:\1\fmax.m function x = fmax(a,b,c) x = a; if(b > x) x = b; end if nargin== 3 if(c > x) x = c; end end end >>fmax(1,3,7) ans = 7 >>fmax(1,3) ans = 3 >> nargin('fmax') ans = 3 >>

  5. Proměnlivý počet vstupních parametrů Je zřejmé, že rozšíření pro ještě větší počet parametrů je touto metodou velmi nepohodlné, zobecnění pro libovolný počet parametrů nemožné. Pro tvorbu funkcí s libovolným počtem parametrů je k dispozici speciální mechanismus (variable-length argument list). Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. function ret_var = jmeno(varargin) tělo funkce; end varargin je buňkové pole, jehož každý jeden element obsahuje postupně všechny parametry funkce Tato funkce může být volána s libovolným počtem parametrů (i bez parametrů).

  6. Proměnlivý počet vstupních parametrů Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. c:\1\test.m nebo for i = 1 : length(varargin) function x = test(varargin) for i = 1 : nargin fprintf('arg%d = ',i); disp(varargin{i}); end x = i; end >>test ans = [] >>test(1,3) arg1 = 1 arg2 = 3 ans = 2 >> test(1,[0,1,2;-1,-1,0],'text') arg1 = 1 arg2 = 0 1 2 -1 -1 0 arg3 = text ans = 3 >> >> nargin('test') ans = -1 >> Prvek buňkového pole se vybírá mechanismem podobným indexování, "index" se uvádí ve složených závorkách. Podrobnosti o buňkových polích netřeba.

  7. Proměnlivý počet vstupních parametrů Funkci fmax by bylo možné zobecnit pro libovolný počet parametrů. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. c:\1\fmax.m function x = fmax(varargin) n = nargin; x = []; if n >= 1 x = varargin{1}; for i = 2 : n if x < varargin{i} x = varargin{i}; end end end end >> fmax(1) ans = 1 >> fmax ans = [] >> fmax(1,3,2,5,7,12) ans = 12 >>

  8. Více návratových hodnot občas je potřebné vracet z funkce více než jednu hodnotu, možné řešení je použít pole nebo datové struktury, Matlab umožňuje přímo vracet více hodnot Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. function [ret_list] = jmeno(arg_list) tělo funkce; end čárkou oddělený seznam jmen proměnných, ve kterých budou vraceny hodnoty (formálně lze chápat jako vektor návratových hodnot)

  9. Více návratových hodnot Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. c:\1\sedm_osm.m • >>sedm_osm • ans = • 7 • >> [a,b] = sedm_osm • a = • 7 • b = • 8 • >> c = sedm_osm • c = • 7 • >> [d] = sedm_osm • d = • 7 • >> [e,f,g] = sedm_osm • ??? Error using ==> sedm_osm • Too many output arguments. • >> nargout('sedm_osm') ans = 2 >> function [x,y] = sedm_osm x = 7; y = 8; end nargout() – vestavěná funkce, při volání bez parametru (uvnitř funkce) slouží ke zjištění počtu návratových hodnot požadovaných při aktuálním volání této funkce. Funkci lze rovněž použít ke zjištění maximálního počtu návratových hodnot, které funkce může poskytnout. V tomto případě je parametrem jméno funkce. O.K., není povinnost využít všechny vrácené hodnoty

  10. Více návratových hodnot Příklad: funkce pro zjištění minimálního prvku pole (vektoru) bude vracet 3 hodnoty: nalezenou minimální hodnotu, index prvního výskytu prvku s touto hodnotou v poli počet výskytů prvku s touto hodnotou v poli. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. c:\1\min3.m function [h, i, c] = min3(a) [r,s]=size(a); h = a(1); i = 1; c = 1; fork = 2 : r*s ifh > a(k) h = a(k); i = k; c = 1; elseifh == a(k) c = c + 1; end end end >> [a,b,c] = min3([1,2;0,0;1,0]) a = 0 b = 2 c = 3 >>

  11. Proměnlivý počet návratových hodnot nargout() nevyřeší vše (každá návratová proměnná musí být uvedena a pojmenována v hlavičce funkce, aby bylo možné ji použít), v Matlabu je mechanismus na tvorbu funkcí s proměnlivým (tedy předem neznámým a neomezeným) počtem návratových hodnot Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. c:\1\licha.m • >> a = licha • a = • 1 • >> [a,b,c,d] = licha a = 1 b = 3 c = 5 d = 7 • >>licha >> function [varargout] = licha for k=1:nargout varargout{k} = 2*(k-1)+1; end end varargout se chová jako proměnná, která může obsahovat libovolný počet návratových hodnot funkce požadovaných při aktuálním volání funkce. Zachází se s ní jako s buňkovým polem (lze indexovat, index se píše do složených závorek, detaily netřeba).

  12. Inline funkce inline umožňuje vytvořit funkci na základě textového řetězce obsahujícího funkční předpis použití pro jednodušší výpočetní funkce (typu "dosazení do vzorce") funkční předpis inline funkce může obsahovat volání dalších funkcí (běžných i inline) Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. jmeno= inline(předpis); identifikátor (jméno) funkce textový řetězec obsahující funkční předpis >> ff=inline('2*x^2-5'); >> ff(0) ans = -5 >> ff(10) ans = 195 >> >> ff=inline('2*x^2-5'); >>ff ff = Inline function: ff(x) = 2*x^2-5 >>

  13. Inline funkce Příklad - program na vykreslení průběhu funkce zadané z klávesnice. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. k=1; x = linspace(0,10); while k ~= 2 s = input('funkce:','s'); ff = inline(s); plot(x,ff(x)); grid on; k=menu('Vyber','další','konec'); end funkce:sin(x)+cos(3*x)-sin(7*x) >>

  14. Inline funkce Inline funkce mohou mít více parametrů. Parametry funkce jsou detekovány automaticky. Jména parametrů mohou být tvořena pouze samostatnými malými písmeny (mimo i a j). Při volání funkce se parametry použijí v abecedním pořadí (bez ohledu na pořadí výskytu ve funkčním předpisu. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. >>f1=inline('a+2*b') f1 = Inline function: f1(a,b) = a+2*b >>f1(1,4) ans = 9 >> >>f2=inline('b+2*a') f2 = Inline function: f2(a,b) = b+2*a >>f2(1,4) ans = 6 >> 4+2*1 1+2*4

  15. Inline funkce Pořadí v automaticky generovaném seznamuparametrů lze ovlivnit uvedením argumentů funkce jako dalších parametrů inline. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. >>f2=inline('b+2*a') f2 = Inline function: f2(a,b) = b+2*a >>f2(1,4) ans = 6 >> >>f1=inline('b+2*a','b','a') f1 = Inline function: f1(b,a) = b+2*a >>f1(1,4) ans = 9 >> 4+2*1 1+2*4

  16. Předávání parametrů Matlab umožňuje výhradně předávání parametrů hodnotou. To znamená: Při volání je ve volané funkci vytvořena pro každý předávaný parametr nová dočasná proměnná inicializovaná na hodnotu skutečného parametru. Tato kopie skutečného parametru v okamžiku návratu z funkce zaniká. Jako skutečný parametr může být použit výraz (volaná funkce se nijak nedozví, zda jako skutečný argument byla použita proměnná, výraz nebo konstanta). Je-li skutečným parametrem proměnná, funkce nepracuje s touto proměnnou, ale s její kopií, proto funkce nemůže hodnotu proměnné předané jako parametr změnit (parametr nemůže sloužit k "výstupu" z funkce, k tomu jsou návratové hodnoty). Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. >>x = 9; >>nula(x); >>x x = 9 >> c:\1\nula.m functionnula(a) a = 0; end

  17. Lokální a globální proměnné Standardně jsou všechny proměnné lokální: proměnné téhož jména vytvořené uvnitř různých funkcí a/nebo mimo funkce jsou nezávislé. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. c:\1\nula.m functionnula a = 0; end >>a = 9; >>nula; >>a a = 9 >>

  18. Lokální a globální proměnné Proměnné lze deklarovat jako globální: globální proměnné jsou přístupné ve všech funkcích, ve kterých jsou deklarovány jako globální proměnná musí být deklarovaná jako globální ve všech funkcích, které s ní mají pracovat, a mimo funkce (na nejvyšší úrovni) Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. c:\1\nula.m >>global a; >>a = 99; b = 22; >>nula; >>a a = 0 >>jedna; >>b b = 22 >> functionnula global a; a = 0; end c:\1\jedna.m function jedna global b; b = 1; end

  19. Lokální a globální proměnné Předání globální proměnné jako parametru funkce: funkce pracuje s kopiemi skutečných parametrů, tzn. změna hodnoty parametru uvnitř funkce se neprojeví změnou hodnoty globální proměnné předané jako parametr. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. c:\1\nula.m >>global x; >>x= 99; >>nula(x); >>x x = 99 >> functionnula(x) x = 0; end

  20. Perzistentní proměnné Lokální (tzn. ne globální) proměnné uvnitř funkcí standardně existují pouze po dobu provádění funkce: při zavolání funkce postupně vznikají (tak jak je jim přiřazovaná hodnota), při návratu z funkce zaniknou, u rekurzivně volaných funkcí vzniká zvláštní sada lokálních proměnných pro každé zavolání funkce - viz dále, důsledek - v těchto proměnných nelze uchovávat hodnoty mezi voláními funkce. Uvnitř funkcí lze deklarovat proměnné jako perzistentní: takové proměnné po návratu z funkce nezanikají, jsou přístupné pouze ve funkci, ve které jsou deklarované, chovají se jako globální z hlediska času existence (tzv. doba života) a jako lokální z hlediska viditelnosti, jsou obdobou static lokálních proměnných v C, perzistentní proměnná obsahuje na počátku prázdnou matici, parametry funkce nemohou být perzistentní. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky.

  21. Perzistentní proměnné Příklad - funkce bude při každém volání vracet o jedničku vyšší hodnotu (např. počítadlo volání funkce). Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. c:\1\blabla.m >>blabla ans = 1 >>blabla ans = 2 >>blabla ans = 3 >>blabla ans = 4 >> function x = blabla persistent a; if isempty(a) a = 1; else a = a+1; end x = a; end

  22. Perzistentní proměnné Příklad - funkce vypíše na obrazovku čas, a to při prvním zavolání a pak vždy, pokud od posledního výpisu času uplynulo alespoň 5 sekund. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. c:\1\printtime.m function printtime persistent naposled; t = fix(clock); if isempty(naposled) | etime(t,naposled) >=5 fprintf('%02d:%02d:%02d\n',t(4),t(5),t(6)); naposled = t; end end >>while 1 printtime(); end 23:41:23 23:41:28 23:41:33

  23. Viditelnost, existence viditelnost - kde je daný identifikátor proměnné platný existence (v některých jazycích zvaná doba života - durability) - doba, po kterou proměnná existuje (má vyhrazenou paměť, uchovává hodnotu) viditelnost může být: lokální - omezená na jedinou funkci (resp. na oblast mimo jakoukoliv funkci) globální - proměnná viditelná mimo funkce a uvnitř funkcí, kde je proměnná deklarovaná jako globální existence: lokální - po dobu provádění funkce, globální - po dobu běhu programu resp. do ukončení Matlabu nebo výmazu proměnné (proměnné mimo jakékoliv funkce a perzistentní proměnné) v některých jazycích nelze viditelnost a existenci ovládat nezávisle (typicky Pascal), v jiných ano (typicky C), obecně se jedná o problematiku viditelnosti a existence i jiných typů objektů (proměnných, funkcí, ...), např. primární funkce vs. subfunkce Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky.

  24. Rekurzivní volání funkcí z funkcí mohou být volány další funkce, zvláštním případem je rekurze, kdy funkce opětovně volá sama sebe, při rekurzi je funkce znovu zavolána dříve, než byl proveden návrat z předchozího volání této funkce, přímá rekurze - funkce volá sama sebe, nepřímá rekurze - první funkce volá druhou funkci, která zase zavolá první funkci, rekurze přináší zvýšené nároky na systémové zdroje (zejména paměť) a rovněž přináší zpomalení běhu programu (pro běžné aplikace to obvykle nevadí), některé (zejména starší) programovací jazyky rekurzi nepodporují, každou rekurzi lze vyjádřit pomocí cyklu, rekurze je důležitý nástroj k vyjadřování algoritmů pro řešení jistých okruhů problémů (syntaktická analýza, práce s grafy, práce se seznamy, úlohy z oblasti umělé inteligence, ...) Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky.

  25. Rekurzivní volání funkcí Příklad - funkce pro výpočet faktoriálu. Tato prezentace je spolufinancována Evropským sociálním fondem a státním rozpočtem České republiky. n! = n×(n-1)! 0! = 1 c:\1\rfact.m function x = rfact(n) if n <= 0 x = 1; else x = n * rfact(n-1); end end

More Related