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

Статистика встречаемости символов в файле - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
m@shka
 Аватар для m@shka
0 / 0 / 0
Регистрация: 17.10.2009
Сообщений: 12
12.11.2009, 21:42     Статистика встречаемости символов в файле #1
В файле содержится какое либо сообщение, предложение или много предложений.
Необходимо подсчитать количество каждого встречаемого символа из файла и подсчитать вероятность встречаемости каждого из них, т.е. разделить количество встречаемости конкретного символа на общее количество символов.
Заранее сасибо!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2009, 21:42     Статистика встречаемости символов в файле
Посмотрите здесь:

C++ Замена символов в файле
C++ добавление символов в файле
C++ Определить частоту встречаемости символов в строке
Подсчёт символов в файле. C++
C++ Шифрование символов в файле
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
17.11.2009, 09:21     Статистика встречаемости символов в файле #2
Вот моя реализация на С, исходный текст и результат работы приложил в text.txt
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
#include <windows.h>
#include <stdio.h>
#include <conio.h>
 
//Подсчитывает количество символов chr в строке str
int GetChrNum(char * str, char chr);
//Удаляет из строки str все символы chr, если они содержится в ней
//Возвращаемый результат - указатель на преобразованную строку str 
char * StrRemChr(char * str, char chr);
 
void main()
{
    FILE * f;
    //При успешном открытии файла строка будет содержать
    //текст содержащиеся в нём
    char * str = (char *)malloc(sizeof(char));
    //Массив символов, встречающихся в файле
    char * chMass = (char *)malloc(sizeof(char));
    //Массив содержит количество символов для каждого элемента chMass
    //которые включает в себя текстовый блок str
    int * chNum = (int *)malloc(sizeof(int));
    if((f = fopen("text.txt","rb")))
    {
        fseek(f,0,SEEK_END);
        int sLen = ftell(f);
        fseek(f,0,SEEK_SET);
        str = (char *)realloc(str,sizeof(char)*sLen);
        fread(str,1,sLen,f);
        fclose(f);
        //При динамическом выделении вконце строки идёт мусор
        //Обрезаем строку до её действительной длинны
        str[sLen] = '\0';
        int i = 0;
        while(str[0] != '\0')
        {
            chMass[i] = str[0];
            chNum[i] = GetChrNum(str, chMass[i]);
            str = StrRemChr(str, chMass[i]);
            if(str[0] != '\0')
                i++;
            chMass = (char *)realloc((void *)chMass,sizeof(char)*(i + 1));
            chNum  = (int *)realloc((void *)chNum,sizeof(int)*(i + 1));
        }
        printf("Total count of chars in text     : %d\r\n",sLen);
        printf("Amount of different chars in text: %d\r\n",i);
        printf("\tChar\t|\tcount in text\r\n");
        while(0 <= i)
        {
            printf("\t'%c'\t|\t\t%d\r\n",chMass[i],chNum[i]);
            i--;
        }
    }
    else
        printf("text.txt is already open or not exist!");
    printf("Program stopped by getch(), for analize other text block\r\n");
    printf("enter new text in text.txt and restart program, now it will be closed\r\n");
    getch();
    free(chNum);
    free(chMass);
    //Строка str вконце анализа будет иметь 0-ую длинну,
    //(т.к. последовательно исключали ииз неё символы),
    //память под неё чистить не нужно...
//  free(str);
}
 
int GetChrNum(char * str, char chr)
{
    int chNum = 0;
    if(str)
    {
        char * chBuf = strchr(str,chr);
        while(chBuf)
        {
            chNum++;
            chBuf = strchr(chBuf + 1,chr);
        }
    }
    return chNum;
}
 
char * StrRemChr(char * str, char chr)
{
    if(str)
    {
        int i = 0,j,sLen = strlen(str);
        while(strchr(str,chr))
        {
            if(str[i] == chr)
            {
                j = i;
                while(str[i] == chr && i < sLen)
                    i++;
                //Осуществляем сдвиг в строке на sLen - i
                memmove((void *)&str[j],(void *)&str[i],sLen - i);
                //Обрезаем строку, т.к начиная с позиции
                //j + strlen((void *)&str[i]) будет идти sLen - i 
                //уже передвинутых внутри str символов
                str[j + strlen(&str[i])] = '\0';
                //Вычисляем новую длину строки
                sLen = strlen(str);
                i = j;
            }
            i++;
        }
    }
    return str;
}
Миниатюры
Статистика встречаемости символов в файле  
Вложения
Тип файла: txt text.txt (59 байт, 46 просмотров)
m@shka
 Аватар для m@shka
0 / 0 / 0
Регистрация: 17.10.2009
Сообщений: 12
17.11.2009, 19:12  [ТС]     Статистика встречаемости символов в файле #3
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вот моя реализация на С, исходный текст и результат работы приложил в text.txt
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
#include <windows.h>
#include <stdio.h>
#include <conio.h>
 
//Подсчитывает количество символов chr в строке str
int GetChrNum(char * str, char chr);
//Удаляет из строки str все символы chr, если они содержится в ней
//Возвращаемый результат - указатель на преобразованную строку str 
char * StrRemChr(char * str, char chr);
 
void main()
{
    FILE * f;
    //При успешном открытии файла строка будет содержать
    //текст содержащиеся в нём
    char * str = (char *)malloc(sizeof(char));
    //Массив символов, встречающихся в файле
    char * chMass = (char *)malloc(sizeof(char));
    //Массив содержит количество символов для каждого элемента chMass
    //которые включает в себя текстовый блок str
    int * chNum = (int *)malloc(sizeof(int));
    if((f = fopen("text.txt","rb")))
    {
        fseek(f,0,SEEK_END);
        int sLen = ftell(f);
        fseek(f,0,SEEK_SET);
        str = (char *)realloc(str,sizeof(char)*sLen);
        fread(str,1,sLen,f);
        fclose(f);
        //При динамическом выделении вконце строки идёт мусор
        //Обрезаем строку до её действительной длинны
        str[sLen] = '\0';
        int i = 0;
        while(str[0] != '\0')
        {
            chMass[i] = str[0];
            chNum[i] = GetChrNum(str, chMass[i]);
            str = StrRemChr(str, chMass[i]);
            if(str[0] != '\0')
                i++;
            chMass = (char *)realloc((void *)chMass,sizeof(char)*(i + 1));
            chNum  = (int *)realloc((void *)chNum,sizeof(int)*(i + 1));
        }
        printf("Total count of chars in text     : %d\r\n",sLen);
        printf("Amount of different chars in text: %d\r\n",i);
        printf("\tChar\t|\tcount in text\r\n");
        while(0 <= i)
        {
            printf("\t'%c'\t|\t\t%d\r\n",chMass[i],chNum[i]);
            i--;
        }
    }
    else
        printf("text.txt is already open or not exist!");
    printf("Program stopped by getch(), for analize other text block\r\n");
    printf("enter new text in text.txt and restart program, now it will be closed\r\n");
    getch();
    free(chNum);
    free(chMass);
    //Строка str вконце анализа будет иметь 0-ую длинну,
    //(т.к. последовательно исключали ииз неё символы),
    //память под неё чистить не нужно...
//  free(str);
}
 
int GetChrNum(char * str, char chr)
{
    int chNum = 0;
    if(str)
    {
        char * chBuf = strchr(str,chr);
        while(chBuf)
        {
            chNum++;
            chBuf = strchr(chBuf + 1,chr);
        }
    }
    return chNum;
}
 
char * StrRemChr(char * str, char chr)
{
    if(str)
    {
        int i = 0,j,sLen = strlen(str);
        while(strchr(str,chr))
        {
            if(str[i] == chr)
            {
                j = i;
                while(str[i] == chr && i < sLen)
                    i++;
                //Осуществляем сдвиг в строке на sLen - i
                memmove((void *)&str[j],(void *)&str[i],sLen - i);
                //Обрезаем строку, т.к начиная с позиции
                //j + strlen((void *)&str[i]) будет идти sLen - i 
                //уже передвинутых внутри str символов
                str[j + strlen(&str[i])] = '\0';
                //Вычисляем новую длину строки
                sLen = strlen(str);
                i = j;
            }
            i++;
        }
    }
    return str;
}
УУУУ.... эт на С...
такое ощущение, что на другом языке....
мне на С++
иль то у меня мозГ не работает....

