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

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

Восстановить пароль Регистрация
 
Golum
0 / 0 / 0
Регистрация: 23.09.2011
Сообщений: 3
23.09.2011, 19:33     помогите с подсчетом букв. #1
Здравствуйте,
Помогите, пожалуйста, дописать мой код. Вобщем программка должна подсчитывать количество каждого символа в веденной строке и выводить в таблицу.

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

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

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

 Комментарий модератора 
Используйте теги форматирования кода!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
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
 Аватар для diagon
1920 / 1186 / 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
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
25.09.2011, 00:21     помогите с подсчетом букв. #6
Странный алгоритм. Считает что-то странное. Зачем два вложенных цикла?

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

И получите количество всех символов. Потом уже можно вычислять все остальное.
xAtom
 Аватар для xAtom
910 / 735 / 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++
C++ Сортировка подсчетом с++
C++ Помогите написать программы по нахождению букв в предложении

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

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

Текущее время: 21:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru