Lekce 1.20
Knihovna pro zpracování řetězců


předchozí lekce (1.19) obsah kurzu následující lekce (1.21)

V předchozích lekcích jsme pracovali převážně s numerickými hodnotami. Dalším typem dat mohou být znaky, čili řetězce. Jedná se o seskupení znaků a písmen. Jeden alfanumerický znak je definován typem Char. Řetězec se potom skládá z několika znaků a je definován typem String. Proměnná typu String může obsahovat teoreticky neomezený počet znaků. Prakticky je velikost řetězce omezena velikostí volné paměti. Začátek a konec řetězce je při zápisu v programu vymezen uvozovkami.

S řetězci je možné provádět spoustu operací. Je možné je slučovat, kopírovat část podřetězce, doplňovat znaky na libovolné místo, převádět na číslo, zjišťovat délku řetězce a podobně. Veškeré uvedené funkce obsahuje knihovna pro zpracování řetězců, se kterou se nyní seznámíme.

Jestliže potřebujete zjistit délku řetězce, použijte funkci Len:


Writeln(Len(S))
Pokud potřebujete z řetězce vybrat pro další zpracování pouze jeho část, můžete použít funkci Mid, kde zadáte mimo řetězce i počáteční pozici a délku podřetězce:

Writeln(Mid("BONANZA",3,4))   'vypíše 'NANZ'
Velmi častým požadavkem je možnost vyjmout z řetězce určitou část, případně do řetězce vložit jiný řetězec. K vyjmutí podřetězce je možné použít přístupnou funkci jazyka KLONDAIK Delete, která ze zadaného řetězce zruší od zadané pozice zadaný počet znaků. Naopak, procedura Insert z jazyka KLONDAIK vloží na zadanou pozici do řetězce požadovaný podřetězec. Obě funkce mění současně délku řetězce.

'program ZNAKY1.BON
Sub Main()
    S = "Program OZOGAN BONANZA"
    Write ("Délka řetězce: ")
    Writeln(Len(S))
    S = Insert("*", s, 15)      'vloží znak '*' do řetězce
    Writeln(S)
    S = Delete(S, 1, 8)         'vyjme znaky z řetězce
    Writeln(S)                  'vypíše: 'OZOGAN*BONANZA'
    Write  ("Délka řetězce: ")
    Writeln(Len(S))             'vypíše: 15
    Write  ("Pozice 'KLON': ")
    Writeln(Pos("KLON", S))     'vypíše: 8
End Sub
Pokud potřebujete zjistit, zda se v řetězci nalézá hledaný podřetězec, lze použít funkci Pos. Funkce vrací pozici prvního znaku hledaného podřetězce.

S = "OZOGAN BONANZA"
Writeln(Pos("KLON",S))   'vrací číslo 8
Každý znak v řetězci má svou číselnou hodnotu, udávající pozici znaku v ASCII tabulce, ve které je umístěno všech 256 možných znaků. ASCII tabulka je pevně definována a platí i mimo systém KLONDAIK. Spodní část tabulky do pozice 125 je vždy pevně dána. Horní část tabulky již záleží na definici národního prostředí počítače (např. písmena s diakritikou). Na začátku tabulky jsou umístěny tzv. netisknutelné znaky, které se používají pro obsluhu tiskárny. Dále jsou již definovány jednotlivé znaky. Každý znak řetězce můžete proto rozložit na jednotlivé znaky a jejich hodnoty. V programu je definována funkce Asc která provádí převod hodnoty znaky na číselnou pozici v tabulce. Opačná funkce je Chr, která vrací dle zadaného čísla odpovídající znak z ASCII tabulky:

'program ZNAKY2.BON
Sub Main()
    Writeln(Asc("A"))   'vypíše ASCII hodnotu znak znaku 'a'
    Writeln(Asc("a"))   'vypíše ASCII hodnotu znak znaku 'A'
    Writeln(Chr(65))    'vypíše znak tabulky zadané hodnoty

    For x = 65 to 90
        Write(Chr(x))   'vypíše abecedu - velká písmena
    Next
    Writeln("")

    For x = 97 to 122
        Write(Chr(x))   'vypíše abecedu - malá  písmena
    Next
    Writeln("")
End Sub
Všimněte si, že velká písmena v tabulce začínají na pozici 65 a malá písmena na pozici 97, jejich rozdíl je proto 32. To by bylo možné využít například pro převod řetězce na malá písmena, jak ukazuje následující příklad.

'program ZNAKY3.BON
Sub Main()
    S = "ozOgaN bOnAnZa"
    For X = 1 to Len(S)
       If (Asc(Mid(S,X,1))>=65) and (Asc(Mid(s,x,1))<=90) then
          S = Mid(S, 1, X-1)_
            + Chr(Asc(Mid(S, X, 1))+32)_
            + Mid(S, X+1, Len(S)-X)
       End If
    Next
    Writeln(S)     'vypíše "ozogan bonanza"
End Sub
Pro převod řetězce na velká písmena se používá funkce UCase, na malá písmena potom funkce LCase. Převádí se znaky včetně diakritických znamének:

s := 'ozOgaN kLonDaiK';
Writeln(LowerCase(s)); {převede na malá  písmena}
Writeln(UpperCase(s)); {převede na velká písmena}
Pravděpodobně velmi často budete potřebovat převádět čísla na řetězce a obráceně. Jednodušší je přitom převod čísel na řetězec. Pro převod čísla typy Integer se používá funkce CStr. Pokud potřebujete převést číslo na řetězec se zadáním počtu desetinných míst, můžete použít dostupnou funkci z jazyka KLONDAIK RealToStr. Ta vám umožní zadat nejen délku čísla, ale i počet desetinných míst. Řetězec na celé číslo se převádí funkcí CInt. Na číslo včetně její desetinné části můžete převést řetězec funkcemi CDbl, nebo funkcí CLng. K převodu je možné použít také dostupné funkce jazyka KLONDAIK StrToReal, kdy budou nenumerické znaky ignorovány.

'program ZNAKY4.BON
Sub Main()
    I = 123
    R = 123.45
    Writeln("číslo: "+CStr(I))
    Writeln("číslo: "+RealToStr(I,6,2))
    Writeln("číslo: "+RealToStr(R,6,2))
    R = StrToReal("123.45")/3
End Sub
Knihovna pro práci s řetězci obsahuje i další zajímavé použitelné funkce.
předchozí lekce (1.19) obsah kurzu následující lekce (1.21)

OZOGAN, 1 Máje 97, 460 01 Liberec
tel.,fax: (048) 52 28 338, e-mail: info@ozogan.cz