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

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

Войти
Регистрация
Восстановить пароль
 
Golum
0 / 0 / 0
Регистрация: 23.09.2011
Сообщений: 3
#1

помогите с подсчетом букв. - C++

23.09.2011, 19:33. Просмотров 537. Ответов 8
Метки нет (Все метки)

Здравствуйте,
Помогите, пожалуйста, дописать мой код. Вобщем программка должна подсчитывать количество каждого символа в веденной строке и выводить в таблицу.

Вот мой код. Сильно не ругайте=) Только учусь.

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
int kol;
double otnch, entropia;
wchar_t c,k;
UnicodeString s;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//s=Ed->Text;
s="шла саша по шоссе и сосала сушку.";
SG->FixedCols=0;
SG->FixedRows=0;
SG->ColCount=5;
SG->RowCount=s.Length()+1;
SG->Cells[0][0]="№"; SG->ColWidths[0]=20;
SG->Cells[1][0]="Знак"; SG->ColWidths[1]=30;
SG->Cells[2][0]="Частота"; SG->ColWidths[2]=50;
SG->Cells[3][0]="Относительная частота (pi)"; SG->ColWidths[3]=150;
SG->Cells[4][0]="Энтропия (-pi*log2pi)"; SG->ColWidths[4]=115;
 
for (int k=1; k<s.Length()+1; k++){
    c=s[k];
    for (int i=1; i<s.Length()+1; i++){
        if (c==s[i]){
            ++kol;
        }
    }
    otnch=kol/(float)s.Length();
    entropia=(-otnch)*(log(otnch)/log(2.0));
    SG->Cells[0][k]=k;
    SG->Cells[1][k]=c;
    SG->Cells[2][k]=kol;
    SG->Cells[3][k]=otnch;
    SG->Cells[4][k]=entropia;
    kol=0;
}
}
Вобщем все считает правильно и выводит.
НО подсчитывает по несколько раз один и тот же символ.
Пример: строка "шла саша"
Выводит:
ш-2
л-1
а-3
" "-1
с-1
а-3
ш-2
а-3
Должен выводить:
ш-2
л-1
а-3
" "-1
с-1

Как это осуществить?

 Комментарий модератора 
Используйте теги форматирования кода!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2011, 19:33     помогите с подсчетом букв.
Посмотрите здесь:

Помогите написать программы по нахождению букв в предложении - C++
Определите количество повторяющихся букв в слове. После каждой буквы &quot;о&quot; в слове вставьте сочетание &quot;ля&quot;. Вычеркните из слова все буквы...

Сортировка подсчетом - C++
Есть код: #include &quot;head.h&quot; void main() { setlocale(LC_ALL,&quot;.1251&quot;); int *x,in,i,n=0,max,min,temp; char c; double sign;...

Сортировка подсчетом с++ - C++
Всем привет. Есть такая проблемка. vs2010 выдает &quot;Прекращена работа программы&quot;. Задание - ввод данных в массив, его нужно отсортировать...

Исправить сортировку подсчетом - C++
Всем привет! Есть программа сортировки подсчетом #include &lt;fstream&gt; #include &lt;iostream&gt; using namespace std; int a; ...

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

Сортировка подсчетом вектора точек - C++
Ребята, нужна помощь! Нужно реализовать сортировку подсчетом для вектора точек. Есть некий шаблон для функции. P.S. идея в том,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DStranger
2 / 2 / 0
Регистрация: 13.09.2011
Сообщений: 12
24.09.2011, 00:09     помогите с подсчетом букв. #2
Как-то слишком сложно у вас! )
Можно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <map>
 
using namespace std;
 
int main()
{
    map<char, long> counter;
    string str;
 
    cout << "Enter a string" << endl;
    getline(cin, str);
 
    for (string::size_type i = 0; i != str.size(); ++i)
        ++counter[str.at(i)];
 
    for (map<char, long>::iterator iter = counter.begin();
                    iter != counter.end(); ++iter)
                    cout << (*iter).first << " - " << (*iter).second << endl;
    return 0;
}
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
24.09.2011, 05:55     помогите с подсчетом букв. #3
Или даже так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <string>
#include <map>
#include <iostream>
 
std::map<char, int> calcChars(const std::string &source) {
  std::map<char, int> result;
  for (std::string::const_iterator i = source.begin(); i != source.end(); ++i)
    ++result[*i];
  return result;
}
 
int main(int argc, char *argv[]) {
  std::map<char, int> calculatedCharacters = calcChars("bazilika");
  for (std::map<char, int>::iterator i = calculatedCharacters.begin();
    i != calculatedCharacters.end(); ++i)
    std::cout << i->first << " " << i->second << std::endl;
  return 0;
}
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.09.2011, 07:54     помогите с подсчетом букв. #4
На С как-то так можно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#define SIZE 256
 
int main()
{
    char str[SIZE];
    fgets( str, SIZE, stdin );
    
    int counts[129] = { };
    for (int i = 0 ; str[i] ; ++i)
        ++counts[ str[i] ];
    
    for (int i = 'A' ; i <= 'Z' ; ++i)
        if ( counts[i] )
            printf("'%c' - %d times\n", i, counts[i]);
}
Golum
0 / 0 / 0
Регистрация: 23.09.2011
Сообщений: 3
24.09.2011, 09:54  [ТС]     помогите с подсчетом букв. #5
Почему же сложно у меня? =)
Подсчет ведет только вот эта часть кода:
C++
1
2
3
4
5
6
7
for (int k=1; k<s.Length()+1; k++){
        c=s[k];
        for (int i=1; i<s.Length()+1; i++){
                if (c==s[i]){
                        ++kol;
                }
        }
А эти строчки считают относительную частоту и энтропию.
C++
1
2
otnch=kol/(float)s.Length();
entropia=(-otnch)*(log(otnch)/log(2.0));
Остальное это настройка StringGrid и вывод на форму.

Я вот думал так. При проходе и подсчете букв из строки удалять подсчитанный символ. Но s.erase(позиция,количество). Не хочет запускаться. Может как нить можно именно этот код дополнить чтоб работал?
Либо Еще думал добавить какое нибудь условие, чтобы уже посчитанную букву , когда он встает на такую же второй раз не считал, а проходил дальше.
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
25.09.2011, 00:21     помогите с подсчетом букв. #6
Странный алгоритм. Считает что-то странное. Зачем два вложенных цикла?

Все, что нужно -- завести контейнер а-ля map (на худой конец, двойной массив), где ключем является символ, а значением -- его количество, пройтись по строке, увеличивая в контейнере (ну или массиве же) соответствующее ключу-символу значение на еиницу.

И получите количество всех символов. Потом уже можно вычислять все остальное.
xAtom
914 / 739 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
25.09.2011, 03:05     помогите с подсчетом букв. #7
Golum, вот вариант ещё посмотри без учёта регистра букв A=a.
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 <stdio.h>
#include <string.h>
#include <ctype.h>
 
int main(void) {
   char buf[] = "AAXAAAbbXsssaaaaYYYYxxxxxXiiixxx";
   char* iter, *ptr, *end;
   int  cnt, ch;
   end = buf + strlen(buf);
 
   for(iter = buf; iter != end; ++iter) {
       ch = tolower(*iter);
       for(cnt = 0, ptr = buf; ptr != end; ++ptr) {
            if(tolower(*ptr) == ch && *ptr) {
                  cnt++;
                 *ptr = '\0';
            }
        }
        if(cnt) { // получаем символ и кол-во его в строке
              printf("sign: %c, count: %d\n", ch, cnt);
        }
  }
  getchar();
  return 0;
}
IrineK
Заблокирован
27.09.2011, 15:06     помогите с подсчетом букв. #8
Golum, ЭТО скрывалось в вашей программе? :
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <vcl.h>
#include <math.h>
#pragma hdrstop
 
#include "un.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int kol, i, k, m;
double otnch, entropia;
char c;
const char s[] ="шла саша по шоссе и сосала сушку.";
int len = strlen(s);
 
//массив - маска для исходной строки,
//0 в массиве <-> буква в строке еще не подсчитывалась,
//1 <-> буква уже подсчитана
int *masq = new int [len];
for(i=0;i<len;i++)
        masq[i] = 0;
 
//шапка таблицы
SG->ColCount=5;
SG->RowCount=len+1;
SG->Cells[0][0]="№"; SG->ColWidths[0]=20;
SG->Cells[1][0]="Знак"; SG->ColWidths[1]=30;
SG->Cells[2][0]="Частота"; SG->ColWidths[2]=50;
SG->Cells[3][0]="Относительная частота (pi)"; SG->ColWidths[3]=150;
SG->Cells[4][0]="Энтропия (-pi*log2pi)"; SG->ColWidths[4]=115;
 
//k - позиция буквы в исходной строке
//m - строка в таблице вывода
for (k=0,m=1,kol = 0; k<len; k++)
{   if(!masq[k])//такой буквы еще не было
    {  c=s[k];
       masq[k] = 1;     //необязательно, для полноты "маскировки"
       kol++;           //по крайней мере одна такая буква есть
       for (i=k+1; i<len; i++)
             if (c==s[i])               //если есть повтор на позиции i
                {       masq[i]=1;      //букву на позиции i в дальнейшем
                                        // не обрабатывать
                        kol++;          //еще одна такая буква есть
                }
        otnch=1.0*kol/len;
        entropia=(-otnch)*(log(otnch)/log(2.0));
        SG->Cells[0][m]=AnsiString(k);
        SG->Cells[1][m]=AnsiString(s[k]);
        SG->Cells[2][m]=AnsiString(kol);
        SG->Cells[3][m]=AnsiString(otnch);
        SG->Cells[4][m]=AnsiString(entropia);
        m++;  //переход на следующую строку в таблице вывода
        kol=0;
    }
}
 
//убираем мусор сами
delete [] masq;
}
Результат:
Миниатюры
помогите с подсчетом букв.  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2011, 17:39     помогите с подсчетом букв.
Еще ссылки по теме:

Сортировка подсчетом нужно решение на С++ - C++
Задача: Выходной массив заполняется значениями - 1, затем для каждого элемента определяется его место в выходном массива путем подсчета...

Трудности с итерацией и подсчетом количеста функций - C++
Возникли трудности в подсчете количества итераций и количества функций #include &lt;iostream&gt; #include&lt;windows.h&gt; using namespace...

Затруднения с итерацией и подсчетом количеста функций - C++
Подскажите, что не так делаю #include &lt;iostream&gt; #include &lt;conio.h&gt; //для _getch() #include &lt;math.h&gt; //для pow(), sqrt() ...

Сравнить сортировку пузырьком с сортировкой подсчетом - C++
Нужно написать который бы сравнивал сортировку пузырьком с сортировкой подсчетом. Нужно вычислить время выполнения и т. д. и т. п.


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

Или воспользуйтесь поиском по форуму:
Golum
0 / 0 / 0
Регистрация: 23.09.2011
Сообщений: 3
27.09.2011, 17:39  [ТС]     помогите с подсчетом букв. #9
Цитата Сообщение от IrineK Посмотреть сообщение
Golum, ЭТО скрывалось в вашей программе? :
Именно так все и задумывалось=) Спасибо огромное за помощь!
Yandex
Объявления
27.09.2011, 17:39     помогите с подсчетом букв.
Ответ Создать тему
Опции темы

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