.
.
课题:哈夫曼编码编译器
设计一个哈夫曼编码/译码系统,对一个文本文件中的字符进行哈夫曼编码,生成编码文件
(压缩文件,后缀名.cod);反过来,可将一个压缩文件译码还原为一个文本文件(.txt)。
功能
(1)输入一个待压缩的英文文本文件,统计文本文件中各字符的个数作为权值,生成哈夫曼树;
(2)将文本文件利用哈夫曼树进行编码,生成压缩文件(后缀名cod)
(3)输入一个待解压的压缩文件名称,并利用相应的哈夫曼树将编码序列译码。
三、程序结构
程序流程图
执行程序
执行程序
选择(0)退出选择(1)编码
选择(0)退出
选择(1)编码
选择(2)译码
选择(2)译码
输入要编码文件
输入要编码文件
输入要译码文件名
输入要译码文件名
编码
编码
译码
译码
保存编码后的文件
保存编码后的文件
保存译码后的文件
保存译码后的文件
文字说明
Main函数:Coding()编码函数
TransCode()译码函数
Coding()编码函数:
clearscreen()清屏函数
Open()打开源码文件
SearchStr()查找字符串中不同的字符及其出现的次数
CreatHFMTree()用每个字符出现的次数作为叶子节点的权值建立哈夫曼树
HFMCode()利用哈夫曼树对每个叶子节点进行编码,存入编码表中
TotalCoding()利用编码表对字符串进行最终编码
Save()保存最终的哈夫曼编码
TransCode()译码函数:
clearscreen()清屏函数
Open()打开编码文件
DeCoding(); //将编码进行解码存入字符串数组中
Save(); //保存译码后的字符串
四、 算法说明
执行界面
可供三个选择
编码
译码
退出
执行(1)选择
需要输入要编译的文件名
需要输出编码保存文件名
选择(1)执行完毕
执行(2)选项
输入要译码的编码文件名并输入保存的文件名
选择(2)执行完毕
执行(0)则退出该程序
五、报告总结
该程序主要采用了哈夫曼编码译码方法,对txt文件进行编译压缩,同时也能对编码后的文件进行解码,程序结构清晰,主干分两大部分:编码部分与解码部分,各部分通过调用函数合理清晰的实现其功能。程序中运用了一些文件的C语言基本操作,例如打开文件open()、保存文件save()函数,但程序上对文件类型的处理还有一些缺点,不能实现文件类型的自动保存,需要输入文件名字和类型。通过这次课程设计,不仅提高了自己的编程能力,还让我知道自己在编程方面的缺点,我以后会更加努力扩大自己的知识面提高自己的编程能力。
#include
#include
#include
#define M 10000 //定义字符串最大长度
#define N 128 //定义叶子节点个数
typedef struct node //定义哈夫曼树节点结构体
{
int weight;
struct node *LChild,*RChild,*Parent; //分别指向该节点的左孩子,右孩子,和双亲节点
struct node *next; //指向建立的哈夫曼树的下一个节点
}HFMNode,*HFMTree;
typedef struct //定义哈夫曼编码的结构体
{
char ch; //存储对应的字符
char code[N+1]; //存储对应字符的编码
int start; //存储编码的起始位置
}CodeNode;
int n; //存储真正叶子节点个数
void clearscreen()
{
system("cls");
}
void Open(char s[]) //打开存放字符或编码的文件,将其存入字符串数组中
{
char name[10];
FILE *fp;
int i=0;
printf("请输入要打开的文件名:");
gets(name); //要打开的文件名
if((fp=fopen(name,"rt"))==NULL)
{
printf("打开失败!\n"); //若打开失败,则直接退出
exit(1);
}
s[i++]=fgetc(fp);
while(s[i-1]!=EOF)
s[i++]=fgetc(fp);
s[i]='\0'; //存取字符串结束
fclose(fp);
}
void Save(char s[]) //保存字符或编码到文件中
{
char name[10];
FILE *fp;
printf("请输入要保存的文件名:");
gets(name);
if((fp=fopen(name,"wt"))==NULL)
{
printf("存储失败!");
exit(1);
}
fputs