Використання текстових даних
Як уже згадувалося, у мові TP є два види текстових даних: символьні (char) та рядкові (string).
Символьною сталою є будь-який один символ алфавіту мови, взятий у лапки: ‘A’, ‘B’, ‘C’, ‘F’, ‘Z’, ‘1’, ‘2’, ... .
Над ними визначені тільки операції порівняння (<, >, =, <>, <=, >=). Результатом операції є дане логічного типу: true або false.
Символи алфавіту впорядковані, тобто:
‘0’ < ’1’ < … < ‘9’ < … < ‘A’ < ‘B’ < … < ‘a’ < ‘b’ < … . Це дає можливість символьну змінну використовувати як параметр циклу, наприклад,
for s:=’A’ to ‘H’ do
begin …
У цьому випадку змінна S прийматиме значення ‘A’, ‘B’, … , ‘H’.
Як уже зазначалось, для роботи з символьними даними є функції: chr(x) та ord(x). Для прикладу, результатом роботи функції chr(66) буде символ ‘B’, а значенням функції ord(‘B’) буде число 66.
Символьні дані можна об’єднувати в масив, наприклад,
var P: array[1..30] of char;
Фактично P – це рядок 50 символів. Його можна увести в циклі:
for i:=1 to 50 do
read(p[i]); readln;
Можна працювати з елементами масиву char як з елементами звичайних масивів, наприклад
p[i]:= ’ ’;
if p[i]:= ’*’ then writeln(p[i]);
Рядкові дані типу string мають більше можливостей для аналізу та опрацювання текстів і багато в чому схожі на одновимірний масив символів array[1..n] of char. Проте, на відміну від масиву, кількість символів у рядку-змінній може змінюватися від 0 до n, де n – кількість символів у рядку. Значення n визначається оголошенням типу string[n] і може бути довільною константою, що не перевищує 255. TP дозволяє не вказувати n, і в такому випадку довжина рядка вважається максимально можливою, а саме n=255. Значення n визначає також об’єм пам’яті, що відводиться для даної змінної. Тип string[n] означає, що для рядкової змінної даного типу відведено n+1 байт.
Рядок в ТР трактується як ланцюжок символів. До будь-якого символу у рядку можна звернутись точно так само, як і до елемента одновимірного масиву.
Наприклад,
var st: string;
begin
if st[5]=’A’ then …
Перший байт рядка має індекс 0 і містить поточну довжину рядка. Другий байт рядка має індекс 1 і містить перший символ рядка. Поточну довжину рядка можна отримати ще з допомогою функції length(st).
Для рядкових даних можна застосовувати операцію зчеплення (конкатенацію), наприклад:
st:= ‘українська’;
st:= st + ‘ академія друкарства’
У результаті рядок символів st міститиме: українська акдемія друкарства.
Якщо довжина зчепленого рядка перевищить максимально допустиму довжину n, то “зайві” символи відкинуться. Наступна програма надрукує символ 1:
var st: string[1];
begin
st:=’123’; writeln(st)
end.
Два рядки можна порівнювати між собою (порівняння відбувається посимвольно, зліва направо), при цьому порівнюються коди відповідних символів. Якщо один рядок менший від іншого за довжиною, то він доповнюється значеннями chr(0).
Наприклад:
var s,q,t,f: string;
begin
s:=’Харків’;q:=’Львів’
t:=’Марчук’; f:=’Марченко’;
p1:=’ПАскаль’; p2:=’Паскаль’;
if s>q then writeln(s);
if t>f then writeln(t)
if p2>p1 then writeln(p2);
end.
Результатом роботи програми будуть слова ‘Харків’, ‘Марчук’ і ‘Паскаль’, бо рядок s більший, ніж рядок q тому, що код букви ‘Х’ більший за код букви ‘Л’, а рядок t більший за рядок f тому, що в цьому випадку порівнюються перші літери, які не співпадають у двох рядках і код букви ‘у’ більший за код букви ‘е’; рядок p2 , більший за рядок p1 тому, що код букви ‘а’ більший за код букви ‘А’.
Інші дії над рядками і символами реалізуються з допомогою вбудованих процедур і функцій:
concat(s1,s2 ,s3, …, sn]) – функція типу string; виконує зчеплення рядків s1, s2, …, sn;
copy(st, index, count) – функція типу string; копіює count символів, починаючи з символу з номером index із рядка st;
delete(st, index, count) – процедура; видаляє count символів, починаючи із символу з номером index із рядка st;
insert(s1,s2, index) – процедура; вставляє рядок s1 у рядок s2, починаючи з символу із номером index;
pos(s1,st) – функція типу integer; шукає в рядку st (з лівого краю) перше входження підрядка s1 і видає номер позиції, з якої він починається; якщо підрядок не знайдений, то результатом буде нуль;
str(x,st) – процедура; перетворює число х типу real чи integer у рядок символів st так, як це робить процедура writeln перед виводом.
Приклади:
var
x:real;
y:integer;
st,st1:string;
……..
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:3,st) {рядок st містить 3.141}
Приклад. Заданий текст містить символи латинського алфавіту, цифри і знаки арифметичних операцій. Видалити з тексту всі цифри і подвоїти знаки ‘ + ’ і ‘ - ‘. Надрукувати отриманий текст.
Pascal-програма розв’язку задачі
program pr1;
var c:char;
begin
read(c);
repeat if (c='+') or (c='-') then
write(c,c) else
if (c<'0') or (c>'9') then write(c);
read(c)
until c='.';
writeln;
end.
Приклад. Задана послідовність слів із латинських букв. Слова відділяються пробілами. У кінці послідовності – крапка. Визначити кількість слів, що починаються з букви ‘а’.
Pascal-програма розв’язку задачі
program pr2;
var c:char; k:integer;
begin k:=0;
repeat
read(c); {перша буква слова}
if c='a' then k:=k+1; {пропуск решти букв слова}
repeat
read(c);
until (c=' ') or (c='.');
until c='.';
writeln('з букви "a" починається ',k,'слів');
end.
Приклад. Скласти програму визначення кількості символів у найдовшому слові заданого тексту.
Pascal-програма розв’язку задачі.
program slovo;
const n=50;
var st:string;
k:array[1..n] of integer;
d,ns,m,l,j,i:integer;
begin
writeln('Введіть текст з крапкою у кінці');
writeln('слова розділяйте одним пробілом');
readln(st);
d:=length(st);
if st[d]<>'.' then
begin
writeln('ви не поставили крапку');
writeln('повторіть спочатку');
halt;
end;
insert(' ',st,d);
i:=0;
while st<>'.' do
begin
i:=i+1;
l:=pos(' ',st);
k[i]:=l-1; {формування масиву довжин}
delete(st,1,l)
end;
m:=k[1]; ns:=1;
for j:=2 to i do
if k[j]>m then begin
m:=k[j];
ns:=j
end;
writeln(ns,' - найдовше слово і містить ',m,' символів');
end.
