Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.61
crashc
23 / 23 / 4
Регистрация: 26.07.2009
Сообщений: 414
#1

Частотный анализ строки - C++

26.07.2009, 14:32. Просмотров 2335. Ответов 14
Метки нет (Все метки)

Помогите пожалуйста дописать программу выполняющую частотный анализ строки, введенной пользователем (т. е. вычисляющей, сколько раз в строку входит данный символ). Рапорт по каждому символу выдавать только один раз (например, символ “a” встречается в строке несколько раз, рапорт должен быть выдан один раз).
Как сделать это с символом, я понял. А как сделать со всей строкой?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma argsused
int main(int argc, char* argv[])
{int y=0;
 char g[10],*j;
 cout<<"Vvedite slova"<<endl;
 gets(g);
 j=strtok(g,"a");
  while (j != NULL)
  {
    j=strtok (NULL,"a");
    y++;
  }
 
   cout<<float(y)<<endl;
        cin.get();
        cin.get();
        return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2009, 14:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Частотный анализ строки (C++):

Частотный анализ - C++
#include&lt;stdio.h&gt; int Count(char *fname, int *count) { FILE *f; char c; if ((f = fopen(fname, &quot;r&quot;)) == NULL) ...

Частотный анализ текста - C++
Помогите решить задачу! Дана строка, содержащая текст, набранный заглавными русскими буквами. Провести частотный анализ текста, т.е....

Частотный анализ текста - C++
Вообщем задача, Есть текст в файле, необходимо определить, какие символы и сколько раз встречаются в тексте. Упорядочить их в порядке...

Частотный анализ текста (символьный) - C++
Частотный анализ текста (символьный). (Подсчитывается относительная частота встречаемости каждого символа в тексте.) Текст вводится из...

Частотный анализ байтов файла - C++
Помогите написать программу Вводятся имя файла произвольного содержания не длиннее 32 Кбайт и число k (k = 1...9) - см. ниже....

Частотный анализ текста (пословный) - C++
24. Частотный анализ текста (пословный). (Подсчитывается относительная частота встречаемости каждого слова в тексте; границами слов...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
26.07.2009, 14:51 #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
#include <iostream>
using namespace std;
 
int main()
{
    char str[255];
    char ch;
    int kol=0;
 
    cout << "Vvedite stroku:" << endl;
    cin.getline(str, sizeof(str));
    
    cout << "\nVvedite symvol: ";
    ch = cin.get();
 
    for (int i=0; i<strlen(str)-1; i++)
        if (str[i] == ch) kol++;
 
    cout << "\nSymvol vstrechaetsa " << kol << " raz! ;-)" << endl;
 
    system("pause");
    return 0;
}
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
26.07.2009, 14:52 #3
Цитата Сообщение от crashc Посмотреть сообщение
А как сделать со всей строкой?
используйте std::multiset<char>
кидайте в неё посимвольно строку.
потом функцией count выведите на экран кол-во повторений каждого символа.
***
ещё проще - карту std::map<char, int> использовать
0
crashc
23 / 23 / 4
Регистрация: 26.07.2009
Сообщений: 414
26.07.2009, 14:54  [ТС] #4
я имел ввиду как посчитать сколько раз каждый символ попадется в строке?
0
ISergey
Maniac
Эксперт С++
1374 / 885 / 52
Регистрация: 02.01.2009
Сообщений: 2,658
Записей в блоге: 1
26.07.2009, 14:54 #5
используйте std::multiset<char>
а std::set<char> чем плох?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
#include <algorithm>
#include <set>
int main()
{
    std::string str = "asdaaaasdfghhgfewripouipo";
    std::set<char> zstr;
    std::copy(str.begin(), str.end(),std::inserter(zstr,zstr.begin()));
    for(std::set<char>::iterator i = zstr.begin(); i != zstr.end(); ++i)
        std::cout << *i << " : " 
        << static_cast<int>( std::count(str.begin(), str.end(), *i) ) 
        << std::endl;
    return 0;
}
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
26.07.2009, 14:59 #6
Цитата Сообщение от ISergey Посмотреть сообщение
а std::set<char> чем плох?
вот этим:
Цитата Сообщение от ISergey Посмотреть сообщение
std::count(str.begin(), str.end(), *i)
лишние вычисления.
***
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <map>
#include <string>
#include <algorithm>
#include <utility>
#include <iostream>
 
void print(std::pair<char, int> rhs) {
  std::cout << rhs.first << ": " << rhs.second << std::endl;
}
int main()
{
  std::map<char, int> ms;
  std::string text("hello my dear friend");
 
  for (std::string::iterator it = text.begin();
       it != text.end();
       ++it) {
    ms[*it]++;
  }
 
  std::for_each(ms.begin(), ms.end(), print);
    return 0;
}
0
ISergey
Maniac
Эксперт С++
1374 / 885 / 52
Регистрация: 02.01.2009
Сообщений: 2,658
Записей в блоге: 1
26.07.2009, 15:11 #7
Цитата Сообщение от zim22 Посмотреть сообщение
лишние вычисления.
понял, но тогда цыкл прийдется так переделать
C++
1
2
3
4
5
6
    for(std::multiset<char>::iterator i = zstr.begin(); 
        i != zstr.end(); 
        i = std::upper_bound(zstr.begin(),zstr.end(),*i))
        std::cout << *i << " : " 
        << zstr.count(*i)
        << std::endl;
ещё проще - карту std::map<char, int> использовать
хм.. точно.
0
crashc
23 / 23 / 4
Регистрация: 26.07.2009
Сообщений: 414
26.07.2009, 15:18  [ТС] #8
Спасибо! А еще скажите пожалуйста как сделать так чтобы пользователь в последнем примере вводил сам в строку данные
0
M128K145
Эксперт С++
8288 / 3508 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
26.07.2009, 15:30 #9
На экзамене было задание написать оптимальный алгоритм для нахождения количества вхождений каждого символа в строку. Код вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdafx.h"
#include <iostream>
 
void main()
{
    char s[1000];
    std::cin.getline(s,1000);
    int i(0), j(0), max(0);
    int mas[256] = {0};
    while(s[i])
        mas[(int)s[i]]++, i++;
    std::cout<<std::endl;
    for(int i = 0; i < 256; ++i)
        if(mas[i])
            std::cout<<(char)i<<'\t'<<mas[i]<<std::endl;
    std::cin.get();
}
Но у меня остался один вопрос. Почему на вывод код русских букв идет один, а на ввод другой?
1
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
26.07.2009, 15:35 #10
Цитата Сообщение от ISergey Посмотреть сообщение
std::upper_bound(zstr.begin(),zstr.end(),*i))
я думаю, если multiset предоставляет свою специализированную функцию upper_bound то её и нужно использовать.
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
#include <iostream>
#include <string>
#include <algorithm>
#include <set>
int main()
{        
  std::multiset<char> zstr;
 
  zstr.insert('a');
  zstr.insert('b');
  zstr.insert('a');
  zstr.insert('c');
  zstr.insert('d');
 
  typedef std::multiset<char>::iterator ms_it;
  std::pair<ms_it, ms_it> pair;
 
   for(ms_it i = zstr.begin();  i != zstr.end(); i = zstr.upper_bound(*i)) {
     pair = zstr.equal_range(*i);                
     std::cout << *i 
               << ":" 
               << std::distance(pair.first, pair.second) 
               << std::endl;       
   }
   return 0;
}
1
crashc
23 / 23 / 4
Регистрация: 26.07.2009
Сообщений: 414
26.07.2009, 15:58  [ТС] #11
скорее такова структура ввода вывода символов

Добавлено через 18 минут 59 секунд
ISergey, скажи пожалуйста как можно переделать этот код так чтобы пользователь сам вводил данные
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
#include <algorithm>
#include <set>
int main()
{
        std::string str = "asdaaaasdfghhgfewripouipo";
        std::set<char> zstr;
        std::copy(str.begin(), str.end(),std::inserter(zstr,zstr.begin()));
        for(std::multiset<char>::iterator i = zstr.begin(); 
                i != zstr.end(); 
                i = std::upper_bound(zstr.begin(),zstr.end(),*i))
                std::cout << *i << " : " 
                << zstr.count(*i)
                << std::endl;
        return 0;
}
0
ISergey
Maniac
Эксперт С++
1374 / 885 / 52
Регистрация: 02.01.2009
Сообщений: 2,658
Записей в блоге: 1
26.07.2009, 16:03 #12
это
C++
1
 std::string str = "asdaaaasdfghhgfewripouipo";
замени на
C++
1
2
 std::string str;
 getline(std::cin, str);
1
crashc
23 / 23 / 4
Регистрация: 26.07.2009
Сообщений: 414
26.07.2009, 16:29  [ТС] #13
ISergey, в коде который ты написал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main(int argc, char* argv[])
{std::string r;
 getline(std::cin,r);
 std::set<char>zstr;
 std::copy(r.begin(), r.end(),std::inserter(zstr,zstr.begin()));
 for(std::multiset<char>::iterator i = zstr.begin();
                i != zstr.end(); 
                i = std::upper_bound(zstr.begin(),zstr.end(),*i))
                std::cout << *i << " : " 
                << zstr.count(*i)
                << std::endl;
        cin.get();
        cin.get();
        return 0;
он считает что каждый символ используется один раз. как сделать чтобы считал нормально?
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
26.07.2009, 16:41 #14
Цитата Сообщение от crashc Посмотреть сообщение
в коде который ты написал он считает что каждый символ используется один раз
iterators incompatible
Цитата Сообщение от crashc Посмотреть сообщение
std::multiset<char>::iterator i = zstr.begin();
Цитата Сообщение от crashc Посмотреть сообщение
std::set<char>zstr;
0
crashc
23 / 23 / 4
Регистрация: 26.07.2009
Сообщений: 414
26.07.2009, 18:09  [ТС] #15
Огромное спасибо за помощь
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2009, 18:09
Привет! Вот еще темы с ответами:

Частотный анализ. Криптоанализ шифра замены. С++ - C++
Доброго времени суток. Задача состоит в следующем: &quot;Дан зашифрованный файл, методом замены. Ключа и открытого текста нет. Надо...

Частотный анализ для шифра Цезаря - C++
Добрый день! Нужно было написать программу,которая кодирует шифр Цезаря. Это есть: #include &lt;iostream&gt; using namespace std; int...

Частотный анализ двухбуквенных сочетаний в русском языке - C++
Кто нибудь может провести частотный анализ двухбуквенных сочетаний в русском языке? например для какого нибудь технического текста? аа...

Подсчитать буквы в тексте и распределить их по частотным диапазонам (частотный анализ текста) - C++
Задание: Провести частотный анализ текста на украинском языке. Программа должна подсчитать буквы в тексте и распределить их по частотным...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.07.2009, 18:09
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru