2

Вроде как программу написал, но почему то частота везде равняется нулю, не могу понять в чем ошибка. Скорее всего ошибка в использовании функции count

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <map>
#include <locale>

using namespace std;

void main() { /ЧТЕНИЕ ФАЙЛА/ fstream in("text.txt"); string text; string tmp;

while (!in.eof())
{
    getline(in, tmp);
    text += tmp;
}

ofstream out;
/*ЧТЕНИ ФАЙЛА ЗАВЕРШЕНО*/
/*ПРИВЕДЕНИЕ ТЕКСТА К ВЕРХНЕМУ РЕГИСТРУ*/
transform(text.begin(), text.end(), text.begin(), toupper);
map&lt;unsigned char, double&gt; letterFrequency;
int countOfSymbols = 0;

for (size_t i = 0; i &lt; text.size(); i++)
{
    if (isalpha((unsigned char) text[i]))
    {
        countOfSymbols++;
    }
}

for (int i = 65; i &lt;= 90; i++)
{
    letterFrequency.insert(make_pair((unsigned char)i, count(text.begin(),
                                     text.end(), (unsigned char)i) / countOfSymbols));
}

for (map&lt;unsigned char, double&gt;::iterator it =
            letterFrequency.begin(); it != letterFrequency.end(); it++)
{
    cout &lt;&lt; it-&gt;first &lt;&lt; &quot; &quot; &lt;&lt; it-&gt;second &lt;&lt; endl;
}

}

Harry
  • 221,325

1 Answers1

5

Ну... зачем просто, если можно сложно? :)

int main()
{
ifstream in(&quot;text.txt&quot;);
char c;
map&lt;char,int&gt; m;
int total = 0;
while(in &gt;&gt; c) { m[toupper(c)]++; total++; }

for(auto k: m)
    cout &lt;&lt; k.first &lt;&lt; &quot;  &quot; &lt;&lt; double(k.second)*100/total &lt;&lt; &quot;%\n&quot;;

}

Если надо считать и пробелы - то добавьте in >> noskipws; перед циклом чтения.

И еще - вот так

while (!in.eof())

не делайте!

Harry
  • 221,325
  • Извините, вот в цикле while, что конкретно происходит? Я не совсем понимаю, как контейнер получает элемент через квадратные скобки, и как во второе значение контейнера попадает кол-во определенных символов – Uladzislau Melnikau Mar 25 '21 at 20:31
  • Это контейнер map, почитайте о нем. Рассказывать долго... Можно и без него, просто int m[256] = {0};, и приводить c на всякий случай (русских букв) к unsigned char. Впрочем, если текст только с английскими буквами - то этого будет достаточно, только при выводе надо будет смотреть и проверять элементы на ненулевые значения. – Harry Mar 26 '21 at 03:59