Špeciálne jazykové prostriedky počítačov - SJPP

4. Vytváranie vlastných aplikácií

4.1. M-súbory

M-súbory slúžia na ukladanie postupností príkazov (skripty) alebo na ukladanie užívateľských funkcií (funkcie). Tieto nové súbory majú príponu .m.

Poznámka: m-súbory sú obyčajné textové súbory (ASCII súbory), a preto je možné ich písať aj v ľubovoľnom textovom editore. Z dôvodov vyššieho komfortu (zvýraznenie syntaxe, možnosť krokovania) je súčasťou MATLABu tiež M-editor/Debugger, ktorý sa otvára v samostatnom okne po otvorení alebo vytvorení m-súboru (skriptu či funkcie).

4.1.1. M-editor

Od verzie 5.0 je súčasťou MATLABu aj vlastný editor, ktorý zároveň slúži ako debugger. Ide o jednoduchý editor, ktorý má niektoré užitočné vlastnosti:

M-editor/Debugger je spustený v samostatnom okne po otvorení (File » Open) alebo vytvorení (File » New » M-file) nového m-súboru. Slúži k pohodlnej editácii m-súboru. Navyše umožňuje krokovať obsah m-súboru (t.j. kontrolovať vykonávanie jeho jednotlivých príkazov).

top

4.2. Skripty

Skript (z angl. script) je postupnosť príkazov uložených do súboru. Každý skript pracuje s premennými pracovného prostredia, takže môže vytvárať nové alebo mazať či meniť vybrané. Výsledky skriptu teda zostávajú v pracovnom prostredí aj po jeho skončení. Skripty samozrejme môžu volať iné skripty alebo funkcie, vytvárať grafické okná, vypisovať do Command Window, ...

4.2.1. Vytvorenie skriptu

  1. Najskôr musí byť v MATLABe nastavený pracovný adresár (napr. príkazom cd).
  2. Vytvorenie nového alebo otvorenie existujúceho skriptu
    M-súbor, ktorý bude obsahovať skript, vytvoríme napríklad pomocou menu File » New » M-file, čím sa tiež otvorí okno M-editora/Debuggera. Pokiaľ je potrebné opraviť už existujúci skript, musíme ho otvoriť (napríklad pomocou menu File » Open).
  3. Zápis skriptu
    Do prázdneho m-súboru sa zapisujú všetky príkazy, ktoré má skript vykonať - príkazy sa píšu rovnako ako v Command Window, iba s tým rozdielom, že sa po napísaní nevykonávajú. Takto sa vytvára kód skriptu (postupnosť príkazov).
  4. Uloženie skriptu
    Ak je napísaný kód skriptu, musí sa celý m-súbor uložiť pod nejakým menom na disk (do pracovného adresára). Uloženie sa vykonáva pomocou menu File » Save. Meno skriptu musí spĺňať rovnaké pravidlá ako názov premennej. Je to z toho dôvodu, aby MATLAB mohol skript spustiť. Meno m-súboru so skriptom teda môže obsahovať iba písmená anglickej abecedy, podtrhovník a čísla (číslom nesmie začínať).

4.2.2. Spustenie skriptu

Spustenie skriptu dáva MATLABu pokyn k vykonaniu jeho príkazov. Pred spustením musí byť skript uložený! Skript môže byť spustený buď

Príklad 4.1: Skript parabola.m, ktorý kreslí graf funkcie x2
% GRAF - vykreslenie paraboly
x = -3:0.1:3; % vektor hodnôt z intervalu [-3;3] s krokom 0,1
y = x.^2; % závislá premenná
plot(x,y) % graf (parabola) 
Príklad 4.2: Spustenie skriptu parabola.m
>> parabola

Pokiaľ je všetko v poriadku, objaví sa okno s grafom. V opačnom prípade musí byť nájdená a opravená chyba, uložený súbor a jeho opätovné spustenie.

top

4.3. Užívateľské funkcie

Ak sa nejaká postupnosť príkazov (algoritmus) opakuje vo viacerých situáciách (napr. pre rôzne hodnoty premenných), nie je praktické používať skripty, pretože vždy sa musia upraviť hodnoty premenných v skripte, uložiť príslušný m-súbor a skript spustiť. Riešenie ponúkajú funkcie.

Funkcie sú m-súbory, ktoré majú presne definovanú štruktúru (viď. Vytvorenie funkcie). Funkcie akceptujú vstupné parametre, ktoré môžu mať pri každom spustení inú hodnotu.

Každá funkcia má svoje vlastné pracovné prostredie, ktoré je oddelené od pracovného prostredia Command Window. Všetky premenné vo funkcii sú lokálne (existujú iba vnútri funkcie). To znamená, že:

Našťastie existuje spôsob, ktorým funkcia môže svoje výsledky predať "von": výstupné premenné. Počet vstupných aj výstupných parametrov funkcie sa určuje pri jej vytváraní. Pokiaľ funkcia nemá žiadne vstupné parametre, môžu sa jej príkazy napísať tiež ako skript.

Príklad 4.3: Súbor (funkcia) priemer.m
function y = priemer(x)
% PRIEMER stredna hodnota vektora.
% PRIEMER(X), kde X je vektor vrati strednu hodnotu elementov vektora
% Ak vstup nie je vektor, vrati chybu.
[m,n] = size(x);
if (~((m == 1) | (n == 1)) | (m == 1 & n == 1))
error('Vstup musi byt vektor')
end
y = sum(x)/length(x); % Vypočet

4.3.1. Vytvorenie funkcie

  1. Najskôr musí byť v MATLABe nastavený pracovný adresár (napr. príkazom cd).
  2. Otvorenie m-súboru
    Funkcia je m-súbor, a preto sa najskôr musí otvoriť nový súbor: napríklad pomocou menu File » New » M-file. Tým sa otvorí okno M-editora/Debuggeru s prázdnym súborom.
    Poznámka: pokiaľ chceme nejakú existujúcu funkciu opraviť, použijeme menu File » Open.
  3. Zápis funkcie (štruktúra m-súboru obsahujúceho funkciu)
    Prvý riadok obsahuje definíciu funkcie, po ňom môžu nasledovať riadky s nápovedou k funkcii (komentáre) a zvyšok súboru tvoria príkazy (kód funkcie, algoritmus) potrebné na výpočet výstupu funkcie za použitia jej vstupov.
    • Definícia funkcie
      tvorí prvý riadok m-súboru. Má tvar:
      function [výstupy]= názov_funkcie (vstupy)
      kľúčové slovo výstupy funkcie názov funkcie vstupné parametre funkcie

      výstupy:

      • ak ich je viac, oddeľujú sa čiarkou
      • ak je len jeden, zátvorky nie sú nutné
      • funkcie nemusia mať žiadny výstup

      názov_funkcie:

      • názov funkcie by mal vystihovať jej činnosť
      • musí splniť pravidlá pre názov premennej, inak sa funkciu nepodarí spustiť!
      • názov funkcie sa nesmie zhodovať so žiadnym názvom jej premennej!

      vstupy:

      • ak je ich viac, oddeľujú sa čiarkou
      • funkcia nemusí mať žiadny vstup (potom sa podobá skriptu, ale má svoje lokálne workspace!)
      Príklad 4.4: Príklady definovania funkcií
      function [s]=sucet(a,b)
      % funkcia s jedným výstupom a dvoma vstupmi
      
      function [podiel,zvysok] = delenie(delenec,delitel)
      % funkcia s dvoma vstupmi a výstupmi
      
      function f = faktorial(n)
      % funkcia s jedným výstupom a vstupom
      
      function graf(x,y)
      % funkcia bez výstupu a dvoma vstupmi
      
    • Nápoveda k funkcii
      nie je povinnou súčasťou funkcie, ale mala by byť vytvorená, pretože uľahčuje používanie danej funkcie. Nápoveda k funkcii začína druhým riadkom, pokiaľ je tento riadok komentárom. Nápoveda k funkcii končí akýmkoľvek riadkom, ktorý už nie je komentárom (t.j. aj treba prázdnym riadkom).
      Pokiaľ je v m-súbore funkcie uvedená nápoveda, zobrazíme ju príkazom help názov_funkcie.

      Prvý riadok nápovedy by mal obsahovať názov funkcie a vystihovať jej činnosť, pretože je vypisovaný príkazom lookfor slovo (slúží na výpis všetkých funkcií obsahujúcich dané slovo) alebo pri výpise nápovedy k funkciám adresára help adresár (napríklad help C:\temp\matlab).
      Ďalšie riadky nápovedy by mali obsahovať opis vstupu a výstupu funkcie a tiež príklad jej použitia.

    • Kód funkcie
      (algoritmus; príkazy) začína hneď za nápovedou a obsahuje postupnosť príkazov, pomocou nich funkcia vypočíta svoje výstupy. Všetky výstupy funkcie musia byť jej kódom vytvorené, inak je po spustení funkcie ohlásená chyba! Všetky priraďovacie príkazy vnútri funkcie by mali byť ukončené bodkočiarkou (aby funkcia neobťažovala okolie výpisom pomocných premenných).

      Poznámka: na výpis chyby a ukončenie funkcie možno použiť funkciu error, jej parametrom je text chybového hlásenia (napr. error('Chyba: veľa vstupných parametrov!')). Okrem vytvorenia nápovedy k funkcii je vhodné používať tiež komentáre v kóde funkcie (pri jednotlivých príkazoch).

      Príklad 4.5: Funkcia, ktorá vypočíta súčet dvoch čísiel
      function [s] = sucet(a,b)
      % SUCET - sucet dvoch cisiel
      % s=sucet(a,b)
      % a,b ... scitance
      % s ... vysledok (sucet)
      % priklad volania: s=sucet(10,-2.5)
      s = a+b; 
      
      • nápoveda k funkcii obsahuje všetko potrebné pre správne použitie funkcie
      • kód funkcie zaberie síce iba jediný riadok, ale to k vypočítaniu výstupu s stačí
      • priraďovací príkaz vnútri funkcie je ukončený bodkočiarkou, aby funkcia nevypisovala pomocné výpočty
      Príklad 4.6: Funkcia, ktorá vypočíta dĺžku prepony pravouhlého trojuholníka
      function [prep] = prepona(odvesna1,odvesna2)
      % PREPONA - vypočet prepony pravouhleho trojuholnika
      prep = (odvesna1^2 + odvesna2^2)^(1/2); % pouzitie Pythagorovej vety 
      
  4. Uloženie funkcie
    Napísaná funkcia sa musí uložiť na disk ako m-súbor (napr. pomocou menu File » Save). Pri ukladaní je potrebné:
    • skontrolovať pracovný adresár
    • ako názov súboru sa zadáva názov funkcie, pretože názov m-súboru sa musí zhodovať s názvom danej funkcie, inak by funkcia nešla spustiť!
    • po uložení m-súboru zmizne hviezdička za jej názvom v titulkovom pruhu okna M-editora/Debuggeru.

