Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933

Посчитать количество букв в заданном тексте

25.10.2016, 22:07. Показов 3037. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
vector<int> alph(123, 0);
for (int j = i; j < str5.size(); j += size)
        {
            arrstr[i] += str5[j];
            alph[int (str5[j])] ++;
        }
for (int t = 97; t < 123; t++)
        cout << alph[t]<<" ";
в общем сделал такой кусочек кода. Понимаю что это позорно, и прошу помощи как это правильно сделать, иначе 97 * 4 байт памяти уходят в пустую. alph затем выводится на экран, очищается и считает следующий фрагмент текста.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.10.2016, 22:07
Ответы с готовыми решениями:

Посчитать в тексте количество удвоенных букв n
Посчитать в тексте количество удвоенных букв n. (текст ввести с клавиатуры)

Подсчитать общее количество букв в заданном тексте
в заданном тексте подсчитайте общее кол-во букв &quot;х&quot; и &quot;у&quot; помогите пожалуйста(

В заданном тексте найти слова, содержащие наибольшее и наименьшее количество букв
Задан текст, слова которого разделены пробелом. Напечатать слово, содержащее наибольшее и наименьшее количество букв (все слова, если их...

19
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
25.10.2016, 22:30
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/////////////////////////////////////////////////////////////////////////////////////////
// Посчитать кол-во букв в тексте
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <unordered_map>
#include <cstdlib>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::unordered_map<char, unsigned> letters;
    
    std::string str{};
    std:;getline( std::cin, str );
    
    for( char it : str )
    {
        if( std::isalpha( it ) )
        {
            ++letters[it];
        }
    }
    
    for( const auto& it : letters )
    {
        std::cout
            << it.first
            << '\t'
            << it.second
            << std::endl;
    }
}
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.10.2016, 22:38
GbaLog-,
я могу конечно объяснить в чем ошибка вашего решения))
но будет лучше, если вы поймете это сами:

http://rextester.com/VGRQ74972

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/////////////////////////////////////////////////////////////////////////////////////////
// Посчитать кол-во букв в тексте
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <unordered_map>
#include <cstdlib>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::unordered_map<char, unsigned> letters;
    
    std::string str{};
    std::getline( std::cin, str );
    
    std::cout << "text: '" << str << "'\n";
    
    for( char it : str )
    {
        if( std::isalpha( it ) )
        {
            ++letters[it];
        }
    }
    
    std::cout << "characters: " << letters.size() << "\n";
    
    for( const auto& it : letters )
    {
        std::cout
            << it.first
            << '\t'
            << it.second
            << std::endl;
    }
}
output:
text: 'привет, мир!!!'
characters: 0
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
25.10.2016, 22:43
hoggy,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/////////////////////////////////////////////////////////////////////////////////////////
// Посчитать кол-во букв в тексте
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <unordered_map>
#include <cstdlib>
#include <string>
#include <clocale>
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global( std::locale( "" ) );
    
    std::unordered_map<char, unsigned> letters;
    
    std::string str{};
    std::getline( std::cin, str );
    
    std::cout << "text: '" << str << "'\n";
    
    for( char it : str )
    {
        if( std::isalpha( it ) )
        {
            ++letters[it];
        }
    }
    
    std::cout << "characters: " << letters.size() << "\n";
    
    for( const auto& it : letters )
    {
        std::cout
            << it.first
            << '\t'
            << it.second
            << std::endl;
    }
}
Исправил так, но на rextester'e не работает, а у меня работает:
Code
1
2
3
4
5
6
7
8
9
10
11
Process started >>>
Привет, мир!!!
text: 'Привет, мир!!!'
characters: 6
м  1
е  1
П  1
и  2
р  2
в  1
<<< Process finished. (Exit code 0)
Добавлено через 1 минуту
А буквы 'т' так и нет.
В общем тут с локализацией проблема.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.10.2016, 22:50
Цитата Сообщение от GbaLog- Посмотреть сообщение
В общем тут с локализацией проблема.
да)
проблем сразу три.

1
std::cin по дефолту не умеет национальные символы.
иногда он их жрет, иногда нет.
в зависимости от платформы.

для того, что бы кушать национальные символы,
я использую wcin,
которому так же нужно назначать локаль.

2.
http://www.cplusplus.com/reference/locale/isalpha/

одним из аргументов принимает локаль.
вы её не указали.

3.
и вот это уже - не решаемая стандартными средствами проблема:
с++ не осилил локаль.

если в студийной реализации это ещё как то фурычит,
то mingw (g++) умеет только латинские буквы,
и не обещает ничего другого.

и проблема здесь не только в том,
что функционал локалей толком не реализован в топовых компиляторах,
но и в самой концепции трейтов стандартной библиотеки.
эти трейты рассчитаны на обработку буковки, как символа.

однако, во многих языках одна буква может обозначаться последовательностью нескольких символов.
и вот здесь с++ поимел эпичный фейл.
что бы это исправить, нужно переписать уйму кода стандартной библиотеки,
как то кардинально поменяв архитектуру по части трейтов.
что делать уже никто не будет.

поэтому, что бы работать полноценно с текстом,
нужно либо подключать толстые специализированные библиотеки,
а потом разгребать нюансы разных платформ и языков.

либо нужно смириться и признать:
что задача не решаемая)
1
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
25.10.2016, 23:16  [ТС]
Буквы только из латиницы
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.10.2016, 23:18
Цитата Сообщение от Senarist Посмотреть сообщение
Буквы только из латиницы
C++
1
2
std::string text = "trololo";
std:::cout << "количество букв: " << text.size();
0
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 933
25.10.2016, 23:22  [ТС]
hoggy )) спасибо конечно, но нужно именно количество каждой буквы.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
26.10.2016, 11:04
Цитата Сообщение от hoggy Посмотреть сообщение
для того, что бы кушать национальные символы,
я использую wcin,
которому так же нужно назначать локаль.
Я думал, что, если не назначить её, то он будет глобальную кушать.
Цитата Сообщение от hoggy Посмотреть сообщение
одним из аргументов принимает локаль.
вы её не указали.
И об этом также думал.
Цитата Сообщение от hoggy Посмотреть сообщение
и вот это уже - не решаемая стандартными средствами проблема:
с++ не осилил локаль.
За то время, пока я изучал С++, я понял это.

Не по теме:

Не то что python, там и локаль, и эта задача в 3 строчки. :)

Python
1
2
3
4
5
str = input();
 
letters = { ( x, str.count(x) ) for x in str if x.isalpha() };
        
print( "lst: %s\nlen: %i" % ( letters, len( letters ) ) );

0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
26.10.2016, 14:07
Цитата Сообщение от hoggy Посмотреть сообщение
с++ не осилил локаль.
Просто надо
C++
1
setlocale( LC_ALL, "rus" );
Для вывода на винде еще
C++
1
2
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
А линукс вообще с юникодом работает, ему собственно вообще все равно.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
26.10.2016, 14:26
Цитата Сообщение от MrGluck Посмотреть сообщение
Просто надо
Тут дело даже не в выводе, а в функциях типа std::isalpha.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/////////////////////////////////////////////////////////////////////////////////////////
// Посчитать кол-во букв в тексте
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <unordered_map>
#include <cstdlib>
#include <string>
#include <clocale>
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    setlocale( LC_ALL, "rus" );
    
    std::unordered_map<char, unsigned> letters;
    
    std::string str{};
    std::getline( std::cin, str );
    
    std::cout << "text: '" << str << "'\n";
    
    for( char it : str )
    {
        if( std::isalpha( it ) )
        {
            ++letters[it];
        }
    }
    
    std::cout << "characters: " << letters.size() << "\n";
    
    for( const auto& it : letters )
    {
        std::cout
            << it.first
            << '\t'
            << it.second
            << std::endl;
    }
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
Process started >>>
абвгдеёжзийклмнопрстуфхцчшщъыьэюя
text: 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
characters: 8
я  1
ь  1
ъ  1
п  1
ц  1
ю  1
у  1
ш  1
<<< Process finished. (Exit code 0)
Как видите, выводится верно, но функция std::isalpha пропускает только 8 из 33 символов.
Вот с подключением windows.h лучше пошло, но всё равно не то!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/////////////////////////////////////////////////////////////////////////////////////////
// Посчитать кол-во букв в тексте
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <unordered_map>
#include <cstdlib>
#include <string>
#include <clocale>
#include <windows.h>
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    SetConsoleCP( 1251 );
    SetConsoleOutputCP( 1251 );
    
    std::unordered_map<char, unsigned> letters;
    
    std::string str{};
    std::getline( std::cin, str );
    
    std::cout << "text: '" << str << "'\n";
    
    for( char it : str )
    {
        if( std::isalpha( it ) )
        {
            ++letters[it];
        }
    }
    
    std::cout << "characters: " << letters.size() << "\n";
    
    for( const auto& it : letters )
    {
        std::cout
            << it.first
            << '\t'
            << it.second
            << std::endl;
    }
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Process started >>>
абвгдеёжзийклмнопрстуфхцчшщъыьэюя
text: 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
characters: 22
я  1
ф  1
у  1
р  1
п  1
о  1
н  1
м  1
ш  1
г  1
ч  1
в  1
б  1
а  1
л  1
д  1
е  1
ы  1
ж  1
ь  1
з  1
и  1
<<< Process finished. (Exit code 0)
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
26.10.2016, 14:44
Цитата Сообщение от GbaLog- Посмотреть сообщение
но всё равно не то!
Попробуйте сразу
C++
1
2
3
SetConsoleCP( 1251 );
SetConsoleOutputCP( 1251 );
setlocale( LC_ALL, "rus" );
Добавлено через 1 минуту
Цитата Сообщение от GbaLog- Посмотреть сообщение
функция std::isalpha пропускает только 8 из 33 символов.
Наверняка, её можно "научить" сравнивать и через локаль, но мне, если честно, не охота вспоминать, какие там значения нужны в std::locale
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
26.10.2016, 14:48
Цитата Сообщение от MrGluck Посмотреть сообщение
Попробуйте сразу
Пробовал:
NppExec:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
Process started >>>
абвгдеёжзийклмнопрстуфхцчшщъыьэюя
text: 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
characters: 8
я  1
ь  1
ъ  1
п  1
ц  1
ю  1
у  1
ш  1
<<< Process finished. (Exit code 0)
В cmd:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
абвгдеёжзийклмнопрстуфхцчшщъыьэюя
text: 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
characters: 19
ы       1
ш       1
ч       1
ц       1
х       1
ф       1
у       1
ю       1
з       1
т       1
э       1
ж       1
е       1
р       1
г       1
о       1
и       1
к       1
м       1
Цитата Сообщение от MrGluck Посмотреть сообщение
Наверняка, её можно "научить" сравнивать и через локаль
В бусте так и делается, насколько я понял.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
26.10.2016, 15:08
Цитата Сообщение от GbaLog- Посмотреть сообщение
Пробовал:
А так:
C++
1
2
3
4
5
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
std::locale loc(".1251");
...
if (std::isalpha(it, loc))
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
26.10.2016, 15:14
Цитата Сообщение от MrGluck Посмотреть сообщение
А так
А так эксепшон, очевидно.

