Самостійне вивчення Символьні масиви. Рядковий тип. Окремо виділимо масиви, елементи яких є символьного типу (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.