Операции с символами

Последнее обновление: 02.03.2023
Упражнение 1

Напишите программу, которая считывает с клавиатуры некоторый текст произвольный длины. Далее запрашивает ввод слова, которое должно быть заменено в тексте на столько звездочек, сколько символов в слове. Заменяются только целые слова. Причем надо заменить все вхождения слова вне зависимости от его регистра. Затем выведите на консоль полученную новую строку.

Решение
#include <iostream>
#include <string>

int main()
{
    std::string text;     // исходный текст
    std::string word;     // слово, которое надо заменить

    std::cout << "Enter some text:\n";    // вводим текст
    std::getline(std::cin, text);

    std::cout << "\nEnter the word to be replaced: "; // вводим слово для замены
    std::cin >> word;
  
    std::string lower_word;    // конвертируем слово в нижний регистр
    for (char ch : word)
    {
        lower_word += std::tolower(ch);
    }
    
    const std::string separators {" ,;:.\"!?'\n"};      // разделители слова

    size_t start {text.find_first_not_of(separators)};  //Находим индекс начала слова
    while (start != std::string::npos)
    {
        auto end{ text.find_first_of(separators, start + 1) };  // находим завершение слова
        // если разделитель не найден, например, после слова в тексте больше нет разделителей
        if (end == std::string::npos) 
        {
            end = text.length(); 
        }

        // сравниваем длину слова для замены и найденного слова в тексте
        if (end - start == word.length())
        {
            bool is_same_word{ true };  // если длина слов совпадает, то устанавливаем флаг замены
            for (size_t i {start}; i < end; i++)
            {
                if (lower_word[i - start] != std::tolower(text[i])) // Если символы различаются
                {
                    is_same_word = false;                           // сбрасываем флаг замены                                
                    break;      
                }
            }
            if (is_same_word)       // Если текущее слово текста представляет слово для замены
            {
                for (size_t i {start}; i < end; i++)    // заменяем звездочками
                {
                    text[i] = '*';
                }
            }
        }
        start = text.find_first_not_of(separators, end + 1);    // находим начало следующего символа
    }

    std::cout << std::endl << text << std::endl;
}

Пример работы программы:

Enter some text:
A Friend in need is a friend indeed.

Enter the word to be replaced: friend

A ****** in need is a ****** indeed.
Упражнение 2

Напишите программу, которая запрашивает ввод двух слов и определяет, является ли одно из них анаграммой другого. Анаграмма слова образована перестановкой его букв. Например, "воз" и "зов" или "все" и "сев".

Решение
#include <iostream>
#include <string>

int main()
{
    std::string word1, word2;

    std::cout << "Enter the first word: ";
    std::cin >> word1;
    std::cout << "Enter the second word: ";
    std::cin >> word2;

    // Проверяем, равны ли их длины, т.к. если не равны, то дальше проверять нет смысла
    if (word1.length() != word2.length())
    {
        std::cout << word1 << " and " << word2 << " are not anagrams" << std::endl;
        return 0;
    }
    // общий алгоритм определения анаграммы - проходим по всем символам первого слова 
    // и удаляем эти символы из второго
    // если после прохода всем символам первого слова во втором слове еще останутся какие-то символы
    // то оба слова содержат разный набор слов и соотвественно анаграммами не являются
    // чтобы не затронуть исходную строку, копируем ее
    std::string word2_copy {word2}; 
    // проходим по всем символам слова word1
    for (char c : word1)
    {
        // проходим по всем символам слова word2
        for (size_t i {}; i < word2_copy.length(); ++i)
        {
            // если символы обоих слов равны
            if (std::tolower(word2_copy[i]) == std::tolower(c)) 
            {
                // удаляем символ из word2
                word2_copy.erase(i, 1);
                break;
            }
        }
    }
    // если второе слово - пустая строка, то слова - анаграммы
    if(word2_copy.empty())
    {
        std::cout << word1 << " and " << word2 << " are anagrams" << std::endl;
    }
    else
    {
        std::cout << word1 << " and " << word2 << " are  not anagrams" << std::endl;
    }
}

Пример работы программы:

c:\cpp>g++ hello.cpp -o hello & hello
Enter the first word: listen
Enter the second word: silent
listen and silent are anagrams

c:\cpp>g++ hello.cpp -o hello & hello
Enter the first word: listen
Enter the second word: lent
listen and lent are not anagrams
Упражнение 3

Напишите программу, которая считывает с консоли текст. Далее программа считывает с консоли символ и находит в тексте все слова, которые начинаются с этого символа (не важно в каком регистре). В конце на консоль выводится список всех этих слов.

Решение
#include <iostream>
#include <string> 
#include <vector> 

int main()
{
    std::string text;   // исходный текст
    char ch;    // символ для поиска
    std::cout << "Enter a text: ";
    std::getline(std::cin, text);       // вводим текст

    std::cout << "\nEnter a char: ";
    std::cin >> ch;            // вводим символ

    const std::string separators {" ,;:.\"!?'\n"};      // разделители слов
    std::vector<std::string> words;                     // вектор для хранения найденных слов
    size_t start {text.find_first_not_of(separators)};  // Индекс первого найденного слова
    // прохоим по всем словам
    while (start != std::string::npos)
    {
        auto end{ text.find_first_of(separators, start + 1) };   // находим конец слова
        if (end == std::string::npos)                            // если разделители не найдены
        {
            end = text.length();
        }
        auto word{ text.substr(start, end - start) };            // Получаем найденное слово
        if (std::toupper(word[0]) == std::toupper(ch))           // Если слово начинается с введенного символа
        {
            words.push_back(word);                              // добавляем слово в вектор
        }
        start = text.find_first_not_of(separators, end + 1);     // получаем начальный индекс следующего слова
    }
    // вывод слов
    std::cout << "\nWords beginning with '" << ch << "' are:\n";
    for (auto& word : words)
    {
        std::cout << word << std::endl;
    }
}

Пример работы программы:

Enter a text: A friend in need is a friend indeed.

Enter a char: i

Words beginning with 'i' are:
in
is
indeed
Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850