Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 2
1

Удаление одинаковых слов в строке

10.04.2015, 20:15. Показов 2160. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, задача заключается в удалении одинаковых слов в строке. Пытался решить, но не доходит где у меня ошибка. Прошу помочь, заранее спасибо)
Из строковых библиотек можно использовать только string.

Вот мой код:
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 <string>
using namespace std;
 
int main()
{string str, str2, slovo; int j=1,l,q=1,z=-1,p;
string::size_type k=0,pos=0;
string razdel=",.:;!? ";
cout<<"Enter string"<<endl;
getline(cin,str);
str2.insert(0,str);
int *fst=new int[str.length()];
int *snd=new int[str.length()];
k=str.find_first_of(razdel,pos);
fst[0]=0; snd[0]=k; l=k;
for (int i=l; i<str.length(); i++)
{if (ispunct(str[i])) p=i+2;
else p=i+1;
fst[j]=p; snd[j]=str.find_first_of(razdel,p); p=snd[j]; q++; j++;}
p=0;
for (int i=0; i<q; i++)
{slovo=str2.substr(fst[i],(snd[i]-fst[i]));
for (int g=0; g<str.length()-1; g++){
     k=str.find(slovo,snd[i]); z+=p;
     if (z>=0) {str.erase(k,(slovo.length())); z=-1;}    }
}
 
cout<<str;
return 0;}
Буду рад любой помощи.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2015, 20:15
Ответы с готовыми решениями:

Удаление одинаковых слов в строке
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &quot;conio.h&quot; using namespace std; int...

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

Проход по массиву и удаление одинаковых слов
Доброе утро!Программа выполняет чтение вводимых слов с консоли и записывает каждое слово в массив...

Поиск слов по маске в строке, их удаление, сортировка оставшихся слов
Доброго времени суток. Помогите, пожалуйста, реализовать задачу. нужно из текстового файла считать...

12
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
11.04.2015, 08:52 2
Удаление одинаковых слов в строке
Если неважен порядок слов, то предлагаю такое решение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
#include <set>
using namespace std;
 
int main()
{
    string str;
    set<string> ss;
    cout<<"Enter string"<<endl;
    while(cin>>str)// конец ввода ^Z
        ss.insert(str);
    for(set<string>::iterator p=ss.begin();p!=ss.end();++p)
        cout<<*p<<' ';
    cout<<endl;
    system("pause");
    return 0;
}
1
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
11.04.2015, 09:48 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
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 <cstdlib>
#include <cstring>
#include <iostream>
#include <locale>
#include <vector>
#include <string>
#include <utility>
#include <windows.h>
 
using std::cout;
using std::cin;
using std::endl;
using std::locale;
using std::string;
 
int main()
{
    locale::global(locale(""));
 
    typedef std::vector<std::pair<size_t, size_t>>::iterator w_it;
 
    string d = " .,!?:;"; // разделители слов
    std::vector<std::pair<size_t, size_t>> words; // пары (позиция первого символа слова, длина слова)
    string s;
 
    cout << "Строка: ";
    getline(cin, s);
    char *cs = new char[s.length() + 1];
    strcpy(cs, s.c_str());
    OemToCharA(cs, cs);
    s = cs;
    delete[] cs;
 
    size_t b = 0;
    size_t found = s.find_first_of(d);
    while (found != string::npos)
    {
        if (b < found) words.push_back(std::make_pair(b, found - b));
        b = found + 1;
        found = s.find_first_of(d, found + 1);
    }
    if (b < s.length()) words.push_back(std::make_pair(b, s.length() - b));
 
    for (w_it ita = words.begin(); ita != words.end(); ++ita)
    {
        string w = s.substr(ita->first, ita->second); // текущее слово
        for (w_it itb = ita + 1; itb != words.end();) // поиск совпадений
        {
            if (w == s.substr(itb->first, itb->second)) // найдено
            {
                s.erase(itb->first, itb->second); // удалить найденное слово
                for (w_it itc = itb + 1; itc != words.end(); ++itc) itc->first -= itb->second; // скорректировать позиции следующих слов
                itb = words.erase(itb); // удалить данные слова
            }
            else ++itb;
        }
    }
 
    cout << "Результат: " << s << endl << endl;
 
 
    system("pause");
    return 0;
}
Разделители не удаляются. Допиливай.
0
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 2
11.04.2015, 17:41  [ТС] 4
Цитата Сообщение от zss Посмотреть сообщение
Удаление одинаковых слов в строке
Если неважен порядок слов, то предлагаю такое решение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
#include <set>
using namespace std;
 
int main()
{
    string str;
    set<string> ss;
    cout<<"Enter string"<<endl;
    while(cin>>str)// конец ввода ^Z
        ss.insert(str);
    for(set<string>::iterator p=ss.begin();p!=ss.end();++p)
        cout<<*p<<' ';
    cout<<endl;
    system("pause");
    return 0;
}
Спасибо за помощь, но такой код не хочет принимать мой преподаватель.
Библиотеку set мы еще не проходили, мне сказали сделать используя только библиотеки string и cstring =(

Добавлено через 49 секунд
Цитата Сообщение от nmcf Посмотреть сообщение
Вот удаление повторов (первое слово не удаляется):
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 <cstdlib>
#include <cstring>
#include <iostream>
#include <locale>
#include <vector>
#include <string>
#include <utility>
#include <windows.h>
 
using std::cout;
using std::cin;
using std::endl;
using std::locale;
using std::string;
 
int main()
{
    locale::global(locale(""));
 
    typedef std::vector<std::pair<size_t, size_t>>::iterator w_it;
 
    string d = " .,!?:;"; // разделители слов
    std::vector<std::pair<size_t, size_t>> words; // пары (позиция первого символа слова, длина слова)
    string s;
 
    cout << "Строка: ";
    getline(cin, s);
    char *cs = new char[s.length() + 1];
    strcpy(cs, s.c_str());
    OemToCharA(cs, cs);
    s = cs;
    delete[] cs;
 
    size_t b = 0;
    size_t found = s.find_first_of(d);
    while (found != string::npos)
    {
        if (b < found) words.push_back(std::make_pair(b, found - b));
        b = found + 1;
        found = s.find_first_of(d, found + 1);
    }
    if (b < s.length()) words.push_back(std::make_pair(b, s.length() - b));
 
    for (w_it ita = words.begin(); ita != words.end(); ++ita)
    {
        string w = s.substr(ita->first, ita->second); // текущее слово
        for (w_it itb = ita + 1; itb != words.end();) // поиск совпадений
        {
            if (w == s.substr(itb->first, itb->second)) // найдено
            {
                s.erase(itb->first, itb->second); // удалить найденное слово
                for (w_it itc = itb + 1; itc != words.end(); ++itc) itc->first -= itb->second; // скорректировать позиции следующих слов
                itb = words.erase(itb); // удалить данные слова
            }
            else ++itb;
        }
    }
 
    cout << "Результат: " << s << endl << endl;
 
 
    system("pause");
    return 0;
}
Разделители не удаляются. Допиливай.
Честно говоря, здесь я код вообще не понял)
0
-30 / 1 / 2
Регистрация: 25.01.2015
Сообщений: 55
11.04.2015, 17:45 5
По пробуйте:
VB.NET
1
Dim Ваше название As String
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
11.04.2015, 20:40 6
Цитата Сообщение от Link312 Посмотреть сообщение
Честно говоря, здесь я код вообще не понял
Что не ясно? Сначала находятся координаты и длина всех слов и сохраняются в words. Дальше по ним выделяются подстроки и сравниваются, при совпадении удаляются, а координаты последующих слов корректируются.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
11.04.2015, 22:32 7

Не по теме:

