Решил я написать частотный анализ текста на 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 код" (по идее должно быть - "Привет код")
В цикле, который считает символы, у меня ни разу не выполняется условие.
Как это поправить?
Я не знаю точно, как это влияет на отображение в пост процессе компиляции, но мне помогла замена кодировки с utf-8
на windows-1251
. Вообще, не очень понимаю как это работает.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно написать плагин для OpenCPN, но поскольку не нашел ни одного пособия, то решил разобраться на примере исходного кода существующихНо после...
Написал шаблон функции, описал функцию, но компилятор выдает мне такую ошибку:
Нужно сделать снимок экрана и записать его RGB-данные в буфер (BYTE*, unsigned char*, string - не важно)Не нужно сохранять файл, не нужны BMP-заголовки - просто...