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

Частотный анализ текста (символьный) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 45, средняя оценка - 4.93
chro
2 / 2 / 0
Регистрация: 22.06.2009
Сообщений: 31
23.09.2010, 13:00     Частотный анализ текста (символьный) #1
Частотный анализ текста (символьный). (Подсчитывается относительная частота встречаемости каждого символа в тексте.) Текст вводится из текстового файла произвольной длины; вывод результатов на экран, принтер или в файле по желанию пользователя.

Желательно в Borland C++
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2010, 13:00     Частотный анализ текста (символьный)
Посмотрите здесь:

частотный анализ строки C++
C++ Частотный анализ текста (пословный)
C++ Составить частотный словарь вводимого текста
Частотный анализ. Криптоанализ шифра замены. С++ C++
C++ Частотный анализ текста
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
knkd
37 / 36 / 2
Регистрация: 08.08.2010
Сообщений: 162
23.09.2010, 17:51     Частотный анализ текста (символьный) #2
Цитата Сообщение от chro Посмотреть сообщение
Частотный анализ текста (символьный). (Подсчитывается относительная частота встречаемости каждого символа в тексте.)
Если символы ASCI - вас спасёт массив размерности 256 с адресами по индексу символа.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
23.09.2010, 20:47     Частотный анализ текста (символьный) #3
Цитата Сообщение от chro Посмотреть сообщение
Частотный анализ текста
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
#include <iostream>
#include <fstream>
#include <iomanip>
#include <conio.h>
 
int main()
{
    const int start=32;
    const int size=128;
    char ch;
    int mas[size]={};
 
    std::ifstream in("1.txt", std::ios::out | std::ios::binary);
 
    if (!in){
        std::cout<<"error open file";
        return 2;
    }
 
    while (in.get(ch))
    ++mas[(int)ch];
 
    //count symbols
    int cnt_char=0;
    for (int i = start; i < size; ++i)
    cnt_char+=mas[i];
 
    //table
    std::cout<<"__ Frequency of characters in the percentage __"<<std::endl<<std::endl;
    for (int i = start; i < size; ++i){
        if ( mas[i] )
        std::cout<<(char)i<<" --> "<<(float)(mas[i]*100)/(float)cnt_char<<"%"<<std::endl;
    }
 
    getch();
    return EXIT_SUCCESS;
}
tymrfik
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
11.04.2012, 20:44     Частотный анализ текста (символьный) #4
Подскажите пожалуйста, почему у меня так происходит: из файла у меня читается строка: "Вот здесь", когда я хочу вывести частоты каждой бвквы, которая встретилась в моем файле (8 букв): то у меня частота буквы В не выводиться, а только с буквы Д идет.
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
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <locale.h>
 
using namespace std;
 
char al[32] ={'Г*','ГЎ','Гў','ГЈ','Г¤','ГҐ','Г¦','Г§','ГЁ','Г©','ГЄ','Г«','Г¬','Г*','Г®','ГЇ','Г°','Г±','ГІ','Гі','Гґ','Гµ','Г¶','Г·','Гё','Г№','Гє','Г»','Гј','ГЅ','Гѕ','Гї'};
int main(int argc, char *argv[])
{
    int i, m;
    char *mes;
    mes = new char[m];
    setlocale(0,"RUS");
    ifstream file ("mess.txt");
    i=0;
     while (!file.eof())
    {
         file>> mes[i];
         cout<<mes[i];
         i++;
    }
    cout<<endl;
    int n=strlen(mes);
    cout<<"êîë-ГўГ® ГўГ±ГҐГµ ñèìâîëîì, âêëþ÷Г*Гї Г§Г*Г*ГЄГЁ ïðåïèГ*Г*Г*ГЁГї="<< n <<endl;
    int u[32]; 
    double e[32];
    int rr=0;
    for(int k=0;k<32;k++){ u[k]=0;}
     for(int k=0;k<32;k++){ 
         for(i=0;i<n;i++){
         if (al[k]==mes[i])
           u[k]=u[k]+1; // Г±Г·ГЁГІГ*ГҐГ¬ ñêîëüêî Г°Г*Г§ âñòðå÷Г*ГѕГІГ±Гї ГЄГ*æäГ*Гї ГЎГіГЄГўГ* Г*ëôГ*ГўГЁГІГ*
             }
            //cout<<u[k]<<endl;
              }   
      for(int k=0;k<32;k++){ rr=rr+u[k];}
      cout<<"êîë-ГўГ® ГЎГіГЄГў Гў ГІГҐГЄГ±ГІГҐ"<<rr<<endl;  
//Г—Г*ñòîòГ*ГіГѕ ГІГ*áëèöó ïîñòðîèì.
  for(int k=0;k<32;k++)
  { e[k]=(double)u[k]/rr;
    cout<<e[k]<<endl;
    }
    system("PAUSE");
    return EXIT_SUCCESS;
Думаю это из-за типа char но не могу никак придумать выхода из-этого... почему пропускается первый символ текста для подсчета?!!!!
Яна Грач
 Аватар для Яна Грач
9 / 2 / 0
Регистрация: 14.04.2010
Сообщений: 27
30.04.2012, 15:57     Частотный анализ текста (символьный) #5
Он считает только строчные буквы... модифицируем)))
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
30.04.2012, 16:37     Частотный анализ текста (символьный) #6
както немного убого получилось..

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
#include <map>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <iostream>
 
typedef std::map<char, unsigned> Dictionary;
 
struct _dict {
  _dict (Dictionary& map) : m_map(map) {}
  void operator()(const char sym) { ++m_map[sym]; }
  Dictionary m_map;
};
 
int main() {
  std::ifstream f ("map.cpp");
  Dictionary dictionary;
  if (!f) return EXIT_FAILURE;
 
  _dict d = std::for_each(std::istream_iterator<char>(f), std::istream_iterator<char>(),
                          _dict(dictionary));
 
  for (Dictionary::iterator it = d.m_map.begin() ; it != d.m_map.end() ; ++it) {
    std::cout << it->first << " : " << it->second << std::endl;
  }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2012, 10:32     Частотный анализ текста (символьный)
Еще ссылки по теме:

C++ Частотный анализ байтов файла
Частотный анализ текста C++
C++ Частотный анализ

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

Или воспользуйтесь поиском по форуму:
tymrfik
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
18.06.2012, 10:32     Частотный анализ текста (символьный) #7
Помогите пожалуйста сделать дешифровку с помощью частотной таблицы. Для того же текста, что и шифруется.
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
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <locale.h>
#include <cctype>
#include <clocale>
 
using namespace std;
 
char al[32] ={'Г*','ГЎ','Гў','ГЈ','Г¤','ГҐ','Г¦','Г§','ГЁ','Г©','ГЄ','Г«','Г¬','Г*','Г®','ГЇ','Г°','Г±','ГІ','Гі','Гґ','Гµ','Г¶','Г·','Гё','Г№','Гє','Г»','Гј','ГЅ','Гѕ','Гї'};
int main(int argc, char *argv[])
{
    setlocale(LC_CTYPE, "Russian_Russia.1251");
    int i, m;
    char *mes;
    mes = new char[m];
    char *c;
    c = new char[m];
   // setlocale(0,"RUS");
    ifstream file ("mess.txt");
    i=0;
     while (!file.eof())
    {
         file>> mes[i];
         cout<<mes[i];
         i++;
    }
    cout<<endl;
    int n=strlen(mes);
    cout<<"êîë-ГўГ® ГўГ±ГҐГµ ñèìâîëîì, âêëþ÷Г*Гї Г§Г*Г*ГЄГЁ ïðåïèГ*Г*Г*ГЁГї="<< n <<endl;
    int u[32]; 
    double e[32];
    int rr=0;
         int prev=' ';
         for (int i = 0; i<n; i++)
   {
      if (prev == ' ' && mes[i] != ' ')
      {         
         mes[i] = tolower(mes[i]);         
      } 
   cout<<mes[i];}
   cout<<endl;
   for(int i=0;i<n;i++){  
      c[i]=mes[i];
      cout<<c[i];} 
    for(int k=0;k<32;k++){ u[k]=0;}
     for(int k=0;k<32;k++){ 
         for(i=0;i<n;i++){
         if (al[k]==mes[i])
           u[k]=u[k]+1; // Г±Г·ГЁГІГ*ГҐГ¬ ñêîëüêî Г°Г*Г§ âñòðå÷Г*ГѕГІГ±Гї ГЄГ*æäГ*Гї ГЎГіГЄГўГ* Г*ëôГ*ГўГЁГІГ*
             }
            //cout<<u[k]<<endl;
              }   
      for(int k=0;k<32;k++){ rr=rr+u[k];}
      cout<<"êîë-ГўГ® ГЎГіГЄГў Гў ГІГҐГЄГ±ГІГҐ"<<rr<<endl; 
      //Г—Г*ñòîòГ*ГіГѕ ГІГ*áëèöó ïîñòðîèì.
  for(int k=0;k<32;k++)
  { e[k]=(double)u[k]/rr;
    cout<<e[k]<<endl;
    }
//ГґГіГ*êöèÿ øèôðîâêè ïðîñòîé Г§Г*ìåГ*îé.
char aj[32] ={'Г¬','Г*','Г©','ГЎ','Г»','Г«','ГЄ','Г°','ГЇ','Г®','ГІ','Гі','Г±','Гґ','ГЅ','Гј','Гµ','ГҐ','ГЈ','Г¤','ГЁ','Гў','Г¦','Гї','Г·','Г¶','Гѕ','Гє','Г§','Гё','Г*','Г№'};  // Г*Г*Гё
  for(int i=0;i<n;i++){ 
      c[i]=mes[i];}   
          for(i=0;i<n;i++){
          for(int k=0;k<32;k++){
         if (mes[i]==al[k])
           c[i]=aj[k];}
           }
 for(int i=0;i<n;i++){  
         cout<<c[i];}                                                                                                                                        
  cout<<endl;  
  int q[32],p[32];
  double f[32];
    for(int k=0;k<32;k++){ q[k]=0;}
     for(int k=0;k<32;k++){ 
         for(i=0;i<n;i++){
         if (aj[k]==c[i])
           q[k]=q[k]+1; // Г±Г·ГЁГІГ*ГҐГ¬ ñêîëüêî Г°Г*Г§ âñòðå÷Г*ГѕГІГ±Гї ГЄГ*æäГ*Гї ГЎГіГЄГўГ* Г*ëôГ*ГўГЁГІГ*
             }
            //cout<<u[k]<<endl;
              }
        //Г—Г*ñòîòГ*ГіГѕ ГІГ*áëèöó ïîñòðîèì.
  for(int k=0;k<32;k++)
  { f[k]=(double)q[k]/rr;
    cout<<f[k]<<endl;
    }   
    //ÑðГ*ГўГ*ГЁГўГ*ГҐГ¬ Г·Г*ñòîòû
  for(int k=0;k<32;k++){
  for(int i=0;i<32;i++){
   if (e[k]==f[i])
    //cout<< e[k]<<"="<<f[i];
     p[k]=i;}
     } 
    system("PAUSE");
    return EXIT_SUCCESS;
}
Видоизменить : где сравниваем частоты, что нужно дописать, чтобы получилась расшифровка.
Yandex
Объявления
18.06.2012, 10:32     Частотный анализ текста (символьный)
Ответ Создать тему
Опции темы

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