Практика программирования (Бейсик, Си, Паскаль)

       

Сравнение и сортировка текстовых данных


Операции сравнения отдельных символов или строк основаны на последовательном анализе отношений числовых значений соответствующих кодов. В кодовых страницах символы букв упорядочены в соответствии с их расположением в латинском или национальном алфавитах. Поэтому код буквы А меньше кода буквы F, код буквы г меньше кода буквы ю и т. д.

Некоторое неудобство вызывает тот факт, что одноименные заглавные и строчные буквы имеют разные коды — в одной клетке кодировочной таблицы можно разместить только один символ, кроме того, заглавные и строчные буквы имеют разный смысл. Это не позволяет напрямую упорядочить слова в соответствии с их лексикографическим расположением в словарях. Поэтому приходится предварительно заменять коды всех малых букв в тексте на коды больших (или наоборот) и только после этого выполнять операцию сравнения. Такая замена для букв латинского алфавита особых проблем не представляет, т. к. смещение между кодами соответствующих заглавных и строчных букв — величина постоянная. А ьот с русскими буквами приходится поооэнтьсл — D кодировке ASCII цепочка строчной буко между пир разорвана символами псевдографики, а буквы вне вообще находятся "не на своих местах.

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

QBasic позволяет преобразовывать содержимое символьных строк к верхнему (UCASE$(A$>) или нижнему (LCASE$(A$)) регистру. В Паскале имеется только одна функция upCase (с), заменяющая строчную букву заглавной. Но коды символов, не принадлежащих множеству букв латинского алфавита, она оставляет без изменения. Такая же оговорка распространяется на функции strupr(s) Hstrlwr(s) В Си.

В Паскале и QBasic операции сравнения символьных данных ничем не отличаются от аналогичных операций над числовыми величинами:

RЕМ Упорядочение слов по "возрастанию"

IF A$>B$ THEN




ТМР$=А$ : A$=BS : В$=ТМР$

END IF

или

{Упорядочение слов по "убыванию"}



if s1<s2 then

begin

tmp:=sl;

sl:=s2;

s2:=tmp;

end;

Для сравнения строк Си предлагает довольно много системных функций, но не забывайте, что их действие не всегда допустимо над русскими словами. Каждая из описываемых ниже функций принимает положительное значение, если ее первый операнд строго "больше" второго, нулевое значение при "равенстве" операндов, и отрицательное значение, если первый операнд оказался "меньше".

strcmp(s1,s2); //сравнивает строки s1 и s2

strcmpi(s1,s2); //сравнивает s1 и s2 с игнорированием

//разницы между большими и малыми буквами

stricmp(s1,s2); //эквивалентна функции strcmpi

strncmp(s1,s2,k); //сравнивает первые k символов в s1 и s2

strncmpi(s1,s2,k); //сравнивает первые k символов в s1 и s2

//с игнорированием разницы между большими

//и малыми буквами

strnicmp(s1,s2,k); //эквивалентна функции strncmpi




Содержание раздела