Я ничего не понял. Так?| Код | #include <iostream> #include <string> #include <vector> #include <utility> #include <algorithm>
// Проверяем, является ли символ пробелом. // Если является, то возвращает true, в противном случае -- false inline bool is_space(const char ch) { return (ch == ' '); }
// Проверяем, не является ли символ пробелом. // Если не является, то возвращает true, в противном случае -- false inline bool not_space(const char ch) { return (ch != ' '); }
// Разделяем предложение на слова. // Результат сохраняется в вектор, содержащий пары значений: // (позиция первого символа слова в строке; само слово) std::vector<std::pair<size_t, std::string> > split(const std::string &str) { // Объявление вектора пар std::vector<std::pair<size_t, std::string> > result; // Итератор указывающий на первый символ строки. // Почитайте что такое итераторы и как они работают! иначе ничего не поймете! std::string::const_iterator i = str.begin(); // Пока итератор i не равен концу строки делать ... while (i != str.end()) { // Найти первый непробельный символ (с которого начинается слово) начиная с позиции i i = std::find_if(i, str.end(), not_space); // Найти первый пробельный символ после позиции первой буквы в слове std::string::const_iterator j = std::find_if(i, str.end(), is_space); if (i != str.end()) { // Добавить в вектор пару (позиция первого символа слова в строке; само слово). // Позиция вычисляется вычетом из текущей позиции итератора позиции первого символа строки, // а само слово это символы от i (первая буква) до j (позиция пробела после текущего слова) result.push_back(std::pair<size_t, std::string>((i - str.begin()), std::string(i, j))); // На следующей итерации поиск будет производиться с позиции пробела за текущим словом i = j; } } return result; }
// Проверить есть ли слово (substr) в строке. // Усли есть, то вернуть true, в противном случае -- false bool is_word_present(std::string &str, std::string &substr) { // Изначально предпологаем, что слова нет bool result = false; // Разделяем строку на слова std::vector<std::pair<size_t, std::string> > words = split(str); // В цикле сравниваем искомое слово (substr) с каждым словом строки for (size_t i = 0; i < words.size(); ++i) { // Само сравнение if (words.at(i).second == substr) { // Если слово совпало, то присваиваем переменной result значение true result = true; } } return result; }
// Меняем местами два слова с заданными индексами std::string swap_words(const std::string &str, int first_index, int second_index) { // Создаем копию исходной строки std::string result = str; // Разделяем исходную строку на слова std::vector<std::pair<size_t, std::string> > words = split(str); // Проверяем какой из индексов больше. Для нормальной замены нужно сначала заменить слово, // которое расположено ближе к концу строки. Ведь у меняемых слов может быть разная длина. // А при разделении слов мы сохраняем индекс первой буквы слова с троке. Таким образом, // если мы сначала поменяем слово ближе к концу, это никак не отразится на позиции первой буквы // слова, которое ближе к началу. Почитайте про std::string.replace(), чтобы понять что идет дальше. // Объяснить в коментарии я этого не смогу! // Если первый индекс меньше (например введены числа 1 и 2) if (first_index < second_index) { result.replace(words.at(second_index - 1).first, words.at(second_index - 1).second.length(), words.at(first_index - 1).second); result.replace(words.at(first_index - 1).first, words.at(first_index - 1).second.length(), words.at(second_index - 1).second); } // А это если второй индекс меньше (например введены числа 2 и 1) else if (first_index > second_index) { result.replace(words.at(first_index - 1).first, words.at(first_index - 1).second.length(), words.at(second_index - 1).second); result.replace(words.at(second_index - 1).first, words.at(second_index - 1).second.length(), words.at(first_index - 1).second); } // ВОзвращаем строку с поменяными местами словами. return result; }
// Вставляем слово (inserted_word) после заданного слова (searched_word) std::string insert_word(const std::string &str, const std::string &searched_word, const std::string &inserted_word) { // Создаем копию исходной строки std::string result = str; size_t position; // Разделяем исходную строку на слова std::vector<std::pair<size_t, std::string> > words = split(str); // В цикле сравниваем искомое слово (searched_word) с каждым словом строки for (size_t i = 0; i < words.size(); ++i) { // Если слово совпало if (words.at(i).second == searched_word) { // Вычисляем позицию порвого символа для втавки слова (позиция первого символа // искомого слова + его длина) position = words.at(i).first + words.at(i).second.length(); // Прерываем цикл. Ведь слово мы уже нашли, значит перебирать дальше смысла нет. break; } } // Вставляем заданное слово (inserted_word) в позицию после искомого слова (searched_word). // Заодно добавляем перед вставляемым словом пробел, чтобы оно не слилось с искомым. result.insert(position, " " + inserted_word); // Возвращаем строку со вставленным словом. return result; }
int main() { std::string str; std::string searched_word; std::string inserted_word; int first_index; int second_index; std::cout << "Vvedite slova razdelennie probelami >>> "; std::getline(std::cin, str); std::vector<std::pair<size_t, std::string> > words = split(str); int words_count = words.size(); std::cout << "Vvedeno " << words_count << " slov." << std::endl; std::cout << "Vvedite slovo dlya poiska >>> "; std::getline(std::cin, searched_word); if (is_word_present(str, searched_word) == true) { std::cout << "Slovo \"" << searched_word << "\" naideno." << std::endl; } else { std::cout << "Slovo \"" << searched_word << "\" ne naideno!" << std::endl; } std::cout << "Vvedite nomer pervogo slova dlya zameni (ot 1 do " << words_count << ") >>> "; std::cin >> first_index; std::cout << "Vvedite nomer vtorogo slova dlya zameni (ot 1 do " << words_count << ") >>> "; std::cin >> second_index; if ((first_index <= words_count) && (second_index <= words_count)) { // Присваиваем исходной строке строку с поменяными местами словами. str = swap_words(str, first_index, second_index); std::cout << str << std::endl; } else { std::cout << "Vvedeni nevernie nomera slov!" << std::endl; } std::cout << "Vvedite slovo, posle kotorogo nujno vstavit novoe slovo >>> "; std::cin.ignore(); std::getline(std::cin, searched_word); if (is_word_present(str, searched_word) == true) { std::cout << "Vvedite slovo, kotoroe nujno vstavit >>> "; std::getline(std::cin, inserted_word); std::cout << insert_word(str, searched_word, inserted_word) << std::endl; } else { std::cout << "Vvedennoe slovo \"" << searched_word << "\" ne naideno!" << std::endl; } return 0; }
|
|