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

Код Шеннона, не могу победить - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Параметры типа класса шаблона http://www.cyberforum.ru/cpp-beginners/thread1522690.html
смотрите был такой код в файле заголовочном: template <typename DataType> class CircleList { ..................... а преподаватель изменил его и стал такой код: template <typename DataType, int K> class CircleList { ...................... и он задает вопрос такой: можно ли среди параметров типа в шаблоне класс потребовать подстановку какойто константы и зачем оно понадобится?
C++ Определить, за сколько дней все деревья в лесу будут вырублены Всем привет ещё раз, и это уже третья задача на бинарный поиск. И в этот раз я уже преуспел в решении, осталось лишь найти ошибку ( она точно есть ). Вот сама задачка: Фермер Николай нанял двух лесорубов: Дмитрия и Федора, чтобы вырубить лес, на месте которого должно быть кукурузное поле. В лесу растут X деревьев. Дмитрий срубает по A деревьев в день, но каждый K-й день он отдыхает и не... http://www.cyberforum.ru/cpp-beginners/thread1522679.html
C++ Послать сообщение окну в указанный момент времени
Здравия желаю! Вот сижу, в носу ковыряюсь от скуки — задел извилину. Интересно стало: как можно без цикла проверки системного времени в посылающем приложении послать сообщение окошку в указанный момент? Или как оптимизировать обычный цикл проверки равенства системного времени с указанным в посылающей программе, если без него нельзя. Или единственный вариант — крутить while до потери...
Массив структур: в чем ошибка? C++
Что не так в коде? struct bop { char fullname; char title; char bopname; int preference; }; bop bops; bops.fullname = "Valeriy"; bops.title = "Director";
C++ Разобраться с ошибками в коде http://www.cyberforum.ru/cpp-beginners/thread1522648.html
подскажите, ошибки в коде есть подчеркиваются "красным" они, препод говорит, что это связано с неуниверсальностью кода код: #include "stdafx.h" #include "string" using namespace std; class Student { private: #ifdef UNICODE
C++ Книга для начинающего Подскажите, какая книга будет мне лучше, если учесть что немного знаю С#: Самоучитель по С++(читал что требуется знание языка Си) или С++ базовый курс(обе Герберта Шилдта) подробнее

Показать сообщение отдельно
tchsa
0 / 0 / 1
Регистрация: 02.10.2014
Сообщений: 16
01.09.2015, 13:54  [ТС]     Код Шеннона, не могу победить
Промежуточные результаты выводил, просто убрал из кода, чтобы сократить. Вот весь код:
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
#include <iostream>
#include <fstream>
#include <map>
#include <list>
#include <vector>
#include <iomanip>
 
using namespace std;
 
class shennon{
public:
    double p;
    int count;
    char simb;
};
 
struct Compare{
public:
    bool operator()(const shennon* l, const shennon* r) const {
        return l->count > r->count;
    }
};
 
int main(){
    char filename[30];
    map <char, int> m;
    int numb_char = 0;//кол-во символов в файле
    char c;//для хранения считываемого символа
    int s;
 
    setlocale(LC_ALL, "Russian");
    cout << "Введите имя файла: ";
    cin >> filename;
 
    ifstream infile(filename);
    if(!infile.is_open())
        cout << "Файл не может быть открыт!" << endl;
    else{
        while(!infile.eof()){ //пока не достигнут конец файла, считываем символы в map
            c = infile.get();
            //оставляем пробелы, все знаки препинания приводим к точке
            //все буквы малые
            s = (int)c;
            if(s >= 65 && s <= 90)
                s += 32;//преобразовываем в нижний регистр
            else if((s >= 33 && s <= 47) || (s >= 58 && s <= 64) || (s >= 91 && s <= 96))
                s = 46;//все знаки препинания приводим к точке
            else if(s > 122 || s < 32)
                continue;//не учитываем
            c = (char)s;
            m[c]++;
            numb_char++;//увеличиваем на один кол-во символов в файле
        }
        infile.close();
    }
 
    list <shennon *> t;
    for(map <char, int>::iterator pItr = m.begin(); pItr != m.end(); pItr++){
        shennon *S = new shennon;
        S->p = (double)pItr->second / numb_char;
        S->simb = pItr->first;
        S->count = pItr->second;
        t.push_back(S);
    }
 
    t.sort(Compare());
 
    for(list <shennon *>::iterator pItr = t.begin(); pItr != t.end(); pItr++){
        cout << (*pItr)->simb << " : " << (*pItr)->p << endl;
    }
    
    double q[38] = {0};
    int L[38] = {0};
    int csh[38][38] = {0};
    int i = 1;
    L[0] = 2;
    for(list <shennon *>::iterator pItr = t.begin(); pItr != t.end(); pItr++, i++){
        q[i] = q[i-1] + (*pItr)->p;     
        L[i] = (int)(-log((*pItr)->p) / log(2)+0.5);
        cout << (*pItr)->simb << " q[" << i << "] = " << q[i] << "     L[" << i << "] = " << L[i] << endl;
    }
 
    for(int i = 1; i <= t.size(); i++){
        for(int j = 1; j <= L[i]; j++){
            q[i-1] = q[i-1] * 2;
            csh[i-1][j-1] = (int)q[i-1];
            if(q[i-1] > 1)
                q[i-1] = q[i-1] - 1;    
        }
    }
 
    i = 0;
    for(list <shennon *>::iterator pItr = t.begin(); pItr != t.end(); pItr++, i++){
        cout << "(" << setw(2) << L[i] << ") " << (*pItr)->simb << " : ";       
        for(int j = 0; j < L[i]; j++)
            cout << csh[i][j];
        cout << endl;
    }
 
    system("pause");
   return 0;
}
f.txtНа этом файле проверяю.
 
Текущее время: 09:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru