Reťazce znakov
Znakový reťazec je údajový typ veľmi podobný poľu. Obsahuje ľubovoľnú postupnosť znakov zapísateľných z klávesnice. Maximálna dĺžka textového reťazca je 255 znakov.
Označuje sa kľúčovým slovom string. Nie je zavedený univerzálny typ reťazca, ktorý by zahŕňal reťazce ľubovoľných dĺžok, ale rozlišujú sa rôzne typy reťazcov podľa dĺžky. Vyššie sme uviedli, že reťazec je postupnosť znakov. Premenná tohto typu si môže zapamätať práve jeden znak, prípadne skupinu znakov maximálnej dĺžky, napr. písmeno (A, B, C,..., a, b, c,...), číslicu (0, 1, 2,...), ale aj iné znaky (@, %, €,... +, -, *, /,...), pričom hodnoty typu char zaberajú v počítači jeden bajt a kódované sú ASCII kódovaním.
Operácie, ktoré môžeme so znakovými reťazcami vykonávať sú napríklad priradenie hodnotydo premennej, môžeme ju porovnať s inou hodnotou a znakovú hodnotu môžeme vypísať, napr. do grafickej plochy.
Základné funkcie so znakovými reťazcami:
- vytvorenie reťazca
- zisťovanie dĺžky reťazca
- zreťazenie dvoch a viacerých reťazcov
- práca s jednotlivými znakmi reťazca
- Výpočet znakov v zadanom reťazci
- kopírovanie reťazca
Znakové reťazce (string), rovnako ako typ char majú svoje konštanty, ktoré zapisujeme do apostrofov. S týmito konštantami sme sa už stretli napríklad pri príkaze na výpis textu TextOut (Image1.Canvas.TextOut /10, 10 'Ahoj'/), alebo pri nastavení textu na komponente Label (Label1.Caption := 'Ahoj')
V nasledujúcich príkladoch si ukážeme, ako môžeme takéto texty uchovávať v premenných, ako ich môžeme meniť a ako s nimi budeme pracovať. V prvom rade musíme mať zadeklarované premenné typu znakový reťazec (string), následne im priradíme nejakú hodnotu, napr. reťazcovú konštantu a nakoniec ju, nám už známym spôsobom, vypíšeme na grafickú plochu (obr. 83).
Keď už máme reťazec vytvorený, vieme pomocou funkcie Lenght zistiť jeho dĺžku, tá je však údajového typu Integer, teda celé číslo a musíme preň deklarovať novú premennú typu Integer (obr. 84).
Po spustení programu (F9) dostávame (obr. 85):
Program nám oznámil, že dĺžka reťazca "Vitajte!" je 8 (tvorí ju 8 znakov). Program zmeníme tak, že nám nevypíše len číslo osem, ale odpovie nám celou vetou (obr. 87), t. j.: "Zistil som dĺžku reťazca. Jeho dĺžka je 8 (obr. 86).
Funkcia, ktorá nám umožní spájať dva a viac reťazcov do jedného celku sa nazýva zreťazenie a na zreťazenie slúži operácia plus (+). V tomto prípade má iný význam ako pri sčitavaní čísel.
Premenná typu string môže obsahovať aj prázdny reťazec (Reťazec := ' ';) vtedy je jej dĺžka 0.
So znakovými reťazcami môžeme pracovať aj po jednotlivých znakoch. Ak máme premennú znakový reťazec, môžeme pristupovať ku konkrétnemu znaku tak, že index, t. j. poradové číslo znaku, uzavrieme do hranatých zátvoriek (ALT+91 a ALT+93). Znaky v znakovom reťazci (string) sú očíslované od 1 pre prvý znak až po Length pre posledný znak.
Pracujme s našim vytvoreným reťazcom "Vitajte!", ktorý má dĺžku 8, ako sme už zistili v predchádzajúcom príklade, preto indexom môže byť číslo od 1 po 8. Napríklad:
R [4] má hodnotu ' a '
R [Length (R)] je posledný znak v reťazci, teda ' ! '
R [I] je I-ty znak, závislý od hodnoty celočíselnej premennej, ktorá musí byť z intervalu <1, 8>
Index môžeme zadať nielen celočíselnou konštantou, ale aj premennou alebo aj aritmetickým výrazom. Dôležité je, aby to malo hodnotu z intervalu <1, Length (R)>.
Prácu s jednotlivými znakmi reťazca si ukážeme v nasledujúcom príklade, v ktorom využijeme aj cyklus for a editovací riadok Edit1. Program bude vyberať postupne zo zadaného reťazca znaky, zakaždým nastaví náhodnú farbu písma a vypíše príslušný znak (obr. 88).
- Skôr, ako sme pracovali so znakmi reťazca,
nastavili sme farbu a veľkosť písma, ktorá zostáva nemenná. Ak by sme tieto príkazy nezadali, program by menil farbu aj prvým dvom riadkom, čo
nechceme.
- Doteraz sme pracovali s apostrofmi len
vtedy, ak sme ohraničovali nejaký text. V tomto príklade sme ale
ohraničovali ďalšie apostrofy, čím sme vypisovaný text zapísali do úvodzoviek.
- Použili sme ešte jeden nový príkaz a to je
funkcia UpCase, ktorá spraví
z malého písmena abecedy zodpovedajúce veľké písmeno. Ostatné znaky (napr.
%, = !,...) zostávajú nemenné.
- pozn.
Editovaciemu riadku sme v Inšpektore objektov nastavili vlastnosť Text na
nulovú hodnotu
Keď program spustíme, zadáme do editovacieho riadku text (napr. Vitajte!), s ktorým bude program pracovať a upravovať ho. Môže to vyzerať napríklad takto (obr. 89):
Nasledujúci program počíta počet písmen, číslic a medzier v zadanom texte. V cykle for prechádzame postupne všetky znaky a pre každý zvlášť (R[I]) zisťujeme, či je to písmeno, číslica alebo medzera (obr. 90).
Po spustení programu a stlačení tlačidla Počítaj program vypíše výsledok (obr. 91):
Použili sme niekoľko nových príkazov, ktoré si teraz vysvetlíme:
- V podmienenom príkaze sme zadávali logické operácie and a or. Okrem nich existuje aj operácia not:
not A negácia
True, ak A = False
True, ak zároveň A = True aj B = True
True, ak aspoň pre jedno A = True alebo B = True
- Ďalším novým príkazom bol Inc, pomocou ktorého vieme zvýšiť
obsah ordinálnej (rozlišujúca medzi
predchádzajúcim a nasledujúcim prvkom iba v zmysle "väčší - menší" ) premennej.
Ďalšími funkciami sú napr:
- Succ ('A') = 'B'
- Succ ('f') = 'g
- Pred ('3') = '2'
- Pred ('Z') = 'Y'
- Inc (I) rovnaké ako I := I +1;
- Dec (Z) rovnaké ako Z := Pred (Z);
Inc (X, 18) rovnaké ako X := X +18;
- nasledovník ordinálnej hodnoty
- nasledovník ordinálnej hodnoty
- predchodca ordinálnej hodnoty
- predchodca ordinálnej hodnoty
- zvyšovanie ord. hodnoty
- znižovanie ord.
hodnoty
Jednou z najdôležitejších funkcii pri práci s textovým reťazcom je Copy, ktorá vie z reťazca vybrať nejaký podreťazec. Znamená to, že z daného reťazca R nemusíme vyberať len jeden znak R[I] a s tým ďalej pracovať, ale môžeme z neho vybrať aj nejakú súvislú časť. Funkcia Copy má 3 parametre:
- je samotný reťazec, z ktorého chceme
vyberať nejakú časť
- je index, na ktorom začína tento podreťazec
- je dĺžka tohto podreťazca
Copy ('Janosik', 3, 2) = 'no'
Často sa môžete stretnúť aj so zápisom
Copy (Retazec, I, MaxInt),
ktorý označuje, že z daného reťazca Retazec berieme od I-teho znaku všetky až do konca.
Napríklad, ak chceme vyhodiť znak na I-tej pozícií, môžeme zapísať:
Copy (Retazec, 1, I - 1) + Copy (Retazec, I + 1, MaxInt)
Výsledný reťazec je teda spojenie dvoch reťazcov: znaky od začiatku až po znak pred I-tym a reťazec od nasledujúceho za I-tym až do konca. Podobne zapíšeme, ak chceme I-ty (teda jeden znak) nahradiť viacerými, napr. reťazcom '...':
Copy (Retazec, 1, I - 1 ) + '...' + Copy (Retazec, I + 1, MaxInt)
Nasledujúci program vypíše daný text viackrát pod seba: najskôr iba prvý znak, potom prvé dva, prvé tri, ... až vypíše celý reťazec (obr. 92):
Program nám vypíše (obr. 93):
Ďalšími reťazcovými funkciami sú napr.:
- UpperCase vráti reťazec, v ktorom budú všetky písmená veľké
- LowerCase vráti reťazec, v ktorom budú všetky písmená malé
- Trim vráti reťazec bez medzier na začiatku a na konci
- Insert vloží znak do reťazca
- Pos hľadá pozíciu konkrétneho znaku/znakov
- Ďalšie reťazcové funkcie môžete nájsť v Pomocníkovi (Help) jazyka Free Pascal.