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

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

Войти
Регистрация
Восстановить пароль
 
lp_4eva
Учусь...
59 / 2 / 1
Регистрация: 20.03.2010
Сообщений: 167
#1

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

22.11.2011, 13:32. Просмотров 828. Ответов 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]++;
Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно???
Помогите исправить...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2011, 13:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно??? (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
Учусь...
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
Учусь...
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
Учусь...
59 / 2 / 1
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 15:17  [ТС] #7
Спасибо
Да но я не смогла их приклеить к моему коду=(
Сделала как поняла...
Но че-то вообще не выходит
mc.Duck
Заблокирован
22.11.2011, 15:19 #8
lp_4eva, советую полность переписать код - поверь, так будет легче и гораздо быстрее.
Раньше ты не знала как реальзовать, а сейас уже знаешь)
accept
4821 / 3241 / 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
Учусь...
59 / 2 / 1
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 15:40  [ТС] #10
да эту ошибку я исправила
только вот теперь он вообще никакой результат не выдает
accept
4821 / 3241 / 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
Учусь...
59 / 2 / 1
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 15:47  [ТС] #12
Цитата Сообщение от accept Посмотреть сообщение
много букв у тебя в программе
в смысле???
слишком закручен?
а как ее можно упростить?
accept
4821 / 3241 / 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
Учусь...
59 / 2 / 1
Регистрация: 20.03.2010
Сообщений: 167
22.11.2011, 16:07  [ТС] #14
Вы меня совсем запутали=)
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.11.2011, 16:23 #15
у тебя там ещё какая-то вероятность
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2011, 16:23
Привет! Вот еще темы с ответами:

Как сделать, чтобы консольное приложение в Lazarus читало символы псевдографики? - Lazarus
Вот эти символы: │,┤,╡,╢,╖,╕,╣,║,╗,╝,╜,╛,┐,└,┴,┬,├,─,┼,╞,╟,╚,╔,╩,╦,╠,═,╬,╧,╨,╤,╥,╙,╘,╒,╓,╫,╪,┘,┌,┌. Он их при выводе на экран показывает...

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

Как сделать так, чтобы считывались символы из всех файлов из папки? - C#
помогите, если можете: class dict { List&lt;string&gt; sumvols = new List&lt;string&gt;(); public List&lt;dictor&gt; dic = new...

Напишите функцию escape (s,t), которая при копировании текста из t в s преобразует такие символы, как новая строка и табуляция в символы "_" - C (СИ)
help me)


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

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

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