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

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

11.01.2017, 18:56. Показов 5734. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.01.2017, 18:56
Ответы с готовыми решениями:

Создать список из слов. Подсчитать количество слов, совпадающих с последним словом
создать список из слов. подсчитать количество слов, совпадающих с последним словом. Удалить все таки слова, оставив одно последнее.

Стек: создать список из слов, подсчитать количество слов, совпадающих с последним словом
Создать список из слов. подсчитать количество слов, совпадающих с последним словом. Удалить все таки слова, оставив одно последнее. ...

Определить количество слов в тексте, совпадающих с введенным с клавиатуры словом. По нажатию произвольной клавиши выделить последнее из найденных слов
Такая вот задачка. Определить количество слов в тексте, совпадающих с введенным с клавиатуры словом. По нажатию произвольной клавиши...

11
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
11.01.2017, 19:14
Лучший ответ Сообщение было отмечено 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
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
11.01.2017, 19:17
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Эксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
11.01.2017, 19:21
Цитата Сообщение от 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 << " ";
}
2
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
11.01.2017, 19:48
Эко все набросились! Таки неравнодушны к нежелательным словам!
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  [ТС]
Ахах спасибо всем, помогло) а можно это каким-либо образом организовать попроще, а то по курсу"Принципы и практика с использованием с++" find я пока не проходил
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
11.01.2017, 20:37
Цитата Сообщение от 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
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
11.01.2017, 22:24
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  [ТС]
Интересный вариант, спасибо за ответ
0
11.01.2017, 23:27

Не по теме:

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

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

Добавлено через 57 секунд
Цитата Сообщение от Fixer_84 Посмотреть сообщение
vector<string> x, string s
Такие вещи лучше передавать по ссылке на константу.
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
12.01.2017, 20:18
MrGluck, спасибо за ваше замечание. Буду иметь это ввиду.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.01.2017, 20:18
Помогаю со студенческими работами здесь

Заданная последовательность слов от 1 до 30 слов, в каждом от 1 до 5 латинских букв. Между соседними словами - запятая за последний словом точка. выве
Здраствуйте решите пожалуста такую задачку: Заданная последовательность слов от 1 до 30 слов, в каждом от 1 до 5 латинских букв. Между...

Заменить нежелательные слова словом BLEEP.
Задача: Напишите программу, заглушающую нежелательные слова; иначе говоря, считайте слова из потока cin и выведите их в поток cout, заменив...

Считывание/запись слов из файла. Обработка списка слов.
Помогите, пожалуйста, написать программу на языке Prolog. Задание:В файле записаны слова, некоторые из них повторяются. Требуется считывать...

Считывание/запись слов из файла. Обработка списка слов
Помогите, пожалуйста, написать программу на языке Lisp. Задание:В файле записаны слова, некоторые из них повторяются. Требуется считывать...

Считывание из файла слов и вывод их в richTextBox
Здравствуйте! Подскажите пожалуйста, есть файл .txt в нем записаны слова (по одному в строке), необходимо вытащить все слова в...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru