% ******************* MATEMATICKÝ SEMINÁŘ č. 8 ************************
% 8.1. INTERAKCE S PROGRAMEM
% 8.2. LADĚNÍ (DEBUGGING)
%
% 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

%======================================================================
% 8.1. INTERAKCE S PROGRAMEM
%----------------------------------------------------------------------
%% Interaktivní vstup:
%%
%% A=input(prompt) ... Při provádění tohoto příkazu je obsluha zprávou
%%                     v textovém řetězci prompt vyzvána k vložení matice A;
%%                     A může být vložena ve formě libovolného maticového
%%                     výrazu. Vložení je zakončeno klávesou RETURN.
%%
%% t=input(prompt,'s') ... Vkládaná posloupnost znaků je uložena do t ve
%%                         formě textového řetězce, ale
%%                         bez ukončovací klávesy RETURN=CR=13. 
%%
%% Jen klávesa RETURN => A, resp t je prázdná matice.
%% V řetězci prompt lze používat libovolný počet escape znaků \n ve významu
%% přechodu na nový řádek.
  
A=[];
  while any(size(A)-[2,3])
        A=input('Vložte matici 2 x 3: ')
     end
  pause;
%----------------------------------------------------------------------
% Typické použití pro vyžádání odpovědi typu ano/ne (Ne=implicitní vstup):
  vstup='';
  while ~strcmp(upper(vstup),'A')
        vstup=input('Chcete ukončit nekonečný cyklus (a/N)? ','s')
  end
keyboard;


%% Výběrová menu
%%
%% k=menu('Titulek menu','Volba_1','Volba_2',...,'Volba_n') ... 
%%
%% ... k=obsluhou zadané pořadové číslo v zobrazeném seznamu voleb
%%     nabídky

  k = menu('Choose a color','Red','Blue','Green')


%% keyboard ... Předá řízení klávesnici, která se chová jako dávkový
%%              m-soubor (script m-file). Tento režim je indikován
%%              promptem ve tvaru K>>.
%%              Je-li příkaz použit uvnitř funkční procedury, pak
%%              v režimu 'keyboard' jsou přístupné všechny lokální proměnné.
%%              Jejich hodnoty odpovídají místu provedení příkazu
%%              'keyboard' a mohou být prohlíženy i měněny.
%%
%% return  ...  Ukončení režimu 'keyboard'.
%%
%%  Například v tomto dávkovém souboru je příkaz 'keyboard' použit
%%  za každou tematickou skupinou popisovaných příkazů, aby umožnil
%%  jejich aktivní procvičení.

%% pause     ... pozastaví provádění m-souboru až do stisku libovolné klávesy
%% pause(n)  ... pozastaví provádění m-souboru na n sekund
%% pause off ... deaktivuje příkazy pause a pause(n) ... ignorují se
%% pause on  ... aktivuje příkazy pause a pause(n)
%%               - implicitní stav
%%
%% more     ... řídí stránkování při výstupu na display takto:
%% more off ... stránkování vypnuto=souvislý výstup
%%              (implicitní stav po spuštění MATLABu)
%% more on  ... zapnout stránkování
%%              ovládání: klávesa RETURN => další řádek
%%                        mezerník       => další stránka
%%                        q              => předčasné ukončení výstupu
%% more(N)  ... zapne stránkování a nastaví velikost stránky na N řádků
%%              (implicitně N=23 po spuštění MATLABu)

  more off
  fix(clock), pause(5); fix(clock)
  pause off
  fix(clock), pause(5); fix(clock)
  pause on
pause;
%----------------------------------------------------------------------
  more(5)
  type kron
  more(23)
keyboard;

