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

C++

Войти
Регистрация
Восстановить пароль
 
kamberb
Сообщений: n/a
#1

Не могу дописать метод перевода в десятичного кода символа в двоичный в алгоритме LZW - C++

14.05.2010, 22:58. Просмотров 537. Ответов 0
Метки нет (Все метки)

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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
 
class Lzw
{
    // Вспомогательный класс, описывающий элемент в таблице
    class CodeTableItem
    {
    public:
        string str;
    };
 
    // Указатель на массив, содержащий таблицу
    CodeTableItem* codeTable;
    // Размер таблицы
    int tableSize;
 
    // Вспомогательный метод, начальная подготовка таблицы
    void initTable()
    {
        for (int i=0; i < tableSize; i++)
        {
            if (i < 256)    // Первые 256 элементов инициализируем исходным алфавитом
            {
                codeTable[i].str = "";
                codeTable[i].str += char(i);
            }
            else // Остальные пустые
                codeTable[i].str = " ";
        }
    }
 
    // Вспомогательный метод, возвращает код по заданной строке, 
    // или -1, если строки нет в таблице
    int getCode(const string& str)
    {
        for (int i=0; i < tableSize; i++)
            if (codeTable[i].str == str)
                return i;
 
        return -1;
    }
 
    // Вспомогательный метод, записывает код в выходной файловый поток
    void writeCode(int code, ofstream& fout)
    {
        fout<<code;
    }
 
    // Вспомогательный метод, определяет строку по коду
    string getString(int code)
    {
        return codeTable[code].str;
    }
 
    // Вспомогательный метод, проверка кода (есть в таблице или нет)
    bool inTable(int code)
    {
        return (! codeTable[code].str.empty() );
    }
 
 
public:
    // Конструктор класса
    Lzw() 
    {
        // 4096 =  2^12, значит такой таблицы хватит для кодов длиной до 12ти бит
        tableSize = 4096;
        // Выделяем память под таблицу
        codeTable = new CodeTableItem[tableSize];
 
        // Начальная подготовка таблицы
        initTable();
    };
 
 
    // Метод сжатия
    void compress(const char* inFile, const char* lzwFile)
    {
        // Открываем входной файл
        ifstream fin(inFile);
        // Открываем выходной файл
        ofstream flzw(lzwFile);
 
        // Значение следующего кода (коды от 0 до 255 уже заняты исходным алфавитом)
        int nextCode = 256;
 
        // Читаем очередной байт из файла
        char c = fin.get();
        
        // Рабочая строка, содержащая текущую цепочку
        string buf;
        
        // Цикл до конца файла
        while (fin)
        {
            // Вычисляем код для очередной цепочки
            int code = getCode(buf + c);
            int newcode=getCode(buf);
            int prob, w[32];
            // Код не найден
            if (code == -1)
            {
 
                
                for(int i=0;i<32;i++)
                {
                     w[i]=((newcode>>i)&1);
                 }
                for(int i=31,r=0;i>=0;i--)
                 { 
                      if((w[i]==1)||(r==1))
                 {
                     
                     int temp=0;
                     temp=w[i];
                     prob=temp;
                     writeCode(prob, flzw);
                      r=1;
    }
    }
                
                // Записываем код для предыдущей цепочки в выходной файл
                
                // Заполняем таблицу новой цепочкой
                codeTable[nextCode].str = buf + c;
                nextCode++;
                // Сбрасываем текущую цепочку (остается только последний символ)
                buf = "";
                buf += c;
            }
            else // Код найден, наращиваем цепочку
            {
            buf += c;
            
            }
 
            // Читаем следующий символ
            c = fin.get();
        }
    
        // Записываем код для последней цепочки
 
        writeCode(getCode(buf), flzw);
 
        // Закрываем файлы
        fin.close();
        flzw.close();
    }
    };
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    Lzw t;
    
    t.compress("input.txt", "lzw.txt");
 
    //t.decompress("lzw.txt", "output.txt");
 
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2010, 22:58     Не могу дописать метод перевода в десятичного кода символа в двоичный в алгоритме LZW
Посмотрите здесь:

C++ Двоичный код символа
составить програму перевода целого десятичного числа в шестнадцятеричную систему числения C++
C++ Написать блоки перевода числа из десятичного в двоичный и обратно
C++ Как определить двоичный код символа.
C++ Помогите пожалуйста дописать программу перевода чисел 5->7 с.с
C++ написать программу перевода введенного символа
Преобразование двоично-десятичного кода числа в двоичный Visual C++
C++ Функция перевода символа в цифру
Не могу найти ошибку в алгоритме Флойда-Уоршелла C++
C++ Перевод числа из десятичного вида в двоичный. Что неправильно в коде?
C++ Реализовать систему перевода десятичного числа в двоичное не используя деление и остаток от деления
C++ Builder Получить число из двоично-десятичного кода

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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