Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
6 / 6 / 3
Регистрация: 29.12.2016
Сообщений: 132
1

Считывание слов из потока cin и вывод их в поток cout, с заменой нежелательных слов словом "Bleep"

11.01.2017, 18:56. Показов 3581. Ответов 11
Метки нет (Все метки)

Напишите программу, заглушающую нежелательные слова; иначе говоря, считайте слова из потока cin и выведите их в поток cout, заменив нежелательные слова словом BLEEP. Начните из одного не желательного слова например
string disliked = "Broccoli";
Когда отладите программу, добавьте еще несколько нежелательных слов.

__
вот условие задачи. Если с первойчастью все понятно, то со второй проблемы: когда компилирую программу то каждое обычное слово он пишет по 4 раза(количество нежелательных слов в векторе), а если он находит нежелательное слово(например 'ok') то он три раза пришет это слово, а на 4 раз пишет ok - BLEEP. Как сделать так чтобы программа работала корректно(проверяла все значения вектора 'disliked' и по 1 разу выводила результат)?
Вот код:
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
  #include <iostream>
#include <vector>
#include <conio.h>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
    vector<string> v;
    vector<string> disliked{ "darkey", "jaja", "gabe", "ok" };
 
    for (string word; cin >> word;)
    {
        if (word == "exit")
            break;
        v.push_back(word);
    }
    for (int i = 0; i < v.size(); i++)
    {
 
        for (string x : disliked)
            if (x == v[i])
                 cout << i + 1 << ".\t" << v[i] << " - bleep" << endl;
            else cout << i + 1 << ".\t" << v[i] << ';' << endl;
 
    }
    _getch();
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2017, 18:56
Ответы с готовыми решениями:

Дана строка, состоящая из слов, разделенных пробелом. Определить количество слов, в которых есть хотя бы одна буква "а", или "А"
Дана строка, состоящая из слов, разделенных пробелом. Определить количество слов, в которых есть...

Рассматривая массив из 8 пятиразрядных слов, найти "исключающее или" всех 8 слов для выражения "10101"
У меня дан массив из 5 байт. Рассматривая его как массив из 8 пятиразрядных слов, найти...

В заданной строке, состоящей из "слов", разделенных пробелами, определить количество "слов"
В заданной строке, состоящей из &quot;слов&quot;, разделенных одним или более пробелами, определить...

"cin","cout" на "printf","scanf"
Вот ещё прога. Мне чисто нужно переделать её на printf,scanf и не используя функцию show, а puts и...

11
Форумчанин
Эксперт CЭксперт С++
8169 / 5017 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
11.01.2017, 19:14 2
Лучший ответ Сообщение было отмечено mskoromets как решение

Решение

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
#include <iostream>
#include <vector>
#include <conio.h>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
    vector<string> v;
    vector<string> disliked{ "darkey", "jaja", "gabe", "ok" };
 
    for (string word; cin >> word;)
    {
        if (word == "exit")
            break;
        v.push_back(word);
    }
    for (int i = 0; i < v.size(); i++)
    {
        bool flag = false;
        for (string x : disliked)
            if (x == v[i])
                flag = true;
 
        if (flag)
            cout << i + 1 << ".\t" << v[i] << " - bleep" << endl;
        else
            cout << i + 1 << ".\t" << v[i] << ';' << endl;
    }
    _getch();
}
Добавлено через 4 минуты
С помощью алгоритма find из STL:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
#include <conio.h>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
    vector<string> v;
    vector<string> disliked{ "darkey", "jaja", "gabe", "ok" };
 
    for (string word; cin >> word && word != "exit"; v.push_back(word));
 
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << i + 1 << ".\t" << v[i];
        if (find(disliked.begin(), disliked.end(), v[i]) != disliked.end())
            cout << " - bleep\n";
        else
            cout << ";\n";
    }
    _getch();
}
Добавлено через 3 минуты
Но для хранения большого количества "плохих" слов я бы рекомендовал использовать контейнер std::set. Он позволит делать поиск не за линейное, а логарифмическое время (у него свой метод find).

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <set>
#include <string>
#include <vector>
using namespace std;
 
int main()
{
    vector<string> v;
    const set<string> disliked{ "darkey", "jaja", "gabe", "ok" };
 
    for (string word; cin >> word && word != "exit"; v.push_back(word));
 
    for (size_t i = 0; i < v.size(); i++)
        cout << i + 1 << ".\t" << v[i] << (disliked.find(v[i]) == disliked.end() ? ";" : " - bleep") << endl;
}
1
nd2
3416 / 2796 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
11.01.2017, 19:17 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    for (int i = 0; i < v.size(); i++)
    {
        if (find(disliked.begin(), disliked.end(), v[i]) != disliked.end())
        {
            cout << "BLEEP";
            if (i != v.size() - 1)
                cout << ' ';
        }
        else
            cout << v[i];
        if (i != v.size() - 1)
                cout << ' ';
    }
1
Форумчанин
Эксперт CЭксперт С++
8169 / 5017 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
11.01.2017, 19:21 4
Цитата Сообщение от mskoromets Посмотреть сообщение
считайте слова из потока cin и выведите их в поток cout, заменив нежелательные слова словом BLEEP
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <set>
#include <string>
#include <vector>
 
int main()
{
    std::vector<std::string> v;
    const std::set<std::string> disliked{ "darkey", "jaja", "gabe", "ok" };
 
    for (std::string word; std::cin >> word && word != "exit"; v.push_back(word))
        if (disliked.find(word) != disliked.end())
            word = "BLEEP";
 
    for (const auto &word : v)
        std::cout << word << " ";
}
1
Эксперт С++
3207 / 1734 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
11.01.2017, 19:48 5
Эко все набросились! Таки неравнодушны к нежелательным словам!
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
//Напишите программу, заглушающую нежелательные слова;
//иначе говоря, считайте слова из потока cin и выведите
//их в поток cout, заменив нежелательные слова словом BLEEP.
//Начните из одного не желательного слова например
//string disliked = "Broccoli";
//Когда отладите программу, добавьте еще несколько
//нежелательных слов.
///////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <iterator>
#include <set>
#include <string>
///////////////////////////////////////////////////////////////////////////////
typedef std::string                 T_str;
typedef std::set    < T_str     >   T_words;
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    T_words     bad_words   {
                                "la-la",
                                "bu-bu",
                                "fa-fa"
                            };
 
    std::replace_copy_if
        (
            std::istream_iterator< T_str >  ( std::cin ),
            std::istream_iterator< T_str >  (),
            std::ostream_iterator< T_str>   ( std::cout ),
 
            [&]                             ( auto  const   &   word )
            {
                std::cout   <<  '\t';
                return  bad_words.count( word );
            },
 
            T_str( "BLEEP" )
        );
}
1
6 / 6 / 3
Регистрация: 29.12.2016
Сообщений: 132
11.01.2017, 19:51  [ТС] 6
Ахах спасибо всем, помогло) а можно это каким-либо образом организовать попроще, а то по курсу"Принципы и практика с использованием с++" find я пока не проходил
0
nd2
3416 / 2796 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
11.01.2017, 20:37 7
Цитата Сообщение от mskoromets Посмотреть сообщение
а то по курсу"Принципы и практика с использованием с++" find я пока не проходил
2 пост, первый код.

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    for (int i = 0; i < v.size(); i++)
    {
        bool flag = false;
        for (int i = 0; i < disliked.size(); ++i)
        {
            if (v[i] ==  disliked[i])
            {
                flag = true;
                break;
            }
        }
        if (flag)
        {
            cout << "BLEEP";
            if (i != v.size() - 1)
                cout << ' ';
        }
        else
            cout << v[i];
        if (i != v.size() - 1)
                cout << ' ';
    }
1
1480 / 944 / 811
Регистрация: 30.04.2016
Сообщений: 3,298
11.01.2017, 22:24 8
mskoromets, вот еще один вариант:

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 <vector>
 
using namespace std;
 
bool Disliked(vector<string> x, string s)
{
    for (int i = 0; i < x.size(); i++)
    {
        if (s == x[i])
        {
            return true;
            break;
        }
    }
    return false;
}
 
int main()
{
    int k;
    string s;
    vector<string> x = { "Malfunction", "Disadvantage", "Decrease", "Gap" };
    vector<string> y;
    cout << "Введите слова (Exit для завершения):" << endl;
    k = 1;
    while (s != "Exit")
    {
        cout << k << ": ";
        cin >> s;
        if (Disliked(x, s))
            y.push_back("Bleep");
        else
            y.push_back(s);
        k++;
    }
    cout << "Искомый набор:" << endl;
    for (int i = 0; i < y.size(); i++)
    {
        if (y[i] != "Exit")
            cout << i + 1 << ": " << y[i] << endl;
    }
    system("pause");
    return 0;
}
1
6 / 6 / 3
Регистрация: 29.12.2016
Сообщений: 132
11.01.2017, 22:26  [ТС] 9
Интересный вариант, спасибо за ответ
0
gazlan
11.01.2017, 23:27
  #10

Не по теме:

vector - это не "вариант", а глупость. Такие задачи решаются либо с использованием хэш-таблиц (в компиляторах, например), либо perfect hash (спеллеры, фильтры на биллионы записей итп), либо Trie (TST). Пример с TST можно посмотреть здесь: Перевести код алгоритма шинглов из PHP в Delphi.

0
Форумчанин
Эксперт CЭксперт С++
8169 / 5017 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
12.01.2017, 00:57 11
Цитата Сообщение от gazlan Посмотреть сообщение
либо с использованием хэш-таблиц
Для использования хеш таблиц нужно чтобы хеш функция обработала строку, пройдя её до конца. Мы можем выбрать место подстановки более выгодно, используя бинарный поиск в самобалансирующемся бинарном дереве. Именно поэтому я порекомендовал использовать set, а не unordered_set. Конкретно для строк он лучше.

Добавлено через 57 секунд
Цитата Сообщение от Fixer_84 Посмотреть сообщение
vector<string> x, string s
Такие вещи лучше передавать по ссылке на константу.
1
1480 / 944 / 811
Регистрация: 30.04.2016
Сообщений: 3,298
12.01.2017, 20:18 12
MrGluck, спасибо за ваше замечание. Буду иметь это ввиду.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2017, 20:18

Перегрузка функций "ввести в поток", "вывести с потока", "умножить вектор на число"
Подскажите пожалуйста, как убрать ошибки с этой программы? (делала перегрузку &quot;ввести в поток&quot; и...

Составить фразу "письменный стол" из слов "тесненный", "полка", "речь", "миф".
1) Составить фразу &quot;письменный стол&quot; из слов &quot;тесненный&quot;, &quot;полка&quot;, &quot;речь&quot;, &quot;миф&quot;. 2) Вывести...

Составить фразу "текстовый редактор" из слов "тесто", "редакция", "мотор", "который"
1) Составить фразу &quot;текстовый редактор&quot; из слов &quot;тесто&quot;, &quot;редакция&quot;, &quot;мотор&quot;, &quot;который&quot;.

Составить фразу "программное обеспечение" из слов "программист", "оборот", "анчоус", "измерение"
Составить фразу &quot;программное обеспечение&quot; из слов &quot;программист&quot;, &quot;оборот&quot;, &quot;анчоус&quot;,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.