%======================================================================
% 8.2. LADĚNÍ (DEBUGGING)
%----------------------------------------------------------------------
%%    Malými písmeny značíme pevná klíčová slova příkazů,
%%    velkými písmeny parametry příkazů.
%%
%% 1. Elementární metody
%%    ==================
%% a) Výpis mezivýsledku u vybraných příkazů
%%    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%%    Tyto příkazy ukončíme čárkou (,) místo standardně používaného
%%    středníku (;).
%%
%% b) Monitorování posloupnosti prováděných příkazů
%%    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%%    (1) v dávkových m-souborech (script m-file)
%%        ---------------------------------------
%%        echo on  ... zapne výpis
%%        echo off ... vypne výpis (implicitní stav)
%%        echo     ... přepne stav z on->off nebo z off->on
%%        Působnost pro všechny dávkové soubory.
%%
%%    (2) ve funkčních m-souborech
%%        ------------------------
%%        echo MFILE on  ... zapne výpis jen pro funkci MFILE
%%        echo MFILE off ... vypne výpis jen pro funkci MFILE (implicitní stav)
%%        echo MFILE     ... přepne z on->off nebo z off->on jen pro
%%                           funkci MFILE
%%        echo on  all   ... zapne výpis pro všechny funkce
%%        echo off all   ... vypne výpis pro všechny funkce
%%
%% c) Využití klávesnicového režimu 'keyboard' (viz 1. výše)
%%    m-soubor:
%%    -------------
%%    |           |         prompt K>> předá řízení obsluze, která se ocitne
%%    |           |         v prostředí m-souboru se stavem proměnných
%%    |           |         (i lokálních) odpovídajícím okamžiku přerušení
%%    | keyboard  | -->K>>  příkazem 'keyboard'.
%%    |           |         Obsluha může zjistit nebo i měnit okamžitě hodnoty
%%    |           |         proměnných.
%%    |           |         Pokračování příkazem 'return'.
%%    -------------
%%
%% 2. Ladící prostředí (jen pro funkční m-soubory)
%%    ============================================
%% a) Příprava ladění
%%    ~~~~~~~~~~~~~~~
%%    (1) dbtype MFILE       ... výpis všech řádku funkce MFILE 
%%                               s očíslovanými řádky.
%%        dbtype MFILE R1:R2 ... vypíší se jen řádky s pořadovými čísly
%%                               R1 až R2.
%%
%%    (2) dbstop at LINE in MFILE ... určení bodů zastavení (breakpoint)
%%                                    před řádkem LINE ve funkci MFILE.
%%                                    Všechny proměnné jsou v okamžiku
%%                                    zastavení přístupné stejně jako
%%                                    v režimu 'keyboard'.
%%        dbstop in MFILE ... určení bodů zastavení na začátku funkce
%%                            MFILE, tj. před jejím prvým výkonným příkazem.
%%        dbstop if error ... zastavení ve všech funkcích při vzniku chyby,
%%                            v tomto případě lze zjistit hodnoty proměnných,
%%                            ale nelze pokračovat v ladění.
%%        dbstop if naninf...
%%        dbstop if infnan... zastavení ve všech funkcích při výskytu hodnoty
%%                            NaN nebo Inf.
%%        !POZNÁMKA! Při změně souboru MFILE (změna datumu vzniku) nebo
%%                   po příkazech clear MFILE, clear functions, clear all
%%                   se všechny nastavené body zastavení zruší. 
%%                   (viz také dále (4) - příkaz dbclear).
%%
%%    (3) dbstatus MFILE ... výpis všech bodů zastavení funkce MFILE
%%
%%    (4) dbclear at LINE in MFILE ... zrušení specifikovaných bodů zastavení
%%                                     funkce MFILE.
%%        dbclear all in MFILE ... zrušení všech bodů zastavení funkce MFILE.
%%        dbclear all          ... zrušení všech bodů zastavení ve všech
%%                                 funkcích.
%%        dbclear in MFILE ... zrušení bodů zastavení na začátku funkce MFILE.
%%        dbclear if error ... zrušení zastavení při vzniku chyby.
%%        dbclear if naninf...
%%        dbclear if infnan... zrušení zastavení při výskytu hodnoty NaN
%%                             nebo Inf.
%%
%% b) Řízení ladění
%%    ~~~~~~~~~~~~~
%%    Během vlastního ladění lze měnit podmínky ladění s využitím příkazu
%%    (1) až (4) a navíc jsou k dispozici následující příkazy:
%%
%%    (5) dbstack ... výpis zásobníku (stack) posloupnosti volání počínaje
%%                    jménem funkce, v níž došlo k zastavení, pak funkce,
%%                    která ji volala, atd.
%%    (6) dbup   ... přepnutí do prostředí volající funkce (následující
%%                   v zásobníku volání).
%%    (7) dbdown ... přepnutí do prostředí volané funkce (předcházející
%%                   v zásobníku volání).
%%    (8) dbstep    ... provedení následujícího příkazového řádku,
%%                      krokovat lze pouze po řádcích, nikoliv po
%%                      jednotlivých příkazech v řádku.
%%                      Volání funkce se nekrokuje (viz dále dbstep in).
%%        dbstep NR ... provedení následujících NR příkazových řádků.
%%        dbstep in ... je-li následující příkaz volání funkce, vstoupí
%%                      se do ní a provede se její první příkazový řádek.
%%    (9) dbcont    ... odstartuje pokračování (continue) provádění přerušené
%%                      funkce od následujícího příkazového řádku až po
%%                      případný další bod zastavení.
%%   (10) dbquit    ... přerušení ladění: funkce se nedokončí a provede se
%%                      návrat do normálního příkazového režimu.
%%                      Nastavené body zastavení zůstávají v platnosti.

echo on
%  K procvičení metod ladění jsou připraveny tři jednoduché funkce
%  't0.m', 't1.m' a 't2.m':
                  
   dbtype t0; dbtype t1; dbtype t2;
pause;
%----------------------------------------------------------------------
%  Vidíme, že 't0' volá 't1' a ta zase 't2'.
%  Funkce 't0' má jako vstupní parametr vektor b. Je-li jeho délka n, pak
%  výstupem je čtvercová matice a rozměru n x n, jejíž k-tý řádek
%  má identické prvky určené zaokrouhlenou hodnotou b(k) zvětšenou
%  procedurou 't1' o 0.1 a následně procedurou 't2' o 0.01.
   b=10*rand(1,4)
   a=t0(b)
   
pause;
%----------------------------------------------------------------------
%  Vyzkoušejte na funkcích 't0','t1' a 't2' všechny metody ladění.
%  Zejména si vyzkoušejte všechny ladící příkazy db... .
%  Vhodné je dát bod zastavení např. před příkaz v cyklu funkce 't0',
%  tj.:
   dbstop at 7 in t0
   dbstatus t0
   pause
%  V dalším ladění již pokračujte sami.
      
                   
%================================= KONEC ==============================
%
%
%%
more off
echo off
