Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
2 / 2 / 0
Регистрация: 25.10.2018
Сообщений: 289

Посчитать количество вхождений в текст каждого символа

15.09.2019, 10:16. Показов 3838. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужна программа, которая считает количество вхождений в текст каждого символа.
Вот мой код:

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
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
 
int main()
{
    string text = "", symbol = "";
    int count[256] = { 0 };
    int f = 0;
    
    //считываем текст
    cout << "Input the text:" << endl;
    getline(cin, text); 
    
    //меняем заглавные буквы на строчные
    transform(text.begin(), text.end(), text.begin(), tolower); 
    
    //считаем количество вхождений каждого символа
    //(если посчитали, то заменяем на '^')
    for (int i = 0; i < text.length(); i++)
    {
        if (text[i] != '^') 
        {
            symbol += " ";
 
            symbol[f] = text[i];
            count[f]++;
            text[i] = '^';
            for (int j = i + 1; j < text.length(); j++)
            {
                if (text[j] != '^' && text[j] == symbol[f])
                {
                    text[j] = '^'; 
                    count[f]++;
                }
                    
            }
            f++;
        }
 
    }
 
    //выводим символ и его количество вхождений в текст
    cout << endl;
    for (int i = 0; i < symbol.length(); i++) cout << symbol[i] << "\t";
    cout << endl;
    for (int i = 0; i < symbol.length(); i++) cout << count[i] << "\t";
    cout << endl;
 
    system("pause");
    return 0;
}
1) Почему-то заглавные буквы не меняются на строчные.
2) Не знаю, как упорядочить при выводе символы по количеству их вхождений (по убыванию).
Миниатюры
Посчитать количество вхождений в текст каждого символа  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.09.2019, 10:16
Ответы с готовыми решениями:

Определить количество вхождений каждого символа
cout &lt;&lt; &quot;Введите строку: &quot;; cin.get(); getline(cin, str1); if (str1.empty() == true) { cout &lt;&lt;&quot; Ошибка!Вы ничего не...

Определить количество вхождений каждого символа в строке
Помогите решить задачу! Вот условие: После ввода с клавиатуры произвольного строки выдать на экран протокол о количестве вхождений...

Подсчитать количество вхождений каждого символа в строку
например у Вас есть строка: asddsg В выходной файле, куда Вы запишите результаты работы программы будет: a – 1 s – 2 d – 2 g – 1

16
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
15.09.2019, 10:46
так подойдёт ?
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
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
 
int main() 
{
    string s;
    cout << "String:\n";
    getline(cin, s);
 
    map <char,int> m;
    for (size_t i = 0; i < s.size(); i++) m[s[i]]++;
    
    multimap<int,char> mm;
    for(map<char,int>::iterator p = m.begin();p != m.end();p++)
        mm.insert(make_pair(p->second,p->first));
    
    for (auto i = mm.begin(); i != mm.end(); i++)
    cout << i->second << "->" << i->first << "\n";  
    
system("pause");
return 0;
}
1
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
15.09.2019, 11:00
Yetty, Если выкинуть multimap, будет вообще огонь.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
15.09.2019, 11:10
Цитата Сообщение от nalbe666 Посмотреть сообщение
Yetty, Если выкинуть multimap, будет вообще огонь.
так давай код, кто же против ?

wwmax, если в строчные хотите перевести к библиотекам добавьте #include <cctype>, а после ввода строки
C++
1
2
3
4
5
6
    size_t i=0;
    while(s[i])
    {
        s[i]=tolower(s[i]);
        i++;
    }
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
15.09.2019, 11:13
Yetty, Зачем мне копипастить ваш код без 2х строчек?
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
15.09.2019, 11:18
nalbe666, что-то я тебя не понимаю, там ещё сортировка по количеству. сбрасывай свой вариант.
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
15.09.2019, 11:25
Yetty, Потому, что я прочитал только первое условие, пропустив всё после слов "вот мой код". Тогда всё и так огонь.
0
2 / 2 / 0
Регистрация: 25.10.2018
Сообщений: 289
15.09.2019, 11:42  [ТС]
Спасибо, но нет. Мне нужно переделать МОЙ код
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
15.09.2019, 12:05
Цитата Сообщение от wwmax Посмотреть сообщение
Мне нужно переделать МОЙ код
как перевести заглавные в строчные Вам показал. А массивы в Вашем коде просто отсортируйте по убыванию, например пузырьком.

не заметил, что в моём варианте по возрастанию вывел, там очень просто переделать на убывание. но раз не интересует, то и корректировать смысла нет
0
2 / 2 / 0
Регистрация: 25.10.2018
Сообщений: 289
15.09.2019, 12:13  [ТС]
Хорошо, спасибо. Сделал, как у вас. Английские буквы меняются на строчные, а русские - нет.

А насчет сортировки массивов: отсортировать массив с количествами вхождений я понимаю как. А как отсортировать вместе с ним массив с символами? Можете показать на моем коде, пожалуйста?
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
15.09.2019, 13:50
Цитата Сообщение от wwmax Посмотреть сообщение
Английские буквы меняются на строчные, а русские - нет.
tolower c русскими буквами не работает. это сами разбирайтесь - буквы должны идти блоками. примерно так: если символ принадлежит первому блоку (заглавные) прибавить число чтобы он превратился в строчный.
Цитата Сообщение от wwmax Посмотреть сообщение
вместе с ним массив с символами
зачем вместе ? сортируйте отдельно. строку можно так:
C++
1
sort(s.begin(), s.end(), greater<char>());
Цитата Сообщение от wwmax Посмотреть сообщение
Можете показать на моем коде, пожалуйста?
всё Вам рассказал выше. код напишите сами, если будут вопросы - задавайте.
1
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
15.09.2019, 22:20
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
#include <iostream>
using namespace std;
 
int main()
{
   string text = "";
   int symbol[256]={0};
 
   getline(cin, text);
   for(int i=0;i<text.length();i++){
      int bukva=(int)text[i];
      if(bukva>0){
            if(bukva>='a' && bukva<='z')
                   bukva-=' ';
            if(bukva>='A' && bukva<='Z')
                   symbol[bukva]++;
         }
      if(bukva<0){
            bukva+=256;
            if(bukva>=160 && bukva<=175)
                    bukva-=' ';
            if(bukva>=224 && bukva<=239)
                     bukva-=80;
            if(bukva>=128 && bukva<=159)
                   symbol[bukva]++;
          }
      }
 
    for(int i=0;i<256;i++)
    if(symbol[i]!=0) cout<<(char)i<<"  "<<symbol[i]<<"\n";
 
    system("pause");
    return 0;
}
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
15.09.2019, 23:14
повар1,
Цитата Сообщение от wwmax Посмотреть сообщение
как упорядочить при выводе символы по количеству их вхождений (по убыванию).
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
16.09.2019, 10:06
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
#include <iostream>
using namespace std;
 
int main()
{
   string text = "";
   int symbol[256]={0};
 
   getline(cin, text);
   for(int i=0;i<text.length();i++){
      int bukva=(int)text[i];
      if(bukva>0){
            if(bukva>='a' && bukva<='z')
                   bukva-=' ';
            if(bukva>='A' && bukva<='Z')
                   symbol[bukva]++;
         }
      if(bukva<0){
            bukva+=256;
            if(bukva>=160 && bukva<=175)
                    bukva-=' ';
            if(bukva>=224 && bukva<=239)
                     bukva-=80;
            if(bukva>=128 && bukva<=159)
                   symbol[bukva]++;
          }
      }
    int max=0;
    for(int i=0;i<256;i++)
         if(max<symbol[i])max=symbol[i];
    while(max>0){
    for(int i=0;i<256;i++)
           if(symbol[i]==max) cout<<(char)i<<"  "<<symbol[i]<<"\n";
           max--;
           }
    system("pause");
    return 0;
}
1
2 / 2 / 0
Регистрация: 25.10.2018
Сообщений: 289
16.09.2019, 12:26  [ТС]
Огромное спасибо! Но я не очень понимаю Ваш код. Можете добавить к нему комментарии, пожалуйста?

Но было бы лучше, если бы Вы помогли мне добавить упорядовачивание в мой код:
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
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
 
int main()
{
    string text = "", symbol = "";
    int count[256] = { 0 };
    int f = 0;
    
    //считываем текст
    cout << "Input the text:" << endl;
    getline(cin, text); 
    
    //меняем заглавные буквы на строчные
    transform(text.begin(), text.end(), text.begin(), tolower); 
    
    //считаем количество вхождений каждого символа
    //(если посчитали, то заменяем на '^')
    for (int i = 0; i < text.length(); i++)
    {
        if (text[i] != '^') 
        {
            symbol += " ";
 
            symbol[f] = text[i];
            count[f]++;
            text[i] = '^';
            for (int j = i + 1; j < text.length(); j++)
            {
                if (text[j] != '^' && text[j] == symbol[f])
                {
                    text[j] = '^'; 
                    count[f]++;
                }
                    
            }
            f++;
        }
 
    }
 
    //выводим символ и количество его вхождений в текст
    cout << endl;
    for (int i = 0; i < symbol.length(); i++) cout << symbol[i] << "\t";
    cout << endl;
    for (int i = 0; i < symbol.length(); i++) cout << count[i] << "\t";
    cout << endl;
 
    system("pause");
    return 0;
}
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
16.09.2019, 13:48
wwmax, алгоритм такой:
1. так как в таблице символов 256 значений заводим массив symbol на эти значения.
Код символа равен индексу массива.
2. Преобразовываем строчные символы в заглавные:
Для этого от кода английского символа надо отнять 32, а это код пробела;
Русский символ обрабатываем так: прибавляем к нему 256 и для символов с кодами от 160 до 175
отнимаем 32, а для остальных 80.
3. Записываем в массив symbol символы введенной строки суммируя одинаковые .
4. Ищем максимальное количество одинаковых символов записанных в массив.
5. Выводим символы и их количество в порядке убывания
1
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
16.09.2019, 14:56
Цитата Сообщение от повар1 Посмотреть сообщение
Преобразовываем строчные символы в заглавные
повар1, ТС там заглавные в строчные переводит, но похоже ему всё равно в каком регистре выводить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.09.2019, 14:56
Помогаю со студенческими работами здесь

Посчитать количество вхождений заданного символа в строке, введённой пользователем
Дано : Пользователь вводит строку символов и искомый символ, посчитать сколько раз он встречается в строке. (С++) Вопрос: Как сделать,...

Посчитать количество вхождений каждого символа в файле
Дано: файл input.txt, содержащий строки. Требуется: посчитать количество вхождений каждого символа в файле и записать результат в файл...

Определить количество вхождений каждого символа в данный текст
Всем привет!!))) Мне необходимо написать програму на Assemblerе для подсчьота количества вхождения определеного символа введенного из...

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

Количество вхождений каждого символа в строке
Помогите решить задачу пожалуйста.Определить количество вхождений каждого символа в строке. Вот то что смог написать. #include...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru