- •9.1. Типы данных char и string
- •9.1.1. Символьный тип
- •9.1.2. Строковый тип
- •9.2. Операции над строками
- •9.2.2. Операции отношения
- •I Листинг 9.4. Слияние двух отсортированных массивов строк,
- •9.3. Строковые процедуры и функции
- •9.3.1. Процедуры удаления и вставки символов
- •9.3.2. Функции для работы со строками
- •9.3.3. Процедуры преобразования типов
- •9.4. Примеры программ обработки строк
- •9.4.1. Вставка, удаление
- •9.4.2. Преобразование строчных букв в заглавные
- •10.1. Понятие множества
- •10.2. Операции над множествами
- •10.3. Формирование
- •11.1. Определение и правила записи
- •11.2. Записи с вариантами
9.4. Примеры программ обработки строк
9.4.1. Вставка, удаление
и замена фрагментов текста
Эти действия постоянно выполняются при редактировании текста различными текстовыми процессорами. Использование процедур и функций для работы со строками превращает программирование подобных задач обработки текстов в довольно увлекательное занятие. В качестве примеров рассмотрим две небольшие задачи.
первая из них (листинг 9.5) позволит сократить размер текста без искаже-ия его содержания. Удалим из текста все незначащие пробелы (ведущие, шершающие и лишние между словами). Кроме того, заменим устойчивые эчетания типа "так как", "то есть" их аббревиатурами "т. к.", "т. е.". Сокра-[ение размеров текста особенно важно, например, при пересылке писем по чектронной почте.
Пистинг 9.5. Программа, сокращающая размер текста 5ез искажения содержания
$V-}{ отключили проверку полной совместимости типов }
ar s:string[80];{ формальный и фактический параметры разных типов }
•rocedure delspace(var s: string);
egin
{ пробелы удаляются до тех пор, пока функция роз выдает ненулевой результат при поиске двойного пробела в строке } while роз (' ',з}>0 do delete(з,роз(' ',s),l);
if s[l] = ' ' then delete (s,1,1); f удаляем пробел из начала строки } if sflength(s)J=' ' then delete(s,length(s),1); f и из конца } nd;
rocedure itd_itp(var s:string); Dnst a;array[1. . 4] of string[15] =
('и т. д,', 'и тому подобное1, 'т. к. ', 'т. е. '); al:array[I..4] of string[5]=('и т.д1, 'и т.п', 'т.к', 'т.е'); ie k,p:integer; :gin for k:=l to 4 do begin { сокращаем каждую из 4 фраз J
while роз(a[k],s)>0 do begin { пока встречается фраза }
p:=pos(a[k],s); ( определяем номер первого символа фразы } delete(s,p,length(a[k])};{ удаляем фразу }
{ если после фразы стояла точка, то не добавляем последнюю '.') } if s[p]='.p then insert(al[k],s,p} else insert(al[k]+'.',s,p); end; end; id; fein
writeln('Введите строку текста:'); readln(s); delspace (s); itd_itp(s); writelnf'Сокращенный вариант:'); writeln(s); readln
'
торая программа (листинг 9.6) может несколько увеличить размер обраба-ываемой строки текста, т. к. она проверяет обязательное наличие пробела
после любого знака препинания. При отсутствии пробела она вставляет en в нужное место.
f • ; v • :
| Листинг 9,6. Программа, контролирующая наличие пробелов I после знаков препинания •'•.'
{ все знаки препинания поместили в служебную строку } const ch:string[6]='.,:;!?'; var s:string;
procedure insspace{var s:string); var k,1:integer; begin k:=l; repeat
for 1:=1 to 6 do
{ немного усложним условие, чтобы не забыть про многоточие или три восклицательных знака подряд }
if (s[k]=ch[l]) and (s[k+1]<>ch[1]) then insertf' ',s,k+l); k:=k+l;
until k=length(s);{ последний символ не рассматриваем, чтобы строка не оканчивалась пробелом } end; begin
writeln ('Введите строку текста:'); readln(s); insspace(s);
writeln{'Вставляем пробел после знаков препинания:'); writeln(s); readln end.
9.4.2. Преобразование строчных букв в заглавные
Это тоже полезное действие, которое часто применяется в системах хранения и поиска данных. Дело в том, что при сравнении строк обязательно учитывается регистр, поэтому такие способы записи одного слова, как компьютер, компьютер и компьютер будут восприняты как три разных слова, а в отсортированном списке они будут располагаться даже не рядом друг с другом. Учитывая данное обстоятельство, обычно при вводе информации выполняют преобразование слова к буквам какого-то одного регистра, чаще к заглавным буквам.
Начнем с простого примера. Преобразуем все строчные английские буквы введенной строки в заглавные. Для этого достаточно знания одной функции upcase, которая преобразует к верхнему регистру один символ (листинг 9.7).
I Листинг 9.7. Преобразование строчных латинских букв в заглавные
var s : string/procedure upstring(var s:string); ) процедура преобразования строки } var i: integer; begin
for i:=l to length(s) do
s[i]:=upcase(s[i]); { преобразование одного символа } end; begin { начало основной программы }
write('Введите исходную строку:');readln{з);
upstring(s); writeln(s); readln; end.
Усложним задачу. Пусть требуется преобразовать в строке строчные буквы русского алфавита в заглавные. Функция upcase с символами русского алфавита не работает. Придется писать свою функцию, работающую с русскими буквами.
Будем использовать две вспомогательные строки: строку из всех заглавных букв русского алфавита и строку всех строчных букв. Заметим, что здесь обязательным является применение типизированных констант (или переменных), т. к. обычная строковая константа не может интерпретироваться как массив символов (листинг 9.8).
Г Листинг 9.8. Преобразование русских букв в заглавные
var s:string;
function upstringrus(s:string):string; const small :з^1пд='абвгдежзиклмнопрстуфхцчишгьыьэюя' ; big:s tring='АБВГДЕЖЗИКЛ1даОПРСТУФХЦЧШЩЬЫЬЭЮЯ'; var i,n:integer; begin
for i:=l to lengthfs) do begin
n:=pos{s[i],small);{ находим номер символа в строке строчных букв ) if n>0 then s[i]:=big[n];{ заглавная буква с таким же номером }
end;
upstringrus:=s; end; begin
write('Введите строку');readln(s);
writeln(upstringrus(s)); readln; end.
Чтобы окончательно закрыть эту тему, приведем заключительный пример. Процедура getupstr преобразует русские и английские буквы в заглавные непосредственно при вводе. Буква вводится в любом регистре, а на экране — всегда заглавная. Такой способ ввода используется в различных программах, теперь есть возможность узнать, как это делается (листинг 9.9).
^Листинг 9.9. Ввод строки с приведением всех букв к верхнему регистру
uses crt;
var s:string;
procedure getupstr(var st: string);
var с:char;
begin
st:='';{ сформировали пустую строй^ — это действие нельзя забывать } repeat
c:=readkey;{ слепой ввод без отображения на экране — модуль crt } case с of
{коды заглавных и прописных русских букв от А до П различаются на 32, } 'а1 .. 'п1: c:=chr(ord(c)-32);
'рт .. 'я1: c:=chr(ord(c)-80); { а коды от Р до Я - на 80 } 'а1 .. -z': c:=upcase(c);
end;
if c<>#13 then { не клавиша <Enter> } begin
st:=st+c; write(с);{ добавляем символ к строке и выводим } end;
until c=#13;{ ввод завершен нажатием клавиши <Enter> } writeln; end; "begin
writeln('Введите строку текста и нажмите <Enter>'); getupstr(s); writeln('Значение s:1); writeln(s); readln
Множества
Множества имеют большое значение в математике, поэтому не удивительно, что в языке Turbo Pascal имеется такой тип данных.
