数据结构课程设计说明书.docx
- 文档编号:27388151
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:20
- 大小:344.85KB
数据结构课程设计说明书.docx
《数据结构课程设计说明书.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计说明书.docx(20页珍藏版)》请在冰豆网上搜索。
数据结构课程设计说明书
《数据结构》
课程设计说明书
题目
Huffman编码和译码
学号
***
姓名
**
指导教师
康懿
日期
2013年12月30日
内蒙古科技大学课程设计任务书
课程名称
数据结构课程设计
设计题目
Huffman编码和译码
指导教师
康懿
时间
2013年秋学期第15周至第19周
一、教学要求
1.掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力
4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风
二、设计资料及参数
每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。
Huffman编码和译码
根据给定的字符集和各字符的频率值,求出其中给定字符Huffman编码,并针对一段文本(定义在该字符集上)进行编码和译码,实现一个Huffman编码/译码系统。
要求设计类(或类模板)来描述Huffman树及其操作,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:
v求Huffman编码
v输入字符串,求出编码
v输入一段编码,实现译码
并设计主函数测试该类。
三、设计要求及成果
1.分析课程设计题目的要求
2.写出详细设计说明
3.编写程序代码,调试程序使其能正确运行
4.设计完成的软件要便于操作和使用
5.设计完成后提交课程设计报告
四、进度安排
资料查阅与讨论(1天)
系统分析(2天)
系统的开发与测试(5天)
编写课程设计说明书和验收(2天)
五、评分标准
1.根据平时上机考勤、表现和进度,教师将每天点名和检查
2.根据课程设计完成情况,必须有可运行的软件。
3.根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。
4.根据答辩的情况,应能够以清晰的思路和准确、简练的语言叙述自己的设计和回答教师的提问
六、建议参考资料
1.《数据结构(C语言版)》严蔚敏、吴伟民主编清华大学出版社2004.11
2.《数据结构课程设计案例精编(用C/C++描述)》,李建学等编著,清华大学出版社2007.2
3.《数据结构:
用面向对象方法与C++语言描述》,殷人昆主编, 清华大学出版社2007
目录
内蒙古科技大学课程设计任务书.............................................................................................................................1
第1章需求分析3
第2章总体设计4
第3章详细设计5
3.1工程视图5
3.2类图视图6
3.3函数的调用关系7
3.4主程序流程7
3.5主要算法的流程图8
第4章测试10
第5章总结12
附录:
程序代码13
第1章需求分析
Huffman编码和译码
根据给定的字符集和各字符的频率值,求出其中给定字符Huffman编码,并针对一段文本(定义在该字符集上)进行编码和译码,实现一个Huffman编码/译码系统。
要求设计类(或类模板)来描述Huffman树及其操作,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:
v求Huffman编码
v输入字符串,求出编码
v输入一段编码,实现译码
并设计主函数测试该类。
第2章总体设计
1.求Huffman编码
2.输入字符串,求出编码
3.输入一段字符,实现译码
系统功能图(2-1)
图(2-1)
第3章详细设计
3.1工程视图
见图(3-1)
图(3-1)
3.2类图视图
见图(3-2)
见图(3-2)
3.3函数的调用关系
如图(3-3)
图(3-3)
3.4主程序流程
如图(3-4)
图(3-4)
3.5主要算法的流程图
如图(3-5)
图(3-5)
第4章测试
程序的运行结果截图。
1.主界面如图(4-1)
图(4-1)
2.Huffman编码如图(4-2)
图(4-2)
3.编码界面如图(4-3)
图(4-3)
4.译码界面如图(4-4)
图(4-4)
第5章总结
通过这次课程设计,让我对一个程序的数据结构有更全面更进一步的认识,根据不同的需求,采用不同的数据存储方式,不一定要用栈,二叉树等高级类型,有时用基本的一维数组,只要运用得当,也能达到相同的效果,同样提高了程序的运行效率。
在编写这个程序的过程中,我复习了之前学的基本语法,Huffman编码是一种编码方式,以Huffman树即为最优二叉树,带权路径长度最小的二叉树,经常用于数据压缩。
赫夫曼编码的应用很广泛,利用赫夫曼树求得的用于通信的二进制编码称为赫夫曼编码,树中从根到每个叶子都有一条路径,对路径上的各分支约定,指向左子树的分子表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个叶子对应的字符的编码,这就是Huffman编码,Huffman译码输入字符串可以把它编译成二进制代码,输入二进制代码是可以编译成字符串。
在这次设计过程中,体现出自己综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,也从中发现自己平时学习的不足和薄弱环节,从而加以弥补,今后投入更多时间学习数据结构。
附录:
程序代码
#include
#include
#include
#include
#include
#defineN50//义用N表示50叶节点数
#defineM2*N-1//用M表示节点总数当叶节点数位n时总节点数为2n-1
#defineMAX_SIZE100
usingstd:
:
cin;
usingstd:
:
cout;
structHTNode
{
chardata;//结点值
intweight;//权值
intparent;//双亲结点
intlchild;//a左孩子结点
intrchild;//右孩子结点
};
structHCode
{
charcd[N];//存放哈夫曼码
intstart;//从start开始读cd中的哈夫曼码
};
classhaffman
{
public:
haffman()
{
n=26;
charstr[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};//初始化
intfnum[]={186,64,13,22,32,103,21,15,47,57,1,2,32,20,57,63,15,1,48,51,80,23,8,18,1,16};//初始化
for(inti=0;i { ht[i].data=str[i]; ht[i].weight=fnum[i]; } } voidCreateHT()//调用输入的数组ht[],和节点数n { inti,k,lnode,rnode; intmin1,min2; for(i=0;i<2*n-1;i++) ht[i].parent=ht[i].lchild=ht[i].rchild=-1;//所有结点的相关域置初值-1 for(i=n;i<2*n-1;i++)//构造哈夫曼树 { min1=min2=32767;//int的范围是-32768—32767 lnode=rnode=-1;//lnode和rnode记录最小权值的两个结点位置 for(k=0;k<=i-1;k++) { if(ht[k].parent==-1)//只在尚未构造二叉树的结点中查找 { if(ht[k].weight { min2=min1; rnode=lnode; min1=ht[k].weight; lnode=k; } elseif(ht[k].weight { min2=ht[k].weight; rnode=k; } } } ht[lnode].parent=ht[rnode].parent=i;//两个最小节点的父节点是i ht[i].weight=ht[lnode].weight+ht[rnode].weight;//两个最小节点的父节点权值为两个最小节点权值之和 ht[i].lchild=lnode;ht[i].rchild=rnode;//父节点的左节点和右节点 } } voidCreateHCode() { inti,f,c; HCodehc; for(i=0;i { hc.start=n;c=i; f=ht[i].parent; while(f! =-1)//循序直到树根结点结束循环 { if(ht[f].lchild==c)//处理左孩子结点 hc.cd[hc.start--]='0'; else//处理右孩子结点 hc.cd[hc.start--]='1'; c=f;f=ht[f].parent; } hc.start++;//start指向哈夫曼编码hc.cd[]中最开始字符 hcd[i]=hc; } } voidDispHCode()//输出哈夫曼编码的列表 { inti,k; printf("输出哈夫曼编码: \n"); for(i=0;i { printf("%c: \t",ht[i].data); for(k=hcd[i].start;k<=n;k++)//输出所有data中数据的编码 { printf("%c",hcd[i].cd[k]); } printf("\n"); } } voideditHCode()//编码函数 { charstring[MAX_SIZE]; inti,j,k; cin>>string;//把要进行编码的字符串存入string数组中 printf("\n输出编码结果: \n"); for(i=0;string[i]! ='#';i++)//#为终止标志 { for(j=0;j { if(string[i]==ht[j].data)//循环查找与输入字符相同的编号,相同的就输出这个字符的编码 { for(k=hcd[j].start;k<=n;k++) { cout< } break;//输出完成后跳出当前for循环 } } } } voiddeHCode()//译码函数 { charcode[MAX_SIZE]; inti,j,k,m,x; cin>>code;//把要进行译码的字符串存入code数组中 while(code[0]! ='#') for(i=0;i { m=0;//m为想同编码个数的计数器 for(k=hcd[i].start,j=0;k<=n;k++,j++)//j为记录所存储这个字符的编码个数 { if(code[j]==hcd[i].cd[k])//当有相同编码时m值加1 m++; } if(m==j)//当输入的字符串与所存储的编码字符串个数相等时则输出这个的data数据 { printf("%c",ht[i].data); for(x=0;code[x-1]! ='#';x++)//把已经使用过的code数组里的字符串删除 { code[x]=code[x+j]; } } } } private: HTNodeht[M];//建立结构体 HCodehcd[N];//建立结构体 intn; }; intmain() { charorz,flag=1; haffmanhafftree; while(flag)//菜单函数,当flag为0时跳出循环 { printf("\n"); printf("**************************************"); printf("\n**A---------------显示编码**"); printf("\n**B---------------进行编码**"); printf("\n**C---------------进行译码**"); printf("\n**D---------------退出**\n"); printf("****************************************"); printf("\n"); printf("请输入选择的编号: "); cin>>orz; switch(orz) { case'a': case'A': system("cls");//清屏函数 hafftree.CreateHT(); hafftree.CreateHCode(); hafftree.DispHCode(); //printf("\n按任意键返回..."); //getch(); system("\npause"); system("cls"); break; case'b': case'B': system("cls"); printf("请输入要进行编码的字符串(以#结束): \n"); hafftree.editHCode(); //printf("\n按任意键返回..."); //getch(); system("\npause"); system("cls"); break; case'c': case'C': system("cls"); hafftree.DispHCode(); printf("请输入编码(以#结束): \n"); hafftree.deHCode(); //printf("\n按任意键返回..."); //getch(); system("\npause"); system("cls"); break; case'd': case'D': flag=0; break; default: system("cls"); } } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 说明书
![提示](https://static.bdocx.com/images/bang_tan.gif)