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 apostrofy.

Unit prg;
interface
implementation

Var s : string;
    c : Char;
begin
   s := 'OZOGAN KLONDAIK';
   c := 'K';
end;
end.
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 Length:


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

Writeln(Copy('KLONDAIK',2,3)); {vypíše 'LON'}
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 se používá procedura Delete, která ze zadaného řetězce zruší od zadané pozice zadaný počet znaků. Naopak, procedura Insert vloží na zadanou pozici do řetězce požadovaný podřetězec. Obě funkce mění současně délku řetězce.

Unit znaky1;
interface
implementation

Var s : String;
begin
   s := 'Program OZOGANKLONDAIK';
   Writeln('Délka řetězce: '+IntToStr(Length(s)));
   s := Insert('*', s, 15); {vloží znaky do řetězce}
   Writeln(s);
   s := Delete(s, 1, 8);    {vyjme znaky z řetězce}
   Writeln(s);              {vypíše: 'OZOGAN*KLONDAIK'}
   Writeln('Délka řetězce: '+IntToStr(Length(s)));
end;
end.
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 KLONDAIK';
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 Ord 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:

Unit Znaky2;
interface
implementation

Var x : Integer;

begin
   Writeln(Ord('A'));  {vypíše ASCII hodnotu znak znaku 'a'}
   Writeln(Ord('a'));  {vypíše ASCII hodnotu znak znaku 'A'}
   Writeln(Chr(65));   {vypíše znak tabulky zadané hodnoty}

   For x:= 65 to 90 do
       Write(Chr(x));  {vypíše abecedu - velká písmena}
   Writeln();

   For x:= 97 to 122 do
       Write(Chr(x));  {vypíše abecedu - malá písmena}
   Writeln();
end;
end.
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.

Unit Znaky3;
interface
implementation

Var s : String;
    x : Integer;
begin
   s := 'ozOgaN kLonDaiK';
   For x := 1 TO Length(s) do
   begin
      If (Ord(Copy(s,x,1))>=65) and (Ord(Copy(s,x,1))<=90) then
         s := Copy(s,1,x -1)
           + Chr(Ord(Copy(s,x,1))+32)
           + Copy(s, x+1,Length(s)-x)
   end;
   Writeln(s);  {vypíše 'ozogan klondaik'}
end;
end.
Pro převod řetězce na velká písmena se používá funkce UpperCase, na malá písmena potom funkce LowerCase. 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 IntToStr. Tato funkce nedokáže převést desetinnou část čísla. K tomu se používá funkce RealToStr, která vám umožní zadat nejen délku čísla, ale i počet desetinných míst. Řetězec na číslo je nejvhodnější převádět funkcí StrToReal. Nenumerické znaky budou přitom ignorovány. Pro případné zjištění nenumerického znaku v řetězci můžete použít funkci Val.

Unit Znaky4;
interface
implementation

Var i : Integer;
    r : Real;
    s : String;
begin
   i := 123;
   r := 123.45;
   Writeln('číslo:'+IntToStr(i));      {vypíše 'číslo: 123'}
   Writeln('číslo:'+RealToStr(i,6,2)); {vypíše 'číslo: 123.00'}
   Writeln('číslo:'+RealToStr(r,6,2)); {vypíše 'číslo: 123.45'}
   r := StrToReal('123.45')/3;         {převede řetězec na číslo}
end;
end.
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