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

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

25.10.2016, 22:07. Показов 3007. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru