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

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

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

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

23.09.2011, 19:33. Просмотров 541. Ответов 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

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

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

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

Дана строка с набором случайных символов, при вводе 10 букв первые 5 букв становятся большими , вторые 5 букв маленькими - C++
Дана строка с набором случайных символов, при вводе 10 букв первые 5 букв становятся большими , вторые 5 букв маленькими .Если непонятно то...

Сортировка подсчетом - 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++
Доброго времени суток. Написал код, вот только выдает ошибку: error C2061: синтаксическая ошибка: идентификатор &quot;a&quot;. error C2061:...

сортировка подсчетом! - C++
нужно написать програму, которая будет сортировать масив, методом подсчета! А так же во время выполнения программы обязательно выводить на...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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;
}
1
lemegeton
2924 / 1353 / 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;
}
1
diagon
Higher
1929 / 1195 / 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]);
}
1
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(позиция,количество). Не хочет запускаться. Может как нить можно именно этот код дополнить чтоб работал?
Либо Еще думал добавить какое нибудь условие, чтобы уже посчитанную букву , когда он встает на такую же второй раз не считал, а проходил дальше.
0
lemegeton
2924 / 1353 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
25.09.2011, 00:21 #6
Странный алгоритм. Считает что-то странное. Зачем два вложенных цикла?

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

И получите количество всех символов. Потом уже можно вычислять все остальное.
0
xAtom
915 / 740 / 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;
}
1
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;
}
Результат:
1
Миниатюры
помогите с подсчетом букв.  
Golum
0 / 0 / 0
Регистрация: 23.09.2011
Сообщений: 3
27.09.2011, 17:39  [ТС] #9
Цитата Сообщение от IrineK Посмотреть сообщение
Golum, ЭТО скрывалось в вашей программе? :
Именно так все и задумывалось=) Спасибо огромное за помощь!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2011, 17:39
Привет! Вот еще темы с ответами:

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

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

Алгоритмы сортировки. Подсчетом - C++
#include &lt;iostream&gt; #include &lt;time.h&gt; #include &lt;stdlib.h&gt; using namespace std; const int n = 10,m = 1; int a = {0}; ...

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


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

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

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