Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 основи програмування книга.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.77 Mб
Скачать

11.5. Рядки і засоби їх обробки

Значенням рядкового типу даних є рядки. Стандарт мови передбачає використання рядків тільки як констант, що використовуються в операторах виведення Write, Writeln. У розширенні мови Turbo-Pascal рядковий тип даних визначений більш повно.

Визначення рядкового типу слідує діаграмі:

Тут ціле належить діапазону 1..255 і означає максимальну кількість символів у рядку цього типу. Якщо описання типу String використовується без вказівки максимальної кількості символів, це (за замовченням) означає, що під цей тип резервується 255 символів.

Наприклад:

Type

Name = String[20]; { рядки з 20-ти символів }

Post = String; { рядки з 255-ти символів }

Процедури і функції типу String.

Над рядками визначена операція конкатенації “+”, результат якої - рядок, в якому операнди з’єднанні в порядку їх слідування у виразі. Наприклад:

'Turbo' + 'Pascal' = 'TurboPascal';

'Turbo_' + 'Pascal ' + 'System' = 'Turbo_Pascal System';

Тому результатом виконання серії операторів

X := ' Приклад';

У := ' додавання ';

Z := ' рядків' ;

Writeln(X + Y + Z);

Writeln(Y + ' ' + Z + ' ' + X)

будуть виведені на екран рядки

Прикладдодаваннярядків

додавання рядків Приклад

Тип String допускає і пустий рядок - рядок, який не містить символів: EmptyStr := '' {лапки, що йдуть підряд}. Вона грає роль нуля (нейтрального елемента) операції конкатена­ції: EmptyStr + X = X + EmptyStr = X

Над рядками визначені також відношення (операції логічного типу)

" = ", " <> ", " < ", " > ", " <= ", " >= ".

Таким чином, кожний із рядкових типів упорядкований, причому лексикографічно. Це означає, що

а) порядок на рядках погоджений з порядком, заданим на символьному типі (Char);

б) порівняння двох рядків здійснюється посимвольно, починаючи з перших символів;

в) якщо рядок А є початком рядка В, то А < В;

г) пустий рядок - найменший елемент типу.

Наприклад:

а) 'с' < 'k', так як Ord(‘c’) < Ord(‘k’);

б) 'abс' < 'abk', так як перші два символи рядків співпадають, а порівняння третіх дає Ord(‘c’) < Ord(‘k’);

в) 'abс' < 'abkd', так як перші два символи рядків співпадають, а порівняння третіх дає Ord(‘c’) < Ord(k);

г) 'ab' < 'abсd', так як рядок 'ab'- початок рядка 'abсd'.

На рядковому типі даних визначені:

Функції:

a) Length(X: String): Byte; - довжина рядка X; { Length(EmptyStr) = 0 }

б) Pos(Y:String; X:String):Byte; - позиція першого символу першого зліва входження підрядка Y у рядок X. Якщо X не містить Y, Pos(Y, X) = 0.

в) Copy(X:String; Index, Count: Integer):String - підрядок рядка X, що починається з пози­ції Index і містить Count символів.

г) Concat(X1, X2, .., Xk: String): String; - конкатенація рядків Х1, X2, .., Xk. Інша форма запису суми X1+X2+ .. +Xk.

Процедури:

д) Delete(var X: String; Index, Count: Integer); З рядка X видаляється Сount символів, починаючи з позиції Index. Результат поміщується в змінну X.

e) Insert(Y:string; var X: String; Index: Integer); В строку X вставляється рядок Y, причому вставка здійснюється починаючи з позиції Index.

Стандартні процедури введення-виведення Паскаля розширені для введення-виведення рядків. Відмітимо, однак, що для введення декількох рядкових даних треба користуватись оператором Readln. Оператор Read у цих випадках може вести себе непередбачено.

Приклад 11.7. Дано масив A[1..n] of string[20]. Скласти програму заміни всіх перших входжень підрядка L в A[i] на підрядок R. Рядки L і R вводяться з клавіатури в виді рівності L = R. Результат замін відобразити у масив, елементи якого - рівності виду:

A[i]=результат заміни L на R в A[i].

Program RewriteArray;

Const

n = 100;

Single = 20;

Double = 41;

Type

Sitem = string[Single];

Ditem = string[Double];

SWordArray = array[1..n] of Sitem;

DWordArray = array[1..n] of Ditem;

Var

A: SWordArray;

B: DWordArray;

L, R: Sitem;

X : Sitem;

i, Index : Integer;

Procedure InpWord(var U, V : Sitem);

Var

X : Ditem;

j : Integer;

Begin

Writeln('________ Введення рівності L = R __________');

Read(X); j := Pos('=', X);

U := Copy(X, 1, j - 1);

V := Copy(X, j + 1, Length(X))

End;

Procedure InpArray;

begin

Writeln('====== Введення масиву слів ======');

For i:=1 to n do Readln(A[i])

end;

Procedure OutArray;

begin

Writeln('====== Виведення масиву слів ====');

For i:=1 to n do Writeln(B[i])

end;

Begin

InpArray; {введення масиву слів з клавіатури}

InpWord(L, R); {введення і аналіз рівності L = R}

For i := 1 to n do begin

X := A[i];

Index := Pos(L, X);

If Index <> 0

then begin

Delete(X, Index, Length(L));

Insert(R, X, Index)

end;

B[i] := A[i] + '=' + X

end;

OutArray; {виведення масиву слів до друку}

End.