Уважаемы Форумчане! Доброго вам времени суток.
Кратко о задаче. У меня есть код на делфи, реализующий компрессию методом Хаффмана. Необходимо перевести код в C++ Builder 6, ибо иного преподаватель видеть не хочет. Заранее огромное спасибо!
Код собственно.
Код:
unit Archivarius;
interface
Uses
Forms, Dialogs;
const
count=4096;
Arch_Extention='asv';
dot='.';
//две файловые переменные для чтения исходного файла и для
//записи архива
var
f_r,f_w: File;
// Процедуры, которые используются для работы с файлом
// Первая - кодирование по методу Хаффмана
procedure RUN_ENCODE(f_name: string);
// Вторая - декодирование
procedure RUN_DECODE(f_name: string);
implementation
Type
//тип дерева для динамической обработки статистики байтов
byte_=^byte_jachejka;
byte_jachejka=Record
//сам байт
byte_id: Byte;
//статистика байта
byte_st: Integer;
//последовательность битов, в которые преобразуется текущий
//байт после сжатия (в виде строки из "0" и "1")
byte_string: String;
//ссылки на левое и правое поддеревья (ветки)
left, right: Byte_;
End;
//массив со статистикой байтов, принимающих участие в
//файле
bytes_with_stat = Array [0..255] of byte_;
//объект, инкапсулирующий в себе:
// * массив байтов с их статистикой
// * количество байт, содержащихся в файле (встречающихся в файле
// хотя бы один раз)
// * процедура (метод) инициализации объекта
// * процедура для увеличения частоты i-го байта
// * метод чтения i-го байта и его статистики
// * метод чтения массива байтов со статистикой
TStat = Object
massiv: bytes_with_stat;
count_byte: Byte;
Procedure create;
Procedure inc(i: Byte);
Function Read_(i: Byte): Byte_;
Function Read_Bytes: bytes_with_stat;
End;
// * процедура (метод) инициализации объекта
Procedure TStat.create;
var
i: Byte;
Begin
count_byte:=255;
For i:=0 to count_byte do
Begin
new(massiv[i]);
massiv[i]^.byte_id:=i;
massiv[i]^.byte_st:=0;
massiv[i]^.left:=nil;
massiv[i]^.right:=nil;
Application.ProcessMessages;
End;
End;
// * процедура для увеличения частоты i-го байта
Procedure TStat.inc(i: Byte);
Begin
massiv[i]^.byte_st:=massiv[i]^.byte_st+1;
End;
// * метод чтения i-го байта и его статистики
Function TStat.Read_(i: Byte): Byte_;
Begin
Read_:=massiv[i];
End;
// * метод чтения массива байтов со статистикой
Function TStat.Read_Bytes: bytes_with_stat;
Begin
Read_Bytes:=massiv;
End;
Type
//объект, инкапсулирующий в себе:
// * имя и путь к архивируемому файлу
// * размер архивируемого файла
// * массив статистики частот байтов
// * дерево частот байтов
// * метод генерации по имени файла имени архива
// * метод генерации по имени архива имени исходного файла
File_=Object
Name: String;
Size: Integer;
Stat: TStat;
Derevo: Byte_;
Function ArcName: String;
Function FileSizeWOHead: Integer;
Function DeArcName: String;
End;
// * метод генерации по имени архива имени исходного файла
Function File_.DeArcName: String;
Var
i: Integer;
name_: String;
Begin
name_:=name;
if pos(dot+Arch_Extention,name_)=0
Then
Begin
ShowMessage('Неправильное имя архива,'#13#10'оно должно заканчиваться на ".'+Arch_Extention+'"');
Application.Terminate;
End
Else
Begin
i:=Length(name_);
While (i>0) And (name_[i]<>'!') Do
Begin
Dec(i);
Application.ProcessMessages;
End;
If i=0
Then
Begin
name_:=copy(name_,1,pos(dot+Arch_Extention,name_)-1);
If name_=''
Then
Begin
ShowMessage('Неправильное имя архива');
Application.Terminate;
End
Else
DeArcName:=name_;
End
Else
Begin
name_[i]:='.';
Delete(name_,pos(dot+Arch_Extention,name_),4);
DeArcName:=name_;
End;
End;
End;