Решил я написать частотный анализ текста на 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. Вообще, не очень понимаю как это работает.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости