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

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

Восстановить пароль Регистрация
 
lp_4eva
Учусь...
 Аватар для lp_4eva
59 / 2 / 1
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 13:32     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #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
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include< stdio.h>
#include< conio.h>
#include< string.h>
#include <iostream>
#include <fstream>
#include <cmath>
 
using namespace std;
struct node
{
 char sym[256];
 float pro;
 int arr[20];
 int top;
 double total;
}s[256];
 
typedef struct node node;
 
void prints(int l,int h,node s[])
{
 int i;
 for(i=l;i<=h;i++)
 {
 printf("\n%s\t%f",s[i].sym,s[i].pro);
 }
}
 
void shannon(int l,int h,node s[])
{
 float pack1=0,pack2=0,diff1=0,diff2=0;
 int i,d,k,j;
 if((l+1)==h || l==h || l>h)
 {
 if(l==h || l>h)
 return;
 s[h].arr[++(s[h].top)]=0;
 s[l].arr[++(s[l].top)]=1;
 return;
 }
 else
 {
 for(i=l;i<=h-1;i++)
 pack1=pack1+s[i].pro;
 pack2=pack2+s[h].pro;
 diff1=pack1-pack2;
 if(diff1< 0)
 diff1=diff1*-1;
 j=2;
 while(j!=h-l+1)
 {
 k=h-j;
 pack1=pack2=0;
 for(i=l;i<=k;i++)
 pack1=pack1+s[i].pro;
 for(i=h;i>k;i--)
 pack2=pack2+s[i].pro;
 diff2=pack1-pack2;
 if(diff2< 0)
 diff2=diff2*-1;
 if(diff2>=diff1)
 break;
 diff1=diff2;
 j++;
 }
 k++;
 for(i=l;i<=k;i++)
 s[i].arr[++(s[i].top)]=1;
 for(i=k+1;i<=h;i++)
 s[i].arr[++(s[i].top)]=0;
 shannon(l,k,s);
 shannon(k+1,h,s);
 }
}
 
void main()
{
 
 int n,i,j;
 float x;
 //double total = 0.0;
 char ch[10];
 node temp;
 ifstream ofile;
ofstream infile;
 
 ofile.open("1.txt");
 
  if(!ofile)cout<<"\n File not found ";
 
 
//clrscr();
 printf("Symbol vstre4aetsya\t: ");
 
 while(!ofile.eof()){
     ofile>>s[i].sym;
     for(int i=0; s[i].sym; i++)  
    s[i].arr[s[i].sym]++;
 //scanf("%d",&n);
 for(int i=0;i<256;i++){
     s[i].total++;
     if(s[i].sym){
           cout<<"\n    "<<char(i)<<"           "<<s[i].sym<<" raz \n ";
            s[i].pro= s[i].sym /s[i].total;
           cout<<"\n Veroyatnost:    "<<"           "<<s[i].pro<<" ";
 
}
}
 
}
 
 for(j=1;j<=n-1;j++)
 {
 for(i=0;i< n-1;i++)
 {
 if((s[i].pro)>(s[i+1].pro))
 {
 temp.pro=s[i].pro;
 strcpy(temp.sym,s[i].sym);
 s[i].pro=s[i+1].pro;
 strcpy(s[i].sym,s[i+1].sym);
 s[i+1].pro=temp.pro;
 strcpy(s[i+1].sym,temp.sym);
 }
 }
 }
 for(i=0;i< n;i++)
 s[i].top=-1;
 
 shannon(0,n-1,s);
printf("---------------------------------------------------------------");
 printf("\n\n\n\tSymbol\tProbability\tCode");
 for(i=n-1;i>=0;i--)
 {
 printf("\n\t%s\t%f\t",s[i].sym,s[i].pro);
 for(j=0;j<=s[i].top;j++)
 printf("%d",s[i].arr[j]);
 }
printf("\n---------------------------------------------------------------");
 getch();
}
Выдает ошибку типа говорится что разные типы и нельзя делить char на double
Еще одна ошибка s[i].arr[s[i].sym]++;
Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно???
Помогите исправить...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2011, 13:32     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно???
Посмотрите здесь:

как сделать чтобы дружественная функция классу принимал ааргумент типа "класс" который при создании ничем не инициализирован? C++
C++ Сформировать строку S таким образом, чтобы в нее попеременно вошли четные символы строки S1 и нечетные символы строки S2.
данный код считает количество нечетных элементов в столбце , но он считает не для каждого столбца , как сделать , чтобы считал для каждого?подскажите C++
Как использовать символы из русского алфавита, а так же символы типа "█" "░" и т.д.? C++
Задана строка, символы которой могут повторяться. Нужно удалить все символы строки с помощью наименьшего количества вычеркиваний C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mc.Duck
Заблокирован
22.11.2011, 13:48     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #2
lp_4eva, решать задачу полностью не буду, так как ты обьяснила нифига не понятно)))
Но подсказать решение могу.
Решение:
1)Как ты знаешь(или не знаешь) в таблице символов windows(ascii) 255 символов.
Вот заведи в своей программе масив типа int с размерностью 255(допустим имя массива - mass).

2)Поочередно считываешь из строки символ, преобразовываешь его в int
(то есть в номер в таблице символов). Например, (int)'A'=65 и элемент
массива с индексом преобразованного символа увеличиваешь на единицу
(в нашем случае это 65, поэтому mass[65]++)

3)В конце считывания из строки символов, поочередно проверяй не равен ли элемент массива нулю.
Сделай это циклом for(допустим, for(int i=1;i<=255;i++)).
Если нет, то преобразоваваешь индекс элемента массива в char(в символ и выводишь его значение)
Пример:
C++
1
if(mass[i]>0) cout<<(char)i<<"  "<<mass[i]<<endl;
4)Надеюсь, логика ясна?
lp_4eva
Учусь...
 Аватар для lp_4eva
59 / 2 / 1
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 13:55  [ТС]     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #3
Цитата Сообщение от mc.Duck Посмотреть сообщение
Поочередно считываешь из строки символ, преобразовываешь его в int
(то есть в номер в таблице символов).
Вот это я и пыталась сделать
C++
1
2
3
4
5
6
7
printf("Symbol vstre4aetsya\t: ");
 while(!ofile.eof()){
     ofile>>s[i].sym;
     for(int i=0; s[i].sym; i++)  
    s[i].arr[s[i].sym[i]]++;
 for(int i=0;i<256;i++){
     total++;
Если точнее то здесь
C++
1
2
 for(int i=0; s[i].sym; i++)  
    s[i].arr[s[i].sym[i]]++;
Но он у меня неправильно считает...
Я просто хочу чтобы символы которые хранятся в файле хранился в char затем нужен типа счетчик который записывает сколько всего их было это как бы здесь total. Затем есть некий int arr который хранит количество одного символа и затем находит их вероятность то есть делит вот этот arr /total.
А затем дальше с этим значением и выполняется метод шэннона фано. у меня проблемы кажется с приведением типов.
mc.Duck
Заблокирован
22.11.2011, 14:05     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #4
lp_4eva, ну вот код - все работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
     int main()
     {
         char str[]="If you would be great you must do something...";  //твоя строка)))
         int mass[255];                                                               //далее - все, как я говорил)
         for(int i=1;i<=255;i++) mass[i]=0;
         for(int i=1;i<=strlen(str);i++) 
         {
                 char ch=str[i-1];
                 int symb=ch;
                 mass[symb]++;
                 } 
                 for(int i=1;i<=255;i++) if(mass[i]>0) cout<<(char)i<<"  "<<mass[i]<<endl; 
 
//cin.get();
system("Pause");
 }
lp_4eva
Учусь...
 Аватар для lp_4eva
59 / 2 / 1
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 15:12  [ТС]     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #5
Вот переделала сделала вроде как надо...
Но проблема в том что он не выводит результат...
Вообще
Почему?
Помогите разобраться=)
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include< stdio.h>
#include< conio.h>
#include< string.h>
#include <iostream>
#include <fstream>
#include <cmath>
 
using namespace std;
struct node
{
 char sym[1000];
 float pro;
 int arr[20];
 int top;
 double total;
}s[255];
 
typedef struct node node;
 
void shannon(int l,int h,node s[])
{
 float pack1=0,pack2=0,diff1=0,diff2=0;
 int i,d,k,j;
 if((l+1)==h || l==h || l>h)
 {
 if(l==h || l>h)
 return;
 s[h].arr[++(s[h].top)]=0;
 s[l].arr[++(s[l].top)]=1;
 return;
 }
 else
 {
 for(i=l;i<=h-1;i++)
 pack1=pack1+s[i].pro;
 pack2=pack2+s[h].pro;
 diff1=pack1-pack2;
 if(diff1< 0)
 diff1=diff1*-1;
 j=2;
 while(j!=h-l+1)
 {
 k=h-j;
 pack1=pack2=0;
 for(i=l;i<=k;i++)
 pack1=pack1+s[i].pro;
 for(i=h;i>k;i--)
 pack2=pack2+s[i].pro;
 diff2=pack1-pack2;
 if(diff2< 0)
 diff2=diff2*-1;
 if(diff2>=diff1)
 break;
 diff1=diff2;
 j++;
 }
 k++;
 for(i=l;i<=k;i++)
 s[i].arr[++(s[i].top)]=1;
 for(i=k+1;i<=h;i++)
 s[i].arr[++(s[i].top)]=0;
 shannon(l,k,s);
 shannon(k+1,h,s);
 }
}
 
void main()
{
 int n=0;
 int i = 0;
 int j = 0;;
 float x=0;
 float total=0.0;
 char ch[10];
 node temp;
 ifstream ofile;
 ofstream infile;
 
 ofile.open("1.txt");
 
  if(!ofile)
      cout<<"\n File not found ";
 
  ofile>>s[i].sym;
   for(i=0;i<n;i++)
 {
 cout<<"The symbols are: ---> "<<s[i].sym;
 }
 for(i=0;i<n;i++)
 {
     s[i].pro= s[i].sym[i] /s[i].total;
 cout<<"\n\tProbability for %s ---> "<<s[i].sym<<"is: "<<s[i].pro;;
 s[i].pro=x; 
 total=total+s[i].pro;
 }
 s[i].pro=1-total;
 for(j=1;j<=n-1;j++)
 {
 for(i=0;i< n-1;i++)
 {
 if((s[i].pro)>(s[i+1].pro))
 {
 temp.pro=s[i].pro;
 strcpy(temp.sym,s[i].sym);
 s[i].pro=s[i+1].pro;
 strcpy(s[i].sym,s[i+1].sym);
 s[i+1].pro=temp.pro;
 strcpy(s[i+1].sym,temp.sym);
 }
 }
 }
 for(i=0;i< n;i++)
 s[i].top=-1;
 
 shannon(0,n-1,s);
printf("---------------------------------------------------------------");
 printf("\n\n\n\tSymbol\tProbability\tCode");
 for(i=n-1;i>=0;i--)
 {
 printf("\n\t%s\t%f\t",s[i].sym,s[i].pro);
 for(j=0;j<=s[i].top;j++)
 printf("%d",s[i].arr[j]);
 }
printf("\n---------------------------------------------------------------");
 getch();
}
mc.Duck
Заблокирован
22.11.2011, 15:14     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #6
lp_4eva, мой код смотрела?)
lp_4eva
Учусь...
 Аватар для lp_4eva
59 / 2 / 1
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 15:17  [ТС]     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #7
Спасибо
Да но я не смогла их приклеить к моему коду=(
Сделала как поняла...
Но че-то вообще не выходит
mc.Duck
Заблокирован
22.11.2011, 15:19     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #8
lp_4eva, советую полность переписать код - поверь, так будет легче и гораздо быстрее.
Раньше ты не знала как реальзовать, а сейас уже знаешь)
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.11.2011, 15:38     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #9
Цитата Сообщение от lp_4eva
Выдает ошибку типа говорится что разные типы и нельзя делить char на double
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
using namespace std;
 
int main()
{
    char c = 'A';
    double d = 1.5;
    
    cout << c / d << endl;
    return 0;
}
Код
[guest@localhost tests]$ .iso++ t.cpp -o t
[guest@localhost tests]$ ./t
43.3333
[guest@localhost tests]$
Цитата Сообщение от mc.Duck
1)Как ты знаешь(или не знаешь) в таблице символов windows(ascii) 255 символов.
256 там
lp_4eva
Учусь...
 Аватар для lp_4eva
59 / 2 / 1
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 15:40  [ТС]     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #10
да эту ошибку я исправила
только вот теперь он вообще никакой результат не выдает
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.11.2011, 15:44     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream in("file.txt");
    char c;
    
    if (in >> c)
        cout << int(c) << endl;
    if (in >> c)
        cout << int(c) << endl;
    in.close();
    return 0;
}
Код
[guest@localhost tests]$ echo -e "\x00abc" >file.txt
[guest@localhost tests]$ .iso++ t.cpp -o t
[guest@localhost tests]$ ./t
0
97
[guest@localhost tests]$
нуль-символ тоже может быть

lp_4eva, много букв у тебя в программе
если это и есть задание, то делается оно проще
lp_4eva
Учусь...
 Аватар для lp_4eva
59 / 2 / 1
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 15:47  [ТС]     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #12
Цитата Сообщение от accept Посмотреть сообщение
много букв у тебя в программе
в смысле???
слишком закручен?
а как ее можно упростить?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.11.2011, 15:57     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #13
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
bool count_chars(ifstream &in, int chs[]);
 
int main()
{
    ifstream in("file.txt");
    int chs[256] = { 0 };
    
    if (count_chars(in, chs))
        for (int i = 0; i < 256; i++)
            cout << chs[i] << (i + 1 < 256 ? " " : "\n");
    in.close();
    return 0;
}
 
bool count_chars(ifstream &in, int chs[])
{
    char c;
    
    while (in.get(c))
        chs[int(c)]++;
    return in.eof() ? true : false;
}
Код
[guest@localhost tests]$ echo abcd >file.txt
[guest@localhost tests]$ .iso++ t.cpp -o t
[guest@localhost tests]$ ./t
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[guest@localhost tests]$ .hex file.txt
00000000  61 62 63 64 0a                                    |abcd.|
00000005
[guest@localhost tests]$
lp_4eva
Учусь...
 Аватар для lp_4eva
59 / 2 / 1
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 16:07  [ТС]     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #14
Вы меня совсем запутали=)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2011, 16:23     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно???
Еще ссылки по теме:

Как сделать чтобы лишние символы не оставались в консоли ? C++
C++ Как сделать чтобы в постфиксной записи кроме цифр выводились еще и обычные символы
C++ Из заданного текста выбрать те символы, которые встречаются в нём ровно один раз

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.11.2011, 16:23     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? #15
у тебя там ещё какая-то вероятность
Yandex
Объявления
22.11.2011, 16:23     Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно???
Ответ Создать тему
Опции темы

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