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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Naginata
-65 / 0 / 0
Регистрация: 02.01.2014
Сообщений: 60
#1

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

19.05.2014, 21:46. Просмотров 1226. Ответов 11
Метки нет (Все метки)

Здравствуйте форумчане, у меня к вам несколько нескромная просьба, помогите мне пожалуйста, оформив эти задачи программно:

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

Поверите ли вы мне или нет, но я бы и сам разобрался с этим, но я потрачу на это слишком много времени, а у меня очень скоро сессия и другими предметами мне тоже стоит заняться, потому пожалуйста, кому не лень и есть время, окажите услугу. 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++
Заменить в данном тексте все слова «процент» символом «%». Не могу понять как заменить. Добавлено через 40 минут Мне просто...

Найти все слова, в которых есть двойные согласные, и заменить их символом "*" - C++
дан текст(на англ. яз). найти все слова, в которых есть двойные согласные и заменить их *.

Заменить в тексте все слова, в которых есть хоть одна цифра, на звездочки - C++
Помогите! Задание такое: заменить в тексте все слова в которых есть хоть одна цифра на звездочки)

Если в тексте нет символа +, то оставить текст без изменения, иначе каждую из цифр, предшествующую первому вхождению символа +, заменить символом - - C++
Дан текст. Если в тексте нет символа +, то оставить текст без изменения, иначе каждую из цифр, предшествующую первому вхождению символа +,...

Для заданного достаточно длинного слова найти в имеющемся тексте все слова, в которых использованы только буквы, имеющиеся в заданном слове - C++
Помогите пожалуйста!!!!!Плиззззззззз!!!!! Для заданного достаточно длинного слова найти в имеющемся тексте все слова, в...

Вывести на экран все трехзначные числа, не превосходящие заданного n, у которых есть одинаковые цифры - C++
Вывести на экран все трехзначные числа, не превосходящие заданного n, у которых есть одинаковые цифры. Подсчитать количество таких чисел...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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, Спасибо вам огромное, вы сделали даже больше, чем мне бы хотелось, может для вас это было просто недолгим развлечением, но я бы очень долго пытался это сделать, спасибо, что поняли мою ситуацию, и "пошли" навстречу!
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
20.05.2014, 19:58 #12
Naginata, нет проблем, обращайтесь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2014, 19:58
Привет! Вот еще темы с ответами:

Заменить в тексте каждую точку многоточием, если после точки есть пробел - C++
Заменить в тексте каждую точку многоточием, если после точки есть пробел.

В произвольном тексте заменить арабские цифры символом # - C++
Задается произвольный текст, содержащий не более 10 строк, в каждой строке не более 80 символов. Требуется заменить арабские цифры...

Определить являются ли числа из заданного набора равными или все они не меньше заданного - C++
1. Даны n целых чисел. Определить, являются ли эти числа равными или все они не меньше заданного А.

Подчеркнуть в строке все вхождения заданного символа, если такие там есть - C++
Дана строка и некий символ. Подчеркнуть в строке все вхождения заданного символа, если такие там есть. с++


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.05.2014, 19:58
Ответ Создать тему
Опции темы

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