- •Тема: Символьные переменные и строки. Обработка строк.
- •Функции обработки строк.
- •Процедуры обработки строк.
- •Цель: получение практических навыков при работе с массивами символов, их ввода, вывода; овладение навыками по организации программ с использованием функций обработки строк и символов.
- •Содержание отчета:
Функции обработки строк.
Сцепление – 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
Тема: «Решение задач обработки строк и символов»