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

1.3. Процедуры и функции для обработки стрингов

В библиотеке Турбо Паскаля описаны стандартные процедуры и функции, предназначенные для работы со стрингами - переменными типа string и их отдельными элементами, а также текстовыми константами и символами. При составлении программ эти функции и процедуры не описываются, а вызываются из библиотеки.

Функция Concat. Параметрами этой функции являются строки S1, S2, ... ,Sn. Результатом ее работы является строка S, полученная в результате склеивания строк S1, S2, ... , Sn (длина результирующей строки S не превышает 255 символов).

Формат обращения к функции в программе:

S := Concat(S1, S2, ... , Sn).

Пример.

program stroka2;

var S1, S2, S3, S4, S : string;

begin

S1 := 'Зима, '; S2 := 'весна, ';

S3 := 'лето, '; S4 := 'осень ';

S := Concat(S1,S2,S3,S4,'- времена года.');

Writeln(S)

end.

Результатом выполнения программы является строка:

Зима, весна, лето, осень - времена года.

Функция Length . Параметром этой функции является строка S. Результатом ее работы является целое число L - длина строки S (количество литер, содержащихся в данный момент в этом стринге).

Формат обращения к функции в программе:

L := Length(S).

Пример. Подсчитать длину строки S из предыдущего примера.

program stroka3;

var S : string;

L : Integer;

begin

S := 'Зима, весна, лето, осень - времена года.';

L := Length(S);

Writeln(S);

Writeln('Длина этой строки равна ', L,' символам.')

end.

Результат выполнения программы:

Зима, весна, лето, осень - времена года.

Длина этой строки равна 40 символам.

Функция Copy. Параметрами этой функции являются: строка ST; данные целого типа N и M. Результатом ее работы является подстрока S длины M, выделенная из строки ST, начиная с позиции N, при этом значение исходной строки ST не изменяется.

Формат обращения к функции в программе:

S := Copy(ST, N, M).

Функция Copy все свои параметры получает по значению, т.е. на их месте могут стоять любые переменные, константы и даже выражения соответствующих типов.

Замечания:

1) если значение переменной N больше длины строки ST, то S получит значение "пустая строка";

2) если число литер M (длина подстроки S) больше числа символов от позиции N до конца строки ST, то значением S является остаток строки ST, начиная с позиции N до конца.

3) если N принимает значение вне отрезка 1..255, то возникает ошибка выполнения программы.

Пример. Заменить в строке "Версия Турбо Паскаль 7.0" стринг "Турбо Паскаль" на стринг "Turbo Pascal".

program stroka4;

var ST, S : string [80];

L : Integer;

begin

ST := 'Версия Турбо Паскаль 7.0';

S := Copy(ST, 1, 7) + 'Turbo Pascal' + Copy(ST, 21, 7);

Writeln('Полученная строка: ', S);

end.

После выполнения программы на экране выводится сообщение:

Полученная строка: Версия Turbo Pascal 7.0

Замечание. Результатом выполнения функции Copy(ST, 21, 7) является подстрока, состоящая только из 4 символов ' 7.0', так как это количество символов является максимально возможным при вырезке из строки ST в данной ситуации (см. замечание 2 на стр.9).

Функция Pos. Параметрами функции являются стринги SUBST, ST, где SUBST - подстрока, которую нужно найти, а ST - строка, в которой ищем подстроку SUBST. Результатом ее работы является номер позиции K первого вхождения подстроки SUBST в строку ST или 0, если подстрока не найдена.

Формат обращения к функции в программе:

K := Pos(SUBST, ST).

Пример 1. Выяснить, входят ли в строку "Спасское-Лутовиново - родина И.С. Тургенева." подстроки : "родина", "н", "спас".

program stroka5;

var S, S1, S2, S3 : string;

K : Byte;

procedure Otvet(N: Byte; ST : string);

begin if N<>0 then

Writeln ('Подстрока "', ST, '" входит в текст, начиная с позиции ', N ,'.')

else Writeln ('Подстрока "', ST, '" не входит в текст.')

end;

begin

S := 'Спасское-Лутовиново - родина И.С. Тургенева.';

S1 := 'родина'; S2 := 'н'; S3 := 'спас'; K := Pos(S1, S); Otvet(K, S1);

K := Pos(S2, S); Otvet(K, S2); K := Pos(S3, S); Otvet(K, S3);

end.

После выполнения программы на экран выводятся сообщения:

Подстрока "родина" входит в текст, начиная с позиции 23.

Подстрока "н" входит в текст, начиная с позиции 16.

Подстрока "спас" не входит в текст.

Проанализируем полученные результаты, выведенные на экран:

подстрока "родина" входит в текст один раз, К = 23;

подстрока (буква) "н" входит в текст три раза ( с 16-ой, 27-ой, 41-ой позиции), К = 16 (позиция первого вхождения);

подстрока "спас" не входит в текст, К = 0.

Пример 2. Закодировать стринг "ах, балалайка!", заменив в нем букву "а" на сочетание букв "ро".

program stroka6;

Const S:string[18]='ах, балалайка!';{исходная строка}

B:string[1]='а';{заменяемый символ}

C:string[2]='ро';{новое сочетание символов}

var ST:string[80];{новый текст}

S1:string[80];

{подстрока S1 расположена правее очередного символа 'а'}

S2:string[80];

{подстрока S2 расположена левее очередного символа 'а' в строке S1}

K:Byte; {позиция очередного символа 'а'}

begin

ST:=''; S1:=S;

K:=Pos(B,S1);

While K<>0 do

begin S2:= Copy(S1,1,K-1);

ST:=Concat(ST, S2, C);

S1:=Copy(S1,K+1,18);

K:=Pos(B,S1)

end;

ST:=ST+S1;

Writeln('Исходная строка: ', S);

Writeln('Полученная строка: ', ST)

end.

После выполнения программы на экран выводятся сообщения:

Исходная строка: ах, балалайка!

Полученная строка: рох, бролролройкро!

Процедура Delete Параметрами процедуры являются: строка ST (параметр-переменная); данные целого типа M и N (параметры-значения). Процедура удаляет M символов из строки ST, начиная с позиции N.

После удаления символов оставшиеся части строки ST склеиваются. Результатом работы процедуры является видоизмененная строка ST.

Формат вызова процедуры в программе:

Delete( ST, N, M );

Замечания:

1) если значение переменной N больше длины строки ST или значение переменной M равно 0 , то строка ST не изменится, так как ни одного символа не будет удалено;

2) если значение переменной N равно 0, то строка ST не изменится (см. п.1.1 - пояснение строки типа string как одномерного массива);

3) если значение переменной M больше числа символов от позиции N до конца строки ST, то значением ST является остаток строки ST, начиная с позиции N до конца.

Пример 1. Из данного слова получить новое путем удаления из него буквы 'а'.

program ydalen_simvol;

Const M='а';

Type

S=string[80];

Var Slovo:S;

begin

Write('Введите слово- '); Readln(Slovo);

While Pos(M, Slovo) <> 0 do

Delete(Slovo, Pos(M, Slovo), 1);

Writeln(Slovo)

end.

В результате выполнения программы, после введения слова "мама", будет напечатано слово "мм".

Пример 2. В заданном тексте замените все последовательности повторяющихся символов на один символ.

program Zamena_sim;

var

S:string[80];

i:integer;

n:integer; {длина текущей строки}

begin

S:='Мооооскккввваааааа -- горродд ггеройй!!!';

i:=1; n:=length(S);

while i<=n-1 do

if copy(S,i,1)=copy(S,i+1,1) then begin Delete(S,i,1);

n:=Length(S)

end

else i:=i+1;

writeln('Полученный текст : ',S)

end.

Один из возможных алгоритмов решения задачи заключается в следующем: в организованном цикле проверяются на равенство два подряд идущих символа. При этом возможны следующие ситуации:

1) если символы совпадают, то удаляем первый из этих двух символов, определяем длину вновь полученной строки и повторяем сравнение символов (при этом номера сравниваемых символов не изменяются);

2) если символы не совпадают, то увеличиваем на единицу номер первого сравниваемого символа и переходим к сравнению этого символа с последующим.

В результате работы программы на экран выводится сообщение:

Полученный текст : Москва - город герой!

Процедура Insert. Параметрами процедуры являются: подстрока SUBST (параметр-значение), которую нужно вставить; строка ST (параметр-переменная), в которую вставляется подстрока SUBST; данное N целого типа, определяющее номер позиции вставки.

Процедура вставляет подстроку SUBST в строку ST, начиная с позиции N. Результатом работы процедуры является видоизмененная строка ST.

Формат вызова процедуры в программе:

Insert( SUBST, ST, N );

Замечания:

1) если в результате вставки подстроки SUBST в строку ST полученная строка ST содержит больше символов, чем при объявлении этого стринга, то она автоматически укорачивается до его объявленной длины (т.е. все литеры, выходящие за пределы его длины (справа), будут отброшены).

2) если значение переменной N больше длины строки ST, то подстрока SUBST будет просто присоединена к концу строки ST (т.е. имеет место эффект конкатенации);

3) если значение переменной N находится вне отрезка 1..255, возникает ошибка выполнения программы.

Пример 1. Заменить в тексте все буквы "м" на слог "на".

program Zamena2;

type Stroka = string[80];

var St:Stroka; k:integer;

begin

Write('Введите текст: '); Readln(St);

while Pos('м',St)<>0 do

begin k:=Pos('м',St); Delete(St,k,1); Insert('на',St,k)

end;

Writeln('Измененный текст: ',St)

end.

В результате исполнения программы текст, например, "максимальный элемент в массиве" заменится на текст "нааксинаальный эленаент в наассиве".

Пример 2. Дана строка символов. Преобразовать данную строку, повторив (оставив еще раз) каждую пару символов "<<". Полученную строку вывести на печать.

program Zamena3;

type Stroka = string[80];

var St:Stroka; {исходный текст}

{значение St меняется в ходе выполнения программы}

St1:Stroka; {измененный текст}

k:integer;

begin

Write('Введите текст: '); Readln(St); St1:='';

while Pos('<<',St)<>0 do

begin k:=Pos('<<',St); Insert('<<',St,k);

St1:=St1+Copy(St,1,k+3);

Delete(St,1,k+3);

end;

St1:=St1+St; Writeln('Измененный текст: ',St1)

end.

В результате исполнения программы текст, например, "a+d<< f-g /d >><<< sd" заменится на новый текст "a+d<<<< f-g /d >><<<<< sd".

Процедура Str Параметрами процедуры являются: выражение Х (параметр - значение) вещественного или целого типа, строка ST (параметр-переменная) типа string . Параметр Х можно задать в формате X:M для целого типа и X:M:N для вещественного типа (аналогично процедуре Write). Процедура Str преобразует числовое значение параметра Х в последовательность символов.

Результатом работы процедуры является строка ST, в которую записывается символьное представление параметра Х.

Формат вызова процедуры в программе:

Str(X [:M [:N]]; St);

Процедура Val Параметрами процедуры являются: строка ST (параметр-значение) типа string , переменная Х (параметр-переменная) вещественного или целого типа, переменная P (параметр-переменная) целого типа. Процедура Val преобразует строковое значение ST в его численное представление Х. Если преобразование строки в число выполнено успешно, то результатом работы процедуры является число Х, в которое преобразуется строка ST, а параметр P примет значение 0. В противном случае переменная Х принимает значение 0, а переменная Р имеет своим значением номер позиции в строке ST, где обнаружен ошибочный символ.

Формат вызова процедуры в программе:

Val(ST,X,P);

Замечание. Под ошибочными символами строки ST будем понимать все символы, отличные от цифр, десятичной точки, Е, +, -, а также символ пробела.

Пример 1. Задан одномерный массив, каждым элементом которого является строка символов, состоящая из одних цифр. Рассматривая каждую строку как число, определить сумму четных и нечетных значений элементов массива. Полученные суммы вывести на печать, записав цифры в обратном порядке.

program Stroka_Chiclo;

type Stroka=string[10];

mas=array[1..10] of Stroka;

var P,i:integer;

S1,S2,N:longint;

M:mas; ST,ST1,ST2:string[80];

begin Writeln('Введите элементы массива: ');

{элементами массива являются строки символов,}

{состоящие из одних цифр}

{первая цифра не является нулем}

for i:=1 to 10 do

begin write(i,'-й элемент '); readln(M[i])

end;

S1:=0; S2:=0;

for i:=1 to 10 do

begin Val(M[i],N,P); if N mod 2 = 0 then S1:=S1+N

else S2:=S2+N

end;

Write('Сумма четных элементов: ',S1);

Writeln('; сумма нечетных: ',S2);

Str(S1,ST1); Str(S2,ST2); ST:='';

for i:=1 to ord(ST1[0]) do

ST:=ST1[i]+ST;

ST1:=ST; ST:='';

for i:=1 to ord(ST2[0]) do ST:=ST2[i]+ST;

ST2:=ST;

Writeln('Результат: ',ST1,'':3,ST2)

end.

Вводим массив из 10 элементов. Например, '1234', '345', '1', '671', '234', '6', '34198643', '22', '190190', '789'.

После исполнения программы на экране появится:

Сумма четных элементов: 191686; сумма нечетных: 34200449 Результат: 686191 94400243.

Пример 2. Разработать программу, которая работает следующим образом. Пользователь вводит свою фамилию, год рождения и место рождения (город). Программа подсчитывает, сколько ему лет, формирует строку символов вида "фамилия количество_лет место_рождения" и запоминает ее. Следующий пользователь вводит аналогичные данные о себе и т.д. Ввод данных заканчивается вводом пустой строки. По окончании ввода программа выводит на экран сведения о пользователях.

program Fio_kol_let_mesto_rogd;

uses crt;

type Mas=array[1..100] of string;

var Stroka:Mas; S,S1:string;

N:integer;{ количество лет} G:integer;{ год рождения}

K:integer;{ позиция первого пробела}

P:integer;{ сигнальная переменная}

L:integer;{ длина списка} i:integer;{ параметр цикла}

begin clrscr;

writeln('Введите фамилию, год и место рождения ');

{данные ввести через пробел}

readln(S); L:=1;

while S<>'' do

begin K:=Pos(' ',S); S1:=copy(S,K+1,4);

Val(S1,G,P); N:=1996-G; Str(N,S1);

Delete(S,K+1,4);Insert(S1,S,K+1); Stroka[L]:=S;

writeln('Введите фамилию, год и место рождения ');

{данные ввести через пробел}

readln(S); if S<>'' then L:=L+1

end;

gotoXY(WhereX,WhereY-2); DelLine; Writeln;

Writeln('Список с указанием количества лет:');

for i:=1 to L do

Writeln(Stroka[i])

end.

После исполнения программы на экране появится:

Введите фамилию, год и место рождения

Иванов 1945 Москва

Введите фамилию, год и место рождения

Пряхина 1977 Орел

Введите фамилию, год и место рождения

Смирнов 1993 Курск

Введите фамилию, год и место рождения

Бабушкина 1896 Орел

Список с указанием количества лет:

Иванов 51 Москва

Пряхина 19 Орел

Смирнов 2 Курск

Бабушкина 100 Орел

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