Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
SeeT
53 / 23 / 2
Регистрация: 12.10.2012
Сообщений: 132
Записей в блоге: 1
#1

Найти в тексте одинаковые слова и подсчитать число их повторений - C++

24.12.2014, 23:07. Просмотров 2213. Ответов 14
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int z,c,l;
z=0;
c=1;
l=2;
// int numWord - это всего. общее количество векторов
 
for (z; z<numWord; z++)
{
    for (c; c<numWord; c++)
    {
        if (vectWords[z]==vectWords[c])
            cout << "\nСлово " << vectWords[z] << " встречается: " << l++ << " раз " ;
    }
}
Вообще есть вектор. В нем numWord элементов. Надо пробежаться по всем и найти одинаковые. Мой воспаленный ночью мозг выдает только это. После компиляции, программа по факту сравнивает только первое слово со всем массивом, попросту забивая на второе, третье и т.д. Т.е. сравнивается со всем массивом только первая.
Что делааать, хелп ми, кто не спит

Добавлено через 1 минуту
ТАКЖЕ (!)
наверное заметили переменная l=2
если ее приравнять к 0, как и положено, то почему то считается тоже не правильно.
надеюсь на помощь, очень сильно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2014, 23:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Найти в тексте одинаковые слова и подсчитать число их повторений (C++):

Найти одинаковые 5-тисимвольные слова и подсчитать число их повторений - C++
Помогите пож-ста, к завтрашнему очень надор=( Экзамен, а я эту задачку на C++ не могу решить... Вот задание: Вариант №18 Задан текст,...

Найти число повторений каждого слова в тексте - C++
Добрый вечер, помогите пожалуйста найти ошибку в программе: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstring&gt; #include...

Найти количество повторений слова в тексте - C++
Розробити алгоритм і програму для визначення відсотка повторення заданого слова в тексті (як роздільники слів може використовуватися...

Найти в тексте слова, содержащие две одинаковые буквы, стоящие рядом - C++
Имеется строка текста (на любом языке) из нескольких слов, разделённых пробелами и/или знаками препинания. Требуется найти в тексте и...

Найти в тексте все различные слова и число их вхождений - C++
Нужна помощь. Дана последовательность, содержащая от 1 до 30 слов, в каждом из которых от 1 до 5 строчных латинских букв; между...

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

14
GuGo1991
269 / 263 / 93
Регистрация: 02.08.2012
Сообщений: 609
24.12.2014, 23:13 #2
SeeT, ещё c обнуляйте при каждом вхождении во вложенный цикл.
Но вывод будет некрасивый, сами убедитесь. Там дело техники
1
SeeT
53 / 23 / 2
Регистрация: 12.10.2012
Сообщений: 132
Записей в блоге: 1
24.12.2014, 23:21  [ТС] #3
Оу, точно. Спасибо, что то забыл совсем про обнуление. И да, вывод совсем не красивый
мб. есть какие аналоги того что я пытаюсь реализовать, не знаете случаем?
0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 702
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
24.12.2014, 23:27 #4
Цитата Сообщение от SeeT Посмотреть сообщение
C++
1
l=2;
1) Почему 2?
2) Почему она не обнуляется при переходе к следующему слову?
3) Если в Вашем массиве будет 2 одинаковых значения, то Вы дважды об этом узнаете в выводе, если их три - то трижды и т.п.
0
SeeT
53 / 23 / 2
Регистрация: 12.10.2012
Сообщений: 132
Записей в блоге: 1
24.12.2014, 23:37  [ТС] #5
я без понятия, но так работало правильно, поэтому 2 прошу прощения
вот как я переписал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
z=0;
c=0;
l=0;
 
 
for (z; z<numWord; z++)
{
    l=0;
    c=z+1;
 
    for (c; c<numWord; c++)
    {
        if (vectWords[z]==vectWords[c])
            cout << "\nСлово " << vectWords[z] << " встречается: " << l++ << " раз " ;
    }
}
Добавлено через 38 секунд
но, к слову, тоже работает не так как нужно :\

Добавлено через 4 минуты

вот так все это дело выглядит (не умею вставлять картинки)
0
GuGo1991
269 / 263 / 93
Регистрация: 02.08.2012
Сообщений: 609
24.12.2014, 23:38 #6
SeeT, если знакомы с STL то можно воспользоваться обобщёнными алгоритмами.
Сначала сортировать вектор (sort()), затем алгоритмами lower_bound и upper_bound найти где начинаются и
заканчиваются последовательности повторяющихся элементов, высчитать их количество.
1
SeeT
53 / 23 / 2
Регистрация: 12.10.2012
Сообщений: 132
Записей в блоге: 1
24.12.2014, 23:40  [ТС] #7
у меня же вся эта лабуда в векторах записана, думаю мб затирать их после выполнения цикла
ща попробуем

Добавлено через 15 секунд
увы, не знаком
0
MrGluck
Модератор
Эксперт CЭксперт С++
7800 / 4844 / 754
Регистрация: 29.11.2010
Сообщений: 13,211
24.12.2014, 23:42 #8
Цитата Сообщение от SeeT Посмотреть сообщение
Вообще есть вектор.
Надо начать с того, что дан вектор слов (std::string) т.к. вектор - контейнер и может содержать что угодно.

А чем вариант, предложенный мной в темах ниже не устроил?

Добавлено через 55 секунд
И почему дан непременно вектор слов? Мб рациональнее использовать другой контейнер?
1
Kerry_Jr
Эксперт PHP
2210 / 2006 / 702
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
24.12.2014, 23:43 #9
Цитата Сообщение от SeeT Посмотреть сообщение
C++
1
c=z+1;
это можно сюда
Цитата Сообщение от SeeT Посмотреть сообщение
C++
1
for (c; c<numWord; c++)
и получится
C++
1
2
3
for (c = z+1[quote="SeeT;7033646"]if (vectWords[z]==vectWords[c])
        cout << "\nСлово " << vectWords[z] << " встречается: " << l++ << " раз " ;[/quote]
; c < numWord; c++)
под if'ом оставить только l++, а остальное вывести за вложенный цикл.
C++
1
2
3
for (c = z+1; c<numWord; c++)
    if (vectWords[z]==vectWords[c]) l++;
cout << "\nСлово " << vectWords[z] << " встречается: " << l << " раз " ;
1
GuGo1991
269 / 263 / 93
Регистрация: 02.08.2012
Сообщений: 609
24.12.2014, 23:45 #10
SeeT, можно и "затирать", хозяин барин ))

Добавлено через 1 минуту
Kerry_Jr, всё равно встретится одно и то же повторяющееся слово на раз меньше пока не дойдёт до одного
1
Kerry_Jr
Эксперт PHP
2210 / 2006 / 702
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
24.12.2014, 23:46 #11
Но, снова же, о том, сколько раз встречается слово вы узнаете столько раз, сколько это слово встречается, но оно каждый раз будет встречаться на единицу реже.

Добавлено через 49 секунд
Цитата Сообщение от GuGo1991 Посмотреть сообщение
всё равно встретится одно и то же повторяющееся слово на раз меньше пока не дойдёт до одного
Я об этом уже писал выше и написал еще раз
1
GuGo1991
24.12.2014, 23:48
  #12

Не по теме:

Kerry_Jr, без обид

0
SeeT
53 / 23 / 2
Регистрация: 12.10.2012
Сообщений: 132
Записей в блоге: 1
24.12.2014, 23:57  [ТС] #13
MrGluck Может и рациональнее, но мои знания не позволяют мне использовать что-то другое
А ваши решения безусловно шедевральные) Но я для них слишком глуп и объяснить совсем не смогу) Но мб вы действительно посоветуете что то другое?) Поменять контейнер не проблема, просто нужно знать на что