Добавлено через 50 секунд
А вот и он:
Code
1
2
3
4
5
terminate called after throwing an instance of 'std::runtime_error'
  what():  locale::facet::_S_create_c_locale name not valid
 
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
26.10.2016, 15:25
Цитата Сообщение от GbaLog- Посмотреть сообщение
А так эксепшон, очевидно.
Можно попробовать линуксовый вариант ru_RU.CP1251.
Если не пойдёт - значит в mingw не реализовали нормально std::locale. Но неправильная реализация возможности в каком-то компиляторе не характеризует язык.

На студии работает с ".1251".
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
26.10.2016, 16:08
Цитата Сообщение от MrGluck Посмотреть сообщение
Если не пойдёт - значит в mingw не реализовали нормально std::locale.
MinGW не осилил.
Цитата Сообщение от MrGluck Посмотреть сообщение
На студии работает с ".1251".
И что выдаёт?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.10.2016, 16:38
Цитата Сообщение от GbaLog- Посмотреть сообщение
Я думал, что, если не назначить её, то он будет глобальную кушать.
когда то я тоже так думал)
Цитата Сообщение от GbaLog- Посмотреть сообщение
Не то что python, там и локаль, и эта задача в 3 строчки.
локаль - глобальная кросс-языковая проблема.
приведенный на питоне код лососнет,
если строка - не нормализованна.


Цитата Сообщение от MrGluck Посмотреть сообщение
А линукс вообще с юникодом работает, ему собственно вообще все равно.
угу. оно и видно))

Цитата Сообщение от MrGluck Посмотреть сообщение
Для вывода на винде еще
речь о кросс-платформе.
виндузятный компилятор - пожалуй единственный,
который более менее жрет нормализованные строки.
но даже он лососнет на ненормализованных
(когда буква представлена сочетанием нескольких символов)

Цитата Сообщение от MrGluck Посмотреть сообщение
значит в mingw не реализовали нормально std::locale
бинго!
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
26.10.2016, 16:46
Цитата Сообщение от hoggy Посмотреть сообщение
приведенный на питоне код лососнет,
если строка - не нормализованна.
Я думаю ТС вряд ли будет использовать не нормализованные строки.
Хотя если будет, то ничего лучше я не смогу написать.
Да и вряд ли на просторах чистого питона найдётся стандартное средство решения, тут уж фреймворки нужны.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
26.10.2016, 16:55
Цитата Сообщение от GbaLog- Посмотреть сообщение
И что выдаёт?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.10.2016, 16:55
Помогаю со студенческими работами здесь

Посчитать количество слов "что" в заданном тексте
Дано текст. Сколько в нём слов &quot;что&quot;.

Строки. Подсчитать количество заглавных букв в тексте; вывести на экран слова, имеющие наименьшее количество букв... (подправить)
Дано задачу: С клавиатуры вводится строка. Составить программу, которая подсчитывает количество заглавных букв в тексте; выводит на...

Подсчитать в заданном тексте количество удвоенных букв. (Напр.в тексте finn is fool )
Подсчитать в заданном тексте количество удвоенных букв. (Напр.в тексте finn is fool )

Найти и вывести на печать количество цифр и количество букв, которые содержатся в заданном тексте
В заданном тексте найти и вывести на печать количество цифр и количество букв, которые содержатся в нем.(Текст можно любой написать). Хочу...

Посчитать количество букв Т в тексте
Доброго времени суток! Не могу понять, почему выбивает ноль, помогите найти ошибку в коде, спасибо))) #include &lt;stdio.h&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru