Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсач.docx
Скачиваний:
12
Добавлен:
18.02.2016
Размер:
54.15 Кб
Скачать

6.Сравнение строк.

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

//---- Сравнение строк по значениям кодов

int my_strcmp(unsigned char s1[],unsigned char s2[]) {

for ( int n=0; s1[n]!='\0' && s2[n]!='\0'; n++)

if (s1[n] != s2[n]) break;

if (s1[n] == s2[n]) return 0;

if (s1[n] < s2[n]) return -1;

return 1; }

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

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

int Carry(char c){

static char ORD[] = "АаБбВвГгДдЕе1234567890";

if (c=='\0') return 0;

for ( int n=0; ORD[n]!='\0'; n++)

if (ORD[n]==c) return n;

return n+1; }

int my_strcmp(char s1[],char s2[]){

int n; char c1,c2;

for (n=0; (c1=Carry(s1[n]))!='\0' &&(c2=Carry(s2[n]))!='\0'; n++)

if (c1 != c2) break;

if (c1 == c2) return 0;

if (c1 < c2) return -1;

return 1; }

7. Посимвольная и пословная обработка.

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

Одну и ту же программу обработки строки текста можно написать разными способами. Если речь идет о формате текстовой строки, то отслеживать его можно двумя способами :

  • используя логику переменных состояния. В этом случае программа содержит основной цикл посимвольного просмотра строки, а в зависимости от текущего символа меняются значения переменной состояния. Например, для выделения слов достаточно использовать счетчик символов внутри слова, который обнуляется на каждом пробеле и увеличивается на 1 каждым символом слова. При этом в момент обнуления ненулевого счетчика программа находится в конце текущего слова;

  • при использовании структурной логики устанавливается однозначное соответствие между элементами формата (например, повторениями) и управляющими конструкциями алгоритма (соответственно, циклами). Описание формата как бы «зашивается» в текст алгоритма. Например, при пословной обработке строки должен быть цикл, за каждый шаг которого просматривается одно слово (включая пробелы перед ним). Внутри него должны быть два цикла – по цепочке пробелов и по цепочке символов слова.

//---- Поиск слова максимальной длины - посимвольная обработка

// Функция возвращает индекс начала слова или 1, если нет слов

// Логика переменной состояния – n – счетчик символов слова

int find(char s[]) {

int i,n,lmax,b;

for (i=0,n=0,lmax=0,b=-1; s[i]!=0; i++){

if (s[i]!=' ') n++; // символ слова увеличить счетчик

else { // перед сбросом счетчика

if (n > lmax) { lmax=n; b=i-n; }

n=0; // фиксация максимального значения

}}

// то же самое для последнего слова

if (n > lmax) { lmax=n; b=i-n; }

return b; }

//---- Поиск слова максимальной длины - пословная обработка

// Структурная логика – 3 цикла: просмотр слов, пробелов и символов

int find(char in[]){

int i=0, k, m, b;

b=-1; m=0;

while (in[i]!=0) { // Цикл пословного просмотра строки

while (in[i]==' ') i++; // Пропуск пробелов перед словом

for (k=0;in[i]!=' ' && in[i]!=0; i++,k++); // Подсчет длины слова

if (k>m){ // Контекст выбора максимума

m=k; b=i-k; } // Одновременно запоминается

} // индекс начала

return b; }

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

ЛИТЕРАТУРА

1.Брайан, К.Практика программирования [Текст].- СПб:.Невский диалект, 2001.- 381 с.

2. Кнут, Д. Искусство программирования на ЭВМ [Текст]: Том 3. – М:. Мир, 1978. – 356 с.

3. Шень, А. Программирование: теоремы и задачи [Текст]. – М.: Московский центр непрерывного математического образования, 1995.

4. Костерин В.В. Камаев В.А. Технологии программирования: Учебник для вузов. Высшая школа, 2005, 360 стр. ISBN 5-06-004870-5

5. Милов А.В. Основы программирования в задачах и примерах: Учебный курс. Фолио, 2002, 400 стр. ISBN 966-03-1717-4

6. Бондарев В.М., Рублинецкий В.И., Качко Е.Г. Основы программирования. —Харьков: Фолио, Ростов н/Д: Феникс, 1997.

7. Семакин И.Г., Шестаков А.П. Основы программирования: Учебник. - М.: Мастерство, НМЦ СПО; Высшая школа, 2004. - 432 с.

8. Гладков В.П. Конспект лекций по программированию для начинающих: Учеб. пособие / Перм. гос. техн. ун-т. - Пермь, 1998. - 217 с.

9. Семакин И.Г., Шестаков А.П. Основы алгоритмизации и программирования: Учебник для сред. проф. образования / И.Г. Семакин, А.П. Шестаков. - М.: Издательский центр "Академия", 2008. - 400 с. (Допущено Министерством образования и науки Российской Федерации).

10. Абрамов С.А. и др. Задачи по программированию. - М.: Наука, 1988.

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