% ******************* MATEMATICKÝ SEMINÁŘ č. 7 ************************
% 7.1. M-SOUBORY
% 7.2. VĚTVENÍ BĚHU PROGRAMU
% 7.3. CYKLY V PROGRAMU
%
% Copyright (C) 1996-2003 by V. Veselý (Masaryk University Brno, Czech Republic)
%
% Dávka je kompletně upravena pro menu-systém.

echo on
more on
format compact
clc
%======================================================================
% 7.1. M-SOUBORY
%----------------------------------------------------------------------
%% Charakteristika m-souboru (m-file)
%% - ASCII soubor "jmeno.m": přípona .m je povinná.
%% - jmeno=název nového povelu, jehož vyvoláním se provedou příkazy
%%   uvnitř m-souboru "jmeno.m".
%% - Připouští se rekurzivní volání sama sebe uvnitř těla m-souboru.
%%
%% Existují 2 základní typy m-souborů:
%% 1) Dávkové m-soubory (tzv. script m-file)
%%    --------------------------------------
%%    Struktura:
%%    *********************************************************************
%%    % 1.řádek nápovědy pro help   \
%%    % 2.řádek nápovědy             |
%%      .                            |
%%      .                             > úvodní poznámky vypisované
%%      .                            |  při help jmeno
%%    % předposlední řádek nápovědy  |
%%    % poslední řádek nápovědy     /
%%      příkaz_1;    % poznámka     \
%%      příkaz_2;                    |
%%      % poznámka                   |  vlastní výkonné příkazy libovolně
%%         .                          > zakončené nebo proložené poznámkami
%%         .                         |  komentujícími program
%%         .                         |
%%      příkaz_n;                   /
%%    *********************************************************************
%%    Použití: Nahrazují zdlouhavé provádění určité sekvence povelů z
%%             příkazové řádky.
%%             Tedy efekt je stejný, jako kdyby všechny příkazy
%%             dávkového m-souboru byly provedeny přímo z příkazové řádky.
%%             Zejména všechny proměnné vzniklé při běhu dávky jsou
%%             po jejím provedení přístupné z příkazové řádky.
%%    Příkladem dávkových souborů jsou například demonstrační soubory
%%    dav1.m, dav2.m, ...
%    Např. pro tento soubor, který je právě spuštěn:
help Dav7;     % Nápověda
keyboard;

%% 2) Funkční m-soubory (tzv. function m-file)
%%    ----------------------------------------
%%    Struktura:
%%    *********************************************************************
%%    function [y_1,y_2,...,y_m]=jmeno(x_1,x_2,...,x_n)
%%    % 1. řádek nápovědy pro help   \
%%    % 2. řádek nápovědy             |
%%      .                             |
%%      .                              > úvodní poznámky vypisované
%%      .                             |  při help jméno
%%    % předposlední řádek nápovědy   |
%%    % poslední řádek nápovědy      /
%%      příkaz_1;    % poznámka       \
%%      příkaz_2;                     |
%%      % poznámka                    |  vlastní výkonné příkazy libovolně
%%         .                           > zakončené nebo proložené poznámkami
%%         .                          |  komentujícími program
%%         .                          |
%%      příkaz_n;                    /
%%
%%    *********************************************************************
%%
%%    Použití: - Chovají se jako funkční procedura s možností přebírat
%%               vstupní  parametry  x_1,x_2,...,x_n a vracet
%%               výstupní parametry  y_1,y_2,...,y_m.
%%
%%             - Od dávkového souboru se formálně liší pouze úvodním
%%               deklaračním řádkem přidaným před úvodní nápovědu.
%%
%%             - Všechny proměnné uvnitř procedury jsou v ní pouze
%%               LOKÁLNÍ, tj. při volání funkce se automaticky alokují a
%%               po provedení naopak zaniknou (jsou automaticky
%%               odalokovány z paměti). Výjimku tvoří pouze tzv. globální
%%               proměnné uvedené v seznamu příkazu global, které mohou
%%               být sdíleny všude, kde jsou takto deklarovány pod stejnými
%%               jmény, tj. v jiných m-souborech nebo z příkazové řádky.
%%               (např. global x y z  deklaruje proměnné x,y a z jako
%%                globální)
%%
%%             - Po prvém spuštění je funkční m-soubor předkompilován a
%%               uložen v paměti, což urychluje jeho provádění při dalším
%%               volání.
%%               Příkazem clear lze tuto paměť zabíranou předkompilací
%%               uvolnit:
%%
%%               clear jmeno1 jmeno2 ... uvolní vyjmenované funkce
%%               clear functions     ... uvolní všechny funkce
%%               clear all           ... uvolní proměnné i funkce
%%               clear global        ... odalokuje pouze všechny globální
%%                                      proměnné
%%
%%    Skutečné vstupní a výstupní parametry nemusí být při volání zadány
%%    všechny, ale vždy je dovoleno vynechat pouze souvislý koncový úsek.
%%    Všechny výstupní parametry jsou na počátku funkce automaticky
%%    deklarovány jako prázdné matice. Na výstup se vrací poslední hodnota
%%    jim přiřazená za běhu procedury, resp. [], pokud nebylo přiřazeno nic.
%%    Např. povolené volání je
%%    [v_1,v_2] = jmeno(a_1,a_2,a_3)
%%    nebo
%%    jmeno(a_1,a_2,a_3) ... = hodnota 1. výstupního parametru
%%
%%    Faktické ošetření korektnosti volání musí zajistit procedura
%%    sama, většinou v úvodní části.
%%
%%    K tomu slouží
%%    1) předdeklarované  proměnné:
%%       nargin  = počet skutečně předaných vstupních  parametrů
%%       nargout = počet skutečně požadovaných výstupních parametrů
%%    2) error(t) ... je-li t neprázdný textový řetězec, pak
%%                    provádění procedury se ukončí a text t se
%%                    vypíše jako chybové hlášení
%%       error('') nebo error([]) ... neprovede nic
%%    3) t=nargchk(n1,n2,n) ... kontrola, zda n1<=n<=n2
%%       t=[]                          ... když ano
%%       t='Not enough input arguments'... když n<n1
%%       t='Too many input arguments  '... když n>n2
%%       Typické použití jako prvý výkonný řádek funkce, např.:
%%       error(nargchk(2,3,nargin)) ... kontrola, zda funkce byla volána
%%                                      s alespoň dvěma povinnými a
%%                                      nejvýše třemi deklarovanými parametry
%%    4) Příkazy větvení if-then-else-elseif-end popsané v další
%%       části, kterými testujeme další podmínky, např. zda matice je
%%       čtvercová.
%%    5) Příkaz return ... legální předčasné ukončení funkce ještě před
%%                         dosažením jejího konce, kdy je ukončena automaticky
%%    6) Za nepovinné parametry dosadíme vhodné implicitní hodnoty.
%%       Doporučuje se přijmout tuto konvenci:
%%       Je-li nepovinný vstupní parametr x_i prázdna matice, procedura
%%       za něj dosadí implicitní hodnotu, jako kdyby byl vynechán.
%    Typická struktura (zejména úvodní části) funkce se doporučuje
%    v následujícím tvaru:
  type dav7f
pause;
%----------------------------------------------------------------------
  help dav7f
keyboard;
%======================================================================
% 7.2. VĚTVENÍ BĚHU PROGRAMU
%----------------------------------------------------------------------
%% 1) Větvení programu pomocí konstrukcí if-then-else-elseif-end:
%%    if-end
%%    if-else-end
%%    if-elseif-elseif-...-end
%%    if-elseif-elseif-...-else-end
%%
%%    Např.
%%    if podmínka1
%%       p1_1;p1_2;...
%%    elseif podmínka2
%%           p2_1;p2_2;...
%%        else
%%           p3_1;p3_2;...
%%    end
%%
%%    Větvící bloky lze do sebe vnořovat, takže předchozí konstrukci
%%    lze ekvivalentně zapsat také takto:
%%
%%    if podmínka1
%%       p1_1;p1_2;...
%%    else if podmínka2
%%            p2_1;p2_2;...
%%         else
%%            p3_1;p3_2;...
%%         end
%%    end
%%
%%  Podmínka1,2 jsou maticové výrazy.
%%  Podmínka je splněna, právě když všechny prvky maticového výrazu jsou
%%  nenulové (=logické 1).

  A=round(10*rand(5,5))

%      Provedeme následující cyklus:
%
%  if A<5
%     disp('Všechny prvky A jsou menší než 5')
%  elseif A<6
%     disp('Všechny prvky A jsou menší než 6')
%      else
%     disp('Alespoň jeden prvek A je větší nebo roven než 6')
%  end

if A<5
     disp('Všechny prvky A jsou menší než 5')
  elseif A<6
     disp('Všechny prvky A jsou menší než 6')
      else
     disp('Alespoň jeden prvek A je větší nebo roven než 6')
  end

%%  2) Větvení programu pomocí konstrukce switch:
%%     switch v
%%        case h_1
%%           p1_1; p1_2;...p1_n1;
%%        case h_2
%%           p2_1; p2_2;...p2_n2;
%%               :
%%               :
%%        case h_m
%%           pm_1; pm_2;...pm_nm;
%%        otherwise
%%           po_1; po_2;...po_no;
%%     end;
%%
%%     v,h_1,h_2,...,h_m jsou skalární výrazy a to buďto všechny numerické
%%     nebo všechny typu řetězec. Počet skupin case může být libovolný,
%%     skupina otherwise může chybět. Je-li v==hi pro numerické výrazy,
%%     respektive strcmp(v,hi) pro řetězce, provede se posloupnost příkazů
%%     pi_1,pi_2,...,pi_ni.
%%
%%     Platí-li v==h_j resp. strcmp(v,h_j) pro několik výrazů h_j, provedou
%%     se příkazy pi_1,pi_2,...pi_ni pro i nejmenší z takových j. Pokud je
%%     výraz v==hi resp. strcmp(v,hi) nepravdivý pro všechna i, provede
%%     se skupina příkazů po_1,po_2,...,po_no, pokud skupina otherwise
%%     existuje, nebo se neprovede nic, pokud skupina otherwise neexistuje.
%%     Pokud i-tou skupinu zapíšeme jako
%%
%%        case {hi_1,hi_2,...,hi_ki}
%%           pi_1; pi_2;...pi_ni;
%%
%%     pak se příkazy pi_1,pi_2,...pi_ni provedou, pokud je pravdivý alespoň
%%     jeden z výrazů v==hi_1,v==hi_2,...,v==hi_ki resp. strcmp(v,hi_1),
%%     strcmp(v,hi_2),...,strcmp(v,hi_ki).

  s='st'

%   Provedeme následující konstrukci:
%
%  switch  s
%     case 'po'
%        disp('pondělí')
%     case {'ut','st','ct'}
%        disp('úterý nebo středa nebo čtvrtek')
%     case 'pa'
%        disp('pátek')
%     otherwise
%        disp('sobota nebo neděle')
%  end;

  switch  s
     case 'po'
        disp('pondělí')
     case {'ut','st','ct'}
        disp('úterý nebo středa nebo čtvrtek')
     case 'pa'
        disp('pátek')
     otherwise
        disp('sobota nebo neděle')
  end;


  keyboard;

%======================================================================
% 7.3. CYKLY V PROGRAMU
%----------------------------------------------------------------------
%% Cyklus typu 'for':
%%
%% for x=A
%%     p_1;p_2;...
%% end
%%
%% Proměnná cyklu nabývá hodnot sloupců matice A

  A=round(10*rand(5,5))

  for x=A,
    x.',   %postupně vypisujeme transponované sloupce matice A
    pause;
  end

%% Cyklus typu 'while':
%%
%% while podmínka
%%     p_1;p_2;...
%% end
%%
%%  Podmínka je maticový výraz
%%
%%  Podmínka je splněna, právě když všechny prvky maticového výrazu jsou
%%  nenulové (=logické 1).
%%
%%  Z cyklu lze předčasně vyskočit za první příkaz za ním pomocí
%%  příkazu 'break'.

  konec=0;
  n=0;

%  Spouštíme následující cyklus:
%
%  while ~konec
%        konec=input('Ukončit smyčku (ano=1,ne=0): ');
%        n=n+1;
%        if n>10, break; end
%  end

  while ~konec
        konec=input('Ukončit smyčku (ano=1,ne=0): ');
        n=n+1;
        if n>10, break; end
  end
  disp('Konec cyklu');
  n
  pause;

% Příklad k samostatnému řešení:
%
% Napište funkci 'detlap' pro výpočet determinantu pomocí Laplaceovy věty,
% tedy například rozvojem podle prvků prvního řádku.
% Správnost zkontrolujte pomocí 'det'.
% Ladění je pohodlnější, jestliže editaci provádíte v paralelním
% okně. Editor může zůstat stále otevřený.
% Před každým spuštěním funkce po opravě je třeba změny uložit.

%================================= KONEC ==============================
%
%
%%
more off
echo off
