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

Частота повторения букв в тексте - C++

Восстановить пароль Регистрация
 
Piro Tagro
 Аватар для Piro Tagro
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 15
24.11.2014, 17:21     Частота повторения букв в тексте #1
Доброго дня. Помогите пожалуйста разобраться. Простенькая программка по подсчеты количества букв в тексте в процентах на русском языке. До буквы "ч" все правильно считается а дальше начинаются ошибки. Запускала на Delphi все шло, на С++ не работает(((
// Открытие файла для чтения
ifstream fin(name);
if (fin)
{
cout << endl << "Чтение файла\n";
while (!fin.eof())
{
fin.getline(str, 100000); // Чтение файла
puts(str);

d = strlen(str);

for (t = 'а'; t <= 'я'; t++)
b[t] = 0;

for (i = 0; i<d; i++)

if (('а' <= str[i]) && (str[i] <= 'я'))
{
b[str[i]] = b[str[i]] + 1;
k += 1;
}

for (t = 'а'; t <= 'я'; t++)
if (b[t]>0)
{
b[t] = b[t] * 100 / k;
cout << "\t" << t << " " << b[t] << "%" << endl;
}
}
[/FONT]
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gazlan
2867 / 1815 / 272
Регистрация: 27.08.2010
Сообщений: 4,919
Записей в блоге: 1
24.11.2014, 18:17     Частота повторения букв в тексте #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
#include "stdafx.h"
 
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
 
#ifdef NDEBUG
#pragma optimize("gsy",on)
#pragma comment(linker,"/FILEALIGN:512 /MERGE:.rdata=.text /MERGE:.data=.text /SECTION:.text,EWR /IGNORE:4078")
#endif
 
#define ASCII_SIZE            (256)
 
static DWORD      dwCnt[ASCII_SIZE];  
 
inline bool IsPrintable(BYTE byChr)
{
   if ((byChr < 0x20) || (byChr == 0x7F))
   {
      return false;
   }
 
   return true;
}
 
static void Proceed(const char* const pszFileName)
{
   FILE*    pIn = fopen(pszFileName,"rb");
 
   if (!pIn)
   {
      perror("\a\nOpen Input File Error !\n");
      return;
   }
 
   DWORD    dwSize = 0;
   int      iChr   = 0;
   
   while ((iChr = fgetc(pIn)) != EOF)
   {
      ++dwCnt[(BYTE)iChr];
      ++dwSize;
   }
 
   fclose(pIn);
   pIn = NULL;
 
   for (DWORD ii = 0; ii < ASCII_SIZE; ++ii)            
   {
      if (dwCnt[ii])
      {
         printf
         (
            "%c  [%02X]  %5d  %5.2f%%\n",
            IsPrintable((BYTE)ii)  ?  ii  :  '.',
            ii,
            dwCnt[ii],
            100.0 * (double)dwCnt[ii] / (double)dwSize
         );
      }
   }
}
 
void ShowHelp()
{
   const char  pszCopyright[] = "-*-   Frequency 1.0   *   Copyright (c) Gazlan 2014   -*-";
   const char  pszDescript [] = "Calculate characters frequency";
   const char  pszE_Mail   [] = "complains_n_suggestions direct to [email]gazlan@yandex.ru[/email]";
 
   printf("%s\n\n",pszCopyright);
   printf("%s\n\n",pszDescript);
   printf("Usage: frequency.com victim [> report.txt]\n\n");
   printf("%s\n\n",pszE_Mail);
}
 
int main(int argc,char** argv)
{
   if (argc < 2)
   {
      ShowHelp();
      return 0;
   }
 
   if (argc == 2 && ((!strcmp(argv[1],"?")) || (!strcmp(argv[1],"/?")) || (!strcmp(argv[1],"-?")) || (!stricmp(argv[1],"/h")) || (!stricmp(argv[1],"-h"))))
   {
      ShowHelp();
      return 0;
   }
 
   Proceed(argv[1]);
 
   return 0;
}


Ex: frequency.com frequency.cpp > report.txt

Код
.  [0A]     95   4.68%
.  [0D]     95   4.68%
   [20]    456  22.46%
!  [21]      8   0.39%
"  [22]     36   1.77%
#  [23]     10   0.49%
%  [25]      9   0.44%
&  [26]      2   0.10%
'  [27]      2   0.10%
(  [28]     46   2.27%
)  [29]     46   2.27%
*  [2A]      8   0.39%
+  [2B]      6   0.30%
,  [2C]     17   0.84%
-  [2D]      6   0.30%
.  [2E]     13   0.64%
/  [2F]      8   0.39%
0  [30]     16   0.79%
1  [31]     10   0.49%
2  [32]      8   0.39%
4  [34]      2   0.10%
5  [35]      4   0.20%
6  [36]      1   0.05%
7  [37]      2   0.10%
8  [38]      1   0.05%
:  [3A]      7   0.34%
;  [3B]     29   1.43%
<  [3C]      3   0.15%
=  [3D]     17   0.84%
>  [3E]      1   0.05%
?  [3F]      4   0.20%
@  [40]      1   0.05%
A  [41]      4   0.20%
B  [42]      6   0.30%
C  [43]     19   0.94%
D  [44]     11   0.54%
E  [45]     26   1.28%
F  [46]     11   0.54%
G  [47]      8   0.39%
H  [48]      5   0.25%
I  [49]     27   1.33%
L  [4C]      8   0.39%
M  [4D]      4   0.20%
N  [4E]      8   0.39%
O  [4F]      7   0.34%
P  [50]      4   0.20%
R  [52]      7   0.34%
S  [53]     15   0.74%
T  [54]      6   0.30%
U  [55]      5   0.25%
W  [57]      5   0.25%
X  [58]      1   0.05%
Y  [59]      3   0.15%
Z  [5A]      3   0.15%
[  [5B]     17   0.84%
\  [5C]     12   0.59%
]  [5D]     17   0.84%
_  [5F]     15   0.74%
a  [61]     48   2.36%
b  [62]      9   0.44%
c  [63]     42   2.07%
d  [64]     28   1.38%
e  [65]     66   3.25%
f  [66]     28   1.38%
g  [67]     21   1.03%
h  [68]     23   1.13%
i  [69]     75   3.69%
k  [6B]      1   0.05%
l  [6C]     24   1.18%
m  [6D]     16   0.79%
n  [6E]     67   3.30%
o  [6F]     32   1.58%
p  [70]     40   1.97%
q  [71]      3   0.15%
r  [72]     75   3.69%
s  [73]     38   1.87%
t  [74]     65   3.20%
u  [75]     18   0.89%
v  [76]     10   0.49%
w  [77]     13   0.64%
x  [78]      8   0.39%
y  [79]     11   0.54%
z  [7A]     14   0.69%
{  [7B]     11   0.54%
|  [7C]     10   0.49%
}  [7D]     11   0.54%
Вложения
Тип файла: 7z Frequency.7z (5.0 Кб, 8 просмотров)
Piro Tagro
 Аватар для Piro Tagro
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 15
25.11.2014, 17:36  [ТС]     Частота повторения букв в тексте #3
Ого, я конечно разберусь в этом, но боюсь это слишком сложно и много для моих целей, мне просто не поверят.(((
Если не сложно можно написать почему не работает с русским алфавитом и как это можно менее глобально исправить? Буду премного благодарна, а программку все же разберу, пригодится))
gazlan
2867 / 1815 / 272
Регистрация: 27.08.2010
Сообщений: 4,919
Записей в блоге: 1
25.11.2014, 18:12     Частота повторения букв в тексте #4
Цитата Сообщение от Piro Tagro Посмотреть сообщение
почему не работает с русским алфавитом
Признаться, в ваш код не всматривался, но, по крайней мере, одна ошибка очевидна: 'я' - это -1. Используйте всюду unsigned char и беззнаковые константы. Например, взамен 'я' - 0xFF. Иначе, ни одно из ваших сравнений работать не будет.
Piro Tagro
 Аватар для Piro Tagro
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 15
27.11.2014, 19:44  [ТС]     Частота повторения букв в тексте #5
Большое спасибо за помощь)))
Yandex
Объявления
27.11.2014, 19:44     Частота повторения букв в тексте
Ответ Создать тему
Опции темы

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