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

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 имеется такой тип данных.