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

Программа, подсчитывающая частоту повторения слов в тексте - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 44, средняя оценка - 4.93
Tanja
0 / 0 / 0
Регистрация: 11.07.2011
Сообщений: 12
11.07.2011, 17:38     Программа, подсчитывающая частоту повторения слов в тексте #1
Разработать программу, подсчитывающую частоту повторения в тексте слов и печатающую слова в порядке уменьшения их частоты. Распечатать статистику по словам с частотой не менее 2. Построить диаграмму.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2011, 17:38     Программа, подсчитывающая частоту повторения слов в тексте
Посмотрите здесь:

C++ Как подсчитать повторения символов в тексте?
C++ разработать алгоритм и программу для опредиления процента повторения заданого слова в тексте(как разделители слов можно использовать символы запятая,
C++ Программа подсчета количесва указанных слов в тексте
C++ Программа подсчитывающая количество повторов цифр в числе.
C++ программа подсчитывающая число повторения в тексте
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
11.07.2011, 19:20     Программа, подсчитывающая частоту повторения слов в тексте #2
Tanja,

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 <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <iterator>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
 
void Print(std::pair <int, std::string> pair)
{
    std::cout << pair.first << "\t" << pair.second << std::endl;
}
 
struct ClassCmp
{
    bool operator() (int one, int two)
    {
        return (one > two) ? true : false;
    }
};
 
int main()
{
    std::string text("This is my test text text. This text about split This split. Split is cool is. is");
    std::vector <std::string> text_words;
    std::size_t count = 0;
    std::multimap <int, std::string, ClassCmp> result;
 
    boost::split(text_words, text, boost::is_any_of(" .,;-"), boost::token_compress_on);
 
    std::sort(text_words.begin(), text_words.end());
 
    std::vector <std::string> :: iterator p = text_words.begin();
 
    while ((p += count) != text_words.end())
    {
        count = std::count(p , text_words.end(), *p);
 
        if (count >= 2)
            result.insert(std::make_pair(count, *p));
    }
 
    std::for_each(result.begin(), result.end(), Print);
 
    return 0;
}
Добавлено через 4 минуты
Диаграмму сами построите.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
11.07.2011, 19:22     Программа, подсчитывающая частоту повторения слов в тексте #3
Цитата Сообщение от nameless Посмотреть сообщение
std::multimap <int, std::string, ClassCmp> result;
Расуж используете все стандартное, то чем std::greater<int> не угодил ?
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
11.07.2011, 19:25     Программа, подсчитывающая частоту повторения слов в тексте #4
asics, да забыл я про std::greater<int> что-то..
insolent
11.07.2011, 19:44
  #5

Не по теме:

Ого, как оперативно

Tanja
0 / 0 / 0
Регистрация: 11.07.2011
Сообщений: 12
11.07.2011, 20:45  [ТС]     Программа, подсчитывающая частоту повторения слов в тексте #6
Спасиииибо)
burbon
Сообщений: n/a
23.07.2011, 14:32     Программа, подсчитывающая частоту повторения слов в тексте #7
Если я правильно понял, то это С++. А можно эту программу написать в обычном С? Задание на обработку текста мне не дается. Буду очень признателен.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.07.2011, 14:43     Программа, подсчитывающая частоту повторения слов в тексте #8
burbon, а в чем проблема, разбиваем текст на токены с помощью strtok и делаем подсчет совпадающих токенов
C
1
2
3
4
5
6
char buf[255];
fgets(buf, 255, stdin);
//...
char* ptr = strtok(buf, " \t\n,.:;!?");
for ( ptr != NULL; ptr = strtok(NULL, " \t\n,.:;!?"))
{/*запись токена в массив*/}
burbon
Сообщений: n/a
23.07.2011, 14:51     Программа, подсчитывающая частоту повторения слов в тексте #9
Спасибо. А можно поподробней расписать (пошагово) пожалуйста, с комментариями? Честно сказать я не очень понял.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
23.07.2011, 16:07     Программа, подсчитывающая частоту повторения слов в тексте #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
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
#define WORDLEN 50
#define MAXWORD BUFSIZ
#define DELIM " \t\n,.:;!?"
 
typedef struct {
    char word[WORDLEN];
    int count;
}map;
 
void init_struct(map*);
void for_each(map*, map*, void(*)(map*));
int already_have(char*);
int getsize();
int mysort(const void*, const void*);
void print(map*);
 
map arr[MAXWORD];
 
int main(){
    int i;
    char buf[MAXWORD*WORDLEN], *ptr;
    for_each(arr,arr+MAXWORD,init_struct);
    puts("Enter string: ");
    fgets(buf, 255, stdin);
    for (i=0,ptr = strtok(buf, DELIM) ;ptr != NULL; ptr = strtok(NULL, DELIM)){
        int n;
        if((n=already_have(ptr))!=-1)
            arr[n].count++;
        else {
            strcpy(arr[i].word,ptr);
            arr[i++].count++;
        }
    }
    qsort(arr,getsize(),sizeof(map),mysort);
    for_each(arr,arr+getsize(),print);
 
    return 0;
}
 
 
void init_struct(map* st){
    memset(st->word,0,WORDLEN);
    st->count=0;
}
 
void for_each(map* from, map* to, void(*f)(map*)){
    while(from<to)
        f(from++);
}
 
int already_have(char *p){
    int i;
    for(i=0;i<MAXWORD;i++)
        if(!strcmp(arr[i].word,p))
            return i;
    return -1;
}
 
int getsize(){
    int i=0;
    while(arr[i].count!=0)++i;
    return i;
}
 
int mysort(const void *one, const void *two){
    return ((map*)(one))->count-((map*)(two))->count;
}
 
void print(map *st){
    printf("%s - %d\n",st->word,st->count);
}
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
23.07.2011, 16:13     Программа, подсчитывающая частоту повторения слов в тексте #11
Подсчитывает повторяющие слова без учёта регистра APL = apl
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
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <malloc.h>
#define  SEPARATOR   " \t\n\r,.:;-!?"
 
 
typedef struct  _stack {
    char    str[48];
    int     num;
    struct  stack*  next;
} stack;
 
 
stack*  push(stack* lp, const char* str, int num) {
      stack*  lst  = NULL, *iter;
 
      for(iter = lp; iter != NULL; iter = iter->next) {
          if(! stricmp(iter->str, str))  {
                iter->num++;
                return NULL;
          }
      }
      lst         = (stack*) malloc(sizeof(stack));
      lst->num  = num;
      strcpy(lst->str, str);
      lst->next = lp;
      lp           = lst;
      return lp;
}
 
 
void  sort(stack** lp) {
    stack* sa, *sb, tmp;
    short  id;
    int    size = sizeof(tmp.str) + sizeof(tmp.num);
    while(1) {
        id = 0;
        for(sa = *lp, sb = (*lp)->next; sb != NULL; sa = sa->next, sb = sb->next) {
            if(sa->num < sb->num) {
                memcpy(&tmp, sa, size);
                memcpy(sa,   sb, size);
                memcpy(sb, &tmp, size);
                id  = 1;
            }
        }
        if(! id)
            break;
    }
}
 
 
 
int main(void) {
 
    char   str[] = "token, Token-token, ops, Spy-red77 oPs, OPS kobalt, TOKEN cap cAP...";
    char* tok;
 
    stack*  wlst = NULL, *res;
 
    for(tok = strtok(str, SEPARATOR); tok; tok = strtok(NULL, SEPARATOR)) {
          res = push(wlst, tok, 1);
          if(res)
                wlst = res;
    }
 
    sort(&wlst);  // сортируем стек
 
    // выводим от наибольшей частоты повторения слов
    for(res = wlst; res != NULL; res = res->next)
       printf("%d). %s\n", res->num, res->str);
 
 
    // чистим
    while( wlst != NULL) {
       res  = wlst;
       wlst = wlst->next;
       free(res);
       res = NULL;
    }
    wlst = NULL;
 
    getchar();
    return 0;
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
23.07.2011, 16:19     Программа, подсчитывающая частоту повторения слов в тексте #12
xAtom, по-моему тип данных "стек" здесь не совсем уместен, все таки он несколько для иных задач.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.07.2011, 16:51     Программа, подсчитывающая частоту повторения слов в тексте #13
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
#include <stdio.h>
#include <string.h>
 
#define MAX_WORDS 100
#define DELIM " \t\n,.:;!?"
 
int split(char* str, char** tok);
int unique(char** arr, int size);
 
int main()
{
    const char text[] = "is This is my test text text. This text about split This split. Split is cool is is";
    char buf[255];
    strcpy(buf, text);
 
    char* unique_token[MAX_WORDS];
    int words = split(buf, unique_token);
    int i = 0, 
        new_size = unique(unique_token, words);
 
    strcpy(buf, text);
    char* token[MAX_WORDS];
    split(buf, token);
    for (; i < new_size; ++i)
    {
        int j = 0, count = 0;
        for (; j < words; ++j)
        {
            if (!strcmp(token[j], unique_token[i]))
                ++count;
        }
        printf("%s\t-\t%d\n", unique_token[i], count);
    }
 
    getchar();
    return 0;
}
 
int split(char* str, char** token)
{
    int tokens = 0;
    char* ptr = strtok(str, DELIM);
    for (; ptr != NULL; ptr = strtok(NULL, DELIM), ++tokens)
    {
        token[tokens] = ptr;
    }
    return tokens;
}
 
int unique(char** arr, int size)
{
    int i, j;
    for (i = 0; i < size; ++i)
    {
        for (j = 0; j < size; ++j)
        {
            if (i != j && !strcmp(arr[i], arr[j]))
            {
                int t = j;
                --size;
                for (; t < size; ++t)
                {
                    arr[t] = arr[t + 1];
                }
                arr[++t] = NULL;
            }
        }
    }
    return ++size;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2011, 23:49     Программа, подсчитывающая частоту повторения слов в тексте
Еще ссылки по теме:

C++ Создать список слов из файла и подсчитать количество повторения этих слов
C++ функция, подсчитывающая, сколько раз в тексте встречается сочетание
C++ Частота повторения букв в тексте

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

Или воспользуйтесь поиском по форуму:
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
23.07.2011, 23:49     Программа, подсчитывающая частоту повторения слов в тексте #14
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
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <map>
#include <iomanip>
#include <algorithm>
#include <exception>
 
int main()
try{
    const std::string delim("\n\t .,:;!?(){}");
    const std::size_t field_width = 20;
 
    std::ifstream ifile;
    std::string filename;
    std::string buf;
    std::string word;
    std::istringstream isstr;
    std::multimap<std::size_t, std::string, std::greater<int> > words;
    std::multimap<size_t, std::string, std::greater<int> >::iterator it;
 
    std::cout << "Enter a name of file with text: ";
    std::getline(std::cin, filename);
    ifile.open(filename.c_str());
    if (ifile.fail()) 
        throw std::runtime_error("Can't open file");
 
    while ( !ifile.eof() ) {
        std::getline(ifile, buf);
        std::replace_if(buf.begin(), buf.end(), [delim] (char c)
        {
            return delim.find(c) != std::string::npos;
        }, ' ');
        isstr.str(buf);
 
        while (isstr >> word) {
            it = std::find_if(words.begin(), words.end(), [word] 
                (const std::pair<std::size_t, std::string> &pair)
            {
                return pair.second == word;
            });
 
            if (it != words.end()) {
                words.insert(
                    std::make_pair<std::size_t, std::string>(it->first + 1, it->second));
                words.erase(it);
            } else
                words.insert(std::make_pair<std::size_t, std::string>(1, word));
        }
        isstr.clear();
    }
    ifile.close();
 
    for (it = words.begin(); it != words.end(); ++it)
        std::cout << it->first  << '\t' << it->second << std::endl;
 
    std::cout << "\nThe words, that occur more equal than twice(diagram):\n";
 
    for (it = words.begin(); it != words.end(); ++it) {
        if (it->first < 2)
            break;
        std::cout << std::setw(field_width) << std::setiosflags(std::ios::right)
                  << std::string(it->first, '*') << '|'
                  << it->second << std::endl;
    }
    return 0;
}
 
catch (std::exception &e)
{
    std::cout << "Exception: " << e.what() << std::endl;
}
Yandex
Объявления
23.07.2011, 23:49     Программа, подсчитывающая частоту повторения слов в тексте
Ответ Создать тему
Опции темы

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