- •Нижегородский государственный университет им. Н.И. Лобачевского
- •Оглавление
- •Предисловие
- •Глава 1. Вычисление значений функций
- •1.1. Операторы циклов
- •1.2. Операторы ветвления
- •Когда в программе нужно выбрать один из многочисленных вариантов, бывает целесообразным применять оператор-переключатель switch. Этот оператор называется ещё оператором множественного выбора [1].
- •Switch (выражение)
- •1.3. Алгоритмы, необходимые для написания программ
- •Глава 2. Суммирование рядов
- •Глава 3. Позиционная запись числа
- •Глава 4. Делители целого числа
- •5.1. Сортировка вставкой
- •5.2. Метод пузырька
- •5.3. Сортировка выбором
- •5.4. Быстрая сортировка
- •Глава 6. Работа с файлами. Построение массивов без повторений
- •6.1. Работа с файлами
- •6.2. Построение массивов без повторений
- •Глава 7. Обработка последовательности символов
- •7.1. Алгоритм выделения слова из строки
- •7.2. Выбор слов, подходящих под шаблон
- •7.3. Перевод прописных символов в строчные
- •Глава 8. Побитовые операции
- •Глава 9. Преобразование и построение матриц
- •Содержимое файла “input.Txt”
- •Глава 10. Структуры
- •Выделение памяти под объект coat
- •Содержимое файла "input.Txt".
- •Содержимое файла "outout.Txt"
- •Содержимое файла "input.Txt"
- •11. Динамические структуры данных
- •11.1. Односвязные списки
- •11.2. Очереди
- •11.3. Стеки
- •Содержимое файла “input.Txt”
- •Содержимое файла “input.Txt”
- •Список литературы
Глава 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;
}