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

Поиск повторяющихся слов в тексте (доработка кода) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
ПаЗитиФкА
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 51
23.12.2011, 20:57     Поиск повторяющихся слов в тексте (доработка кода) #1
Дан текст, содержащий n строк. Для каждого слова указать, сколько раз оно встречается в тексте.
Я тут кое-что попробовала сделать (с++), идей дальше нет. Кому не сложно, помогите пожалуйста!
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
intchar ...
void main
{ 
  printf (“vvedite col strok in text”);
  gets (s);
  n=atoi(s);
  printf (“vvedite text: \n”);
  for (i=0; i<n; i++) gets (txt[i]);
  for (i=0; i<n; i++)  strcpy (st, txt[i]);  // превращение текста в одну строчку
  p=strlen(st);
  for ( i=0;i<p; i++)
  if (st[i]=='.' || st[i]==',' || st[i]=='?' || st[i]=='!') st[i]=' ';   //очистка от знаков препинания
  do
 { k=strchr(st,  ' ');   // поиск пробела
  if (k!=NULL) k1=k-st;
  for (i=0; i<k1; i++)  {st4[i]=st[i];    \\ выделение слова
                                  g++;
                                 }
  for (i=k1+1; i<p; i++)  {st1[i]=st[i];   \\ отделение остальной части
                                      s++;
                                     }
  do
  z=strlen(st4);
  L=strstr(st, st4);
  if (L= =NULL) { for (i=0; i<z; i++) puts(st4[i]);   \\ если слово больше не встретилось выводит слово и кол
                           printf(%d”, g);
                           zm++;
                         }
   else
  { L1=L-st;
    L2=L+z-2;
    g++;
    for (i=L2+1; i<p; i++) { st1[s]=st[i];           \\  отбрасывает часть содержащую повтор
                                        s++;
                                      }
    for (i=L2+1; i<p; i++) st[i]=st1[i];
}
while (L!=NULL);
delete [] st;
delete [] st1;
delete [] st4;
g=0;
   }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2011, 20:57     Поиск повторяющихся слов в тексте (доработка кода)
Посмотрите здесь:

Поиск слов в тексте C++
Поиск слов в тексте C++
C++ Запись всех повторяющихся слов в новый массив слов
Масивы и строки: поиск и замена слов в тексте C++
Поиск одинаковых слов в тексте C++
C++ Поиск повторяющихся слов
Поиск слов в тексте C++
Поиск повторяющихся символов в тексте и удаление таких строк C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
24.12.2011, 01:34     Поиск повторяющихся слов в тексте (доработка кода) #2
вот как-то так получилось.
прокомментировал то что показалось неочевыидным.
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
 
#include <cstring>
using std::string;
 
#include <cstdio>
 
#include <sstream>
using std::stringstream;
 
struct Words {
    string word;
    int count;
};
 
int readText(string &);
bool isPunct(const char &);
void splitText(const string &, Words[], const int &);
void countWords(Words[], const int &);
 
int main() {
    string myText; //весь текст
    int numberOfWords;
    Words * wordsInText;
 
    numberOfWords = readText(myText); // посчитаем сколько слов в тексте и удалим знаки припенания
    wordsInText = new Words[numberOfWords]; //создадим массив для слов в тексте
 
    splitText(myText, wordsInText, numberOfWords);  //делим текст на слова
    countWords(wordsInText, numberOfWords); //считаем слова
 
    // print results
    for (int i = 0; i < numberOfWords; ++i) {
        if (wordsInText[i].count > 0) {
            cout << wordsInText[i].word << " ";
            cout << wordsInText[i].count << endl;
        }
    }
    cout << "Words total :: " << numberOfWords;
 
    delete [] wordsInText;
    return 0;
}
 
//считаем слова
void countWords(Words wordsInText[], const int &numberOfWords) {
    for (int i = 0; i < numberOfWords - 1; ++i) { //пока не достигнут конец массива
        if (wordsInText[i].count == 1) { //если данное слово еще не было отмечено как повторяющееся
            for (int j = i + 1; j < numberOfWords; ++j) { //для всех следуюших слов
                if (wordsInText[i].word.length() == wordsInText[j].word.length()) { //если длина слов совпадает
                    for (unsigned int k = 0; k < wordsInText[i].word.length(); ++k) { // пока не проверены все буквы в слове
                        if (wordsInText[i].word.at(k) != wordsInText[j].word.at(k)) { // если буквы не совпадают то выходим из цикла
                            break;
                        }
                        if (k + 1 == wordsInText[i].word.length()) { // если достигли последней буквы то слова одинаковые
                            wordsInText[i].count++; //увеличиваем количесто повторений на 1
                            wordsInText[j].count = 0; // отмечаем найденное повторение как обработанное
                        }
                    }
                }
            }
        }
    }
}
 
//делим текст на слова и записываем слова в массив поотдельности
void splitText(const string &myText, Words wordsInText[], const int &numberOfWords) {
    stringstream ss(myText);
    for (int i = 0; i < numberOfWords && ss >> wordsInText[i].word; ++i) {
        wordsInText[i].count = 1;
    }
}
 
//читаем весь текст.  записываем его в виде одной строки.
//знаки припенания заменяем на пробелы
int readText(string &myText) {
    int lines, numberOfWords = 0;
    char ch;
 
    cout << "Enter number of lines ::\n>";
    cin >> lines;
    cin.clear();
    cin.ignore();
 
    for (int i = 1; i <= lines; ++i) {
        cout << "Please enter " << i << " line ::\n>";
        while ((ch = cin.get())) {
            if (isPunct(ch)) {
                ch = ' ';
            }
            if ((ch == ' ' || ch == '\n') && myText.at(myText.length() - 1) != ' ') {
                numberOfWords++;
            }
            if (ch != '\n') {
                myText.append(1, ch);
            } else {
                break;
            }
        }
        myText.append(1, ' ');
    }
    return numberOfWords;
}
 
 
//проверямем является ли сивол знаком припенания
bool isPunct(const char &ch) {
    const int size = 6;
    const char punct[size] = { '.', ',', '?', '!', ':', ';' };
    for (int i = 0; i < size; ++i) {
        if (ch == punct[i]) {
            return true;
        }
    }
    return false;
}
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
24.12.2011, 06:32     Поиск повторяющихся слов в тексте (доработка кода) #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
#include <iostream>
#include <cctype>
using namespace std;
 
char* swords(char* s, char** i) {
   if(! *s)
       *s++;
   for(; *s && ! isalpha(*s); *s++);
   if(! *s)
        return NULL;
   for(*i = s; *s && isalpha(*s); *s++);
   return s;
}
 
char* snext(char* a, char* b) {
   char* p = a;
   for(; *a; *a++ = *b++);
   return --p;
}
 
int main(void)
{
   char s[] = "red, ops-yellow, white; ops red:OK, <red>OK</red>, yellow. ops 'OK'";
   char* a0, *a1, *b0, *b1;
 
   int n = 1;
   for(b0 = s; (b0 = swords(b0, &a0)); ) {
           for(b1 = b0; (b1 = swords(b1, &a1)); ) {
                if(! strncmp(a0, a1, b1 - a1)) { //strnicmp(a0, a1, b1 - a1) можно без учёта регистра
                     ++n;
                     b1 = snext(a1, b1);
                }
           }
           cout << n << ").";
           cout.write(a0, b0 - a0);
           cout << endl;
           n = 1;
   }
   return 0;
}
ПаЗитиФкА
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 51
25.12.2011, 18:26  [ТС]     Поиск повторяющихся слов в тексте (доработка кода) #4
greeezz, у меня почему то после введения каждой строки все просто пропадает и все....
а по идее должно выводиться какое слово повторилось и сколько раз
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
25.12.2011, 21:35     Поиск повторяющихся слов в тексте (доработка кода) #5
Цитата Сообщение от ПаЗитиФкА Посмотреть сообщение
у меня почему то после введения каждой строки все просто пропадает и все....
переде строкой return 0;
напишите строку cin.get();

или добавьте в начало файла
#include <cstdlib> // если собираете проект в Visual Studio то не обязательно.
а переде строкой return 0;
system("pause");
ПаЗитиФкА
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 51
25.12.2011, 23:29  [ТС]     Поиск повторяющихся слов в тексте (доработка кода) #6
greeezz, спасибо огромное)) все работает.
Yandex
Объявления
25.12.2011, 23:29     Поиск повторяющихся слов в тексте (доработка кода)
Ответ Создать тему
Опции темы

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