Но в равно спасибо!!!
Rififi
 Аватар для Rififi
2330 / 1045 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
18.11.2009, 00:20     Статистика встречаемости символов в файле #4
Вот моя реализация на С, исходный текст и результат работы приложил в text.txt
Мракуха какая-то. в неё врубаться надо только пол-часа. как минимум

вот вариант на C++

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
#include <map>
#include <algorithm>
#include <iterator>
#include <fstream>
#include <iostream>
#include <locale>
#include <boost/lambda/lambda.hpp>
 
using namespace boost::lambda;
 
int main()
{
    setlocale(LC_ALL, "");
 
    std::ifstream ifs("input.txt");
    ifs.unsetf(std::ios_base::skipws);
 
    typedef std::map<char, unsigned> M;
    M m;
    typedef std::istream_iterator<char> I;
    std::for_each(I(ifs), I(), ++var(m)[_1]);
 
    for (M::const_iterator it=m.begin(), end=m.end(); it != end; ++it)
    {
        std::cout
            << "Символ " << it->first <<
            " встретился " << it->second << " раз." << std::endl;
    }
 
    return (0);
}
для файла input.txt, состоящего из:
1 2 3
4 5 6
1 2 33
вывод такой:
Символ
встретился 2 раз.
Символ встретился 6 раз.
Символ 1 встретился 2 раз.
Символ 2 встретился 2 раз.
Символ 3 встретился 3 раз.
Символ 4 встретился 1 раз.
Символ 5 встретился 1 раз.
Символ 6 встретился 1 раз.
(первая строка печатает символ "перевод каретки" \n)

подсчитать вероятность встречаемости каждого из них, т.е. разделить количество встречаемости конкретного символа на общее количество символов.

Хорошего понемножку. а это сам делай.
ptichka
 Аватар для ptichka
0 / 0 / 0
Регистрация: 19.12.2009
Сообщений: 15
21.12.2009, 17:10     Статистика встречаемости символов в файле #5
Цитата Сообщение от Rififi Посмотреть сообщение
Вот моя реализация на С, исходный текст и результат работы приложил в text.txt
Мракуха какая-то. в неё врубаться надо только пол-часа. как минимум

вот вариант на C++

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
#include <map>
#include <algorithm>
#include <iterator>
#include <fstream>
#include <iostream>
#include <locale>
#include <boost/lambda/lambda.hpp>
 
using namespace boost::lambda;
 
int main()
{
    setlocale(LC_ALL, "");
 
    std::ifstream ifs("input.txt");
    ifs.unsetf(std::ios_base::skipws);
 
    typedef std::map<char, unsigned> M;
    M m;
    typedef std::istream_iterator<char> I;
    std::for_each(I(ifs), I(), ++var(m)[_1]);
 
    for (M::const_iterator it=m.begin(), end=m.end(); it != end; ++it)
    {
        std::cout
            << "Символ " << it->first <<
            " встретился " << it->second << " раз." << std::endl;
    }
 
    return (0);
}
для файла input.txt, состоящего из:


вывод такой:


(первая строка печатает символ "перевод каретки" \n)

подсчитать вероятность встречаемости каждого из них, т.е. разделить количество встречаемости конкретного символа на общее количество символов.

Хорошего понемножку. а это сам делай.
может кто нибуть закоментировать этот код? на моём си билдере не в какую не хочет работать!
-----------------------------------------------------------------
вот это например что? =)
#include <boost/lambda/lambda.hpp>

using namespace boost::lambda;
Андрейка
409 / 213 / 23
Регистрация: 25.03.2009
Сообщений: 716
21.12.2009, 18:46     Статистика встречаемости символов в файле #6
ptichka, это как из названия видно лямбда выражения из библиотеки boost, в отличии от STL она не входит в стандарт С++ поэтому её надо ставить отдельно.
Yandex
Объявления
21.12.2009, 18:46     Статистика встречаемости символов в файле
Ответ Создать тему
Опции темы

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