Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория информации.docx
Скачиваний:
2
Добавлен:
19.09.2019
Размер:
40.78 Кб
Скачать

Листинг программы.

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.