4.3.2. Spustenie funkcie

Funkcie (aj vlastné) môžeme spustiť z Command Window (alebo z iných funkcií či skriptov).
Príkaz na spustenie funkcie vypadá obecne takto:

>> [vystupy] = nazov_funkcie(vstupy)
% pokiaľ je potrebné uložiť výsledky do premenných

>> nazov_funkcie(vstupy)
% pokiaľ sa výsledky neukladajú do premenných

Poznámky:

Príklad 4.7:
>> s = sucet(7,14);

>> vysledok = sucet(7,14)
vysledok =
     21
	 
>> x=7; y=14; sucet(x,y)
ans =
     21

4.3.3. Zobrazenie kódu funkcie

Kód funkcie (t.j. obsah m-súboru) je možné (okrem M-editora/Debuggera) zobraziť v Command Window príkazom type názov_funkcie, kde názov_funkcie je názov funkcie (názov m-súboru bez prípony).

top

4.4. Krokovanie (ladenie) funkcií/skriptov

Pokiaľ sú vo funkcii chyby (napr. nedáva správne výsledky) a nie je možné ich príčinu nájsť jednoduchým prečítaním jej kódu, potom sa používa Debugger, ktorý ponúka možnosť krokovania:

  1. v M-editore sa nastaví breakpoint na nejakom riadku s príkazom jedným z nasledujúcich spôsobov:
    • nastavíme kurzor do riadku, na ktorý chceme umiestniť Breakpoint. Potom nastavíme breakpoint (F12, menu Breakpoints » Set/Clear Breakpoint), alebo
    • klikneme na pomlčku medzi číslom riadku a oknom. Pomlčka za zmení na červený kruh (viď. obrázok)
  2. spustí sa funkcia s jej parametrami (z Command window) - v Command Window sa objaví K>> a v M-editore svieti zelená šípka pred riadkom, ktorý bude následne spracovaný
  3. pomocou F10 (Debug » Step) a F11 (Debug » Step in) sa v M-editore krokuje (spúšťajú sa jednotlivé príkazy) - výsledky sa kontrolujú pomocou myši (pohyb nad názvom premennej, ktorej obsah nás zaujíma) alebo pomocou okna Workspace (kde by mal byť nastavený Stack pre krokovanú funkciu)
  4. výsledkom celého snaženia je nájdenie chyby, jej oprava a uloženie opravenej funkcie
top

4.5. Príkazy a funkcie pre vytváranie vlastných aplikácií

4.5.1. Práca s reťazcami, funkciami a premennými

Funkcia Opis
eval vykoná reťazec z MATLABového príkazu
feval vykoná funkciu so špecifikovaným menom
function pridanie novej funkcie
global definovanie globálnej premennej
nargin počet zadaných vstupných parametrov
nargout počet požadovaných výstupných parametrov

Pomocou funkcie eval umožňuje MATLAB vykonávanie výrazu prostredníctvom reťazca. Vykonávanie funkcií pomocou reťazca umožňuje funkcia feval.

Príklad 4.8:
% Vykonanie výrazu pomocou definovaných premenných
>> a = 2; b = 1;
>> c = '1/(a+b+7)';
>> eval(c)
ans =
	0.1000

% Vytvorenie premenných x1, x2, ..., x5 a priradenie
  druhých mocnín
>> for i=1:5  
  eval(['x',int2str(i),'=i.^2'])
end
x1 =
	1
x2 =
	4
x3 =
	9
x4 =
	16
x5 =
	25

% Možnosť vykonávania rôznych funkcií
>> fun = ['sin';'cos';'log'];
>> k = 1; x = 2;
>> feval(fun(k,:),x) % = sin(x)
ans =
	0.9093

Zistenie počtu skutočných vstupných a výstupných argumentov

Pokiaľ je potrebné, aby "vlastná" funkcia reagovala na rôzny počet vstupných parametrov, môže byť v jej kóde použitá funkcia nargin. Funkcia nargin nemá žiadne vstupy, ale vracia skutočný počet parametrov, s ktorými bola funkcia spustená. Pokiaľ je zavolaná "vlastná" funkcia s menším počtom vstupných argumentov, môže sa spracovať inak ako v prípade plného počtu vstupov.

Poznámka: poradie vstupných parametrov v definícii funkcie je zaväzujúce (napr. ak je vynechaný druhý zo štyroch vstupov, funkcia to pochopí tak, že vynechal ten štvrtý!).

Na zistenie skutočného počtu výstupných parametrov je funkcia nargout. Pracuje sa s ňou podobne ako s funkciou nargin.

Príklad 4.9: Funkcia nargin, nargout - súbor kontrola.m
function [x,y] = kontrola(a,b,c,d)
disp(sprintf('počet zadanych vstupnych argumentov: %d',nargin));
disp(sprintf('počet vyzadovanych vystupnych argumentov: %d',nargout));
x = 2;
y = 3;
Príklad 4.10:
>> [x,y] = kontrola(1,2);
počet zadanych vstupnych argumentov: 2
počet vystupnych argumentov: 2
Príklad 4.11:
>> [x] = kontrola(1);
počet zadanych vstupnych argumentov: 1
počet vystupnych argumentov: 1
Príklad 4.12:
>> kontrola(1);
počet zadanych vstupnych argumentov: 1
počet vystupnych argumentov: 0
Príklad 4.13: Vylepšenie funkcie sucet.m - hlásenie chyby, ak je zavolaná menším počtom parametrov
function [s] = sucet(a,b)
% SUCET - sucet dvoch cisiel
% s=sucet(a,b)
% a,b ... scitance
% s ... vysledok (sucet)
% priklad volania: s=sucet(10,-2.5)
if nargin~=2 % nespravny počet vstupov?
   error('CHYBA: na vypočet su potrebne DVA vstupy!') % vypis chyby a koniec funkcie
end % koniec if
s = a+b; % vypočet vysledku
top

4.6. Riadiace príkazy

Príkaz Opis
break ukončenie vykonávajúceho sa cyklu
else súvisiace s if
elseif súvisiace s if
end ukončenie rozsahu príkazov for, while, switch a if
error zobrazenie správy a ukončenie funkcie
for opakované vykonávanie príkazov so špecifikovaným číslom
if podmienené vykonávanie príkazov
switch podmienené vetvenie príkazov
return návrat do volajúcej funkcie
while podmienené opakovanie vykonávania príkazov

4.6.1. Podmienené vykonávanie príkazov (vetvenie)

Príkaz IF - ELSE

Občas potrebujeme, aby sa určité príkazy vykonali iba v prípade, ak je splnená nejaká podmienka. V MATLABe je k dispozíci príkaz if, ktorý umožnuje vyhodnotiť (otestovať) podmienku, a podľa jej pravdivosti potom vykoná (nebo nevykoná) zadanú množinu príkazov. Jeho základná syntax je:

if podmienka
   príkazy
end

Príkaz začína kľúčovým slovom if, za nim následuje podmienka (ľubovoľný výraz s logickou hodnotou 0 alebo 1 (väčšinou sa v podmienkach používajú relačné alebo binárne logické operátory). Vnutri príkazu if sú akékoľvek príkazy, ktoré sa majú vykonať v prípade splnenia podmienky. Pretože príkazov vnútri if môže byť viac, tak za posledným z nich musíme uviesť kľúčové slovo end, ktoré označuje koniec celého príkazu.

Poznámky:

Príklad 4.14:
>> znamka = 3;
>> if znamka == 1
zobraz = 'Gratulujeme! Lepsie to byt nemohlo!'
end

Poznámka:

Príklad 4.15: Zápis príkazov do jedného riadku
>> znamka = 1; if znamka == 1; zobraz = 'Gratulujeme! Lepsie to byt nemohlo!', end
zobraz =
Gratulujeme! Lepsie to byt nemohlo!
Príklad 4.16: Súbor priklad.m
if a < 5
   disp('hodnota premennej ''a'' je mensia ako cislo 5')
end
Výsledok príkladu 4.16:
>> a = 3;
>> priklad
hodnota premennej 'a' je mensia ako cislo 5
V prípade, že potrebujeme vykonať nejaké príkazy v prípade platnosti podmienky, ale iné príkazy v prípade jej neplatnosti, môžeme použiť vetvu else:
if podmienka
   príkazy1
else
   príkazy2
end

Činnosť príkazu if-else: najskôr sa testuje podmienka. Ak je pravdivá, vykonajú sa príkazy1, ak je nepravdivá, vykonajú sa príkazy2. Vždy sa teda vykoní jedna skupina príkazov.

Príklad 4.17: Súbor priklad1.m
if a < 5
   disp('hodnota premennej ''a'' je mensia ako cislo 5')
else
   disp('hodnota premennej ''a'' je vacsia alebo rovnaká ako cislo 5')
end
Výsledok príkladu 4.17:
>> a = 9;
>> priklad1
hodnota premennej 'a' je vacsia alebo rovnaká ako cislo 5

Z predchádzajúceho príkladu je vidieť, že niekedy može byť vhodné v prípade neplatnosti podmienky testovat tiež iné možnosti. Na splnenie tohto cieľa stačí vnoriť ďalší príkaz if do vetvy else. Existuje aj pohodlnejší prostriedok ako vnorenie - rozšírená syntax príkazu if:

if podmienka1
   príkazy1
elseif podmienka2
   príkazy2
else
   príkazy3
end

Poznámka:

Včeobecná činnosť príkazu if: najskôr sa testuje pravdivosť podmienky1. Pokiaľ platí, vykonajú sa príkazy1 a ostatné vetvy príkazu sú ignorované. Pokiaľ podmienka1 neplatila, začne sa testovať podmienka2. Ak platí, vykonajú sa príkazy2 a zvyšok vetvy je ignorovaná. Ak neplatí, pokračuje sa ďalšej vetve elseif (ak ešte nejaká je) ... V prípade, že ani jedna z podmienok neplatila, sú vykonané príkazy vo vetve else (ak je definovaná).

Príklad 4.18: Funkcia vetvenie1.m
function text = vetvenie1(x)
n = length(x);
if n == 0
  error('Vektor je prázdny');
elseif n < 3
  text = 'Vektor má 1 alebo 2 prvky';
elseif n >= 3 & n < 5
  text = 'Vektor má 3 alebo 4 prvky';
else
  text = 'Vektor má viac ako 4 prvky';
end
Výsledok príkladu 4.18:
>> a = 1;
>> b = vetvenie1(a)
b =
Vektor má 1 alebo 2 prvky

>> a = [1 2 3];
>> disp(vetvenie1(a))
Vektor má 3 alebo 4 prvky

>> a = [1 2 3 4 5 6];
>> vetvenie1(a)
ans =
Vektor má viac ako 4 prvky

Príkaz SWITCH

Príkaz vetvenia switch má takmer rovnaký význam ako if, ale môže niekedy zjednodušiť skript. Vďaka tomuto príkazu sa dajú nahradiť dlhé príkazy if. Vetva skriptu je daná hodnotou jedného výrazu. Príkazy za otherwise sa vykonajú, pokiaľ výraz neodpovedá žiadnej podmienke.

switch výraz
  case podmienka1, 
    príkazy1
  case podmienka2, 
    príkazy2
  ...
  case podmienkaN, 
    príkazyN
  otherwise,
    príkazy
end

Pokiaľ je výraz == podmienka1 pravdivý, potom sa vykonajú príkazy1 a ostatné vetvy príkazu sú ignorované. Pokiaľ podmienka1 neplatila, začne sa testovať výraz == podmienka2. Ak platí, vykonajú sa príkazy2 a zvyšok vetvy je ignorovaná. Ak neplatí, pokračuje sa ďalšej vetve case (ak ešte nejaká je) ... V prípade, že ani jedna z podmienok neplatila, sú vykonané príkazy vo vetve otherwise (ak je definovaná).

Príklad 4.19: Funkcia vetvenie2.m
function text = vetvenie2(x)
n = length(x);
switch n
  case 0
    error('Vektor je prázdny');
  case {1,2}
    text = 'Vektor má 1 alebo 2 prvky';
  case {3,4}
    text = 'Vektor má 3 alebo 4 prvky';
  otherwise
    text = 'Vektor má viac ako 4 prvky';
end
Výsledok príkladu 4.19:
>> a = 1;
>> b = vetvenie2(a)
b =
Vektor má 1 alebo 2 prvky

>> a = [1 2 3];
>> disp(vetvenie2(a))
Vektor má 3 alebo 4 prvky

>> a = [1 2 3 4 5 6];
>> vetvenie2(a)
ans =
Vektor má viac ako 4 prvky

4.6.2. Podmienené opakovanie vykonávania príkazov (cykly)

Cyklus slúži na zápis príkazov, ktoré majú byť vykonávané opakovane (nekoľkokrát za sebou). Počet opakovaní týchto príkazov závisí od nejakej podmienky alebo môže byť dopredu známy. Preto existujú dva základne typy cyklov:

Príkazy vnútri cyklu sa nazývajú telo cyklu.

Cyklus riadený podmienkou - WHILE

Cyklus riadený podmienkou používame, pokiaľ chceme niekoľkokrát vykonať určité príkazy, ale dopredu nepoznáme počet opakovaní, ale poznáme podmienky, za ktorých sa príkazy vykonávať majú. Táto podmienka sa nazýva riadiaca podmienka cyklu. V MATLABe je tento druh cyklov realizovaný príkazom while.

Cyklus while začína kľúčovým slovom while a končí kľúčovým slovom end:

while podmienka
  príkazy
end

Poznámky:

Činnosť cyklu je možné vyjadriť vetou: Pokiaľ platí podmienka, vykonávaj príkazy.

Na začiatku sa testuje platnosť riadiacej podmienky. Pokiaľ podmienka platí (t.j. výraz má nenulovú hodnotu), vykonajú sa všetky príkazy tela cyklu. Potom sa opäť testuje podmienka a pokiaľ platí, vykonajú sa opäť všetky príkazy tela cyklu atď., pokiaľ sa pri testovaní podmienky nezistí, že podmienka neplatí (t.j. hodnota výrazu je nulová). Vtedy cyklus skončí, t.j. pokračuje sa vykonávaním príkazu za jeho koncom (ktorý je označený kľúčovým slovom end), pokiaľ tam nejaké sú.

Koniec cyklu môže nastať už pri prvom teste podmienky (ak je nulová), takže sa môže stať, že príkazy v tele cyklu sa nevykonajú ani raz.

Pretože sa podmienka testuje opakovane a závisí na ej ukončenie cyklu, mali by sa dodržiavať následujúce doporučenia: riadiaca podmienka cyklu by mala byť ovplivňovaná vykonávaním príkazov v tele cyklu tak, aby raz prestala platiť. Inak cyklus nikdy neskončí (nekonečný cyklus). Pokiaľ chceme ukončiť vykonávanie nekonečného cyklu, stlačíme CTRL+C.

Príklad 4.20: Nekonečný cyklus
while 1  % podmienka je vždy pravdivá, má stále hodnotu 1
  disp('opakujem...')
end
Príklad 4.21: Funkcia fakt1.m
function f = fakt1(n)
% FAKT1 - vypočet faktorialu celeho cisla
% f = fakt1(n)
% n ... cislo
% f ... faktorial (f=n!)

if n<0
  error('faktorial neexistuje')
end
f = 1; 
while n>1 
  f = f*n; 
  n = n-1;
end
Výsledok príkladu 4.21:
>> f = fakt1(5)
f =
        120.00
		
>> fakt1(0)
ans =
          1.00
		  
>> f = fakt1(-5)
??? Error using ==> fakt1
faktorial neexistuje

Cyklus so známym počtom opakovaní (iteračný cyklus) - FOR

Tento cyklus používame, keď dopredu vieme, koľkokrát sa majú vykonať určité príkazy. Počet opakovaní je väčšinou daný vektorom, z ktorého si v každej iterácii (t.j. pri každom prechode cyklom) vezmeme jednu hodnotu - hodnota je uložená v tzv. riadiacej premennej cyklu. V MATLABe je tento druh cyklu realizovaný príkazom for.

Cyklus for začína kľúčovým slovom for a končí kľúčovým slovom end:

for premenná = výraz
  príkazy
end

Poznámky:

Činnosť cyklu je možné vyjadriť vetou: n-krát vykonať príkazy (n je dĺžka výrazu, t.j. počet prvkov vektora alebo počet stĺpcov matice).
Na začiatku sa zistí dĺžka (n) výrazu a pokiaľ je nenulová, n-krát sa vykoná telo cyklu (príkazy). V každej iterácii je riadiaca premenná cyklu rovná jednému prvku vektora (začína sa prvým prvkom a pokračuje sa po rade). Po vyčerpaní všetkých hodnôt vektora cyklus skončí, tzn. pokračuje sa vykonávaním príkazu za jeho koncom (ktorý je označený kľúčovým slovom end), pokiaľ tam nejaké sú.

Koniec cyklu môže nastať predčasne, pokiaľ je v tele cyklu obsiahnutý príkaz break alebo return.

Príklad 4.22: Skript fakt2.m
k = 1;
for i=1:5 
  k = k*i;
  sprintf('%d! = %d',i,k)
end
Výsledok príkladu 4.22:
>> fakt2
ans =
1! = 1
ans =
2! = 2
ans =
3! = 6
ans =
4! = 24
ans =
5! = 120
Príklad 4.23: Naplnenie matice súčinom jej súradníc - skript matica.m
n = 3;   % Pocet stlpcov 
m = 2;   % Pocet riadkov 
for i=1:m
  for j=1:n
    A(i,j) = i*j
  end
end
Príklad 4.24:
>> matica
A =
          1.00
A =
          1.00          2.00
A =
          1.00          2.00
          2.00             0
A =
          1.00          2.00
          2.00          4.00
A =
          1.00          2.00
          2.00          4.00
          3.00             0
A =
          1.00          2.00
          2.00          4.00
          3.00          6.00
top

4.7. Príkazy pre užívateľský vstup

Príkaz Opis
input žiadosť o vstup z klávesnice
keyboard funkcia preruší chod programu pre príkazy z príkazového riadku
menu funkcia umožňujúca výber cez menu, ktorá vracia poradie vybranej položky
pause čakanie na stlačenie klávesy
Príklad 4.25: Načítanie veľkosti vektora z klávesnice
>> dlzka = input('Zadaj velkost vektora: ')
Zadaj velkost vektora: 4
dlzka =
  4
Príklad 4.26: Súbor klavesnica.m - Použitie keyboard
disp('Zaciatok')
keyboard
disp('Koniec')
Výsledok príkladu 4.26:
>> klavesnica
Zaciatok
K>> c = 1
c =
          1.00
K>> b = 2
b =
          2.00
K>> return
Koniec
>> 
Príklad 4.27: Vytvorenie menu pre výber krivky
k = menu('Vyber krivky','Priamka','Parabola','Exponenciala')
Výsledok príkladu 4.27:

Výsledok príkladu 4.27: Výsledok po kliknutí na položku 'Parabola'
k =
          2.00
top

4.8. Úlohy

  1. Vytvorte:
    • matematickú funkciu v tvare y = x*sin(x)+cos(2*x).
    • funkciu, ktorej výstupnou hodnotou budú spoločné prvky dvoch vektorov (vektory » argumenty funkcie), napr. [1 3 4] a [2 4 5] majú spoločný prvok 4.
    • funkciu, ktorá vypočíta faktoriál zadaného čísla (číslo » argument funkcie). Ak použijeme funkciu bez argumentov, potom uvažujte číslo=1.
    • funkciu, ktorá vytvorí maticu zadaných rozmerov (rozmery matice » argumenty funkcie). Ak použijeme funkciu iba s jednym parametrom, potom funkcia vytvorí štvorcovú maticu. Ak použijeme funkciu bez parametrov, potom funkcia vytvorí štvorcovú maticu 5x5. Jednotlivé prvky matice budú definované poradovým číslom bunky (1 až N).
    • funkciu, ktorá vytvorí štvorcovú maticu zo zadaným rozmerom (rozmer matice » argument funkcie), kde na diagonále budú čísla 1 až N. Mimo diagonály budú čísla rovné 0.
  2. Vytvorte m-súbor v ktorom:
    • definujte vektor mince s hodnotami 1, 2, 5 a 10
    • v cykle, pomocou funkcie eval a vektora mince, vytvorte premenné minca1, minca2, minca5, minca10, ktoré naplňte príslušnou hodnotou (1, 2, 5, 10)
  3. Vytvorte malú aplikáciu pre načítanie a zobrazenie údajov pomocou menu, ktorá by obsahovala:
    • hlavné menu s položkami Inicializácia, Zobrazenie a Koniec
    • sa otvorí nové menu s ponukou nastavenia farby zobrazenia
    • výberom položky Inicializácia sa otvorí nové menu s ponukou:
      • sin
      • cos
      Výberom jednej z položiek sa vytvoria vektory t=[0:0.1:2pi] a y=sin(t), resp. y=cos(t)
    • výberom položky Zobrazenie sa otvorí nové menu s ponukou farby:
      • červená
      • modrá
      • čierna
      • fialová
      Výberom jednej z položiek sa vykreslí priebeh údajov so zvolenou farbou (príkaz plot(t,y,'farba'))
    • výberom položky Koniec sa aplikácia ukončí
    Poznámka: aby sa ponuka po výbere opäť zobrazila, použite nekonečný cyklus. Cyklus sa ukončí výberom položky Koniec.
top