Ох уж эти длинные непонятные коды, да еще перекрещивающиеся с Си.



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
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main (void){
    setlocale(LC_ALL,"");
 
 string S="Привет. Это строка, которая содержит     несколько одинаковых слов. Несколько одинаковых слов будет удалено. А несколько не одинаковых слов будет оставлено";
 vector <string> v;
 string temp;
 
 cout<<"Исходная строка:\n========================\n"<<S<<"\n========================\n\n\nОбработанная строка:\n========================\n";
 
 for (string::iterator it=S.begin();it!=S.end();it++){
 
    if (!isgraph(*it) or (ispunct(*it))){
        if(find(v.begin(), v.end(), temp) == v.end())  v.push_back(temp);
        temp.clear();
        while (!isgraph(*it) or (ispunct(*it))){
                temp=temp+*it;
                it++;
                v.push_back(temp);
                temp.clear();
        }
    }
   temp=temp+*it;
 
 };
 if(find(v.begin(), v.end(), temp) == v.end())  v.push_back(temp); //Последнее слово
 
 
 for (int i=0;i<v.size();i++) cout<<v.at(i);
 cout<<"\n========================\n";
 
 
 return 0;
}
0
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
13.04.2015, 17:50 8
Цитата Сообщение от daslex Посмотреть сообщение
Ох уж эти длинные непонятные коды
У меня этот код завис.
Чуток доделав, получилось вот что.
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
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main (void){
    setlocale(LC_ALL,"");
 
 string S="Hi. This string has some equal words. Some equal words will be removed.\
  Some unique words will be left.";
 vector <string> v;
 string temp, FL="\n========================\n";
 
 cout<<"Original string:"<<FL<<S<<FL<<"Developed string:"<<FL;
 
  for (string::iterator it=S.begin();it!=S.end();it++) {
      if (!isgraph(*it) or (ispunct(*it)))   {
        if(find(v.begin(), v.end(), temp) == v.end())  v.push_back(temp);
        temp.clear();      
      } else temp+=*it;
  }
 
  for (int i=0;i<v.size();i++) cout<<v.at(i)<<" ";
  cout<<"\n========================\n";
 
  return 0;
}
Выдает похоже на то, что надо, за исключением того, что после Hi включает лишний пробел - считает пробел после точки за слово.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
13.04.2015, 23:27 9

Не по теме:

Цитата Сообщение от rotciv Посмотреть сообщение
У меня этот код завис.
сволочь какая :D



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
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main (void){
    setlocale(LC_ALL,"");
 
 string S="Hi. This string has some equal words. Some equal words will be removed.  \Some unique words will be left.";
 vector <string> v;
 string temp;
 
 cout<<"Исходная строка:\n========================\n"<<S<<"\n========================\n\n\nОбработанная строка:\n========================\n";
 
 S=S+"a";
 
 for (string::iterator it=S.begin();it!=S.end();it++){
 
    if (!isgraph(*it) or (ispunct(*it))){
        if(find(v.begin(), v.end(), temp) == v.end())  v.push_back(temp);
        temp.clear();
        while (!isgraph(*it) or (ispunct(*it))){
                temp=temp+*it;
                it++;
                v.push_back(temp);
                temp.clear();
        }
    }
   temp=temp+*it;
 
 };
 if(find(v.begin(), v.end(), temp) == v.end())  v.push_back(temp); //Последнее слово
 
 S.clear();
 for (int i=0;i<v.size()-1;i++) S+=v.at(i);
 v.clear();
 cout<<S<<"\n";
 cout<<"\n========================\n";
 
 
 
 return 0;
}
0
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
14.04.2015, 07:04 10
Вопрос - в строке 21, когда мы входим туда в 1-й раз, temp объявлен, но не инициализирован.
С чем мы сравниваем и что мы кладем в v?
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
14.04.2015, 09:16 11
Пустая строка там.
0
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
14.04.2015, 11:29 12
Цитата Сообщение от nmcf Посмотреть сообщение
Пустая строка там
И как find будет искать пустую строку? Ничего не найдет или будет находить при каждом обращении?
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
14.04.2015, 14:11 13
Там простое сравнение. Если в v нет пустых строк, значит ничего не найдёт.
0
14.04.2015, 14:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2015, 14:11
Помогаю со студенческими работами здесь

Удаление одинаковых слов в векторе типа string
Ай даже не буду ходить вокруг да около, просто скажу, что реализую задание (лично для себя...

Найти количество одинаковых слов в строке
#include &lt;iostream&gt; using namespace std; int main() { char str1 = &quot;to be or not to be&quot;; ...

Cтроки, vector. Посчитать количество одинаковых слов в строке
Дана строка текста разделена пробелами, символами &quot;,&quot; и &quot;;&quot;.Посчитать количество одинаковых слов в...

Удаление и замена слов в строке
Здравствуйте! Помогите, пожалуйста написать программу! Дана последовательность строк. Каждая...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru