ŁAŃCUCHY

   Łańcuch ma strukturę danych podobna do tablic lecz jego liczba elementów nie musi byś ścisle określona

Struktury takie będziemy nazywać łańcuchami. Ich elementy muszą być typu CHAR. Deklaracja typu łańcuchowego jest następująca:

TYPE nazwa = STRING[długość_łańcucha];

np. TYPE nazwisko = STRING[20];

Wyrażenia:

VAR x, y: STRING [20];

CONST A: STRING[20]=‘Zawalny’

są deklaracjami zmiennych x, y i stałej A typu STRING[20]. W przykładzie nazwisko jest nazwą typu, w którym są łańcuchy znaków o długości nie większej niż 20. Zatem każde słowo o długości nie większej niż 20 znaków jest strukturą tego typu. Maksymalna długość łańcucha nie może być większa niż 255 znaków. W tym ostatnim przypadku nie musimy podawać w deklaracji wielkości łańcucha, np.

VAR x,t: STRING;

Dotychczas używaliśmy łańcuchów w niejawny sposób, przez używanie instrukcji write tekst'). Tak jak dla danych typu CHAR, tak i tu będziemy konkretne łańcuchy wyróżniać używając apostrofu, np. 'Zawalny’, '='. Podobnie, jeśli x jest zmienną typu STRING[n]], to możemy użyć instrukcji przypisania x:='Zawalny' W Pascalu mamy operację łączenia łańcuchów, oznaczamy ją symbolem +.

Polecenie: x:’Zawalny’+’Stanisław daje w wyniku ZawalnyStanisław. W celu przyporządkowania zmiennej x (typu łańcuchowego) pewnej wartości, używamy instrukcji przypisania lub polecenia Readln(x).). W tym drugim przypadku słowo będące wartością przyporządkowaną zmiennej x będzie wpisane z klawiatury.

Dość powszechnie jest stosowany porządek alfabetyczny. Dla przykładu, nazwiska w książce telefonicznej są ustawione w porządku alfabetycznym. Zasady tego porządku są następujące: w pierwszej kolejności porządkujemy nazwiska według ich pierwszej litery, dalej nazwiska zaczynające się od tej samej litery porządkujemy według drugiej litery itd. Zakładamy przy tym, że jeśli nazwisko-1 jest początkiem nazwisko-2, to nazwisko-l<nazwisko~2. Opisany tu porządek czasem nosi nazwę porządku leksykograficznego. Do wyrażenia tego porządku możemy używać symboli <, <=, >, >=, = np. ''A'<'B'', ''A'<'ABC'.

Pojęcie łańcucha jest naturalnym uogólnieniem pojęcia danej typu CHAR oraz tablic jednowymiarowych, których elementy mają typ CHAR. Do wykonywania bardziej skomplikowanych operacji na łańcuchach mamy w Turbo Pascalu pewne standardowe procedury i funkcje łańcuchowe. Procedury te są zawarte w module SYSTEM. Oto najważniejsze z nich:

Length(s: STRING): BYTE

Jest to funkcja podająca długość określonego łańcucha. Wynik operacji jest liczbą całkowitą.

Str(i: number; VAR s: STRING)

Jest to procedura przekształcająca podaną wartość numeryczną i (rzeczywistą lub całkowitą) w łańcuch znaków i przypisująca go zmiennej użytej w miejsce parametru wejściowo-wyjściowego s. Funkcja ta może być używana z parametrem, np. Str(i:n,s) co powoduje, że z danej liczby tworzy się łańcuch o długości n, przy czym następuje obcięcie wyrażenia numerycznego lub uzupełnienie go spacjami. Podobnie działa polecenie Str(i:n:m,s) zastosowane do danych typu REAL. Uwaga, symbol '.' jest traktowany jako element łańcucha.         

Val(s: STRING; VAR r:: REAL; VAR p: INTEGER)

Przy tym: s jest pewnym łańcuchem przedstawiającym wyrażenie numeryczne, parametr r-jest typu INTEGER lub REAL, parametr p jest typu INTEGER. Procedura ta przekształca dany łańcuch w odpowiadające mu wyrażenie numeryczne i przypisuje je zmiennej użytej w miejscu parametru r. Użyta tu zmienna w miejscu p przyjmuje wartość O, jeśli wykonalna jest procedura VAL lub n, (n jest numerem znaku, który uniemożliwił konwersję). W tym ostatnim przypadku wartość parametru r pozostaje taka sama jak przed wykonaniem procedury.

Copy(s: STRING,m,n: INTEGER)

Tworzy nowy łańcuch będący fragmentem łańcucha s od miejsca o numerze m i o długości n.

Concat(sl,...,sk: STRING): STRING

Tworzy łańcuch będący sumą wyszczególnionych łańcuchów. Otrzymany wynik nie powinien mieć więcej niż 255 znaków.

Pos(sl,s2: STRING): INTEGER

Podaje jako wynik najmniejszy numer miejsca w łańcuchu s2, od którego zaczyna się łańcuch identyczny z s l.

Insert(s: STRING; VAR d: STRING; n: INTEGER)

Wstawia do łańcucha d w miejscu n łańcucha, przy czym będą wstawione tylko te znaki poczynając od lewej, które nie powodują przekroczenia zadeklarowanej długości łańcucha o?.

Delete(VAR s: STRING; n,m: INTEGER)

Usuwa z podanego łańcucha m znaków poczynając od miejsca o numerze n włącznie.

PROGRAM Dlugosc_wyrazow;

USES  Crt;

VAR

  Nazwisko : String[25];

  Imie     : String[20];

(******************************)

BEGIN

  ClrScr;

  Writeln;

  Writeln('Wyznaczenie dlugosci nazwiska i imienia ');  Writeln;

  Write('Pisanie nalezy zakonczyc nacisnieciem');  Writeln(' klawisza  Enter ');

  Writeln;

  Write('Podaj nazwisko : ');  Readln(Nazwisko);

  Write('Podaj imie     : ');  Readln(Imie);

  Writeln;

  Writeln('Imie ',Imie,' zawiera ',Length(Imie),' liter');

  Writeln('Nazwisko ',Nazwisko,' zawiera ', Length(Nazwisko),' liter');

   REPEAT UNTIL KeyPressed

END.

PROGRAM Obecnosc_litery_a;

USES Crt;

VAR

 tekst   : STRING;

 i     : INTEGER;

 ile   : INTEGER;

(*********************)

BEGIN

  ClrScr;

  Writeln(' Wyznaczenie liczby malych liter ''a'' w tekscie');  Writeln;

  Writeln(' Napisz tekst i nacisnij ENTER');  Readln(tekst);

  ile:=0;

         FOR i:=1 TO LENGTH(tekst) DO

         IF (tekst[i]='a') THEN

         ile:=ile+1;

   Writeln(' Liczba malych liter ''w'' w tekscie : ',ile);

   REPEAT UNTIL KeyPressed

END.

 

PROGRAM Przejrzysta_postac_liczb;

USES  Crt;

VAR

   Liczba_String : STRING[15];

   Liczba        : LONGINT;

   Licznik       : SHORTINT;

(*************************************************************)

BEGIN

  ClrScr;

  WriteLn(' Przejrzystosc  liczb');

  WriteLn;

  Write(' Podaj liczbe calkowita (do 9 cyfr): ');

  ReadLn(Liczba);

  STR(Liczba,Liczba_String);

  Licznik := LENGTH(Liczba_String) - 2;

   WHILE Licznik > 0 DO

    BEGIN

      Insert (' ',Liczba_String, Licznik);

      Licznik := Licznik - 3

    END;

  WriteLn;

  WriteLn(' Przejrzysta postac : ', Liczba_String);

   REPEAT UNTIL KeyPressed

END.

powrót