Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/34: Рейтинг темы: голосов - 34, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 19.10.2017
Сообщений: 59

Удалить слова из текста, которые содержат все буквы первого слова

07.12.2017, 20:14. Показов 6609. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дан текст. Удалить слова, которые содержат все буквы первого слова.
Как можно реализовать сие на c++? Не совсем понимаю принцип.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.12.2017, 20:14
Ответы с готовыми решениями:

Выяснить, есть ли в заданной строке слова, которые содержат все буквы слова "read"
Помогите, пожалуйста, с кодом на с++. Задание было такое: Дано строку символов. Выяснить, есть ли в ней слова, которые содержат все...

Есть ли в строке слова, которые содержат все буквы слова "read"
Помогите пожалуйста с заданием на си. Дано строку символов. Выяснить, есть ли в ней слова, которые содержат все буквы слова...

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

10
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
07.12.2017, 21:17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using std::string;
using std::cin;
using std::cout;
const int size = 255;
typedef std::vector<string> vecstring;
typedef std::vector<int> vecint;
 
int main()
{
    vecstring vecs;
    string s, word;
    std::getline(cin, s);
    std::istringstream iss(s);
    while (iss >> word)
    {
        vecs.push_back(word);
    }
    
    vecint veci(size, 0);
    word = vecs[0];
    for (int i = 0; i < word.size(); ++i)
    {
        veci[+word[i]] = 1;
    }
 
    int count = 0;
    for (int i = 0; i < size; ++i)
    {
        if (veci[i] == 1) count++;
    }
 
    int k;
    for (int i = 1; i < vecs.size(); ++i)
    {
        word = vecs[i];
        k = 0;
        for (int j = 0; j < word.size(); ++j)
        {
            if (veci[+word[j]] == 1)
            {
                k++;
                veci[+word[j]] = 2;
                if (k == count)
                {
                    vecs[i] = "";
                    break;
                }
            }
        }
        for (int i = 0; i < size; ++i)
        {
            if (veci[i] == 2) veci[i] = 1;
        }
    }
    for (int i = 0; i < vecs.size(); ++i)
    {
        cout << vecs[i] << std::ends;
    }
    return 0;
}
1
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
07.12.2017, 22:27
sealpup,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
 
std::string& RemoveWords(std::string &str)
{
    /// Находим первое слово
    auto beg_word = std::find_if(str.begin(), str.end(),
        [](char &Ch) { return std::isalpha(Ch); });
    auto end_word = std::find_if(beg_word, str.end(),
        [](char &Ch) { return std::isspace(Ch) || std::ispunct(Ch); });
 
    auto beg_other = end_word; // Итератор начала другого слова (в данном случае указывает на конец первого)
    auto beg_erase = str.end();// Интератор на "конец" строки.
 
    while (beg_other != beg_erase) // Идем по всем словам начиная от Второго слова до Последнего в строке...
    {
        /// Ищем начало другого слова
        beg_other = std::find_if(beg_other, beg_erase,
            [](char &Ch) { return std::isalpha(Ch); });
        /// Ищем конец другого слова
        auto end_other = std::find_if(beg_other, beg_erase,
            [](char &Ch) { return std::isspace(Ch) || std::ispunct(Ch); });
        /// Проверяем Входят ли буквы первого слова в другое
        auto res = std::find_first_of(beg_word, end_word, beg_other, end_other);
        if (res != end_word) // Если входят...
        {
            beg_erase -= std::distance(beg_other -= 1, end_other); // Итератор конца строки сдивигаем влево на размер "другого" слова + 1 символ стоящий перед ним (как правило это пробел, либо знак пунктуации)
            std::rotate(beg_other, end_other, str.end()); // Крутим оставшуюсь строку влево на N позиций (где N длина "другой" строки) / т.е. "другое" слово окажется в пределах от beg_erase до str.end()
        }
        else // Иначе...
        {
            beg_other = end_other; // Пропускаем "другое" слово.
        }
    }
    str.erase(beg_erase, str.end()); // удаляем то, что находится в переделах между beg_erase и str.end()
    //std::cout << "string(beg_erase, str.end()): " << std::string(beg_erase, str.end()) << std::endl; // если интересно что находится в этих пределах - убери коммент
    return str;
}
 
int main()
{
    std::string str("Hello world! He Zzz... How are you?");
    std::cout << RemoveWords(str) << std::endl;
}
1
0 / 0 / 0
Регистрация: 19.10.2017
Сообщений: 59
07.12.2017, 23:12  [ТС]
no swear, anapshy, всё замечательно, за исключением того, что таких шаблонов, как algorithm, cstring, vector и sstream, в моей учебной программе попросту не изучается. Но, пожалуй, просить это ещё и оптимизировать было бы слишком нагло. Как бы то ни было, большое спасибо!
P.S. Хочется подчеркнуть решение anapshy: очень подробно и понятно!
0
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
07.12.2017, 23:36
Цитата Сообщение от sealpup Посмотреть сообщение
в моей учебной программе попросту не изучается
Изучай самостоятельно. В моей программе тоже много чего нет. Берешь книжку и читаешь.

Просто если сейчас начать это всё расписывать без указанных тобой выше библиотек, то кода выйдет в раза 4-5 больше.
И как бы смысла в этом нет, т.к. есть уже готовые "инструменты" для этого.
И нет ничего сложно в незнакомых функция, сейчас есть Google, вводишь "std::find_if" и читаешь о нем.

По факту у меня используется только:
std::find_if(first, last, function) - ищет в указанном диапазоне элемент удовлетворяющий условию и возвращаем итератор на него, иначе возвращает итератор на last (по этому в 27 строке идет сравнение res & end_word).
std::find_first_of - принимает 2 диапазона и ищет первое вхождение элемента из одного диапазона в другом и возвращает итератор на него, иначе ...(всё тоже самое, что и выше).
std::rotate - сдвиг указанного диапазона (в интернете можешь почитать про "сдвиг массива влево/вправо на N элементов" как это выглядит).
std::distance - дистанция между 2-я элементами (как далеко друг от друга в контейнере).
std::isspace - является ли символ пробелом.
std::ispunct - является ли символ знаком пунктуации.
std::isalpha - является ли символ буквой алфавита выбранной локали.
std::string.erase(iterator first, iterator last) - удаляет нужный диапазон устанавливаемый 2-мя итераторами.
1
0 / 0 / 0
Регистрация: 19.10.2017
Сообщений: 59
07.12.2017, 23:42  [ТС]
Цитата Сообщение от anapshy Посмотреть сообщение
Изучай самостоятельно
Проблема, в общем-то, не в этом - вернее, это вообще не проблема. Не принимается то, что выполненено инструментами, которые не были изучены.
Да, я понимаю, что кода будет больше - причины этого понятны. Более того, это ещё и вызывает путаницу.
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
08.12.2017, 14:00
Лучший ответ Сообщение было отмечено sealpup как решение

Решение

Вот "по обычному написал". Думаю хоть класс string проходили а то с char вообще не хочется писать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
#include <string>
using namespace std;
const int size = 255;
int key[size];
int cou;
 
void recovery()
{
    for (int i = 0; i < size; ++i)
    {
        if (key[i] == 2) key[i] = 1;
    }
}
 
bool symbol(string word)
{
    int k = 0;
    for (int i = 0; i < word.size(); ++i)
    {
        if (key[+word[i]] == 1)
        {
            k++;
            if (k == cou)
            {
                recovery();
                return true;
            }
            key[+word[i]] = 2;
        }
    }
    recovery();
    return false;
}
 
int main()
{
    string str, word, str_out;
    getline(cin, str);
 
    bool flag = false;
    int i;
    for (i = 0; i < str.size(); ++i)
    {
        if (str[i] == ' ' && flag) break;
        if (str[i] != ' ')
        {
            word += str[i];
            flag = true;
        }
    }
    
    for (int j = 0; j < size; ++j) key[j] = 0;
    for (int j = 0; j < word.size(); ++j) key[+word[j]] = 1;
 
    cou = 0;
    for (int j = 0; j < size; ++j)
    {
        if (key[j] == 1) cou++;
    }
 
    flag = false;
    word = "";
    for (int j = i; j < str.size(); ++j)
    {
        if (str[j] == ' ' && flag)
        {
            if (!symbol(word))
            {
                str_out += word + "  ";
            }
            flag = false;
            word = "";
        }
        if (str[j] != ' ')
        {
            word += str[j];
            flag = true;
        }
    }
    if (flag)
    {
        str_out += word;
    }
    cout << str_out;
    return 0;
}
1
0 / 0 / 0
Регистрация: 19.10.2017
Сообщений: 59
10.12.2017, 19:27  [ТС]
Боже мой, спасибо большое!
Чувствую себя каким-то извергом идиотом, потому что вынудил писать одно и то же трижды. Но вы мне очень-очень помогли!
Ещё раз, большое спасибо!
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
10.12.2017, 20:45
Всегда Рад ПОМОЧЬ!
0
0 / 0 / 0
Регистрация: 19.10.2017
Сообщений: 59
11.12.2017, 10:59  [ТС]
Все было бы еще прекраснее, если бы программа работала корректно
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
11.12.2017, 18:36
Приведите пример где она не работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.12.2017, 18:36
Помогаю со студенческими работами здесь

Удалить из текста слова которые содержат заданную букву
задан текст.удалить из него те слова,которые содержат букву f.

Найти в файле все слова которые содержат двойные буквы
Найти в файле f все слова которые содержат двойные буквы и сложить с них новый файл q.

Удалить все слова, которые содержат хотя бы одну латинскую букву
Подскажите, почему не работает программа, пожалуйста. :scratch:#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

В текстовом файле удалить все слова, которые содержат хотя бы одну цифру
В данном текстовом файле удалить все слова, которые содержат хотя бы одну цифру.

Удалить из слова X все буквы, которые встречаются в слове Y
#include &lt;iostream&gt; using namespace std; main() { string x, y; cin &gt;&gt;x; cin &gt;&gt;y;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru