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

Задача “Поиск слов в строке и удаление символов”

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

{

Пример обработки строки.

Удаляются все гласные буквы в словах, которые начинаются

с двух согласных букв

}

{=====================================================}

{Функция IsLetter.

Возвращает TRUE, если Ch является русской буквой.

Иначе возвращает False.}

function IsLetter(Ch: char): boolean;

begin

IsLetter := ch in ['А'..'Я','а'..'п','р'..'я','ё','Ё'];

end;

{=====================================================}

{Функция IsSoglasn.

Возвращает TRUE, если Ch является русской согласной буквой.

Иначе возвращает False.}

function IsSoglasn(ch:char):boolean;

begin

IsSoglasn := ch in ['б','в','г','д','ж','з','й','к','л',

'м','н','п','р','с','т','ф','х','ц',

'ч','ш','щ','ъ','ь',

'Б','В','Г','Д','Ж','З','Й','К','Л',

'М','Н','П','Р','С','Т','Ф','Х','Ц',

'Ч','Ш','Щ','Ъ','Ь'];

end;

{=====================================================}

{Функция IsGlasn.

Возвращает TRUE, если Ch является русской гласной буквой.

Иначе возвращает False.}

function IsGlasn(ch:char):boolean;

begin

IsGlasn := ch in

['а','е','ё','и','о','у','ы','э','ю','я',

'А','Е','Ё','И','О','У','Ы','Э','Ю','Я'];

end;

{=====================================================}

{Функция FindNextWord.

Ищет в строке S следующее слово, начиная с символа Start.

Если слово найдено, то возвращается True

и возвращается индекс первого символа слова (через BeginWord)

и его длина (через LengthWord).

Если слово не найдено, возвращается False.}

function FindNextWord( const S : String;

Start : Integer;

var BeginWord : Byte;

var LengthWord : Byte) : Boolean;

var

i : Integer; {Индекс может выйти за границы 255,

поэтому Byte использовать нельзя!}

Len : Byte; {Длина строки}

Begin

{Вычисляем длину строки}

Len := length(s);

{Ищем начало слова, начиная со стартового символа строки}

i := Start;

{В цикле продвигаем i вперед по строке до тех пор,

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

while not isLetter( S[i] ) and (i <= Len ) do

inc( i );

{Сейчас i указывает на первый символ найденного слова}

BeginWord := i;

{Ищем конец слова}

{Для этого продвигаем i вперед до тех пор, пока не встретится

НЕ БУКВА или пока i не выйдет за пределы строки}

while isLetter(S[i]) and ( i <= Len ) do

inc( i );

{Сейчас i указывает на первый символ-разделитель, следующий

за словом (или i указывает на символ за пределами границ

строки).

Длину слова вычисляем как разность между индексами его

последнего и первого символов }

LengthWord := i - BeginWord;

{Если вычисленная длина слова больше 0, значит, слово в строке

найдено. Возвращаем True.

Иначе - слова в строке нет. Возвращаем False.}

if LengthWord > 0

then FindNextWord := true

else FindNextWord := false;

end;

{=====================================================}

{Функция StringWithoutGlasn.

Возвращает строку, созданную из строки

S путем удаления всех гласных букв.}

function StringWithoutGlasn(const s:string):string;

var

res : string; {Результат}

i : integer;

begin

res := ''; {Сначала результирующая строка пустая}

for i := 1 to length(s) do {Затем все символы}

if not IsGlasn(s[i]) then, {Которые не являются}

res := res + s[i]; {Гласными буквами,

добавляются к строке}

WordWithoutGlasn := res; {Получившаяся строка возвращается}

end;

{=====================================================}

{Функция DeleteGlasn.

В строке S во всех словах, начинающихся на две согласные буквы, удаляются гласные буквы.

Полученная строка возвращается.}

function DeleteGlasn(const s:String):String;

var

newstr : string; {Новая строка}

i : integer; {Счетчик}

beg : byte; {Индекс начала слова}

len : byte; {Длина слова}

w : string; {Выделенное слово}

begin

newstr := ''; {новая строка вначале пустая}

{В строке S ищем все слова по очереди}

I := 1;

while FindNextWord( S, i, beg, len) do {Ищем очередное

слово}

begin

{К новой строке прицепляем все разделители,

стоящие перед очередным словом}

newstr := newstr + Copy(S, i, beg-i);

{Найденное слово копируем в W}

w:=Copy(s,beg,len);

{Если первые две буквы слова являются согласными}

if IsSoglasn(w[1]) and IsSoglasn(w[2]) then

newstr := newstr + WordWithoutGlasn(w) {К строке

прицепляем слово без гласных букв}

else

newstr := newstr + w; {Иначе - прицепляем

неизмененное слово}

I := beg + len; {Поиск очередного слова начнем

с символа, следующего за концом этого слова}

end;

DeleteGlasn := newstr; {Возвращаем созданную новую строку}

end;

{Тело программы}

var

s : string; {трока}

begin

s := 'В словах удалить все гласные буквы';

s := DeleteGlasn(s);

writeln(s); {Будет выведено 'В слвх удалить вс глсн буквы'}

end.

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