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

         

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


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


//------------------------------------------------------bk34-01.cpp


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


&#35include &#60stdio.h&#62
void nospace(c1[],c2[])
{
int i,j;
for (j=0,i=0;c1[i]!=0;i++) // Посимвольный просмотр строки


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


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


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


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


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


}
c2[j]=0;
}

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

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


//------------------------------------------------------bk34-02.cpp



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

// Функция возвращает индекс начала слова или 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 &#62 lmax) { lmax=n; imax=i-n; }
n=0;
}
} // то же самое для последнего слова

if (n &#62 lmax) { lmax=n; imax=i-n; }
return imax;
}

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



//------------------------------------------------------bk34-03.cpp

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

// Функция возвращает индекс начала слова или 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]!=' ' &#38&#38 in[i]!=0; i++,k++); // Подсчет длины слова

if (k&#62m)
{
m=k;
b=i-k;
}
}
return b;
}

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





//------------------------------------------------------bk34-04.cpp

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

void sort(char in[], char out[])
{
int i,k;
i=0;
while((k=find(in))!=-1) // Получить индекс очередного слова

{
for (; in[k]!=' ' &#38&#38 in[k]!=0; i++,k++)
{ // Переписать с затиранием

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

}
out[i]=0;
}


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