Portál AbcLinuxu, 1. května 2025 16:52

Octave - 5 (práce s řetězci)

23. 2. 2006 | Jiří Poláček
Články - Octave - 5 (práce s řetězci)  

Kromě čísel umí Octave také pracovat s krátkými texty - řetězci. Této vlastnosti se využívá v případech, kdy je třeba jako parametr nějaké funkce zadat název souboru nebo pro čitelnější práci s vlastním programem, který může vypisovat hlášky typu „Zadejte vstupní hodnotu parametru N“ apod. Žádná extra kouzla s texty tedy nečekejte, i když...

Zobrazování řetězců

Octave jako řetězce chápe texty uzavřené v dvojici uvozovek nebo apostrofů; řetězce je samozřejmě možné ukládat do proměnných a dále s nimi pracovat.

>> A="Karel"
A = Karel
>> B='Veronika'
B = Veronika
>> C=[A, ' a ', B]
C = Karel a Veronika
>> C(3)
ans = r

Pokud je potřeba mít v řetězci znak apostrof či uvozovka, je potřeba dát toto najevo zpětným lomítkem zapsaným před požadovaným znakem. Jedno zpětné lomítko se také zapíše jako dvě zpětná lomítka:

>> '\'\\'
ans = '\
>> "\\\""
ans = \"

Jelikož Matlab pro uvozování řetězců používá pouze apostrofy, budeme se v dalším textu držet této varianty.

Řetězce se v Octave ukládají do vektorů, kde každý znak odpovídá jednomu prvku vektoru - k jednotlivým znakům tedy lze přistupovat pomocí indexů stejně jako u číselných vektorů a matic. Zapsání více řetězců jako prvků ve vektoru má za následek jejich spojení - zřetězení, jak je vidno v příkladu u proměnné C. Pokud chceme vypsat obsah řetězce bez onoho „ans =“ na začátku, je na místě použití funkce disp:

>> A
A = Karel
>> disp(A)
Karel
x = 35
>> disp(['Vysledkem funkce je cislo ', x])
Vysledkem funkce je cislo #

Je-li částí nějakého vektoru řetězec, chápe se jako řetězec celý vektor. Pedchozí příklad proto namísto čísla 35 vypsal znak „#“, který se nachází na 35. pozici v tabulce znaků. Pro nápravu této situace existuje funkce num2str, která převádí čísla na jejich textovou podobu:

>> disp(['Vysledkem funkce je cislo ', num2str(x)])
Vysledkem funkce je cislo 35
>> c=str2num('1')+str2num('1')
c = 2

Opačná funkce str2num převádí platnou textovou podobu čísla na číslo, s kterým je možné dále počítat - provádět matematické operace.

Řetězce v maticích

Určitě nebude překvapením fakt, že řetězce lze ukládat také do matic. Následující dva způsoby jsou ekvivalentní - funkce char je v Octave z důvodu kompatibility s Matlabem, který v prvém případě neumí automaticky doplňovat „vyplňující znaky“ za kratší řetězce, aby vzniklá matice měla ve všech řádcích stejný počet sloupců:

>> M=['Karel'; 'Veronika'; 'Josef']  
M =
Karel   
Veronika
Josef 
>> M=char('Karel', 'Veronika', 'Josef')
M =
Karel   
Veronika
Josef

Výchozím doplňovacím znakem je mezera, lze jej však změnit pomocí vestavěné proměnné string_fill_char:

>> string_fill_char='@';             
>> N=['Karel'; 'Veronika'; 'Josef']
N =
Karel@@@
Veronika
Josef@@@

Díky funkci strjust nemusí být texty v matici nutně zarovnány doleva. Přípustnými parametry jsou "left", "center" a "right":

>> strjust(M, "right")
ans =
   Karel
Veronika
   Josef

Pole buněk - cell arrays - je možností Octave, jak mít jako prvky matice skutečně celé řetězce, nikoliv jen znaky - rozdíl oproti maticím je vesměs jen v typu závorek, u pole buněk se používají složené:

>> M={'Karel', 'Veronika'; 'Josef', 'Marie'}
M =
{
  [1,1] = Karel
  [2,1] = Josef
  [1,2] = Veronika
  [2,2] = Marie
}

Obvyklé funkce pro práci s řetězci

Chceme-li porovnat dva řetězce, zda jsou shodné, není relační operátor „==“ na místě, pokud nás nezajímá shodnost jednotlivých znaků, která navíc funguje jen pro stejně dlouhé řetězce jako u číselných vektorů:

>> 'Jana'=='Dana'
ans =
        0        1        1        1
>> 'Ano'=='Ne'   
error: operator ==: nonconformant arguments (op1 is 1x3, op2 is 1x2)
error: evaluating binary operator `==' near line 35, column 6

Pro srovnávání podle obvyklých představ je k dispozici funkce strcmp:

>> strcmp('Jana', 'Dana')
ans = 0

Jednoduché vyhledávací funkce index a rindex vrací první, respektive poslední pozici řetězce zadaného jako druhý parametr v řetězci zadaném jako první parametr. Pozice se počítají od jedničky:

>> index('krabice hranice slepice', 'ice')
ans = 5
>> rindex('krabice hranice slepice', 'ice')
ans = 21

Obdobně funkce findstr vrací vektor všech vyhovujících pozicí:

>> findstr('abababaq','aba')  
ans =
        1        3        5
>> findstr('abababaq','aba',0)
ans =
        1        5

Pokud je jako třetí volitelný parametr zadáno číslo 0, pak nejsou povoleny přesahy řetězců (další vyhovující řetězec se hledá až za koncem předchozího nalezeného).

Funkce substr vrací ze zadaného řetězce podřetězec od dané pozice a dané délky (respektive až do konce, není-li třetí parametr zadán):

>> substr('stonozka', 4, 5)  % Od čtvrté pozice pět znaků
ans = nozka

Funkce strrep odpovídající vzorky v zadaném řetězci nahradí jiným zadaným řetězcem:

>> strrep('zena Bozena neni zenata', 'zena', 'spor')
ans = spor Bospor neni sporta

Konečně funkce split dělí zadaný řetězec na matici podřetězců podle zvoleného vzorku:

>> split('krabice hranice slepice', 'ice')          
ans =
krab 
 hran
 slep

Zbytek ve zkratce

Zřejmě nemá smysl zde podrobně rozepisovat zbývající funkce pro práci s řetězci, případný zájemce může navštívit manuál. Proto jen stručný přehled:

Seriál Octave (dílů: 16)

První díl: Octave - 1 (je to kalkulačka), poslední díl: Octave - 16 (a co dál?).
Předchozí díl: Octave - 4 (je to pravda?)
Následující díl: Octave - 6 (práce se soubory)

Související články

Octave - 1 (je to kalkulačka)
Octave - 2 (počítání s maticemi)
Octave - 3 (přístup k jednotlivým položkám matice)
Octave - 4 (je to pravda?)
Octave - 6 (práce se soubory)
Octave - 7 (vlastní skripty a funkce)
Octave - 8 (větvení programu)
Octave - 9 (cykly)
Octave - 10 (zbylé řídicí struktury)
Octave - 11 (kreslíme grafy)
Octave - 12 (měřítko os a speciální grafy)
Octave - 13 (dokončení grafiky)
Octave - 14 (finance a statistika)
Octave - 15 (špetka matematiky)
Octave - 16 (a co dál?)
Vektorový elegán Ipe
Recenze: Kniha kódů a šifer
Awk & sed: Příručka pro dávkové zpracování textu
SETI@home
Jak se píše procesor
GnuCash - domácí účetnictví na úrovni
Použití gnuplot pro tvorbu grafů v PHP
Hra s písmenky - wxMaxima

Odkazy a zdroje

Octave

Další články z této rubriky

LLVM a Clang – více než dobrá náhrada za GCC
Ze 4 s na 0,9 s – programovací jazyk Vala v praxi
Reverzujeme ovladače pro USB HID zařízení
Linux: systémové volání splice()
Programování v jazyce Vala - základní prvky jazyka

Diskuse k tomuto článku

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.