Главная » Free Pascal » Операции над символами и фрагментами коротких строк Free Pascal

0

С операцией сравнения строк мы познакомились в программе sort_nam (см. лис- тинг 2.7). Но в словарях, где слова располагаются в лексикографическом порядке (т. е. по алфавиту), не делается разницы между большими и малыми буквами. Хоте- лось бы реализовать такой же подход и в программах. Однако в таблице ASCII коды всех малых букв русского и латинского алфавитов располагаются вслед за кодами больших букв, следовательно, в числовом эквиваленте код любой малой буквы больше кода соответствующей большой буквы. Для того чтобы нейтрализовать эту разницу, можно воспользоваться двумя способами. Во-первых, можно прибегнуть к одной из функций — UpCase или LowerCase, с помощью которых в тексте произво- дится замена всех букв на большие или малые. К сожалению, эта возможность рас- пространяется только на буквы латинского алфавита. Во-вторых, вместо обычных операций отношения (больше, меньше, равно) можно воспользоваться функцией сравнения строковых данных ShortCompareText(s1,s2), которая выполняет свою роль, игнорируя разницу между большими и малыми буквами. Эта функция возвра- щает целочисленный результат, который положителен, если s1>s2, равен нулю при s1=s2 и отрицателен, если s1<s2. Однако и эта функция приспособлена только для текстов, содержащих латинские буквы. В этом нетрудно убедиться, анализируя про- грамму com_str (листинг 5.5) и результаты ее работы (рис. 5.5).

Рис. 5.5. Результаты сравнения текстов

   Л ис тинг 5 .5 .  Программа  com_str                                              

program com_str; var

s1:String[10]=’Привет'; s2:String[15]=’привет'; s3:String[10]=’123ABC';

s4:String[10]=’123def'; begin

writeln(‘UpCase : ‘,UpCase(s1),’ ‘,UpCase(s4));

if s3=LowerCase(s3) then writeln(‘s3=LowerCase(s3)’) else writeln(‘s3<>LowerCase(s3)’);

if ShortCompareText(s3,LowerCase(s3))=0

then writeln(‘равны с игнорированием регистров’); readln;

end.

Для обработки строковых данных с русскими буквами придется написать свои подпрограммы, аналогичные функциям UpCase и LowerCase. Мы продемонстриру- ем такое преобразование на примере замены кодов всех малых букв латинского и русского алфавитов на соответствующие коды больших букв (листинг 5.6).

   Листинг 5.6. Программа  upconvert                                            

program upconvert; const

s1=’abcdefghijklmnopqrstuvwxyz'; s2=’абвгдеѐжзийклмнопрстуфхцчшщъыьэюя';

function UpCase_r(s:String):String; var

j,ch:byte;

begin

for j:=1 to length(s) do begin

ch:=ord(s[j])-32;

if (‘a'<=s[j]) and (s[j]<=’z’) or

(‘а'<=s[j]) and (s[j]<=’п’)then s[j]:=char(ch);

if (‘р'<=s[j]) and (s[j]<=’я’) then s[j]:=char(ch-48);

if s[j]=’ё’ then s[j]:=’Ё'; end;

UpCase_r:=s;

end;

begin

writeln(s1); writeln(UpCase_r(s1)); writeln(s2); writeln(UpCase_r(s2)); readln;

end.

Результат ее работы приведен на рис. 5.6. При наборе программы upconvert не забывайте об одной технической детали: в первом сравнении на принадлежность символа s[j] диапазону от ‘a’ до ‘z’ малая буква ‘a’ набирается на латинском

регистре, а во втором сравнении при проверке на принадлежность диапазону от ‘а’ до ‘п’ — на русском регистре. По начертанию отличить латинскую букву ‘a’ от русской нельзя, но для правильной работы программы эта деталь существенна.

Рис. 5.6. Преобразование символов к верхнему регистру

Перечень наиболее часто используемых процедур обработки коротких строк и их фрагментов приведен в табл. 5.1.

Таблица 5.1

Формат вызова

Выполняемая операция

Delete(s,ind,count);

Удаление count символов из строки s, начиная с символа s[ind]

s:=Concat(s1,s2,…,sn);

Конкатенация (объединение) строк s1, s2, …, sn

s1:=Copy(s,ind,count);

Копирование count символов из строки s, начиная с символа s[ind]

Insert(s1,s2,ind);

Вставка в s2 строки s1, начиная с символа s2[ind]

k:=Length(s1);

Определение длины строки s1

k:=Pos(s1,s2);

Определение позиции вхождения строки s1 в строку s2

Программа str_proc демонстрирует приемы их использования (листинг 5.7).

   Листинг 5 .7 .  Программа  str_proc                                             

program str_proc; var

s1:string=’Hello, world!'; s2:string;

k:byte; begin

delete(s1,1,5);

writeln(‘s1=’,s1); s2:=concat(‘Привет’,s1,’ Привет’); writeln(‘s2=’,s2); writeln(‘length(s2)=’,length(s2));

writeln(‘pos(”world”,s2)=’,pos(‘world’,s2)); k:=pos(‘Привет’,s2);

writeln(‘Первое вхождение ”Привет” в s2 с позиции ‘,k); insert(‘! Hello!’,s2,22);

writeln(‘s2=’,s2);

readln; end.

Результаты ее работы приведены на рис. 5.7. Обратите внимание на то, как в строковых константах задается символ одиночной кавычки, как правило, исполь- зуемый в качестве признака начала и конца строкового значения.

Рис. 5.7. Результаты работы программы str_proc

Функция конкатенации (concat) в языке Паскаль является некоторым рудимен- том, т. к. эта же операция выполняется как "сложение" строковых значений:

s2:=’Привет’+s1+’Привет';

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

Для формирования коротких строк, заполненных пробелом или заданным сим- волом, можно воспользоваться функциями Space и StringOfChar:

s3:=Space(10);          {формирование строки из 10 пробелов} s4:=StringOfChar(‘=’,5); {эквивалент: s4:=’=====';}

Если во время работы программы потребовалось изменить максимальную дли- ну короткой строки (либо в сторону увеличения, либо в сторону уменьшения), то необходимо обратиться к процедуре SetLength:

var

s1:string[10];     // первоначальное объявление

SetLength(s1,20);  // изменение максимальной длины

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

   Листинг 5 .8 .  Программа  dyn_string                                           

program dyn_string; type

dyn_str=string[80]; var

p_str:^dyn_str;      {объявление типизированного указателя} begin

New(p_str);          {запрос памяти} p_str^:=’Hello, world!'; writeln(p_str^);

Dispose(p_str);      {освобождение памяти} readln;

end.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии