0 / 0 / 0
Регистрация: 19.10.2017
Сообщений: 59
1

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

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

Дан текст. Удалить слова, которые содержат все буквы первого слова.
Как можно реализовать сие на c++? Не совсем понимаю принцип.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.12.2017, 20:14
Ответы с готовыми решениями:

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

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

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

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

10
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 935
07.12.2017, 21:17 2
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
279 / 251 / 209
Регистрация: 14.11.2016
Сообщений: 948
07.12.2017, 22:27 3
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  [ТС] 4
no swear, anapshy, всё замечательно, за исключением того, что таких шаблонов, как algorithm, cstring, vector и sstream, в моей учебной программе попросту не изучается. Но, пожалуй, просить это ещё и оптимизировать было бы слишком нагло. Как бы то ни было, большое спасибо!
P.S. Хочется подчеркнуть решение anapshy: очень подробно и понятно!
0
279 / 251 / 209
Регистрация: 14.11.2016
Сообщений: 948
07.12.2017, 23:36 5
Цитата Сообщение от 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  [ТС] 6
Цитата Сообщение от anapshy Посмотреть сообщение
Изучай самостоятельно
Проблема, в общем-то, не в этом - вернее, это вообще не проблема. Не принимается то, что выполненено инструментами, которые не были изучены.
Да, я понимаю, что кода будет больше - причины этого понятны. Более того, это ещё и вызывает путаницу.
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 935
08.12.2017, 14:00 7
Лучший ответ Сообщение было отмечено 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  [ТС] 8
Боже мой, спасибо большое!
Чувствую себя каким-то извергом идиотом, потому что вынудил писать одно и то же трижды. Но вы мне очень-очень помогли!
Ещё раз, большое спасибо!
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 935
10.12.2017, 20:45 9
Всегда Рад ПОМОЧЬ!
0
0 / 0 / 0
Регистрация: 19.10.2017
Сообщений: 59
11.12.2017, 10:59  [ТС] 10
Все было бы еще прекраснее, если бы программа работала корректно
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 935
11.12.2017, 18:36 11
Приведите пример где она не работает
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2017, 18:36
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru