Информатика и технология программирования

       

Упорядоченные строки


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


//------------------------------------------------------bk34-07.cpp


// Функция сравнивает две строки по значениям


// кодов (гарантированный алфавитный порядок для


// латинских букв). Результат сравнения:


// 0 - строки одинаковы,


// -1 - первая строка "меньше" по алфавиту, либо


// строки равны, но первая короче


// 1 - то же самое, но для второй строки


int Compare1(unsigned char s1[],unsigned char s2[])
{
int n;
for (n=0; s1[n]!='\0' &#38&#38 s2[n]!='\0'; n++)
if (s1[n] != s2[n]) break;
if (s1[n] == s2[n]) return 0;
if (s1[n] &#60 s2[n]) return -1 ;
return 1 ;
}

Обратите внимание на то, что массивы символов указаны как беззнаковые. В противном случае коды с весом более 0x80 (символы кириллицы) будут иметь отрицательные значения и располагаться в алфавите "раньше" латинских, имеющих положительные значения кодов (кроме того, еще и в обратном порядке, от Я к А). Чтобы устранить этот и другие недостатки, необходимо установить свой порядок следования символов в алфавите и использовать порядковый номер символа в последовательности (индекс в массиве) в качестве его "веса":


//------------------------------------------------------bk34-08.cpp


//---- Сравнение строк с заданными "весами" символов


char ORD[] = "АаБбВвГгДдЕе1234567890";
int Carry(char c)
{
int n;
if (c=='\0') return(0);
for (n=0; ORD[n]!='\0'; n++)
if (ORD[n]==c) break;
return n+1;
}
int Compare2(char s1[],char s2[])
{
int n;
char c1,c2;
for (n=0; (c1=Carry(s1[n]))!='\0' &#38&#38(c2=Carry(s2[n]))!='\0'; n++)
if (c1 != c2) break;
if (c1 == c2) return 0;
if (c1 &#60 c2) return -1;
return 1;
}



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