Самостійне вивчення
Символьні масиви. Рядковий тип.
Окремо виділимо масиви, елементи яких є символьного типу (char). Такі одновимірні масиви, індексами яких є діапазон цілого типу, називають рядками. Наприклад:
var R: array [1..14] of char;
У Паскалі є деякі додаткові засоби роботи з такими масивами. По-перше, змінним такого типу можна присвоювати символьні сталі (тобто рядки символів):
R:='Рядок символів';
У цьому випадку довжина присвоюваного рядка повинна чітко збігатися з розмірністю відповідного символьного масиву.
Крім того, для рядкових масивів допустима операція конкатенації, яку позначають символом +. Вона полягає у формуванні нового символьного масиву, розмір якого дорівнює сумі розмірів масивів-операндів, а значення - це елементи масивів-операторів, розміщені послідовно. Наприклад:
var
s1: array [1..5] of char; s2: array [1..8] of char;
Тоді можна записати
s1:='Рядок'; s2:='символів'; writeln(s1+' '+s2);
Буде виведене повідомлення: Рядок символів
Виведення для рядка не є обов'язково покомпонентне, дозволено задати й ім'я. Операцію конкатенації не можна використати в правій частині присвоєння, наприклад, s:=s1+s2. Для цього треба застосувати рядки змінної довжини.
Рядки, що містять однакову кількість компонентів, хоча належать до різних типів, можна порівнювати за допомогою
знаків -, <>, <, <-, >, >=. Для цього використовують властивість упорядкованості рядків. Рядки порівнюють шляхом послідовного порівняння символів до першого незбігання. Незбіжні символи визначають упорядкованість рядків. Упорядкованість же символів визначена їхнім внутрішнім зображенням у комп'ютері, зокрема, для букв - це алфавітний порядок, для цифр - порядок за зростанням.
Для прикладу порівняємо дві змінні рядкового типу:
type
aa=array [1..10] of char;
var
x1, x2: aa;
b: boolean;
x1 :='програма 1';
х2:='прогноз 22’;
b:=х1>х2;
У цьому випадку b буде мати значення true, оскільки 'р'>'н'. Стандартна процедура read не читає автоматично рядки, їх треба читати в циклі символ за символом.
Рядковий тип (string)
У Турбо Паскалі реалізований рядковий тип, що є узагальненням символьних масивів, який дає змогу, на відміну від них, динамічно змінювати довжину рядка. Загальний вигляд опису рядкового типу такий:
type
<ім'я>=string[<максимальний розмір>];
Наприклад:
type
Line=string[80];
var R: Line;
Тепер змінна R типу Line може набувати значення будь-якої послідовності символів (типу char) завдовжки від 0 до 80. Це значення може бути присвоєне або введенне. Наприклад:
R:='Гpyпa КТ-14'; або readln(R); (3 клавіатури вводять ГрупаКТ-14<Enter>).
Як і для символьних масивів, тут використовується операція конкатенації. Наприклад:
writeln(R+'складає іспит 20-го січня');
Максимальну довжину в описі рядкового типу зазначають цілим числом або не зазначають, за замовчуванням приймається 255.
Під змінну рядкового типу відводиться N+1 байтів пам'яті, де N - максимальна довжина, зазначена в описі (рис 1).
Нульовим елементом є байт, що містить значення довжини поточного рядка, наступні k елементів - поточне значення рядка, і байти k+1..N- вільні.
0 1 2 к к+1 n-1 n
Значення рядкової змінної Вільна частина
Довжина рядкової змінної
Рис. 1. Структура пам'яті для даних типу string.
Для визначення довжини поточного значення рядка використовують нульовий елемент
Writeln (ord(R[0]))
З іншого боку, якщо спочатку присвоїти R[0]:=5;
то writeln(R) виведе "Група", тобто тільки п'ять елементів.
Частіше для визначення довжини рядка використовують функцію Length, параметром якої є вираз рядкового типу. Наприклад:
writeln(Length(R+'здає іспит 20-го січня')); виведе число 33 - цілого типу.
Крім операції конкатенації, над змінними рядкового типу визначені операції порівняння, у разі використання яких діють такі правила:
а) коротший рядок завжди менший від довшого;
б) якщо довжини однакові, то поелементно порівнюються символи порівнюваних рядків з урахуванням лексикографічної впорядкованості значень стандартного символьного типу char.
Присвоєння змінній рядкового типу виразу з довжиною, більшою від максимально допустимої, зумовлює до обрізання рядка до максимальної довжини. Наприклад:
var
st: string [5];
st:='Програма';
writeln(st);
Буде виведене слово Прогр.
Доступ до окремих елементів рядкових типів такий самий, як і до елементів звичайних одновимірних масивів - за допомогою індексів у квадратних дужках. Наприклад: R[5]; st[2].
У процесі поелементного опрацювання рядкових типів треба враховувати їхню поточну довжину.
У Турбо Паскалі з рядковими типами використовують низку функцій:
1) concat([s1 ,s2,...,sn]: string): string - злиття довільної кількості рядків. Якщо довжина вислідного >255, то він буде обрізаний;
2) copy(s: string; Index: integer; Count: integer): string - повертає частину рядка 5 довжиною Count, починаючи від символу з номером Index;
3) delete(var s: string; Index, Count: intrger) - вилучає з рядка s частину цього рядка довжиною Count, починаючи з Index;
4) Insert(Source: string; var s: string; Index: integer) — вставляє рядок Source в рядок s, починаючи з Index;
5) Length(s: string): integer - повертає довжину рядка s;
6) Pos(Substr, s: string): byte - результатом цієї функції є номер позиції, з якої в рядку s розміщений рядок Substr.