Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Работа со строкой





Поскольку строка представляет собой последовательность символов, большинство программ, обрабатывающих строки, используют последовательный просмотр символ за символом - ПОСИМВОЛЬНЫЙ ПРОСМОТР СТРОКИ. Если же в процессе обработки строки предполагается изменение ее содержимого, то проще всего организовать его в виде посимвольного переписывание входной строки в выходную. При этом нужно помнить, что каждой строке требуется отдельный индекс, если для входной строки он может изменяться в заголовке цикла посимвольного просмотра, то для выходной строки он меняется только в моменты добавления очередного символа. Кроме того, не нужно забывать “закрывать” выходную строку символом конца строки. В качестве примера рассмотрим функцию УДАЛЕНИЯ ЛИШНИХ ПРОБЕЛОВ.

// Удаление лишних пробелов при посимвольном переписывании

#include <stdio.h>

void nospace(c1[],c2[])

{

int i,j;

for (j=0,i=0;c1[i]!=0;i++)// Посимвольный просмотр строки

{

if (c1[i]!=' ') // Текущий символ – не пробел

{

if (i!=0 && c1[i-1]==' ') // Первый в слове -

c2[j++]=' '; // добавить пробел

c2[j++]=c1[i]; // Перенести символ слова

} // в выходную строку

}

c2[j]=0;

}

Заметим, что контекст c1[j++]= имеет вполне определенный смысл: добавить к выходной строке очередной символ и переместиться к следующему.

Рассмотрим еще один пример – поиск СЛОВА МАКСИМАЛЬНОЙ ДЛИНЫ. Несмотря на ярко выраженный “словный” характер алгоритма его можно реализовать путем посимвольного просмотра. Для этого можно использовать принцип, уже реализованный ранее при определении максимальной длины последовательности возрастающих значений. Достаточно использовать счетчик, который увеличивает свое значение на каждый символ слова и сбрасывает его при обнаружении пробела. Дополнительно в момент сбрасывания счетчика фиксируется его максимальное значение, а также индекс начала слова.

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

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

int find(char s[])

{

int i,n,lmax,imax;

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

{

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

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

{ // фиксация максимального значения

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

n=0;

}

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

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

return imax;

}

 

Такая форма представления программы позволяет одним циклом “убить всех зайцев”, но не является наглядной. В другой версии ПОСЛОВНОЙ ОБРАБОТКИ ТЕКСТА циклов больше, то есть имеются “архитектурные излишества”, зато структура программы отражает в полной мере сущность алгоритма.

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

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

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;

}

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

// Сортировка слов в строке в порядке убывания (выбором)

void sort(char in[], char out[])

{

int i,k;

i=0;

while((k=find(in))!=-1) // Получить индекс очередного слова

{

for (; in[k]!=' ' && in[k]!=0; i++,k++)

{ // Переписать с затиранием

out[i]=in[k]; in[k]=' ';

}

out[i++]=' '; // После слова – добавить пробел

}

out[i]=0;

}

Date: 2015-11-13; view: 376; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию