Листинг программы.
Hafman.h
//---------------------------------------------------------------------------
#ifndef HafmanH
#define HafmanH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *Text1;
TButton *TreeCr;
TEdit *Final;
void __fastcall TreeCrClick(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Hafman.cpp
// --------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <string>
#include "Hafman.h"
// --------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
const n=8;
struct Character { //Структура: Словарь для подсчёта весов символов
char Ch;
unsigned int Mas;
};
struct Wordbook { //Структура: Итоговый словарь с кодами символов
char Ch;
char Cd[n];
};
struct TreeAlf { //Структура: Дерево необходимое для определения кодов
Character A; //символов
TreeAlf *left;
TreeAlf *right;
};
Wordbook Wordb[256]; //Словарь
TreeAlf TreeCod; //Дерево словаря
Character Alf[60]; //Промежуточный алфавит
int Alength, index;
Int Mass(char St[], int len) { //Функция подсчёта весов символов
int k = 0;
for (int i = 0; i < len; i++) {
if (St[i] != Alf[0].Ch) {
Alf[k].Ch = St[i];
Alf[k].Mas = 0;
k++;
for (int j = i; j < len; j++) {
if (Alf[k - 1].Ch == St[j]) {
Alf[k - 1].Mas = Alf[k - 1].Mas + 1;
St[j] = Alf[0].Ch;
}
}
}
}
return k; }
Void Book(TreeAlf *TreeB, char X, int z) { //Определение кодов символов по
if (TreeB->A.Ch == X) { //бинарному дереву
Wordb[index].Ch = X;
for (int i = z; i < 7; i++) {
Wordb[index].Cd[i] = NULL;
}
}
if ((TreeB->left != NULL) && (Wordb[index].Ch != X)) {
Wordb[index].Cd[z] = '1';
Book(TreeB->left, X, z+1);
}
if ((TreeB->right != NULL) && (Wordb[index].Ch != X)) {
Wordb[index].Cd[z] = '0';
Book(TreeB->right, X, z+1);
}
}
// --------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
}
// --------------------------------------------------------------------------
AnsiString coder(char St) { //кодирование сообщения
AnsiString s;
for (int i = 0; i < Alength; i++) {
if (Wordb[i].Ch == St) {
int j = 0;
while ((Wordb[i].Cd[j] == '0') || (Wordb[i].Cd[j] == '1')) {
s = s + Wordb[i].Cd[j];
j++;
}
}
}
return s;
}
// --------------------------------------------------------------------------
TreeAlf TrCr[30], *Tr;
// --------------------------------------------------------------------------
int Uni(int len) { //функция построения дерева
Tr = new TreeAlf;
Tr->left = TrCr[len - 1].left;
Tr->A.Ch = TrCr[len-1].A.Ch;
Tr->right = TrCr[len-1].right;
Tr->A.Mas = TrCr[len-1].A.Mas;
TrCr[len - 1].left = Tr;
TrCr[len - 1].right = &TrCr[len];
TrCr[len - 1].A.Mas = Tr->A.Mas + TrCr[len].A.Mas;
TrCr[len - 1].A.Ch = NULL;
return len - 1;
}
int sort(int len) { //Функция сортировки
TreeAlf BufferC;
for (int i = 0; i < len; i++) {
for (int j = len; j > i; j--) {
if (TrCr[j].A.Mas > TrCr[j - 1].A.Mas) {
BufferC = TrCr[j - 1];
TrCr[j - 1] = TrCr[j];
TrCr[j] = BufferC;
}
}
}
return len;
}
// --------------------------------------------------------------------------
void __fastcall TForm1::TreeCrClick(TObject *Sender) {
AnsiString Temp = Text1->Text;
char *Text = Temp.c_str();
Alength = Mass(Text, strlen(Text));
int Al = Alength;
for (int i = 0; i <= Al; i++) {
TrCr[i].A = Alf[i];
TrCr[i].left = NULL;
TrCr[i].right = NULL;
}
while (Al != 1) {
Al = sort(Al);
Al = Uni(Al);
}
TreeCod.left = &TrCr[0];
TreeCod.right = &TrCr[1];
TreeCod.A.Mas = TrCr[0].A.Mas + TrCr[1].A.Mas;
TreeCod.A.Ch = NULL;
for (index = 0; index < Alength; index++) {
Book(&TreeCod, Alf[index].Ch, 0);
}
for (int i; i < index; i++) {
}
Temp = Text1->Text;
Text = Temp.c_str();
for (unsigned int i = 0; i < strlen(Text); i++) {
Final->Text = Final->Text + coder(Text[i]);
}
}
// --------------------------------------------------------------------------
Заключение
В данной курсовой работе были рассмотрены вопросы архивации данных алгоритмом Хаффмана. Целью данного курсового проекта было программная реализация алгоритма Хаффмана. Подробно описана теоретическая часть алгоритма.
В курсовой работе был реализован алгоритм кодирования Хаффмана и создана программа, сжимающая и разжимающая файл.
Для реализации использовался язык C++ и визуальная среда программирования Embarcadero RAD Studio.