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

3.9 Стандартні підпрограми для обробки рядків.

Функція length рахує число всіх символів, включаючи і пропуски.

Функція pos(Str_l,Str_2) визначає номер першого символу рядка Str_1 при його першій появі в рядку Str_2. Якщо Str_1 відсутній в Str_2, то функція Pos повертає нуль.

Str_1:='це';

Str_2:='Знайти це слово';

{123456789 - номери відповідних літер}

Надалі ці рядки будуть використані у ряді подальших прикладів.

writeln('Слово''',Str_1,'''знаходиться на' Pos(Str_1,Str_2), 'позиції');

Буде виведено на екран: «Слово 'це' знаходиться на 7 позиції».

Функції length і pos повертають числа типу byte.

Функція copy (Str_x,р,n) копіює n символів рядка Str_x, починаючи з позиції р:

writeln (copy (Str _2,7,3)); {Буде виведено «це»}

Якщо р більше довжини Str_x (p> length(Str_x)), то функція copy повертає порожнє значення «"».

В тому випадку, коли необхідних номерів символів в Str_x немає (р+n-1> >length(Str_x)), то насправді копіюється лише фактично існуючі в ньому символи після позиції p.

Параметри р і n цієї функції можуть бути не тільки константами і змінними, але і цілочисельними виразами, що мають тип integer, проте їх значення за діапазоном 0...255 приводять до помилки на стадії виконання програми.

Процедура delete(Str_x,p,n) видаляє n символів рядка Str_x, починаючи з позиції р. Символи, що залишилися праворуч, переносяться на початок рядка Str_x на число знакомісць, рівних числу видалених символів, поточна довжина цього рядка при цьому зменшується на n символів:

delete(Str_2,7,3);

writeln(Str_2); {Буде виведено:«Знайти слово»}

Якщо р і n такі, що p+n-l>length (Str_x), то будуть видалені лише символи, розташовані починаючи від позиції р до кінця рядка:

delete (Str_2,6,20);

writeln (Str_2); {Буде виведено:«Знайти»}

У разі, коли р>length(Str_x), не буде видалений жоден символ Str_x.

Процедура insert (Str_1,Str_2,p) вставляє рядок Str_1 в рядок Str_2, починаючи з позиції р. Результат її роботи протилежний результату роботи процедури delete. Якщо задана максимальна довжина Str_2 менша за length(Str_1+Str_2), то в результуючому рядку всі символи, що виходять за межі його максимальної довжини (справа), будуть відкинуті. У разі ж, коли р>length (Str_2), відбудеться злиття рядків:

insert(Str_1,Str_2,p)=Str_1+Str_2.

У процедурах delete і insert параметр р може бути константою, змінною і будь-яким виразом, результат якого має цілочисельний вираз з типом integer, проте, якщо його значення виявиться зовні діапазону 0...255, то виникне помилка виконання програми.

Процедура str(x[:shirina[:drob]],Str_x) перетворить число х в рядок. Можна задавати поля формату, вказуючи ширину поля (shirina) для всього числа і число знаків після десяткової крапки (drob). Для цілих чисел можна задавати тільки параметр shirina, для дійсних чисел – або обидва поля (формат з фіксованою крапкою), або одне shirina. В останньому випадку задається експоненціальний формат із загальною довжиною shirina.

Якщо число має менше знаків, ніж параметр shirinа, то воно вирівнюватиметься праворуч, знаки, яких не вистачає будуть замінені пропусками попереду літер числа:

var

y:integer

х:real;

...

begin

y:=1999;

str(y:6,Str_x);

writeln(Str_x); {Буде надруковано «1999»}

х:=1.999Е+3;

writeln(x:10:2,Str_x); {Буде надруковано «1999.00»}

...

Процедура val(Str_x,x,Pomjlka) здійснює переміщення рядків Str_x в ціле або дійсне числа х. Якщо перетворення можливе (в Str_x всі символи є символами числа), то в змінну Pomjlka буде записаний нуль. Інакше, в цій змінній знаходитиметься номер першого символу, який не може бути символом числа.

var

x:real;

Str_x:string[5];

Pomjlka:integer;

begin

Str_x:='17.25';

val(Str_x,x,Pomjlka);

writeln('x=',x:5:2,',Pomjlka=',Pomjlka); {Буде виведено «x=17.25,Помилка=0»}

Str_x:='17ЮП 5';

val(Str_x,x,Pomjlka);

writeln('Pomjlka=',Pomjlka); {Буде виведене «Помилка=3»}

...

Значення змінної х в цьому випадку не змінюватиметься, в ній збережеться попереднє значення.

Тип змінної х повинен відповідати очікуваному вмісту Str_х: якщо в Str_x є крапка або ступінь числа «Е+nn», то змінна х повинна бути дійсного типу, в решті випадків може бути цілою.

Приклад 2:

Ілюстрація обробки рядків. Програма перетворює початковий текст таким чином, щоб його слова розмежовувались не більше ніж одним пробілом. Початковий текст, що складається із декількох рядків із словами, які розмежовані одним та декількома пробілами, знаходиться у текстовому файлі Text_Vyh. У файлі Rezultat повинні знаходитись початковий та перетворений текст із відповідними поясненнями.

program Vykor_Ryadkiv;

uses Crt;

const

max_dov_ryad=75;{максимальна довжина рядка}

n_ryad=100;{максимальне число рядків}

vyh=’Text_Vyh.pas’;

rez=’Rezultat.pas’;

tурe

n_int=1..n_ryad;

ryad_max=string[max_dov_ryad];

mas_ryad=array[1.. n_ryad] of ryad_max;

var

Text_Vyh:mas_ryad;{початковий текст}

chyslo_ryad:n_int;{дійсне число рядків}

Rez_f:Text;

procedure Chytannya(Var T_Vyh:mas_ryad; Var Ch_ryad:n_int);

{Читає із зовнішнього файлу в масив Text_Vyh і рахує число рядків та розміщує це число в Ch_ryad}

var

vyh_f:Text;

begin

assign(vyh_f,vyh);

reset(vyh_f);

Ch_ryad:=0;

While (not EOF(vyh_f) or (Ch_ryad=n_ryad)) do begin

Ch_ryad:= Ch_ryad+1;{лічильник числа рядків}

Readln(vyh_f,Text_Vyh[Ch_ryad]);{читає з файлу vyh_f в рядок масиву Text_Vyh з номером Ch_ryad}

end;{While}

close(vyh_f);

end;{Chytannya}

procedure Druk(T_Vyh:mas_ryad);

{друкує масив рядків}

var i_ryad:n_int;{номер поточного рядка}

begin

for i_ryad:=1 to chyslo_ryad do

writeln(Rez_f,T_Vyh[i_ryad]);{запис у файл Rez_f рядка з номером i_ryad масиву T_Vyh}

end;{Druk}

procedure Vydal_Prob(T_Vyh:mas_ryad);

{продивляється та видаляє усі зайві пробіли}

Var

p,i_ryad:n_int;

begin

for i_ryad:=1 to chyslo_ryad do

repeat

p:=pos(‘’+‘’,T_Vyh[i_ryad]);

{позиція двох пробілів в T_Vyh}

if p>0 {якщо два злитих пробіли знайдено}

then

delete(T_Vyh[i_ryad],p,1);

{видалено один у двох злитих пробілів}

Until p=0;

end;{Vydal_Prob}

begin

clrscr;

Chytannya(Text_Vyh,chyslo_ryad);

{прочитано vyh_f в T_Vyh та визначено chyslo_ryad}

Assign(rez_f,rez);

Rewrite(rez_f);

Writeln(rez_f, 'Це текст із зайвими пробілами');

Writeln(rez_f);{пропуск рядків}

Druk(Text_Vyh);

Writeln(rez_f);{ пропуск рядків }

Writeln(rez_f,'Текст після видалення зайвих пробілів');

Vydal_Prob(Text_Vyh);

Druk(Text_Vyh);

Close(rez_f);

end.{Vykor_Ryadkiv}

Процедура Vydal_Prob спочатку у першому рядку знайде першу позицію двох злитих пробілів (за ними може стояти довільне число злитих пробілів) і видаляє перший з них. Далі вона за допомогою циклу repeat знову знайде у цьому ж рядку позицію двох злитих пробілів та видалить перший з них. Цикл repeat буде повторювати цю операцію доти, доки у першому рядку не виявиться ні одного «слова», яке складається з двох злитих пробілів. При цьому у першому рядку всі слова будуть відокремлюватись одне від одного лише одним пробілом. Цикл for послідовно буде «запускати» внутрішній для нього цикл repeat для кожного рядка початкового тексту – від першого до останнього (Chyslo_ryad) і очистить увесь текст від зайвих пробілів.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]