C/C++

С++ Нет идей как можно реализовать. Даже не понятно как алгоритм должен работать.

Задан текст, содержащий не более 255 символов. Определить частоту, с которой в тексте встречаются различные буквы русского алфавита (в долях от общего количества букв).
Пример работы программы:
Введите строку: В чащах юга жил бы цитрус? Да, но фальшивый экземплярЪ!
а : 0.139
б : 0.028
в : 0.056
г : 0.028
д : 0.028
е : 0.028
ж : 0.028
з : 0.028
и : 0.083
й : 0.028
к : 0.028
л : 0.083
м : 0.028
н : 0.028
о : 0.028
п : 0.028
р : 0.056
с : 0.028
т : 0.028
у : 0.028
ф : 0.028
х : 0.028
ц : 0.028
ч : 0.028
ш : 0.028
щ : 0.028
ъ : 0.028
ы : 0.056
ь : 0.028
э : 0.028
ю : 0.028
я : 0.028
В вашем тексте 43 буквы, буква «а» встречается 5 раз!!
5 / 43 = 0.116
Почему у вас 0.139?

#include <iostream>
#include <string>
#include <algorithm>
#include <map>
#include <iomanip>
using namespace std;
string strlwr(const string& str) {
const auto len = str.length();
const string upper = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
const string lower = "абвгдежзийклмнопрстуфхцчшщъыьэюя";
string box = str;
transform(box.begin(), box.end(), box.begin(), [](char c) { return tolower(c); });
for (auto ch = 0U; ch < len; ++ch) {
for (auto i = 0U; i < 33U; ++i) {
if (str[ch] < -96) box[ch] = str[ch] + 96;
else if (str[ch] == upper[i]) box[ch] = lower[i];
}
}
return box;
}
bool isstralpha(char ch) {
if (!isalpha(ch)) {
const string upper = "абвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
if (upper.find(ch) != string::npos) return true;
}
return false;
}
map<char, double> letters(const string& str) {
auto tmp = strlwr(str);
map<char, unsigned> box;
auto length = 0U;
for (const auto letter : tmp) if (isstralpha(letter)) {
++box[letter];
++length;
}
map<char, double> result;
for (const auto [letter, count] : box) result.insert({ letter, double(count) / length });
return result;
}
void show(map<char, double>& box, const streamsize w = 3U) {
cout << fixed;
for (const auto [letter, value] : box) cout << letter << ": " << setprecision(w) << value << '\n';
cout.unsetf(ios::fixed);
}
int main() {
setlocale(LC_CTYPE, "Russian");
string test = "В чащах юга жил бы цитрус? Да, но фальшивый экземплярЪ!";
auto box = letters(test);
show(box);
system("pause > nul");
}
Башир Шахмурзиев
Башир Шахмурзиев
53 976
Лучший ответ
русские буквы в c++, да еще в windows (((
Денис Акатов работы со строками хуже, чем в плюсах/си не встречал...
1) создаешь map
2) считываешь строку, удаляя все пробелы и приводя все буквы к одному регистру (tolower или toupper)
3) пробегаешься по каждому символу i строки и делаешь map[i]++
4) для каждого элемента i в мапе выводишь i.second, деленное на длину строки.
P.S. не забудь про setlocale и длину и (или) второй элемент мапа объявить как double/float
P.S.S если нужна каждая буква (даже если она не встречается и ее доля будет 0.0), то перед началом пихаешь в мап все символы со значением 0
Семён Сандуца Вместо map можно использовать массив байт или int. Индекс в массиве = код символа. Значение элемента массива = счётчик символа.

Ввод русских букв не работает в Windows консоли. setlocale не спасает.
Михаил Чередник Можно подробнее про 4й пункт i.second это что? И в мапе как понял считает количество букв.