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

C++

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

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

14.05.2010, 22:58. Просмотров 549. Ответов 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++):

Преобразование двоично-десятичного кода числа в двоичный - Visual C++
Помоги с программой. Нужна функция и код программы преобразования двоично-десятичного кода числа в двоичный. Ну или хотя бы функцию...

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

не могу дописать функцию перевода текста на 2сс,не могу возвращать переведенный текст - C++
void itoa(char str){ int i; char buf; char url; char yn; int x=0; i=0; while(str){ _itoa_s( (unsigned char)str, buf, 2);...

Перевод числа из десятичного вида в двоичный. Что неправильно в коде? - C++
#include &lt;iostream&gt; #include&lt;conio.h&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;RUS&quot;); cout &lt;&lt; &quot;эта программа...

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

Перевести из десятичного кода в двоичный знаковый - Информатика
Здравствуйте! Извините за дилетантский вопрос: Имеются константы в двоичном коде типа Signed и их значения в десятичном коде: 1)....

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2010, 22:58
Привет! Вот еще темы с ответами:

Преобразование двоично-десятичного кода в двоичный - Программируемая логика
есть код, выполняющий преобразование двоичных чисел в двоично десятичные, можно на примере этого кода сделать обратное преобразование?...

Преобразование двоично-десятичного кода в двоичный (VHDL) - Программируемая логика
Написать код и протестировать его(как я понимаю написать TestBench). Помогите пожалуйста

Шифратор десятичного кода в двоичный код 8421 - Программируемая логика
Помогите посмтроить шифратор, и если можно с подробными комментариями, спасибо. Построить шифратор для десятичных чисел 0,1...11,12 в...

Доказательство формулы перевода из кода Грея в двоичный код - Теория автоматов
Здравствуйте. Сдаю домашнее задание по микро-процессорной технике. Задание звучит следующим образом: &quot;Синтезировать...


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

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

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