错误输入哈夫曼编码代号:
图10.错误输入哈夫曼编码代码串示意图
输出:
图11.错误输入哈夫曼编码代码串输出示意图
2.程序调试中遇到的问题以及解决问题的方法:
编写完译码函数ReadCode()后进行调试,程序会在译码过程中进入死循环,且无法译出正确字符串。经过仔细观察,发现程序中有一个循环的终止条件本应为str[i]!=’\\0’,却将其误写成了str[i]!=’\\n’,因而无法正常终止循环并译码,改正后实现了译码功能。
3.课程设计过程经验教训、心得体会:
此次课程设计,我编写程序的时候遇到了不少问题,在攻克这些问题,最终实现课题任务的过程中,我学到了不少东西:
首先,在完成一个课题之前,要仔细理解课题要求。我在此次课程设计中犯的最严重的错误,应该算没有仔细审题。课题的要求是用读取文件的方式输入需要编码字符,译码所需的编码代号也要用文本方式输入。我在拿到这个课题的时候,因为没有仔细理解这些要求,就采用了键盘输入字符进行编码和译码的方式,以致没有完全达到课题的要求。
另外,这次课程设计充分暴露了我的惰性思想。在拿到这个课题后,因为对哈夫曼编码这个知识点理解比较到位,所以没花多少时间就完成了课题要求实现的功能。然而,在此之后,我由于自我感觉良好和惰性,没有积极地去寻找改进程序的方法,也没对程序运行的界面进行美化,使其拥有良好的用户使用体验。最终在答辩的时候,交给老师的是一个界面简陋,功能不全面的程序。
通过这次课程设计,我更加深入了理解了哈夫曼编码的过程,以及利用哈夫
第10页
共21页
曼编码对数据进行压缩的优越性,并且使我能够更熟练地运用树形的数据结构。并且体会到了在学习中,要严格要求自己,不能因为一点点的成功就骄傲自满,停止不前。
五. 用户使用手册
1.运行程序,程序首先会要求你输入需要编码的字符串,输入完毕按回车即可进行编码:
图12.程序启动画面
输出:
图13.编码输出画面
2.输出编码后,程序会提示输入需要译码的哈夫曼编码串,输入后按回车即可进行译码:
图14.译码输入界面
输出:
图15.译码输出界面
3.译码结束后,输入a可退出程序,输入b可继续进行译码。
第11页
共21页
六. 附录
源程序清单(带注释):
typedef.h文件代码: #define MAXV 30
typedef struct CNode //用来保存字符次数的结构体 { char c; int num;
int flag; };
typedef struct //哈弗曼树结点 { char data; double weight; int parent; int lchild; int rchild; }HTNode;
typedef struct //各叶子结点的哈弗曼编码 {
char cd[30]; int start; }HCode;
main.cpp文件代码: #include
第12页
共21页
#include
extern void insertstr(char str[]); extern int countstr(char str[],CNode *); extern void dispCNode(CNode *,int); extern void CreateHT(HTNode ht[],int);
extern void CreateHCode(HTNode ht[],HCode hcd[],int n); extern int DispHCode(HTNode ht[],HCode hcd[],int n); extern void insertstr1(char str[]);
extern int ReadCode(char str1[],HCode hcd[],HTNode ht[],int MAX,int n); int n=0; void main() { int i;
int MAX; //哈弗曼编码的最大长度 int flag=0; //标记哈弗曼编码输入是否合法 char choice; char str[N],str1[N]; CNode CharNode[MAXV]; HTNode ht[100]; HCode hcd[50]; insertstr(str); printf(\
n=countstr(str,CharNode); printf(\
dispCNode(CharNode,n); printf(\
for(i=0;i 第13页 共21页 } ht[i].data=CharNode[i].c; ht[i].weight=CharNode[i].num; CreateHT(ht,n); CreateHCode(ht,hcd,n); MAX=DispHCode(ht,hcd,n); printf(\ while(flag==0) { } } function.cpp文件代码: #include 第14页 共21页 insertstr1(str1); printf(\ printf(\译码结果如下:\\n\flag=ReadCode(str1,hcd,ht,MAX,n); printf(\请选择:a(退出)/b(继续译码)\\n\getchar(); scanf(\switch(choice) { } case 'a': exit(1);break; case 'b': flag=0;break;