% ******************* MATEMATICKÝ SEMINÁŘ č. 6 ************************
% 6.1. PRÁCE S TEXTOVÝMI ŘETĚZCI
% 6.2. ZNAKOVÉ KONVERZE ČÍSEL
% 6.3. DATUM, ČAS
%
% 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

%======================================================================
% 6.1. PRÁCE S TEXTOVÝMI ŘETĚZCI
%----------------------------------------------------------------------
%% A=double(T)  ... převod textové matice T na číselnou matici A   
%% T=char(A)    ... převod číselné matice A na textovou matici T   
%% ischar(A)  = 1 když A je textová matice                         
%%            = 0 jinak
%% X=isletter(A) <=> X(r,s)=1 jestliže A(r,s) je ASCII kód písmene
%%                   X(r,s)=0 jinak
%% X=isspace(A)  <=> X(r,s)=1 jestliže A(r,s) je ASCII kód oddělovače
%%                            mezerového typu:
%%                            mezera (SP=32), horizontální tabulátor (HT=9),
%%                            vertikální tabulátor (VT=11), nový řádek (LF=10),
%%                            návrat vozu (CR=13), nová stránka (FF=12)
%%                   X(r,s)=0 jinak
%%
%% L=lower(T)  ... konverze velkých písmen na malá a ostatní beze změny
%% U=upper(T)  ... konverze malých písmen na velká a ostatní beze změny  
ascii=reshape(char(0:255),16,16).'  % ASCII tabulka znaků      
  pause;
% Pípnutí způsobuje znak char(7)    
  char(7)                           
pause;  
%----------------------------------------------------------------------
A=double(ascii)              
pause;
%----------------------------------------------------------------------
  char(A)                    
  pause;
%----------------------------------------------------------------------
  lower(ascii)
  pause;
%----------------------------------------------------------------------
  upper(ascii)
  pause;
%----------------------------------------------------------------------
% K ASCII tabulce přiřadíme zleva pořadě
% tabulku ze znaků 0 a 1 indikující oddělovače mezerového typu a
% tabulku ze znaků 0 a 1 indikující písmenové znaky
% Všechny tři tabulky jsou opticky odděleny sloupcem col tvořeným znaky |
  col='|'.*ones(16,1);
  [col,'0'+isspace(ascii),col,'0'+isletter(ascii),col,ascii,col]
keyboard;

%% blanks(n)  ... řádkový textový vektor sestávající z n mezer
%% deblank(t) ... odstranění koncových mezer a znaků NUL z konce textového
%%                vektoru t.
  double(blanks(5))      % pět mezer v číselné reprezentaci        
  double(blanks(5)')             
  ['xxx',blanks(5),'yyy']
  disp(blanks(5)')   % vertikální posuv kurzoru
  pause;
%----------------------------------------------------------------------
  t=['řádek zakončený mezerami a znaky NUL (ASCII kód 0):',0 0,'   ',0 0];
  double(t)                       
  tt=deblank(t)                                                
  double(tt)          % Odstraněny koncové mezery i znaky NUL  
keyboard;

%% I=findstr(t1,t2) ... počáteční indexy výskytu kratšího textového řetězce 
%%                      v delším 
%% s=strrep(t,vzor,náhrada)... každý výskyt textového řetězce vzor
%%                             v textovém vektoru t se nahradí řetězcem náhrada
%% strcmp(t1,t2) = 1 ... jsou-li textové vektory totožné
%%               = 0 ... jinak
  t = 'How much wood would a woodchuck chuck?';
  findstr(t,'a')
  findstr(t,' ')
  findstr(t,'wood')
  findstr(t,'Wood')
  echo on          
pause;
%----------------------------------------------------------------------
  T=strrep(t,'wood','  WOOD')
  tt=t;
  strcmp(t,tt)
  strcmp(t,tt')    % vektory musí mít také stejný rozměr nejen obsah
  strcmp(t,T)
keyboard;

%% [p,s2]=strtok(s1,d) ... z textového vektoru s1 typu seznam, jehož položky
%%                         jsou odděleny znaky uvedenými v řetězci d je
%%                         vybrána prvá položka a uložena do p;
%%                         zbytek seznamu se uloží do s2
%% [p,s2]=strtok(s1)   ... předpokládá oddělovače mezerového typu (viz isspace)
  t=['polozka1 polozka2  polozka3',10,'polozka4',12,'polozka5']
  [p,t]=strtok(t)    % ze "seznamu" t vybíráme položky oddělené mezerami
  [p,t]=strtok(t)
  [p,t]=strtok(t)
  [p,t]=strtok(t)
  [p,t]=strtok(t)
  [p,t]=strtok(t)
  echo on                
pause;
%----------------------------------------------------------------------
  t=['polozka1 polozka2  polozka3',10,'polozka4',12,'polozka5']
  [p,t]=strtok(t,[10 12])
  [p,t]=strtok(t,10)
  [p,t]=strtok(t,10)
  echo on       
pause;
%----------------------------------------------------------------------
  t=['polozka1,polozka2;:polozka3:polozka4']
  while ~isempty(t), 
  [p,t]=strtok(t,',;:'), 
  pause;  
  end    
keyboard;

%% T=char(T1,T2,T3,...) | T=str2mat(T1,T2,T3,...)      
%%   ... složení textové matice T naskládáním textových matic T1,T2,...
%%       pod sebe tak, že každý řádek je automaticky doplněn mezerami
%%       na délku nejdelšího řádku. 
%%
%%       Textová matice musí mít všechny řádky stejně dlouhé.
T1=['r_1_1     ';' rrrrr_1_2';'konec T1  ']
% Pracné doplňování mezer na stejnou délku textových řádků
% usnadní použití str2mat:
  T1=str2mat('r_1_1',' rrrrr_1_2','konec T1')
  T2=char('r_2_1',' rrrrr_2_2','konec T2')
% Je dovoleno skládat nejen řádky, ale i textové matice:
  T=char(T1,T2)                                          
keyboard;

%% V = eval(t)
%%   = eval(t,chyba) ... vyhodnocení maticového výrazu zapsaného jako text v t
%%                       chyba je nepovinný textový řetězec, který se volá
%%                       pouze v případě, že při vyhodnocení t nastala chyba.
%%                       Text chybového hlášení se sdělí funkci lasterr.
%% [V1,V2,...] = eval(t)
%% [V1,V2,...] = eval(t,chyba)
%%             ... vyhodnocení maticové funkce zapsané jako text v t:
%%                 t='jmeno(p1,p2,...)'
%% nebo
%% [V1,V2,...] = feval('jmeno',p1,p2,...)
%%             ... vyhodnocení maticové funkce 'jmeno' se vstupními
%%                 parametry p1,p2,...
% Automatické zpracování chyby:
  lasterr('');  % Zrušíme text posledního chybového hlášení
  chyba='disp([''Nalezena chyba:'',10,lasterr])';
  eval('[1 2]-[1;2]',chyba);
  lasterr
pause;
%----------------------------------------------------------------------
  lasterr('');
%  eval('[1 2]-[1;2]');   % Chyba by se vypsala, ale nešlo by ji automaticky zpracovat
  lasterr
pause;
%----------------------------------------------------------------------
  lasterr('');
  eval('[1 2]-[1;2]','');% Potlačení výpisu chyby
  lasterr
  eval('1/0',chyba);     % Netýká se varování
pause;
%----------------------------------------------------------------------
  t=['polozka1,polozka2;:polozka3:polozka4']
  [p,t]=eval('strtok(t,'',;:'')')
pause;
%----------------------------------------------------------------------
  for n = 1:5
      eval(['I' num2str(n) ' = eye(n)'])
  end
  I=feval('eye',n)
pause;
%----------------------------------------------------------------------
  D = char('odedemo','quaddemo','fitdemo');     
  n = input('Select a demo number: ');
  eval(['help ',D(n,:)])
keyboard;

%======================================================================
% 6.2. ZNAKOVÉ KONVERZE ČÍSEL
%----------------------------------------------------------------------
%% t=int2str(n) ... konverze čísla n (po zaokrouhlení) do celočíselné
%%                  znakové reprezentace
%% t=num2str(n) ... konverze čísla do reálné znakové reprezentace s
%%                  s desetinnou tečkou (resp. do semilogaritmického
%%                  tvaru) s přesností maximálně na asi 4 platné cifry.
%% Místo n může být i matice. Pak t vznikne spojením konverzí prvků matice
%% po sloupcích. Prakticky se nepoužívá, neboť je obtížné rozlišit v t
%% konverzní podřetězce jednotlivých prvků.
%% n=str2num(n) ... konverze čísla z reálné znakové reprezentace
%%                  s desetinnou tečkou (resp. v semilogaritmickém
%%                  tvaru) ... opak k num2str.
%% sprintf ... formátová konverze numerických hodnot ---> znakový řetězec
%%             ve stylu jazyka "C".
%%             (viz později příkazy vstupu a výstupu a demo tfprintf.m)
%% sscanf  ... formátová konverze znakového řetězce  ---> numerické hodnoty
%%             ve stylu jazyka "C" (opak k sprintf).
%%             (viz později příkazy vstupu a výstupu a demo tsscanf.m)
  t=int2str(321456), ischar(t)              
  t=int2str(321456.1)
  t=int2str(321456.5)
  t=int2str(321456.50001)
pause;
%----------------------------------------------------------------------
  t=num2str(321456.50001)
  n=str2num(t), ischar(n)              
pause;
%----------------------------------------------------------------------
% Složitější ukázka použití 'eval' a konverze 'int2str'
  T1=['r_1_1     ';' rrrrr_1_2';'konec T1  '];
  T2=char('r_2_1',' rrrrr_2_2','konec T2');
  TT1=double(T1); TT2=double(T2);      
  save text1.txt TT1 -ascii
  save text2.txt TT2 -ascii
  clear T1 T2
  k = 0;
  while 1
    k = k+1
    datak = ['text',int2str(k)]
    filename = [datak,'.txt']
    if ~exist(filename), break, end
    eval(['load ' filename])
    X = eval(datak)
    pause;
    % Zpracujeme data v matici X
  end
delete text1.txt text2.txt
keyboard;

%% t=dec2hex(n) ... konverze celého čísla do jeho znakové reprezentace
%%                  v 16-kové soustavě
%% n=hex2dec(t) ... konverze znakové reprezentace celého čísla v 16-kové
%%                  soustavě (opak k dec2hex).
%% n=hex2num(t) ... konverze znakové reprezentace reálného čísla v 16-kové
%%                  soustavě podle normy IEEE.
  t=dec2hex(321456), ischar(t)
  n=hex2dec(t), ischar(n)
  r=hex2num(t), ischar(r)
keyboard;

%======================================================================
% 6.3. DATUM, ČAS
%----------------------------------------------------------------------
%%  t = clock ... vrací aktuální datum a čas (nástěnné hodiny) ve formě
%%                číselného vektoru 1 x 6: t=[rok měsíc den hod min sec]
%%                sec=reálné číslo, ostatní jsou celá čísla;
%%                fix(clock) usekne desetinnou část a zobrazí tedy jen
%%                celé vteřiny.
%%  dt=etime(t1,t0) ... počet vteřin od času t0 po čas t1.
%%                      t0 a t1 jsou ve formátu 'clock'
%%                      Typické užití k měření reálné doby provedení příkazu:
%%                        t0 = clock;
%%                        příkazy;
%%                        dt=etime(clock,t0);
%%    POZOR! Nepracuje správně v intervalech přes rozhraní měsíce nebo roku.
%% d = date    ... aktuální datum jako anglický textový řetězec ve formátu
%%                 den-měsíc-rok.
%% t = cputime ... čistý čas procesoru (CPU) ve vteřinách od spuštění MATLABu.
%%                 Typické užití k měření časové náročnosti provedení příkazu:
%%                        t0 = cputime;
%%                        příkazy;
%%                        dt=cputime-t0;
%%    POZOR! Vnitřní počitadlo může přetéct a začít opět od nuly při dlouho
%%    spuštěném MATLABu.
%% tic    ... spuštění stopek
%% dt=toc ... čas při zastavení stopek ve vteřinách
%%            Typické užití opět k měření časové náročnosti provedení příkazu:
%%                        tic;
%%                        příkazy;
%%                        dt=toc;
%% UPOZORNĚNÍ: Je-li m-soubor volán poprvé, je zde navíc režie spojená
%%             s jeho předkompilací. Pro objektivní měření časové
%%             náročnosti je tedy třeba zajistit, aby všechny funkce volané
%%             v měřené příkazové sekvenci nebyly volány poprvé.
%%             Měření pomoci etime zahrnuje i balastní čas zatížení
%%             procesoru jinými paralelními procesy.
  t=fix(clock), t=sprintf('%2d-%2d-%4d %2d:%2d:%2d',t(3:-1:1),t(4:6))  
  rand(1,1);  % prvé volání měřené funkce naprázdno
  date
  t0 = clock
  A=rand(100,100);
  dt=etime(clock,t0) % reálný čas generování matice A
pause;
%----------------------------------------------------------------------
  t0 = cputime;
  A=rand(100,100);
  dt=cputime-t0,     % čistý čas procesoru na generování matice A
% Totéž pomocí stopek:
  tic;
  A=rand(100,100);
  dt=toc,            % čistý čas procesoru na generování matice A
  clear t0
  keyboard;
  
%================================= KONEC ==============================
%
%
%%
more off
echo off
