Рядки символів типу String. Операції роботи над рядками символів
Зміст
- 1. Представлення рядків символів у мові Pascal. Тип String. Загальні відомості
- 2. Приклади оголошення рядків типу String
- 3. Перелік операцій, процедур та функцій, що працюють з рядками символів
- 4. Доступ до окремого символу в рядку S[i]. Операція індексування
- 5. Операція присвоєння рядків :=
- 6. Операція +. Конкатенація рядків
- 7. Операції =, <>. Порівняння рядків на рівність (не рівність)
- 8. Операції >, <, >=, <=. Порівняння рядків на більше чи менше з точки зору лексикографічного порядку
- Споріднені теми
Пошук на інших ресурсах:
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) – кількість символів у рядку.
Рисунок 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 ...
⇑
Споріднені теми
⇑