Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Samchik
0 / 0 / 0
Регистрация: 07.11.2015
Сообщений: 15
Завершенные тесты: 1
1

Реализация алгоритма Хаффмана с использованием классов

28.09.2016, 21:35. Просмотров 381. Ответов 1
Метки c++ (Все метки)

Всем привет. Пишу Алгоритм Хаффмана. Хочу сделать все красиво в классах,но как-то не додумываюсь. Пытался сделать чтение файла методом,но никак.

Main.cpp
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
#include "Header.h"
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <fstream>
 
vector <bool> code;
map <char, vector<bool> > table;
void fillcodemap(Tree *root) {
    
    if (root->left) {
        code.push_back(0);
        fillcodemap(root->left);
    }
    if (root->right) {
        code.push_back(1);
        fillcodemap(root->right);
    }
    /*if (root->c) table[root->c] = code;
        code.pop_back();*/
    if (root->left == NULL && root->right == NULL) {
        table[root->c] = code;
    }
    if (code.size() >= 1) {
        code.pop_back();
    }
    
}
int main() {
    Tree a;
    a.read(c);
    /*ifstream f("1.txt");
    map < char, int > m;
    do{
        char c = f.get();       //это обычное чтение, его нужно в класс поместить
        m[c]++;
    } while (!f.eof()); 
    */
    list < Tree* > t;
    for (map<char, int>::iterator i = m.begin(); i != m.end(); i++) {
        cout << i->first << ":" << i->second << endl;
        Tree *p = new Tree;
        p->c = i->first;
        p->a = i->second;
        t.push_back(p);
    }
    t
 
    while (t.size() != 1) {  // сортировка листа
        t.sort(MyCompare());
        Tree *SonL = t.front();
        t.pop_front();
        Tree *SonR = t.front();
        t.pop_front();
        Tree *parent = new Tree(SonL, SonR);
        t.push_back(parent);
    }
 
 
    Tree *root = t.front(); //root - вершина дерева
 
 
    fillcodemap(root);
 
 
    f.clear(); f.seekg(0);
    ofstream g("output.bin");
    int count = 0; char buf = 0;
    do{
        char c = f.get();
        vector<bool> x = table[c];
        for (int n = 0; n < x.size(); n++) {
            buf = buf | x[n] << (7 - count);
            count++;
            if (count == 8) {
                count = 0; g << buf; buf = 0;
            }
        }
    } while (!f.eof());
    f.close();
    g.close();
 
 
    ifstream F("output.bin");
 
    //setlocale(LC_ALL, "Russian");
 
    Tree *p = root;
    count = 0; char byte;
    byte = F.get();
    do
    {
        bool b = byte & (1 << (7 - count));
        if (b) p = p->right; else p = p->left;
        if (p->left == NULL && p->right == NULL) { cout << p->c; p = root; }
        count++;
        if (count == 8) { count = 0; byte = F.get(); }
    } while (!F.eof());
 
    F.close();
    
}
Header.h
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
#pragma once
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <fstream>
using namespace std;
class Tree {
private:
    char c;
public:
    int a;
    char c;
    Tree *left;
    Tree *right;
    Tree();
    Tree(Tree *L, Tree *R);
    void read(char **c);
};
struct MyCompare {
    bool operator()(Tree* l, Tree* r) const {
        return l->a < r->a;
    }
};
Source.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "Header.h"
using namespace std;
 
Tree::Tree() {
    left = NULL;
    right = NULL;
};
Tree::Tree(Tree *L, Tree *R) {
    left = L;
    right = R;
    a = L->a + R->a;
}
void Tree::read(char **c) {
    ifstream f("1.txt");
    map < char, int > m;
    do {
        c = f.get();
        m[c]++;
    } while (!f.eof());
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2016, 21:35
Ответы с готовыми решениями:

Кодирование алгоритма Хаффмана
Доброго времени суток. У меня есть на руках рабочий код. Вопрос стоит следующим...

помогите с реализацией алгоритма сжатия Хаффмана
помогите с реализацией алгоритма сжатия Хаффмана есть код в с++ в...

Подскажите ошибку в реализации алгоритма Хаффмана
при архивации txt файла проблем не возникает, но со всеми остальными (например:...

Вынести методы из классов Panel и PictureBox (явная реализация методов базовых абстрактных классов)
Тема: Множественное наследование. Явная реализация методов базовых абстрактных...

Реализация отношения классов типа двунаправленная ассоциация, UML, порядок объявления классов, неполный класс
Доброго времени суток! Осваивая UML, решил реализовать отношение...

1
nmcf
6409 / 5671 / 2581
Регистрация: 14.04.2014
Сообщений: 23,997
29.09.2016, 19:49 2
map тогда полем класса должен быть. И зачем передаётся c?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2016, 19:49

Реализация классов-наследников или классов-родителей
Не могу переделать функционал программы таким образом, чтобы у появились...

Алгоритм Хаффмана, реализация через структуры
Добрый день, помогите пожалуйста найти ошибку в построении кодов Хаффмана. ...

Ошибка “vector<bool> erase iterator outside range” при работе алгоритма Хаффмана
Проблема с функцией BuildTable. Компилируется, но в процессе работы возникает...


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

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

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