2 / 2 / 0
Регистрация: 25.10.2018
Сообщений: 289
1

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

15.09.2019, 10:16. Показов 2735. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2019, 10:16
Ответы с готовыми решениями:

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

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

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

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

16
7422 / 5017 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
15.09.2019, 10:46 2
так подойдёт ?
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
817 / 504 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
15.09.2019, 11:00 3
Yetty, Если выкинуть multimap, будет вообще огонь.
0
7422 / 5017 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
15.09.2019, 11:10 4
Цитата Сообщение от 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
817 / 504 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
15.09.2019, 11:13 5
Yetty, Зачем мне копипастить ваш код без 2х строчек?
0
7422 / 5017 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
15.09.2019, 11:18 6
nalbe666, что-то я тебя не понимаю, там ещё сортировка по количеству. сбрасывай свой вариант.
0
817 / 504 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
15.09.2019, 11:25 7
Yetty, Потому, что я прочитал только первое условие, пропустив всё после слов "вот мой код". Тогда всё и так огонь.
0
2 / 2 / 0
Регистрация: 25.10.2018
Сообщений: 289
15.09.2019, 11:42  [ТС] 8
Спасибо, но нет. Мне нужно переделать МОЙ код
0
7422 / 5017 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
15.09.2019, 12:05 9
Цитата Сообщение от wwmax Посмотреть сообщение
Мне нужно переделать МОЙ код
как перевести заглавные в строчные Вам показал. А массивы в Вашем коде просто отсортируйте по убыванию, например пузырьком.

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

А насчет сортировки массивов: отсортировать массив с количествами вхождений я понимаю как. А как отсортировать вместе с ним массив с символами? Можете показать на моем коде, пожалуйста?
0
7422 / 5017 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
15.09.2019, 13:50 11
Цитата Сообщение от wwmax Посмотреть сообщение
Английские буквы меняются на строчные, а русские - нет.
tolower c русскими буквами не работает. это сами разбирайтесь - буквы должны идти блоками. примерно так: если символ принадлежит первому блоку (заглавные) прибавить число чтобы он превратился в строчный.
Цитата Сообщение от wwmax Посмотреть сообщение
вместе с ним массив с символами
зачем вместе ? сортируйте отдельно. строку можно так:
C++
1
sort(s.begin(), s.end(), greater<char>());
Цитата Сообщение от wwmax Посмотреть сообщение
Можете показать на моем коде, пожалуйста?
всё Вам рассказал выше. код напишите сами, если будут вопросы - задавайте.
1
756 / 566 / 313
Регистрация: 24.02.2017
Сообщений: 2,005
15.09.2019, 22:20 12
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
7422 / 5017 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
15.09.2019, 23:14 13
повар1,
Цитата Сообщение от wwmax Посмотреть сообщение
как упорядочить при выводе символы по количеству их вхождений (по убыванию).
0
756 / 566 / 313
Регистрация: 24.02.2017
Сообщений: 2,005
16.09.2019, 10:06 14
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  [ТС] 15
Огромное спасибо! Но я не очень понимаю Ваш код. Можете добавить к нему комментарии, пожалуйста?

Но было бы лучше, если бы Вы помогли мне добавить упорядовачивание в мой код:
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
756 / 566 / 313
Регистрация: 24.02.2017
Сообщений: 2,005
16.09.2019, 13:48 16
wwmax, алгоритм такой:
1. так как в таблице символов 256 значений заводим массив symbol на эти значения.
Код символа равен индексу массива.
2. Преобразовываем строчные символы в заглавные:
Для этого от кода английского символа надо отнять 32, а это код пробела;
Русский символ обрабатываем так: прибавляем к нему 256 и для символов с кодами от 160 до 175
отнимаем 32, а для остальных 80.
3. Записываем в массив symbol символы введенной строки суммируя одинаковые .
4. Ищем максимальное количество одинаковых символов записанных в массив.
5. Выводим символы и их количество в порядке убывания
1
7422 / 5017 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
16.09.2019, 14:56 17
Цитата Сообщение от повар1 Посмотреть сообщение
Преобразовываем строчные символы в заглавные
повар1, ТС там заглавные в строчные переводит, но похоже ему всё равно в каком регистре выводить
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2019, 14:56
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru