var S1 : array [1..8] of char;
S2 : array [1..5] of char;
begin
S1 := ’рядковий’;
S2 := ’масив’;
writeln (S1+’ ’+S2); {результат на екрані: Рядковий масив}
end.
!Особливість:!
1. в операторах присвоювання рядків символьним масивам необхідна точна відповідність довжини рядків і розмірів масивів;
2. операція конкатенації для символьних масивів не допускається у правій частині присвоювання. Наприклад:
S := S1+’ ’+S2; {помилка}
У таких випадках необхідно використовувати рядки, тобто рядкові типи даних.
4. Визначення рядкового типу даних
Рядкові типи даних є одним з розширень мови Паскаль, які найбільш використовуються. Рядковий тип узагальнює поняття символьних масивів, дозволяє динамічно змінювати довжину рядка.
При використанні у виразах рядок обмежується апострофами. Кількість символів в рядку (довжина рядка) може динамічно змінюватись від 0 до 255.
Для визначення рядкових даних використовується ідентифікатор STRING, за яким у квадратних дужках вказується максимальна довжина рядка. Якщо значення не вказане, то по замовченню довжина рядка встановлюється 255 байт.
Приклад:
Line : string [80];
Line1 : string ;
Line2 : string [255].
В приведеному прикладі змінна Line може мати будь-яку послідовність символів (кожен з яких має стандартний тип char) довільної довжини в межах від 0 до 80 символів; Line1 і Line2 – від 0 до 255 символів.
Таким чином, важливіша різниця між рядками і символьними масивами, що рядки можуть динамічно змінювати свою довжину.
Змінну рядкового типу визначають у розділі опису типів, або безпосередньо у розділі опису змінних.
Рядкові дані також можна використовувати у програмі як константу.
Формат:
1. type
<ім’я типа > = string [max довжина рядка];
var
< ідентифікатор > : <ім’я типа >;
Або
2. var
< ідентифікатор > : string [maxдовжина рядка];
Приклад:
const address = ‘пл. Соборна, 1’;
type line = string [125];
var
S1 : Line;
S2 : string;
S3 : string [50];
Механізм динамічних рядківреалізований в мові Турбо-Паскаль достатньо просто.
Для рядкових змінних пам’ять виділяється відповідно максимального значення, а використовується лише частина, яка реально зайнята символами рядка у даний час, тобто для N символів виділяється N+1 байт пам’яті, із яких N байт призначено для зберігання символів рядка, а 1 байт – для значення поточної довжини цього рядка:
Елементи рядка нумеруються цілими числами, починаючи з 1. Це іноді використовують для визначення поточної довжини рядка, наприклад:
1) line := ‘ ’; {пустий рядок}
writeln (ORD (line [0] )); {на екрані число 0}
2) line : =‘ABCD’;
writeln (ORD (line [0] )); {на екрані число 4}
Однак, для визначення поточної довжини рядка, як правило, використовують стандартну функцію length, яке повертає ціле значення поточної довжини рядка. Але це ми розглянемо далі.
У разі присвоювання рядковій змінній виразу з довжиною більше ніж максимально допустимо для даної змінної, то символи за межами максимальної довжини не використовуються (вилучаються). Ця ситуація не є помилковою, тому переривання виконання програми у даному випадку не відбувається. Наприклад:
var line : string [4];
begin
line := ‘дуже довгий рядок’; {на екрані: дуже}
writeln (line);
end.
Таким чином рядки можуть динамічно змінювати свою довжину.
5. Основні операції над рядковими даними
Над рядковими даними виконують такі операції:
1. присвоювання (:=);
2. введення (Read);
3. виведення (Write);
4. поєднання (зчеплення, конкатенації – „+");
5. порівняння (відношення).
Перші три операції виконуються стандартно, без особливостей. Тому розглянемо дві останні операції.
Операція конкатенації.
Використовується для зчеплення декількох рядків в один, причому довжина результуючого рядка не повинна перевищувати 255 символів (або вказану довжину N). Інакше останні символи будуть відкинуті.
Приклади:
1) st := ‘a’+’b’;
st := st + ‘c’;
writeln (‘st = ‘, st) {результат st =abc}
2) var st : string [2];
begin
st :=’1’ + ‘2’ + ‘3’;
writeln (st) {на екрані 12}
end.
Операція порівняння (відношення).
Проводить порівняння двох рядкових операндів за допомогою стандартних операторів: = , <>, >, <, >=, <=.
Правила порівняння:
1. Порівняння проводиться зліва-направо з урахуванням внутрішнього кодування символів таблиці ASCII. Рядок буде більшим, якщо перший не співпадаючий символ має більший номер.
2. У менший по довжині рядок додаються символи значення CHR(0). Тому при однакових, символах короткий рядок завжди менше довгого рядка.
Результат виконання операції завжди має логічний тип і приймає значення TRUEабо FALSE.
Приклади:
1) ‘ " ‘ < ‘.’ TRUE
2) ‘A’ > ‘1’ TRUE
3) ‘AB’ = ‘A’ FALSE
4) ‘ABC’ > ‘AB’ TRUE
5) ‘12’ <’2’ TRUE
6. Стандартні засоби обробки рядків: процедури і функції
Функції:
1. CONCAT(S1,S2,…,SN) – функція типу STRING. Виконує послідовне поєднання рядків S1,S2,…,SN, кожен з яких є вираз рядкового типу (STRING). Результатом є рядок не більше 255 символів. Дана функція еквівалентна операції конкатенації: ‘S1’ + ‘S2’ + ‘S3’…
2. COPY(st : STRING; index : INTEGER; count : INTEGER): STRING або COPY (st, index, count).
Функція копіює (повертає) частину рядка, виділеного з рядка st, довжиною countсимволів, починаючи з символу під номером index.
3. LENGTH(st : STRING) функція типу INTEGER повертає довжину рядка.
4. POS(subst, st : STRING): BYTE. Функція шукає у рядку st рядок subst. Результатом є номер позиції, де рядок subst зустрічається перший раз. Якщо рядок subst не знайдено, то результатом буде 0 (нуль).
5. UPCASE(ch) – функція типу CHAR. Повертає для символьного виразу ch, яке повинно представляти собою рядкову (маленьку) латинську букву, відповідно їй велику букву. Якщо значенням функціїch є будь-який інший символ (в тому числі рядкова буква російського алфавіту), функція повертає його без змін.
Процедури:
1. DELETE(st : STRING; index, count : INTEGER) або DELETE(st, index, count) – процедура вилучає (знищує) count символів у рядку st починаючи з символу під номером index.
2. INSERT(subst: STRING; st: STRING; index: INTEGER) або INSERT(subst, st, index). – процедура вставляє рядок substу рядок st, починаючи з символу під номером index.
3. STR(X [:width[:decimals]]; st: STRING) – процедура перетворює число Х (real або integer) в рядок символів st так, як це робить це робить процедура WRITELN перед виводом. Параметри width і decimals(якщо вони присутні, тобто дужки [ ] показують на необов’язковість цих параметрів) задають формат перетворення: загальну ширину поля для представлення числаХ (width) та кількість символів дрібної частини (decimals), якщо X : REAL.
4. VAL(st, x, code) – процедура перетворює рядок символів st в значення числової змінної X (визначеного типу). Параметр code= 0, якщо перетворення пройшло успішно, тоді X дорівнює результату перетворення. Якщо виявляється помилковий символ у рядку st, то значення Х не змінюється, а codeдорівнює номеру позиції з помилковим символом.
!Особливість!: Недопустимими є пропуски (пробіли) праворуч числа у рядку st!
val (‘123_ _’, x, k) {помилка, x – не змінюється, k=4 };
val (‘_ _123’, x, k) {вірно, x=123, k=0 };
Приклади:
var x : real;
y : integer;
st, st1 : string;
begin
st := concat (‘12’, ‘345’); {рядок st містить 12345}
st1 := copy (st, 3, Length(st)-2); {st1 містить 345}
insert(‘-’ , st1, 2); {рядок st1 містить 3-45}
delete(st, pos(‘2’, st), 3); {рядок st містить 15}
str(pi : 6 : 2, st ); {рядок st містить 3,14}
val (‘3.1415’, x, y); {y містить 2, х беззмін}
end.
Висновок: таким чином над рядками можна виконувати операції присвоювання, порівняння, з’єднання (конкатенації), введення та виведення. Для цього використовують широкий набір процедур та функцій.