�a�cuchy Dane tekstowe maj� - obok grafiki - najwi�kszy udzia� w obj�to�ci informacji przetwarzanej i przechowywanej we wsp�czesnych systemach komputerowych. Z tego te� wzgl�du ka�dy szanuj�cy si� j�zyk wysokiego poziomu jest wyposa�ony w mechanizmy pozwalaj�ce na reprezentowanie, przechowywanie i przetwarzanie tekst�w. W Turbo Pascalu s�u�y do tego typ �a�cuchowy (string), kt�rym zajmiemy si� w tym rozdziale. Dowolny tekst (�a�cuch, ang. string) przechowywany jest w programie w postaci ci�gu znak�w, kt�ry mo�e by� interpretowany jako specyficzna tablica array[0..255] of char Przyk�adowa deklaracja zmiennej �a�cuchowej ma posta� var Napis : string; Sta�e �a�cuchowe zapisuje si� natomiast w postaci ci�g�w znak�w uj�tych w apostrofy (podobnie jak sta�e znakowe): const STALY_NAPIS = 'Turbo Pascal'; Zerowy element �a�cucha przechowuje jego aktualn� d�ugo�� (tzw. d�ugo�� dynamiczn�); b�d�c typu znakowego mo�e on przyjmowa� warto�ci od 0 do 255. St�d w�a�nie wynika ograniczenie d�ugo�ci �a�cucha do 255 znak�w, co zreszt� w wi�kszo�ci przypadk�w wystarcza a� nadto. Aby "skr�ci�" �a�cuch (dana typu string zajmuje zawsze 256 bajt�w, niezale�nie od rzeczywistej d�ugo�ci tekstu), mo�na wykorzysta� deklaracj� nazwa-zmiennej : string[d�ugo��] Mo�liwo�� ta jest szczeg�lnie cenna, je�li w programie wykorzystujesz np. tablic� �a�cuch�w: deklaruj�c element sk�adowy tablicy jako string[20] oszcz�dzasz 235 bajt�w, co przy stu elementach daje zysk ponad 20 kB. Warto zauwa�y�, �e pr�ba zapisania do "skr�conego" �a�cucha tekstu d�u�szego ni� pozwala deklaracja nie spowoduje b��du, a jedynie obci�cie nadmiarowych znak�w. Operacje na �a�cuchach w zasadzie nie r�ni� si� zapisem od operacji na zmiennych typu prostego i nie wymagaj� stosowania �adnych specjalnych sztuczek. Do wprowadzania, wyprowadzania i przypisywania �a�cuch�w wykorzystuje si� - podobnie jak dla zmiennych typ�w prostych - procedury read(ln), write(ln) oraz operator przypisania. R�wnie� por�wnanie dw�ch �a�cuch�w zapisywane jest identycznie, przy czym "wewn�trznie" odbywa si� ono przez por�wnanie kod�w odpowiadaj�cych sobie znak�w. Tak wi�c: 'C' < 'Pascal' (kod ASCII znaku 'C' jest mniejszy od kodu 'P') 'c' > 'Pascal' (kod ASCII znaku 'c' jest wi�kszy od kodu 'P') 'C' > '' (dowolny �a�cuch jest wi�kszy od �a�cucha pustego) Z rzeczy prostych pozosta�o jeszcze dodawanie �a�cuch�w, polegaj�ce na ich zwyk�ym "sklejaniu" (niestety, �a�cuch�w nie da si� odejmowa�, mno�y� ani dzieli�). Je�eli zmienna lancuch1 zawiera tekst 'Turbo', za� lancuch2 - tekst 'Pascal', to wynikiem sklejenia obu zmiennych: wynik := lancuch1 + lancuch2; b�dzie oczywi�cie tekst 'TurboPascal'. R�wnie� odwo�ania do poszczeg�lnych znak�w �a�cucha realizuje si� w spos�b elementarny. Poniewa� mo�e on by� traktowany jako tablica znak�w, instrukcja s[5] := 'x' wstawi znak x na pi�t� pozycj� w �a�cuchu s. Bardziej wymy�lne operacje na �a�cuchach wymagaj� u�ycia specjalnie do tego celu przeznaczonych funkcji, z kt�rych najwa�niejsze opisano poni�ej: Length(s) - zwraca bie��c� d�ugo�� �a�cucha s; Concat(s1, s2) - skleja �a�cuchy s1 i s2 (podobnie, jak operator +) Copy(s, m, n) - zwraca pod�a�cuch o d�ugo�ci m znak�w wyci�ty z �a�cucha s poczynaj�c od pozycji n; Pos(ch, s) - zwraca numer pozycji, na kt�rej w �a�cuchu s znajduje si� znak ch; Delete(s, m, n) - usuwa n znak�w z �a�cucha s poczynaj�c od pozycji m. Jak powiedziano wy�ej, aktualn� d�ugo�� �a�cucha mo�na odczyta� funkcj� Length (lub przez bezpo�rednie odwo�anie do zerowej kom�rki �a�cucha). Aby zmieni� d�ugo�� dynamiczn� �a�cucha, musisz u�y� konstrukcji s[0] := chr[n] gdzie n jest ��dan� d�ugo�ci� (poniewa� �a�cuch sk�ada si� ze znak�w, musimy przekszta�ci� liczb� n na odpowiadaj�cy jej znak funkcj� chr). Poniewa� operacja ta czasem przynosi niezbyt po��dane efekty, lepiej jej unika�. Przytoczony poni�ej program Lancuchy demonstruje niekt�re mo�liwo�ci obr�bki �a�cuch�w i w zasadzie nie wymaga dodatkowego komentarza. Poza wywo�aniami opisanych wy�ej procedur znalaz�a si� w nim r�wnie� funkcja UpCase, przekszta�caj�ca ma�� liter� alfabetu na du��. Operuje ona co prawda na typie znakowym, jednak typowe jej zastosowanie sprowadza si� do konwersji ca�ych �a�cuch�w, jak pokazano ni�ej. program Lancuchy; { Demonstracja operacji na �a�cuchach } const TP = 'Turbo Pascal to bomba'; var s1, s2 : string; i : integer; begin s1 := TP; { przypisanie } s2 := ''; { j.w., �a�cuch pusty } for i := 1 to Length(s1) do s2 := s2 + ' '; { dodawanie �a�cuch�w/znak�w } writeln(s1); i := Pos('a', s1); { wyszukanie znaku } s2[i] := '^'; { wstawienie znaku } writeln(s2); { i co z tego wynik�o? } Delete(s1, 1, 6); { usuni�cie cz�ci �a�cucha } writeln(s1); for i := Length(s1) downto 1 do { wypisanie �a�cucha } { od ty�u } write(s1[i]); writeln; for i := 1 to Length(s1) do { zamiana na du�e znaki } write(UpCase(s1[i])); writeln; s1 := Copy(TP, 1, 13); { wyci�cie pod�a�cucha } for i := Length(s1) downto 1 do begin writeln(s1); Dec(s1[0]); { skracanie �a�cucha } end; end. Na zako�czenie tego rozdzia�u wspomnimy o alternatywnej metodzie reprezentowania danych tekstowych - tak zwanych �a�cuchach zako�czonych zerem (ang. null-terminated string), zwanych te� ASCIIZ. �a�cuch ASCIIZ (podobnie jak string) jest zwyk�� tablic� znak�w, jednak nie posiada pola przechowuj�cego d�ugo��; w zamian za to jego koniec sygnalizowany jest znakiem o kodzie 0 (nie myli� ze znakiem "0"). Efektywna pojemno�� �a�cucha ASCIIZ ograniczona jest wielko�ci� dost�pnej pami�ci (w praktyce do 64 kB) a wi�c jest znacznie wi�ksza, ni� dla typu string. �a�cuchy ASCIIZ (dost�pne pocz�wszy od wersji 7.0 Turbo Pascala) deklarowane s� jako zwyk�e tablice znak�w indeksowane od zera, np.: var BardzoDlugiLancuch : array[0..10000] of char; Elementarna obs�uga �a�cuch�w ASCIIZ (wczytywanie, wyprowadzanie, przypisywanie) realizowana jest tak samo, jak dla zwyk�ych �a�cuch�w, pod warunkiem w��czenia tzw. rozszerzonej sk�adni dyrektyw� kompilatora {$X+} (Options-Compiler-Extended Syntax). Bardziej z�o�one operacje na �a�cuchach ASCIIZ (kopiowanie, por�wnywanie, przeszukiwanie, konwersja do typu string i vice versa) realizowane s� przez procedury zawarte w module bibliotecznym Strings (o modu�ach wkr�tce) i nie b�d� tu omawiane. Warto wreszcie wspomnie� o typie wska�nikowym PChar, umo�liwiaj�cym manipulowanie na dynamicznie tworzonych i usuwanych �a�cuchach ASCIIZ. Poniewa� w wi�kszo�ci przypadk�w typ string znakomicie spe�nia swoje zadanie, poprzestaniemy na powy�szych wzmiankach, odsy�aj�c zainteresowanych Czytelnik�w do systemu pomocy i literatury [2, 3]. W nast�pnym rozdziale zajmiemy si� problemem braku pami�ci, czyli wspomnianym przed chwil� dynamicznym tworzeniem i usuwaniem zmiennych Zapami�taj * Do przechowywania danych tekstowych (napis�w) s�u�y w Turbo Pascalu typ string. * �a�cuch typu string jest specyficzn� tablic� o pojemno�ci do 255 znak�w, przy czym bie��ca d�ugo�� �a�cucha przechowywana jest w zerowej kom�rce tablicy. * Zakres podstawowych operacji na �a�cuchach obejmuje wprowadzanie, wyprowadzanie, przypisywanie i por�wnywanie (realizowane za pomoc� "standardowych" procedur i operator�w). * Bardziej zaawansowane operacje na �a�cuchach to kopiowanie, przeszukiwanie, wycinanie i skracanie. Operacje te realizowane s� za pomoc� specjalnych funkcji i procedur. * Turbo Pascal 7.0 umo�liwia r�wnie� korzystanie z �a�cuch�w zako�czonych zerem (ASCIIZ).
zochul