Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗадачникПоТПиРнаЭВМ.doc
Скачиваний:
28
Добавлен:
11.03.2016
Размер:
1 Mб
Скачать

Глава 7. Обработка последовательности символов

При обработке последовательности символов наиболее часто используются следующие три алгоритма [26]:

  • алгоритм выделения слова из строки;

  • выбор слов, подходящих под шаблон;

  • перевод прописных символов в строчные.

7.1. Алгоритм выделения слова из строки

Алгоритм выделения слова из строки заключается в нахождении индекса, соответствующего началу слова (первый не пробельный символ), и индекса первого после окончания слова пробела или признака конца строки (символ ‘\0’). Существование слова гарантируется отличной от нуля разностью между вторым и первым символом.

Листинг 7.1. Определить число слов в тексте, записанном в файле.

//L7_1.cpp

#include <fstream>

#include <iostream>

using namespace std;

int sum_word(char*st);//Прототип функции

int main( )

{

int sum=0;

char s[81];

fstream f("input.txt"),f1;

f.getline(s,80); //Читаем строку из файла

while(!f.eof()) //Проверка достижения конца файла

{

sum+=sum_word(s); //Добавляем в сумму число

//слов в текущей строке.

f.getline(s,80); //Чистим следующую строку

}

f.close();

f1.open("input.txt",ios::app); //Открываем файл для пополнения

f1<<"\n\nЧисло слов в тексте = "<<sum<<'\n';

f1.close();

return 0;

}

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

int sum_word(char *st)

{

int s=0,b,e=0;

while(st[e] != '\0')

{

//Пропускаем ведущие пробелы:

while(st[e] != '\0' && st[e] == ' ')

e++;

b=e;

//Пропускаем символы слова:

while(st[e] != '\0' && st[e]!=' ')

e++;

if(e-b>0) //Слово выделено

s++;

}

return s;

}

Результат работы программы листинга 7.1 приведен на рис. 7.1.

В файле с именем “input.txt” содержится информация о количестве чисел и сами числа.

Необходимо сформировать массив, не содержащий повторяющихся значений.

Этот алгоритм был рассмотрен в главе 1. При работе с файлом он выглядит следующим образом.

Число слов в тексте = 35

Рис. 7.1. Результат работы программы листинга 7.1

7.2. Выбор слов, подходящих под шаблон

Выбор слов, подходящих под шаблон, является одним из наиболее применяемых алгоритмов. Например, задано слово, в котором встречаются символы ‘*’ и ‘?’. Такие слова будем называть шаблоном. Если в произвольном слове символы совпадают с символами шаблона, а вместо символа ‘*’ можно использовать любую последовательность символов и вместо ‘?’ – любой символ, то говорят, что слово подходит под шаблон. Например, пароход и паропровод подходят под шаблон паро*од. В первом случае под ‘*’ скрывается последовательность “х”, а во втором – “пров”. Под шаблон ?а?а подходят слова мама и папа.

Листинг 7.2. Функция shablon ( ) проверяет, подходит ли слово под шаблон вида ‘*’.

//L7_2.cpp

int shablon(char *word, char *sh)

{

int b, e, si=0, ls;

while(sh[si] != '\0' && sh[si] != '*') si++;

//Если символ ‘*’ отсутствует:

if(si == strlen(sh) && strcmp(word, sh) == 0)

return 1;

if(si == strlen(sh) && strcmp(word, sh) != 0)

return 0;

//si – индекс символа ‘*’ в шаблоне.

//Проверяем совпадение до ‘*’:

for(b=0; b<si; b++)

if(word[b] != sh[b])

break;

if(b<si) //Символы не совпали

return 0;

else

{

//Проверяем совпадение после ‘*’:

for(e=strlen(word)-1, ls = strlen(sh)-1; sh[ls] != '*'; e--, ls--)

if(word[e] != sh[ls])

break;

if(sh[ls] != '*') //Символы не совпали с символом ‘*’

return 0;

else //Символы совпали до и после ‘*’

return 1;

}