Частотный анализ текста c++

291
14 февраля 2017, 19:23

Решил я написать частотный анализ текста на c++. Возникли следующие проблемы: Русские символы нужны на всех платформах(linux, mac os, windows), поэтому хотел работать с данными, которые "могут всё".

Класс analisys:

#define rus_size 33 * 2
#define eng_size 26 * 2
#define rus_space_size 33 * 2 + 1
#define eng_space_size 26 * 2 + 1
class analysis {
private:
    std::wstring rus_alphabet[rus_size];
    std::wstring eng_alphabet[eng_size];
    std::wstring rus_alphabet_space[rus_space_size];
    std::wstring eng_alphabet_space[eng_space_size];
    int _indexOfSymbol(std::wstring const &, std::wstring[], int);
    int _indexOfSymbol(wchar_t, std::wstring[], int);
    int _indexOfMaxElement(int*, int);
public:
    analysis();
    void showAlphabet();
    void showAlphabet(std::wstring const &, bool);
    std::wstring analisys(std::wstring const &, std::wstring const &, bool);
};

Код алфавитов(русский и английский), конструктор класса:

this->rus_alphabet[0] = L"А";
this->rus_alphabet[1] = L"Б";
this->rus_alphabet[2] = L"В";
this->rus_alphabet[3] = L"Г";
this->rus_alphabet[4] = L"Д";
this->rus_alphabet[5] = L"Е";
и т.д.

Такая же история и для английского алфавита. Затем основные действия:

std::wstring analysis::analisys(std::wstring const & text, std::wstring const & lang_of_text, bool space) {
std::wstring result = L"";
if(lang_of_text == L"rus"){
    if(space){
        int count_of_symbols[rus_space_size];
    }
    else{
        int count_of_symbols[rus_size];
        // Новый массив
        for (int k = 0; k < rus_size; ++k) {
            count_of_symbols[k] = 0;
        }
        // Считаем сколько раз повторяется каждый символ в тексте
        for (int i = 0; i < text.length(); ++i) {
            if(iswalpha(rus_alphabet[_indexOfSymbol(std::to_wstring(text[i]), rus_alphabet, rus_size)][0])) {
                count_of_symbols[_indexOfSymbol(std::to_wstring(text[i]), rus_alphabet, rus_size)] += 1;
            }
        }
        // По убыванию даем информацию о кол-ве найденных символов
        for (int j = 0; j < rus_size; ++j) {
            int max = _indexOfMaxElement(count_of_symbols, rus_size);
            result = result + rus_alphabet[max] + L" – " + std::to_wstring(count_of_symbols[max]) + L"\n";
            count_of_symbols[max] = -1;
        }
        return result;
    }
}
return NULL;
}

Функции _indexOfSymbol(две перегрузки):

int analysis::_indexOfSymbol(wchar_t symbol, std::wstring alphabet[], int size) {
for (int i = 0; i < size; ++i) {
    if(std::to_wstring(symbol) == alphabet[i]) return i;
}
return NULL;
}

Вторая перегрузка:

int analysis::_indexOfSymbol(std::wstring const & symbol, std::wstring alphabet[], int size) {
for (int i = 0; i < size; ++i) {
    if(symbol == alphabet[i]) return i;
}
return NULL;
}

И функция поиска _indexOfMaxElement:

int analysis::_indexOfMaxElement(int* array, int size) {
int index_max = 0;
for (int i = 0; i < size; ++i) {
    if(array[index_max] < array[i]) index_max = i;
}
return index_max;
}

В основной программе main.cpp вызов выглядит так:

analysis _analysis;
wstring kek;
getline(wcin, kek);
wcout << _analysis.analisys(kek, L"rus", false);

Проблема в том, что он отказывается искать символы/сравнивать символы/еще что-то делать с символами. На выходе должно быть примерно следующее:

A - 7;
Б - 5;
Я - 4;
Д - 3;

и т.д. по убыванию.

Но у меня на выходе все по нулям. Я ставил точки останова и вот некоторые данные с них:

Текст который я ввёл - L"Ð\U0000009fÑ\U00000080ивеÑ\U00000082 код" (по идее должно быть - "Привет код")
В цикле, который считает символы, у меня ни разу не выполняется условие.

Как это поправить?

Answer 1

Я не знаю точно, как это влияет на отображение в пост процессе компиляции, но мне помогла замена кодировки с utf-8 на windows-1251. Вообще, не очень понимаю как это работает.

READ ALSO
Не работают плагины для OpenCPN [требует правки]

Не работают плагины для OpenCPN [требует правки]

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

286
Почему CListView обнуляется?

Почему CListView обнуляется?

У меня есть объект

297
No matching function for call to [требует правки]

No matching function for call to [требует правки]

Написал шаблон функции, описал функцию, но компилятор выдает мне такую ошибку:

389
Как сделать снимок экрана в буфер на C++?

Как сделать снимок экрана в буфер на C++?

Нужно сделать снимок экрана и записать его RGB-данные в буфер (BYTE*, unsigned char*, string - не важно)Не нужно сохранять файл, не нужны BMP-заголовки - просто...

343