Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/40: Рейтинг темы: голосов - 40, средняя оценка - 4.85
 Аватар для SeeT
55 / 25 / 3
Регистрация: 12.10.2012
Сообщений: 132
Записей в блоге: 1

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

24.12.2014, 23:07. Показов 8009. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.12.2014, 23:07
Ответы с готовыми решениями:

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

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

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

14
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
24.12.2014, 23:13
SeeT, ещё c обнуляйте при каждом вхождении во вложенный цикл.
Но вывод будет некрасивый, сами убедитесь. Там дело техники
1
 Аватар для SeeT
55 / 25 / 3
Регистрация: 12.10.2012
Сообщений: 132
Записей в блоге: 1
24.12.2014, 23:21  [ТС]
Оу, точно. Спасибо, что то забыл совсем про обнуление. И да, вывод совсем не красивый
мб. есть какие аналоги того что я пытаюсь реализовать, не знаете случаем?
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
24.12.2014, 23:27
Цитата Сообщение от SeeT Посмотреть сообщение
C++
1
l=2;
1) Почему 2?
2) Почему она не обнуляется при переходе к следующему слову?
3) Если в Вашем массиве будет 2 одинаковых значения, то Вы дважды об этом узнаете в выводе, если их три - то трижды и т.п.
0
 Аватар для SeeT
55 / 25 / 3
Регистрация: 12.10.2012
Сообщений: 132
Записей в блоге: 1
24.12.2014, 23:37  [ТС]
я без понятия, но так работало правильно, поэтому 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
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
24.12.2014, 23:38
SeeT, если знакомы с STL то можно воспользоваться обобщёнными алгоритмами.
Сначала сортировать вектор (sort()), затем алгоритмами lower_bound и upper_bound найти где начинаются и
заканчиваются последовательности повторяющихся элементов, высчитать их количество.
1
 Аватар для SeeT
55 / 25 / 3
Регистрация: 12.10.2012
Сообщений: 132
Записей в блоге: 1
24.12.2014, 23:40  [ТС]
у меня же вся эта лабуда в векторах записана, думаю мб затирать их после выполнения цикла
ща попробуем

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

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

Добавлено через 55 секунд
И почему дан непременно вектор слов? Мб рациональнее использовать другой контейнер?
1
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
24.12.2014, 23:43
Цитата Сообщение от 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
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
24.12.2014, 23:45
SeeT, можно и "затирать", хозяин барин ))

Добавлено через 1 минуту
Kerry_Jr, всё равно встретится одно и то же повторяющееся слово на раз меньше пока не дойдёт до одного
1
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
24.12.2014, 23:46
Но, снова же, о том, сколько раз встречается слово вы узнаете столько раз, сколько это слово встречается, но оно каждый раз будет встречаться на единицу реже.

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

Не по теме:

Kerry_Jr, без обид :handshake:

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

Kerry_Jr, сделал почти также как написали вы, но ваш вариант аккуратнее)
Действительно, он все равно будет повторять эти значения.. Ох, я уже и не знаю как решить эту задачу иначе(
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.12.2014, 00:38
Возможно вам подойдёт 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
55 / 25 / 3
Регистрация: 12.10.2012
Сообщений: 132
Записей в блоге: 1
26.12.2014, 12:56  [ТС]
В итоге я программу написал. Но работает она коряво, т.к. процент правильной работы ~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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.12.2014, 12:56
Помогаю со студенческими работами здесь

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

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

Определить есть ли в тексте одинаковые слова
Дан символьный массив, образованный из слов, разделенных пробелами. С использованием процедур и функций выполнить: определить есть ли...

Определить есть ли в тексте одинаковые слова
Дан символьный массив, образованный из слов, разделенных пробелами С использованием процедур и функций выполнить: 3)определить есть ли...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru