Pascal. Рядки символів типу String

Рядки символів типу String. Операції роботи над рядками символів


Зміст


Пошук на інших ресурсах:

1. Представлення рядків символів у мові Pascal. Тип String. Загальні відомості

У мові Паскаль визначено два типи рядків:

  • рядки типу String;
  • рядки типу PChar. Більш детально про рядки типу PChar можна прочитати тут.

Рядки символів є не що іншим як масив символів. Цей складений тип даних займає важливе місце при розробці різноманітних програм на Pascal-орієнтованих мовах. Виходячи з цього контексту стандартний Паскаль допускає два способи збереження символьних масивів у пам’яті комп’ютера:

  • розпакований;
  • упакований.

Опис розпакованого масиву символів виглядає приблизно наступним чином:

var
  M: Array[1..Max] of char;

тут

  • M – ім’я масиву;
  • Max – максимально-можлива кількість елементів у масиві.

Опис упакованого масиву символів містить додатково слово packed

var
  M: Packed Array[1..Max] of char;

Для перетворення символьного масиву з розпакованої форми в упаковану і навпаки, у мові Pascal є стандартні функції Pack, UnPack.

Будь-який символьний рядок є не що іншим як упакований (packed) масив символів. Для зручного опису та використання одновимірних упакованих масивів символів у мові Pascal введено тип String. Роботу з типом String підтримують багато стандартних функцій мови Pascal. Ці функції полегшують виконання рутинних (базових) операцій над рядками символів.

Рядок символів типу String може бути присвоєний як константі так і змінній. Будь-яка константа чи змінна може оголошувати рядок символів одним з двох способів:

  • з заданою довжиною рядка;
  • без вказання довжини рядка. У цьому випадку встановлюється довжина рядка, рівна 255 символів. Це є максимально-можлива довжина рядка типу String.

Якщо задається довжина рядка, то оголошення змінної типу String виглядає приблизно так:

var
  s : String[50];

тут

  • s – рядок, що оголошується;
  • 50 – максимально-можлива довжина рядка.

Якщо рядок s оголошується без вказання довжини, то вигляд такого оголошення наступний:

var
  s : String;

Такі самі правила оголошень діють для констант та типів.

У пам’яті, рядок типу String займає на 1 байт більше його довжини. У нульовій позиції рядка вказується довжина рядка (рисунок 1) – кількість символів у рядку.

Pascal. Представлення рядка типу String у пам’яті комп’ютераРисунок 1. Представлення рядка типу String у пам’яті комп’ютера

Тип String без вказівки довжини є сумісний з усіма типами рядків. Окремий символ рядка є тип Char.

 

2. Приклади оголошення рядків типу String
type
  // Оголошення типів рядків
  MySting20 = String[20];
  IdCode = String[10]; // Ідентифікаційний код
  Character = String[1]; // Одиничний символ як рядок

const
  // Оголошення рядків як типізованих констант
  Mon : String = 'Monday';
  Jan : String = 'January';

var
  // Оголошення рядків як змінних
  s1 : String[50];
  s2 : String;

 

3. Перелік операцій, процедур та функцій, що працюють з рядками символів

Для рядків типу String визначені наступні операції:

  • :=присвоювання;
  • +злиття (конкатенації);
  • порівняння. Для порівняння рядків застосовуються будь-які операції відношення (=, <>, >, <, >=, <=). Порівняння рядків відбувається посимвольно, починаючи з першого символу. Рядки рівні, якщо вони мають однакову довжину і посимвольно еквівалентні.

Для доступу до окремого символу в рядку визначена операція індексування

S[i]

тут

  • S – рядок;
  • i – позиція символу в рядку, яка нумерується з 1.

З рядками символів використовуються наступні процедури та функції:

  • Concat – зчеплює (конкатенує) два рядки;
  • Copy – повертає підрядок з рядка;
  • Delete – видаляє підрядок з рядка;
  • Insert – вставляє (додає) підрядок до рядка;
  • Length – повертає довжину рядка;
  • Pos – здійснює пошук підрядка в рядку;
  • Val – конвертує рядок в число;
  • Str – конвертує число в рядок

 

4. Доступ до окремого символу в рядку S[i]. Операція індексування

Щоб отримати окремий символ рядка використовується операція індексування. У найбільш простому вигляді загальний вигляд операції отримання символу наступний

c := S[index];

тут

  • c – символ типу Char;
  • s – вихідний рядок;
  • index – позиція символу в рядку. Нумерація index починається з 1.

Операція індексування може використовуватись і в лівій частині оператора присвоєння. Це означає, що допускається змінювати значення в рядку. Приблизний код зміни значення наступний

S[index] := c;

тут

  • s – рядок типу String;
  • index – позиція в рядку, який змінюється. Значення index нумерується з 1;
  • c – символ типу Char, який замінює символ S[index].

Приклад.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  c : Char;
  s : String;

begin
  // Заданий рядок
  S := 'Hello, world!';

  // Отримати символ з індексом 5
  c := S[5];
  Writeln('c = ', c); // c = o

  // Отримати символ з індексом 1
  c := S[1];
  Writeln('c = ', c); // c = H

  // Отримати останній символ рядка
  c := S[Length(s)];
  Writeln('c = ', c); // c = !

  // Спроба змінити значення S[8]
  S[8] := 'W'; // допускається
  Writeln(S); // Hello, World!

  Readln;
end.

Результат виконання програми

c = o
c = H
c = !
Hello, World!

 

5. Операція присвоєння рядків :=

Корисною операцією для роботи з рядками є операція :=, яка здійснює присвоєння рядків. Загальний вигляд використання операції наступний:

S1 := S2;

тут

  • S1 – рядок-приймач, який отримує значення рядка S2. Попереднє значення рядка S1 втрачається;
  • S2 – рядок-джерело.

При присвоєнні рядків робиться повна копія рядка-джерела. Це означає, що рядки розміщуються в різних ділянках пам’яті.

Приклад.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  s1 : String;
  s2 : String;

begin
  // Задати значення рядкам
  S1 := 'Pascal';
  S2 := 'Delphi';

  // Присвоїти рядку S1 нове значення
  S1 := S2;

  // Вивести результат
  Writeln('S1 = ', S1);
  Writeln('S2 = ', S2);

  // Змінити рядок S2
  S2 := 'JavaScript';

  // Вивести S1 та S2
  Writeln('S1 = ', S1);
  Writeln('S2 = ', S2);

  Readln;
end.

Результат виконання програми

S1 = Delphi
S2 = Delphi
S1 = Delphi
S2 = JavaScript

 

6. Операція +. Конкатенація рядків

Додавання (конкатенація) рядків можна здійснювати з допомогою операції + (плюс). У найбільш загальному випадку реалізація додавання рядків виглядає наступним чином:

s := s1 + s2 + ... + sN;

тут

  • s – рядок, що є результатом конкатенації рядків s1, s2, …, sN;
  • s1, s2, sN – деякі рядки.

Приклад.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  S1, S2, S3 : String;

begin

  // Конкатенація рядків
  S1 := 'Hello';
  S2 := 'world';
  S3 := S1 + ', ' + S2 + '!';
  Writeln(S3); // Hello, world!

  S1 := 'ABCD';
  S1 := S1 + S1;
  Writeln(S1); // ABCDABCD

  Readln;
end.

 

7. Операції =, <>. Порівняння рядків на рівність (не рівність)

У мові Паскаль рядки допускають порівняння на рівність/нерівність. Для порівняння рядків використовуються операції =, <> за наступним зразком

S1 = S2
S1 <> S2

Результатом виконання операцій є логічні значення True або False. Порівняння рядків застосовується в операторах, що допускають виконання логічних операцій.

Приклад.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  S1, S2 : String;

begin

  // Порівняння рядків
  Write('S1 = ');
  Readln(S1);
  Write('S2 = ');
  Readln(S2);

  // Операція =
  if S1 = S2 then
    Writeln('Strings are equal')
  else
    Writeln('Strings are not equal');

  // Операція <> (не дорівнює)
  if S1 <> S2 then
    Writeln('Strings are not equal')
  else
    Writeln('Strings are equal');

  Readln;
end.

Результат виконання програми

S1 = abcd
S2 = abcd
Strings are equal
Strings are equal

 

8. Операції >, <, >=, <=. Порівняння рядків на більше чи менше з точки зору лексикографічного порядку

Для порівняння рядків в лексикографічному порядку використовуються операції >, >=, <, <=. У найбільш загальному випадку порівняння двох рядків S1 та S2 має наступний вигляд

S1 < S2
S1 <= S2
S1 > S2
S1 >= S2

Результатом операцій є значення True або False. Лексикографічний порядок символів у рядках визначається числовим значенням кодів цих символів.
Так, наприклад, код символу ‘A’ слідує перед кодом символу ‘B’. Відповідно вираз

'A' < 'B'

поверне результуюче значення True.

Приклад.

...

// Порівняння рядків
S1 := 'ABC';
S2 := 'ABCD';
res := S1 >= S2; // res = False
res := S1 > S2; // res = False
res := S1 <= S2; // res = True
res := S1 < S2; // res = True

...

 


Споріднені теми