Форум программистов, компьютерный форум CyberForum.ru

Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Naginata
-65 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 60
19.05.2014, 21:46     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора #1
Здравствуйте форумчане, у меня к вам несколько нескромная просьба, помогите мне пожалуйста, оформив эти задачи программно:

"Задан текст, состоящий из слов, разделённых одним пробелом. В тексте нет никаких специальных символов. Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора (для каждого варианта повторяющихся слов брать одинаковый специальный символ, для разных вариантов новый)."

Поверите ли вы мне или нет, но я бы и сам разобрался с этим, но я потрачу на это слишком много времени, а у меня очень скоро сессия и другими предметами мне тоже стоит заняться, потому пожалуйста, кому не лень и есть время, окажите услугу. P.S. Я понимаю, что уже много прошу, но можно ещё и комментарии, хотя-бы к каждому блоку программы, сами знаете, каково это, разбираться в чужом коде, особенно, если программа не самая простая.

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

Добавлено через 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
23
24
25
26
27
28
29
#include "stdafx.h"
#include "iostream"
#include <locale>
#include <string>
 
 
using namespace std;
        
 int main()
{setlocale(LC_ALL,"RUSSIAN");
string str=(" Однажды идя домой я заметил свет исходящй из кустов и я был ошарашен тем что я увидел в кустах лежал крайне приметной раскраски шар затем подойдя к нему ближе что то меня коснулось и я проснулся оказалось это был сон");
string str1=("я");
string str2=("что");
string str3=("и");
size_t found=str.find(str1);
if (found!=string::npos)
cout << "'я' было найдено: "<< '\n';
str.replace(str.find(str1),str1.length(),"1");
size_t found=str.find(str2);
if (found!=string::npos)
cout << "'что' было найдено: "<< '\n';
str.replace(str.find(str2),str2.length(),"2");
size_t found=str.find(str3);
if (found!=string::npos)
cout << "'и' было найдено: "<< '\n';
str.replace(str.find(str3),str3.length(),"3");
cout << str << '\n';
return 0;
}
P.S. Я не знаю, почему не работает, я всё сделал по шаблону, вроде хоть так, но должно работать, вот а каком шаблоне речь: http://www.cplusplus.com/reference/string/string/find/ .

Добавлено через 6 минут
Обновление: Нашёл свою ошибку, можно вы подскажете, как сделать так, чтобы символы искались только сами по себе, а не в словах тоже?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2014, 21:46     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора
Посмотрите здесь:

C++ Для заданного достаточно длинного слова найти в имеющемся тексте все слова, в которых использованы только буквы, имеющиеся в заданном слове
C++ Заменить в тексте каждую точку многоточием, если после точки есть пробел
C++ найти все слова, в которых есть двойные согласные и заменить их символом *
C++ Заменить в тексте все слова, в которых есть хоть одна цифра, на звездочки
C++ Если в тексте нет символа +, то оставить текст без изменения, иначе каждую из цифр, предшествующую первому вхождению символа +, заменить символом -
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
19.05.2014, 21:56     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора #2
Naginata, регистр учитывается, "Однажды" и "однажды" одинаковые слова?
По вашему примеру числа 1, 2, 3 это специальные символы?
Naginata
-65 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 60
19.05.2014, 22:34  [ТС]     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора #3
Да, 1,2,3, это специальные символы.

Добавлено через 14 минут
А как сделать так, чтобы различались слова?
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
19.05.2014, 23:01     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора #4
Naginata, если пойдёт добавлю комментарии
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
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
 
int main()
{
    setlocale(LC_ALL,"RUSSIAN");
    std::string str = "ГЋГ¤Г*Г*æäû èäÿ äîìîé Гї Г§Г*ìåòèë Г±ГўГҐГІ èñõîäÿùé ГЁГ§ "
    "êóñòîâ ГЁ Гї áûë îøГ*Г°Г*ГёГҐГ* ГІГҐГ¬ Г·ГІГ® Гї óâèäåë Гў ГЄГіГ±ГІГ*Гµ ëåæГ*Г« ГЄГ°Г*Г©Г*ГҐ "
    "ïðèìåòГ*îé Г°Г*Г±ГЄГ°Г*Г±ГЄГЁ ГёГ*Г° Г§Г*ГІГҐГ¬ ïîäîéäÿ ГЄ Г*åìó áëèæå Г·ГІГ® ГІГ® ìåГ*Гї "
    "êîñГ*óëîñü ГЁ Гї ïðîñГ*óëñÿ îêГ*Г§Г*ëîñü ГЅГІГ® áûë Г±Г®Г*";
    
    char* chStr = new char[str.size() + 1];
    std::strcpy(chStr, str.c_str());
    
    char* p = std::strtok(chStr, " ");
    std::vector<std::string> arr;
    while(p != NULL)
    {
        arr.push_back(p);
        p = strtok(NULL, " ");
 
    }
    
    int symbol = 1;
    bool check = false, exists = false;
    
    for(int i = 0; i < arr.size(); i++)
    {
        for(int j = i + 1; j < arr.size(); j++)
        {
            for(int s = 1; s <= symbol; s++)
            {
                std::ostringstream convert;
                convert << s;
                if(arr[i] == convert.str())
                {
                    exists = true;
                    break;
                }
            }
            if(arr[j] == arr[i] && !exists)
            {
                arr[j] = (((int)'0') + symbol);
                check = true;
            }
        }
        if(check)
        {
            arr[i] = (((int)'0') + symbol);
            symbol++;
            check = false;
        }
        exists = false;
    }
    
    for(int i = 0; i < arr.size(); i++)
        std::cout << arr[i] << " ";
    std::cout << "\n\n";
    
    delete [] chStr;
    
    system("pause");
    return 0;
}
Naginata
-65 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 60
19.05.2014, 23:20  [ТС]     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора #5
Выдаёт такую ошибку: error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> e:\programs\microsoft visual studio\vc\include\string.h(110): см. объявление "strcpy" .

Добавлено через 11 минут
Обновление, нашёл как решить предыдущую проблему, но теперь вот такие: error C2039: strcpy_s: не является членом "std" error C2660: strcpy_s: функция не принимает 2 аргументов Понимаю, что неприятно надоедать таким, особенно после вашей помощи, но код ведь ваш, я в нём долго буду разбираться.
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
20.05.2014, 00:16     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Naginata, извините не могу быстро отвечать проблема со связью...
Попробуйте следующее вместо 15-ой строчки:
C++
1
strcpy_s(chStr, str.size() + 1, str);
У меня проблем не было иначе бы не выложил, простите за неудобства...

Добавлено через 8 минут
--------------------------
Чтобы долго не мучаться:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
 
int main()
{
    setlocale(LC_ALL,"RUSSIAN");
    char str[] = "ГЋГ¤Г*Г*æäû èäÿ äîìîé Гї Г§Г*ìåòèë Г±ГўГҐГІ èñõîäÿùé ГЁГ§ "
    "êóñòîâ ГЁ Гї áûë îøГ*Г°Г*ГёГҐГ* ГІГҐГ¬ Г·ГІГ® Гї óâèäåë Гў ГЄГіГ±ГІГ*Гµ ëåæГ*Г« ГЄГ°Г*Г©Г*ГҐ "
    "ïðèìåòГ*îé Г°Г*Г±ГЄГ°Г*Г±ГЄГЁ ГёГ*Г° Г§Г*ГІГҐГ¬ ïîäîéäÿ ГЄ Г*åìó áëèæå Г·ГІГ® ГІГ® ìåГ*Гї "
    "êîñГ*óëîñü ГЁ Гї ïðîñГ*óëñÿ îêГ*Г§Г*ëîñü ГЅГІГ® áûë Г±Г®Г*";
    
    char* p = std::strtok(str, " ");
    std::vector<std::string> arr;
    while(p != NULL)
    {
        arr.push_back(p);
        p = strtok(NULL, " ");
 
    }
    
    int symbol = 1;
    bool check = false, exists = false;
    
    for(int i = 0; i < arr.size(); i++)
    {
        for(int j = i + 1; j < arr.size(); j++)
        {
            for(int s = 1; s <= symbol; s++)
            {
                std::ostringstream convert;
                convert << s;
                if(arr[i] == convert.str())
                {
                    exists = true;
                    break;
                }
            }
            if(arr[j] == arr[i] && !exists)
            {
                arr[j] = (((int)'0') + symbol);
                check = true;
            }
        }
        if(check)
        {
            arr[i] = (((int)'0') + symbol);
            symbol++;
            check = false;
        }
        exists = false;
    }
    
    for(int i = 0; i < arr.size(); i++)
        std::cout << arr[i] << " ";
    std::cout << "\n\n";
    
    system("pause");
    return 0;
}
Naginata
-65 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 60
20.05.2014, 17:13  [ТС]     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора #7
Здравствуйте, я не знаю почему, но компилятор снова утверждает, что требуется заменить strtok, на strtok_s, но когда я пытаюсь это сделать, он выдаёт ошибку, мол это не принадлежит namespace std, я пользуюсь Microsoft Visual Studio 2012, может в этом всё дело, особенно, если у вас компилируется?
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
20.05.2014, 17:47     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора #8
Naginata, да VS добавил новые защищённые функции с добавкой _s.
Можно отключить эти предупреждения, вроде следующим образом:
Project properties->Configuration Properties->C/C++->Preprocessor->
Preprocessor Definitions-> _CRT_SECURE_NO_WARNINGS
Я использую Dev-C++ поэтому с такими проблемами не встречаюсь.
Можете убрать std:: перед strtok_s, только эта функция принимает 3 аргумента
http://msdn.microsoft.com/ru-ru/library/ftsafwz3.aspx
Naginata
-65 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 60
20.05.2014, 18:15  [ТС]     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора #9
Отключил в настройках предкомпилированные заголовки, как нашёл в одной теме с схожей проблемой и заработало! Спасибо вам огромное! P.S. А вы присваиваете повторяющимся элементам цифры как я понял, нет, всё отлично, просто хотел уточнить.

