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

Функции обработки строк.

Сцеплениеconcat(строка1, строка2,….), Аналогична операции сцепления.

Пример: Исходные данные: a=’код’, b=’ил’.

Оператор: s:=concat(‘кро’,a,b).

Результат: s=’крокодил’.

Копироватьcopy(строка, число1, число2). Из указанной строки выделяется подстрока, начиная с позиции, заданной числом1, длиной, заданной числом2.

Пример: Исходные данные: s=’крокодил’.

Оператор: b:=copy(s,2,3).

Результат: b=’рок’.

Позиция - Pos(строка1, строка2). Отыскивает первое вхождение строки1 в строке2 и возвращает номер начальной позиции вхождения или ноль, если строка1 не входит в строку2.

Пример: Исходные данные: s=’крокодил’.

Оператор: i:=pos(‘око’,s).

Результат: i=3.

Оператор: i:=pos(‘я’,’крокодил’).

Результат: i=0.

Длина - length(строка). Возвращает длину строки – аргумента.

Пример: Исходные данные: s=’крокодил’.

Оператор: j:=length(s).

Результат: j=8.

Процедуры обработки строк.

Вставитьinsert(строка1, строка2, число). Вставляет строку1 в строку2, начиная с позиции, заданной числом. Если в результате получается строка длины больше максимальной, то она усекается справа.

Пример: Исходные данные: S=’крокодил’.

Оператор: d:=copy(s,3,3).

Результат: d=’око’.

Оператор: insert(‘h’,d,3).

Результат: d=’окно’.

Удалитьdelete(строка, число1, число2). Удаляет из строки подстроку, начиная с позиции, заданной числом1, длиною, заданной числом2. Если число1 больше размера строки, то подстрока не удаляется. Если число2 больше имевшегося количества, то удаляются символы до конца строки.

Пример: Исходные данные: S=’крокодил’.

Оператор: delete(s,4,3).

Результат: =’кроил’.

Оператор: delete(s,1,1).

Результат: s=’роил’.

Преобразовать число в строку str(число[:M[:N]],строка). Преобразует число в строку. M задаёт общее количество символов, получаемых в строке, N – для вещественных чисел (типа real) задаёт количество цифр в дробной части.

Пример:

Оператор: str(123,s).

Результат: s=’123’.

Преобразовать строку в числоval(строка, число, код). Преобразует строку символов во внутреннее представления числа. Код указывает номер неправильного символа или равен 0 в случае успешного преобразования.

Пример:

Оператор: val(‘+12.3’,v,k).

Результат: v=12.3, k=0 {преобразование прошло успешно}

Оператор: val(‘23+5’,v,k).

Результат: v=неправильно, k=3 {ошибка при попытке преобразовать третий символ}

Пример: Дана строка символов. Дано слово. Удалить из строки это слово.

Основная сложность при решении данной задачи состоит в разделении понятий “слово” и “подслово”. В тексте АПРОЛ МИТ слова ИТ нет, а есть подслово ИТ. Для того, чтобы чётко разделить эти понятия, при просмотре допишем перед словом wrd и перед str – пробел

wrd:=concat(’ ’,wrd);

str:= ’ ’+str;

После этого делать этого не следует, т.к. нам следует отличать знаки препинания от значимых слов.

Program Example5;

Var str, wrd: string;

L,i: integer;

M: set of char;

Begin

M:=[’.’, ’,’, ’!’, ’:’, ’;’, ’?’ , ’-’,’’];

writeln(’Введите слово’);

Readln(wrd);

wrd:=concat(’ ’,wrd);

str:= ’ ’+str;

writeln(’Введите текст’);

Readln(str);

L:=length(wrd);

Repeat

i:=pos(wrd,str);

If (i<>0) and (str[i+L] in M) then delete(str,i,L);

Until i=0;

writeln(str);

End.

Для решения задачи:

  • Формируем тело программы и описываем переменные;

  • Задаём значения множества М – множества знаков препинания и пробел;

  • Вводим слово wrd; присоединяем вначале его пробел, чтобы не спутать с подсловом; находим длину слова;

  • Вводим строку str;

  • Цикл Repeat...until i=0 осуществляет просмотр строки до тех пор, пока в ней встречается слово wrd;

  • Значение i>0 указываетна номер символа в строке, с которого начинается слово wrd;

  • Если такое слово найдено, то вырезаемего из строки;

  • Выводим на экран модифицированный текст.

Пример: Дана строка символов до точки. Группы символов в ней между группами пробелов считаются словами. Определить длину самого коротокого и самого длинного слова.

Program Example6;

Var s1: string;

Max,Min,i,j: integer;

Begin

writeln(’Введите текст до точки’);

Readln(s1);

j:=pos(’.’,s1);

s1:=copy(s1,1,j-1);

Max:=0; Min:=256;

Repeat

i:=pos(’ ’,s1);

delete(s1,1,i);

If i-1>Max then Max:=i-1;

If (i-1<Min) and (i>1) then Min:=i-1;

Until i=0;

writeln(’Самое длинное слово Max=’, Max);

writeln(’Самое короткое слово Min=’, Min);

End.

Для решения задачи:

  • Формируем тело программы и описываем переменные;

  • Вводим строку s1;

  • Цикл Repeat...until i=0 осуществляет просмотр строки до тех пор, пока в ней встречается слово wrd;

  • Значение i>0 указываетна номер символа в строке, с которого начинается слово wrd;

  • Если такое слово найдено, то вырезаемего из строки;

  • Выводим на экран модифицированный текст.

Пример: Дана строка символов до точки. Определить, является ли она записью десятичного числа, кратного трём.

Program Example7;

Var s1: string;

i,k: integer;

Begin

writeln(’Введите текст до точки’);

Readln(s1);

k:=0; i:=1;

Repeat

Case s1[i] of

’0’..’9’: k:=k+(ord(s1[i])-ord(’0’));

’ ’:;

else k:=-1;

end;

i:=i+1;

Until (s1[i]=’.’) or (k<0);

If k mod 3=0 then

writeln(’это десятичное число, кратное 3’)

else

writeln(’это не десятичное число, кратное 3’);

End.

Для решения задачи:

  • Формируем тело программы и описываем переменные;

  • Вводим строку s1;

  • Организуем в строке поиск цифр до тех пор, пока не встретим точку или не обнаружим наличие ошибки в арифметическом выражении;

  • В зависимости от значения суммы цифр выводим результат на экран.

Пример: Дана строка символов. Написать процедуру удаления из строки всех кратных рядом стоящих символов.

Program Example8;

Var s: string; {глобальная переменная}

L: integer; {глобальная переменная}

Procedure SIM;

Var str: string; {локальная переменная}

i: integer; {локальная переменная}

Begin

str:=s[1];

for i:=2 to L do

if s[i]<>s[i-1] then

str:= str+s[i];

s:=str

end;

Begin

writeln(’Введите текст до точки’);

Readln(s);

L:=length(s);

SIM; {вызов процедуры}

writeln(S);

End.

Пример. Составить программу, контролирующую наличие пробелов после знаков препинания.

Program Example9;

{все знаки препинания поместим в служебную строку}

Const ch: string[6]=’.,:;!?’;

Var s: string;

Procedure INSSPACE (var s:string);

Var k,i: integer;

Begin

k:=1;

repeat

for i:=1 to 6 do

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

if (s[k]=ch[i]) and (s[k+1]<>ch[i]) then insert(’’,s,k+1);

k:=k+1;

until k=length(s); {последний символ не рассматриваем, чтобы строка не оканчивалась пробелом}

end;

Begin

writeln(’Введите строку текста:’);

Readln(s);

INSSPACE (s); {вызов процедуры}

writeln(’Вставляем пробел после знаков препинания:’);

writeln(S);

readln

End.

Пример. Пусть дана строка символов. Группы символов в ней между одним или несколькими пробелами считаются словами. Подсчитать, сколько слов содержит данная строка, и вывести каждое из них в отдельной строке.

При решении даной задачи следует обратить внимание на следующую важную особенность. Если бы слово от слова отделялось только одним пробелом, то мы могли бы посчитать количество пробелов и вычислить количество слов. В нашем случае необходимо перед каждым определением слова в строке удалять из неё первые прбелы и выделять слово до следующего пробела. После выделения слово удаляется из строки. Для выделения последнего слова строки, если в конце строки нет пробелов, за слово будет считаться оставшаяся часть строки.

Алгоритм удаления пробелов из начала строки оформим в виде процедуры, а выделения слова – в виде функции.

Program Example10;

Var StText: string; {строка текста}

k: integer; {число слов в тексте}

{усечение пробелов в начале строки}

Procedure Trim (var s:string);

Begin

While (s[1]=’’) and (length(s)>0) do

Delete(s,1,1);

end;

{возвращение очередного слова строки и удаление его из строки}

Function GetWord (var s:):string;

Var i: byte; {позиция пробела в строке}

Begin

i:=pos(’’,s);

if i>0 then

begin

GetWord:=copy(s,1,i-1);

delete(s,1,i);

end

else

begin

GetWord:=s;

S:=’’;

end;

end;

Begin

writeln(’Введите строку текста:’);

Readln(StText);

writeln(’В тексте:’);

writeln(StText);

writeln(’Содержатся слова:’);

k:=0;

Trim(StText);

While StText<>’’ do

begin

writeln(GetWord(StText));

inc(k);

Trim(StText);

End;

writeln(’Число слов в тексте -’, k);

End.

Лабораторная работа №12

Тема: «Решение задач обработки строк и символов»

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