Информатика: Методические указания к лабораторным работам № 1-5. Функции. Обработка символьных данных. Организация работы с файлами, страница 22

vector<string> vec; // Массив для хранения слов

int CurBeg = 0;// Позиция начала строки на текущей итерации

while(1)

{ // Пропускаем все разделители перед началом текущего слова

while(s.find_first_of(delim,CurBeg)==CurBeg)

++CurBeg;

// Помещаем в массив позцию начала текущего слова

WordBegPos.push_back(CurBeg);

//Позиция, следующая за последним символом текущего слова

int CurFin = s.find_first_of(delim,CurBeg);

 if(CurFin == string::npos)// Условие выхода из цикла

{// Определяем длину последнего слова и заносим ее в массив

       WordLength.push_back(s.size()-CurBeg);

break;

}

// Определяем длину текущего слова и заносим ее в массив

WordLength.push_back(CurFin-CurBeg);

CurBeg = CurFin+1;// Определяем позицию, с которой

// начнется следующая итерация

}

//Нулевая длина последнего слова говорит о наличии разделителей

// в конце строки

if(WordLength.back() == 0)

{ WordBegPos.pop_back(); WordLength.pop_back();// Удаляем

// записи о них

}

//Заносим слова в массив vec

for(unsigned int i = 0; i<WordBegPos.size();++i)

{ vec.push_back(s.substr(WordBegPos[i],WordLength[i]));

}

    return vec;

}

void main()

setlocale(LC_ALL,"rus_rus.1251");

string s1(" И/дым: отечества, нам сладок и приятен!++");// Исходная

// строка

string s2(": ,/!++ ");// Символы разделители

cout<<"Исходная строка:\""<<s1<<"\"";

vector<string> v;

v = vtok(s1,s2);// Вызов фукции

cout<<endl<<"В исходной строке "<< v.size()<<" слов"<<endl;

for(unsigned int i=0;i<v.size();i++)

     cout<<"\""<<v[i]<< "\""<<endl;

}

Результат

Аналогичен примеру 9.

Анализ

В этом примере функция vtok( )имеет два формальных парметра: ссылку на исходную строку s и ссылку на строку delim, содержащую символы разделители. Возвращает эта функция вектор, элементами которого служат отдельные слова исходной строки.

Варианты заданий

Вариант 1

Удалить из строки все комментарии вида /*….*/ и //….

Вариант 2

Дана строка, в которой слова разделены одним пробелом. Напечатать все слова, отличные от слова hello.

Вариант 3

Дана строка, в которой слова разделены одним пробелом. Напечатать то слово, которое по алфавиту предшествует всем другим словам (все слова различны; слово ааа предшествует слову аааа).

Вариант 4

Дана строка, в которой слова разделены одним пробелом. Напечатать все слова, содержащие ровно две буквы  d.

Вариант 5

Дана строка, в которой слова разделены одним пробелом. Напечатать текст, составленный из последних символов всех слов строки.

Вариант 6

Дана строка, в которой слова разделены одним пробелом и более. Напечатать их в алфавитном порядке.

Вариант 7

Дана строка из строчных русских букв (не более 50). Напечатать измененную строку, где после каждого фрагмента «город» добавлен фрагмент текста «пригород». Фрагменты разделены пробелами.

Вариант 8

Дана строка, в которой слова разделены одним пробелом. Удалить из нее все повторяющиеся слова.

Вариант 9

Дана строка, в которой слова разделены одним пробелом. Напечатать слово максимальной длины, в котором нет символов цифр (считается, что такое слово только одно).

Вариант 10

Дана строка, в которой слова разделены одним пробелом. В каждом слове перенести первую букву в конец слова. Длина строки при этом не должна изменяться, и слова по-прежнему должны быть разделены пробелами.

Вариант 11

Дана строка, в которой слова разделены следующими символами: ,:/+. Если слово нечетной длины, то удалить его среднюю букву.

Вариант 12

Дана строка из цифр и букв латинского алфавита. Найти цифры, обладающие минимальным и максимальным значением.

Вариант 13

Дана строка из цифр и букв латинского алфавита. Вывести сумму всех цифр.

Вариант 14

Дана строка из цифр и букв латинского алфавита в произвольном порядке. Вывести номер позиции, которая содержит символ ‘5’, при условии, что этот символ окружен буквами.

Вариант 15