Lekce 1.20
Knihovna pro zpracování řetězců
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.
OZOGAN, 1 Máje 97, 460 01 Liberec
tel.,fax: (048) 52 28 338, e-mail:
info@ozogan.cz