Добавлено через 8 минут
Правда, можно ещё и комментарии, а то, вообщем-то я понял о чём речь, но конкретно могу не суметь отчитаться, если потребуют.
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
20.05.2014, 18:48     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
 
int main()
{
    setlocale(LC_ALL,"RUSSIAN");
    char str[] = "Однажды идя домой я заметил свет исходящй из "
    "кустов и я был ошарашен тем что я увидел в кустах лежал крайне "
    "приметной раскраски шар затем подойдя к нему ближе что то меня "
    "коснулось и я проснулся оказалось это был сон";
    
    //Первое использование функции strtok(). В качестве указателя используем str.
    //Далее будем использовать NULL. Функция нужна для исключения запятых,
    //точек, скобок и т. д. В нашем случае только пробелы.
    char* p = std::strtok(str, " ");
    //Создаём вектор arr
    std::vector<std::string> arr;
    //Сохраняем лексемы (слова) в вектор
    while(p != NULL)
    {
        arr.push_back(p); //Сохраняем
        p = strtok(NULL, " "); //Переходим к следующей лексеме
 
    }
    
    //Первый символ
    int symbol = 1;
    //Булевые переменные для дальнейшей проверки
    bool check = false, exists = false;
    
    //Главный цикл. Элемент с его индексом (i) проверяется с последующими (j).
    for(int i = 0; i < arr.size(); i++)
    {
        for(int j = i + 1; j < arr.size(); j++)
        {
            //Этот цикл исключает замену символа если он уже заменил слово.
            for(int s = 1; s <= symbol; s++)
            {
                std::ostringstream convert;
                convert << s; //"Конвертация" int в string
                //Т.е. если на каком-то этапе мы попадаем на символ 1, 2 и.т.д.
                //мы должны предотвратить их замену на текущий символ.
                if(arr[i] == convert.str())
                {
                    exists = true; //Поэтому меняем значение exists на true
                    break;
                }
            }
            //Если exists = false и элемент с индексом i равен элементу с индексом j
            if(arr[j] == arr[i] && !exists) 
            {
                //заменяем его (элемент с индексом j) на текущий символ
                arr[j] = (((int)'0') + symbol); 
                check = true; //check меняем на true
            }
        }
        if(check) //Если check = true
        {
            //заменяем (элемент с индексом i) на текущий символ
            arr[i] = (((int)'0') + symbol); 
            symbol++; //"Меняем" символ
            check = false; //Возвращаем check значение false
        }
        exists = false; //Возвращаем exists значение false
    }
    
    //Печатаем результат
    for(int i = 0; i < arr.size(); i++)
        std::cout << arr[i] << " ";
    std::cout << "\n\n";
    
    system("pause");
    return 0;
}
Naginata
-65 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 60
20.05.2014, 19:03  [ТС]     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора #11
GuGo1991, Спасибо вам огромное, вы сделали даже больше, чем мне бы хотелось, может для вас это было просто недолгим развлечением, но я бы очень долго пытался это сделать, спасибо, что поняли мою ситуацию, и "пошли" навстречу!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2014, 19:58     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора
Еще ссылки по теме:

C++ В произвольном тексте заменить арабские цифры символом #
Подчеркнуть в строке все вхождения заданного символа, если такие там есть C++
C++ Если в строках или столбцах есть хотя бы один элемент равный нулю, заменить нулями все их элементы

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

Или воспользуйтесь поиском по форуму:
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
20.05.2014, 19:58     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора #12
Naginata, нет проблем, обращайтесь
Yandex
Объявления
20.05.2014, 19:58     Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора
Ответ Создать тему
Опции темы

Текущее время: 15:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru