Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Учусь...
60 / 3 / 2
Регистрация: 20.03.2010
Сообщений: 167
1

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

22.11.2011, 13:32. Показов 1060. Ответов 14
Метки нет (Все метки)

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]++;
Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно???
Помогите исправить...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2011, 13:32
Ответы с готовыми решениями:

Как сделать чтобы считывал RTF в RichTextBox , место нормального текста символы
Вроде txt нормально открывает, а вот rtf. private void linkLabel1_LinkClicked(object sender,...

Как написать код, который ищет одинаковые символы
как написать код который ищет одинаковые символы(например номера паспорта)

Как сделать, чтобы калькулятор читал строку типа "2+2" и выводил результат?
Здравствуйте уважаемые форумчане.Сижу сегодня уже пол дня и ни как не могу разобраться, как мне...

Как правильно прописать fprintf, чтобы перекинуть символы из А в С?
Добрый день! У меня есть файл А, в котором есть буквы, B с цифрами и пустой файл С. Мне нужно...

14
Заблокирован
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)Надеюсь, логика ясна?
1
Учусь...
60 / 3 / 2
Регистрация: 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.
А затем дальше с этим значением и выполняется метод шэннона фано. у меня проблемы кажется с приведением типов.
0
Заблокирован
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");
 }
1
Учусь...
60 / 3 / 2
Регистрация: 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();
}
0
Заблокирован
22.11.2011, 15:14 6
lp_4eva, мой код смотрела?)
1
Учусь...
60 / 3 / 2
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 15:17  [ТС] 7
Спасибо
Да но я не смогла их приклеить к моему коду=(
Сделала как поняла...
Но че-то вообще не выходит
0
Заблокирован
22.11.2011, 15:19 8
lp_4eva, советую полность переписать код - поверь, так будет легче и гораздо быстрее.
Раньше ты не знала как реальзовать, а сейас уже знаешь)
0
4855 / 3276 / 467
Регистрация: 10.12.2008
Сообщений: 10,570
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 там
1
Учусь...
60 / 3 / 2
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 15:40  [ТС] 10
да эту ошибку я исправила
только вот теперь он вообще никакой результат не выдает
0
4855 / 3276 / 467
Регистрация: 10.12.2008
Сообщений: 10,570
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, много букв у тебя в программе
если это и есть задание, то делается оно проще
1
Учусь...
60 / 3 / 2
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 15:47  [ТС] 12
Цитата Сообщение от accept Посмотреть сообщение
много букв у тебя в программе
в смысле???
слишком закручен?
а как ее можно упростить?
0
4855 / 3276 / 467
Регистрация: 10.12.2008
Сообщений: 10,570
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]$
1
Учусь...
60 / 3 / 2
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 16:07  [ТС] 14
Вы меня совсем запутали=)
0
4855 / 3276 / 467
Регистрация: 10.12.2008
Сообщений: 10,570
22.11.2011, 16:23 15
у тебя там ещё какая-то вероятность
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2011, 16:23

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Дан текст, в который входят любые символы. Удалить из него все символы не являющиеся буквами или цифрами
Дан текст, в который входят любые символы. Удалить из него все символы не являющиеся буквами или...

Как с текста забрать в List все символы?
Как с текста забрать в List все символы?

Как сделать чтобы лишние символы не оставались в консоли ?
мне нужно сделать так: после перемещения курсора остаются символы как их убрать ?

Как сделать так чтобы символы в паролях не повторялись
import random import string def generate_password(m): x = random.randint(1, m - 2) ...

Как сделать чтобы в string записывало символы до Enter, а не до пробела ?
Записывает до пробела. Как сделать чтобы записывало до Enter ? string str=&quot;&quot;; cout&lt;&lt;&quot;Введите...

Как сделать так, чтобы выводило нормальный текст, а не ASCII символы
Задание: Написать программу с использованием Функции 8h INT 21h, для считывания функциональной...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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