Char stringóW, czyli jak działać na zmiennych typu tekstowego I łańcuchach znaków



Pobieranie 31,38 Kb.
Data08.12.2017
Rozmiar31,38 Kb.

CHAR STRINGÓW, czyli jak działać na zmiennych typu tekstowego i łańcuchach znaków.

  1. Funkcja czytaj_znak czyli ReadKey znajduje się w bibliotece Crt - koniecznie zadeklarować. Zmienna typu znakowego Char – 8-bitowa - to każdy znak wpisany z klawiatury (nie tylko te widoczne a klawiszach!). Jest to prosty typ zmiennej. Prosty programie ilustrujący jej działanie:

Program czytajklawisz;

USES CRT;
Var

znak:char;
Begin

WriteLn( 'Wcisnij jakis klawisz...');

znak:=ReadKey;

WriteLn( 'Wcisniety zostal klawisz: ',znak );

End.


  1. Funkcja Chr(liczba) działa w ten sposób, że gdy wpiszemy liczbę jako argument to pokaże się odpowiadający jej znak. Np. Chr(70).

  2. Napisz programie czytający liczbę i przekładający ją na znak ASCII.

  3. Funkcja Ord(znak) działa odwrotnie jak funkcja Char. „Żywi się” znakiem, a oddaje numer.

  4. Napisz prosty program wykorzystujący tę funkcję.

  5. Procedura Inc() zwiększa wartość o 1, ale tym różnie się od przypisania x:=x+1, że działa też na znaki. Wypróbuj jej działanie w programie.

  6. STRING - Ten typ służy do reprezentowania ciągów znaków (krótkich napisów) o długości nie większej niż 255 znaków. String(a) – oznacz łańcuch długi na a znaków. Warto wiedzieć, że łańcuch to praktycznie tablica:

x : string[n]

jest równoważna deklaracji tablicy znakowej

x : array [0 .. n] of char


  1. Często łączymy łańcuchy znaków wypisując odpowiedź na ekranie. Mamy wtedy do czynie z konkatenacją.

  2. Zmienna typu Word to rozszerzony string (zajmuje więcej miejsca w pamięci). Oto przykładowy program zawierający deklarację modułu DOS – chcemy uzyskać czas systemowy.

Program bdata;

Uses DOS;

Const

dni:array[0..6] of string=('Niedz','Pon','Wto','Sro','Czw','Pia','Sob');



Var

rok,mies,dzien,dztyg:word;


Begin

GetDate(rok,mies,dzien,dztyg);

WriteLn('Dzisiejsza Data : ',dni[dztyg],' ',dzien,'-',mies,'-',rok);

End.


Oto kilka ciekawych działań na łańcuchach znaków:

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.



©operacji.org 2017
wyślij wiadomość

    Strona główna