Kerry_Jr, сделал почти также как написали вы, но ваш вариант аккуратнее)
Действительно, он все равно будет повторять эти значения.. Ох, я уже и не знаю как решить эту задачу иначе(
0
MrGluck
Модератор
Эксперт CЭксперт С++
7800 / 4844 / 754
Регистрация: 29.11.2010
Сообщений: 13,211
25.12.2014, 00:38 #14
Возможно вам подойдёт std::map/std::unordered_map. Храните в нём пары строка - количество повторений.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <unordered_map>
#include <string>
 
int main()
{
    std::unordered_map<std::string, int> wordsWithCounter;
    // заполняем тестовыми данными
    for (const auto &word : {"eniki", "beniki", "eli", "vareniki", "eli", "eniki", "eli"})
        ++wordsWithCounter[word]; // увеличиваем количество встреченных слов word
 
    // пробегаемся по всему контейнеру
    for (const auto &p : wordsWithCounter)
    {
        std::cout << p.first << " ";
        if (p.second == 1) // слово встретилось всего один раз
            std::cout << "is unique\n";
        else
            std::cout << "met " << p.second << " times\n";
    }
}
1
SeeT
53 / 23 / 2
Регистрация: 12.10.2012
Сообщений: 132
Записей в блоге: 1
26.12.2014, 12:56  [ТС] #15
В итоге я программу написал. Но работает она коряво, т.к. процент правильной работы ~80% если не меньше, и то, только при больших объемах текста. Выражая свою благодарность и показывая глупость, выкладываю тут код. Может кому-нибудь будет нужно
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <string>
#include <sstream>
#include <Windows.h> // для работы SetConsoleCP, SetConsoleOutputCP
#include <fstream>
#include <vector>
#include <stdio.h>
using namespace std;
 
// подсчитать в тексте количество слов+, их длину, а также количество повторяющихся слов
int main() {
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
setlocale(LC_ALL,"Rus"); // Подключение русского языка
string str;
cout << "#############################\n";
cout << "Данная программа подсчитывает количество слов в тексте и их длинну,\nа также количество повторяющихся слов.\nВаше предложение будет записано в файл и считано оттуда\n" << endl;
cout << "Ваша строка >> " << str;
 
int numWord(0); // подсчет слов в предложении
 
getline(cin, str); // cin в строку str
ofstream in;
in.open("start.txt");
in << str;
in.close();
 
// достанем строку из файла
/*ifstream out;
out.open("start.txt");
while (!out.eof())
{
    str+=str;
}
out.close();
*/
 
//чистим наше предложение от мусора (знаков препинания)
int sSize=str.size(); // записываем длинну строки
for (int i=0; i!=sSize; i++) // удалим все знаки препинания в строке
{
    if ( (str[i]=='.') || (str[i]=='!') || (str[i]=='?')
    || (str[i]==',') || (str[i]=='*') || (str[i]==';')
    || (str[i]==':') )
        str.erase(i, 1);
}
cout << endl << "Строка без знаков препинания >> " << str << endl;
 
    //с помощью потока делим наше предложение на слова
    istringstream stream(str);
    ofstream kin; // открываем на запись
    kin.open("in.txt");
    // также найдем количество слов в файле
    for (string word; stream >> word; kin << word && numWord++)
    kin << endl;
    kin.close(); // закрываем
    cout << "В тексте " << numWord << " слов.\n";
 
vector<string> vectWords(numWord+4);
ifstream kout;
kout.open("in.txt");
for (int i=0; i<numWord; i++)
{
    kout >> vectWords[i];
//  cout << vectWords[i] << endl;
}
kout.close();
 
//алгоритм сравнения строк. в нулевой строке = 1 строка
//! cout << vectWords[0] << ":0\n" << vectWords[1] << ":1\n";
int z,c,l, g;
z=0;
c=0;
g=-1;
 
// немного магии
 
for (z; z<numWord; z++)
{
    l=1;
    g++;
for (c = z+1; c<numWord; c++)
    if (vectWords[z]==vectWords[c])
        {
            l++;
            vectWords[c]=vectWords[g];
        }
if (l>1)
cout << "\nСлово " << vectWords[z] << " длинной в " << vectWords[z].size() << " символов встречается: " << l << " раз\n";
 
 
}
 
return 0;
}
0
26.12.2014, 12:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2014, 12:56
Привет! Вот еще темы с ответами:

Если в тексте есть одинаковые слова, заменить все их экземпляры символом из заданного набора - C++
Здравствуйте форумчане, у меня к вам несколько нескромная просьба, помогите мне пожалуйста, оформив эти задачи программно: &quot;Задан...

Дано предложение. В нем только два слова одинаковые. Найти эти слова - C++
Дано предложение. В нем только два слова одинаковые. Найти эти слова. Заранее спасибо

Найти самое длинное слово в тексте и количество его повторений - C++
Использовать только функции cstdio В чём ошибка? Выводит не самое длинное слово, а определенное кол-во символов с начала текста ...

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


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

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

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