6内蒙古科技大学课程设计任务书-哈夫曼编码和译码

4.根据答辩的情况,应能够以清晰的思路和准确、简练的语言叙述自己的设计和回答教师的提问
六、建议参考资料
1.《数据结构(C语言版)》严蔚敏、吴伟民主编清华大学出版社2004.11
2.《数据结构课程设计案例精编(用C/C++描述)》,李建学等编著,清华大学出版社2007.2
3.《数据结构:用面向对象方法与C++语言描述》,殷人昆主编,清华大学出版社2007
内蒙古科技大学课程设计任务书
课程名称
数据结构课程设计
设计题目
Huffman编码和译码
指导教师
周李涌
时间
2014.5.20
一、教学要求
1.掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力
要求设计类(或类模板)来描述Huffman树及其操作,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:
求Huffman编码
输入字符串,求出编码
输入一段编码,实现译码
并设计主函数测试该类。
三、设计要求及成果
1.分析课程设计题目的要求
2.写出详细设计说明
3.编写程序代码,调试程序使其能正确运行
4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风
二、设计资料及参数
每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。
Huffman编码和译码
根据给定的字符集和各字符的频率值,求出其中给定字符Huffman编码,并针对一段文本(定义在该字符集上)进行编码和译码,实现一个Huffman编码/译码系统。
4.设计完成的软件要便于操作和使用
5.设计完成后提交课程设计报告
四、进度安排
资料查阅与讨论(1天)
系统分析ห้องสมุดไป่ตู้2天)
系统的开发与测试(5天)
编写课程设计说明书和验收(2天)
五、评分标准
1.根据平时上机考勤、表现和进度,教师将每天点名和检查
2.根据课程设计完成情况,必须有可运行的软件。
3.根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。
合集下载

哈夫曼编码与译码课程设计

哈夫曼编码与译码课程设计

哈夫曼编码与译码课程设计本科⽣课程设计论⽂题⽬:哈夫曼编码与译码学⽣姓名:学号:专业:班级:指导教师:2015年1⽉8⽇内蒙古科技⼤学课程设计任务书课程名称数据结构与算法课程设计设计题⽬Huffman编码和译码指导教师时间2015.1.5——2015.1.9⼀、教学要求1. 掌握数据结构与算法的设计⽅法,具备初步的独⽴分析和设计能⼒2. 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本⽅法和技能3. 提⾼综合运⽤所学的理论知识和⽅法独⽴分析和解决问题的能⼒4. 训练⽤系统的观点和软件开发⼀般规范进⾏软件开发,培养软件⼯作者所应具备的科学的⼯作⽅法和作风⼆、设计资料及参数每个学⽣在教师提供的课程设计题⽬中任意选择⼀题,独⽴完成,题⽬选定后不可更换。

Huffman编码和译码根据给定的字符集和各字符的频率值,求出其中给定字符Huffman编码,并针对⼀段⽂本(定义在该字符集上)进⾏编码和译码,实现⼀个Huffman编码/译码系统。

要求设计类(或类模板)来描述Huffman树及其操作,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:求Huffman编码输⼊字符串,求出编码输⼊⼀段编码,实现译码并设计主函数测试该类。

三、设计要求及成果1. 分析课程设计题⽬的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运⾏4. 设计完成的软件要便于操作和使⽤5. 设计完成后提交课程设计报告四、进度安排资料查阅与讨论(1天)系统分析(2天)系统的开发与测试(5天)编写课程设计说明书和验收(2天)五、评分标准1. 根据平时上机考勤、表现和进度,教师将每天点名和检查2. 根据课程设计完成情况,必须有可运⾏的软件。

3. 根据课程设计报告的质量,如有雷同,则所有雷同的所有⼈均判为不及格。

4. 根据答辩的情况,应能够以清晰的思路和准确、简练的语⾔叙述⾃⼰的设计和回答教师的提问六、建议参考资料1.《数据结构(C语⾔版)》严蔚敏、吴伟民主编清华⼤学出版社2004.112.《数据结构课程设计案例精编(⽤C/C++描述)》,李建学等编著,清华⼤学出版社 2007.23.《数据结构:⽤⾯向对象⽅法与C++语⾔描述》,殷⼈昆主编,清华⼤学出版社 2007⽬录第1章需求分析 (3)第2章总体设计 (3)第3章抽象数据类型定义 (4)3.1 哈夫曼编码与译码抽象数据类型的设计 (4)第4章详细设计 (4)4.1 ⼯程视图 (4)4.2 类图视图 (5)4.3 函数的调⽤关系 (5)4.4 主程序流程图 (6)4.5 主要算法的流程图 (7)第5章测试 (9)第6章总结 (10)附录:程序代码 (11)第1章需求分析Huffman编码和译码根据给定的字符集和各字符的频率值,求出其中给定字符Huffman编码,并针对⼀段⽂本(定义在该字符集上)进⾏编码和译码,实现⼀个Huffman编码/译码系统。

数据结构课程设计哈夫曼编码实验

数据结构课程设计哈夫曼编码实验

数据结构设计性实验Huffman编码与译码学号姓名班级设计性实验—Huffman 编码与译码一.实验目的:在掌握相关基础知识的基础上,学会自己设计实验算法,熟练掌握Huffman 树的建立方法,Huffman 编码的方法,进而设计出Huffman 译码算法,并编程实现。

二.实验要求:在6学时以内,制作出能够实现基于26个英文字母的任意字符串的编译码。

写出技术工作报告并附源程序。

三.实验内容及任务:1.设字符集为26个英文字母,其出现频度如下表所示。

2.建Huffman 树; 3.利用所建Huffman 树对任一字符串文件进行编码——即设计一个Huffman 编码器;4.对任一字符串文件的编码进行译码——即设计一个Huffman 译码器。

实现步骤:1.数据存储结构设计; 2.操作模块设计; 3.建树算法设计; 4.编码器设计;5. 译码器设计;51 48 1 15 63 57 20 32 5 1频度z y x w v u t 字符11611882380频度p 21 f q15 g r 47 h s o n m l k j 字符 57 103 32 22 13 64 186 频度 i e d c b a 空格 字符四.分析以及算法描述1.分析问题1)首先学习二叉树的知识,了解二叉树的路径、权数以及带权路径长度计算。

2)认识霍夫曼树,了解霍夫曼树的定义,构造霍夫曼树构造算法①又给定的n个权值{w1,w2,w3,……,w n}构造根节点的二叉树,从而得到一个二叉树森林F={T1,T2,T3,……T n}。

②在二叉树森里选取根节点全职最小和此最小的两棵二叉树作为左右节点构造新的二叉树,此时新的二叉树的根节点权值为左右子树权值之和。

③在二叉树森林中删除作为新二叉树的根节点左右子树的两棵二叉树,将新的二叉树加入到二叉树森林F中。

④重复②和③,当二叉树森林F只剩下一棵二叉树时,这棵二叉树是所构造的霍夫曼树。

3)练习通过普通树来构造霍夫曼树。

课程设计哈夫曼编码

课程设计哈夫曼编码

《数据结构》课程设计报告设计题目哈夫曼(Huffman)编译码器学院名称信息工程学院专业班级 13计本1 姓名 hhh学号1312219999目录一、实验题目-哈夫曼(Huffman)编/译码器 ------------------------------二、问题描述-----------------------------------------------三、设计目标-----------------------------------------------四、需求分析-----------------------------------------------五、概要设计-----------------------------------------------1---系统结构图--------------------------------------2--各个模块功能的详细描述------------------------------- 六、详细设计-----------------------------------------------1——详细代码--------------------------------------a)头文件代码--------------------------------------b)主函数代码--------------------------------------2——系统流程图--------------------------------------七、测试分析-----------------------------------------------八、使用说明-----------------------------------------------1、白盒-----------------------------------------------2、黑盒-----------------------------------------------九、课程设计总结----------------------------------------------一、实验题目哈夫曼(Huffman)编/译码器二、问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

课程设计报告哈夫曼编码

课程设计报告哈夫曼编码

课程设计题目哈夫曼编码学院计算机科学与技术专计算机科学与技术业班级姓名指导教师20 0 010 年7 月2 日课程设计任务书学生姓名:拉巴珠久专业班级:计算机0806指导教师:姚寒冰工作单位:计算机科学系题目:哈夫曼编码初始条件:输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。

(1) 1:初始化(Initialization )。

对输入的一段央文中的每个字符统计其权值,建立哈夫曼树;(2) E:编码(Encoding )。

利用已建好的哈夫曼树,对每个字符进行编码。

(3) D:译码(Decoding )。

利用已建好的每个编码,对输入的一个由0、1组成的序列进行译码;(4) P:印代码文件(Print )。

将每个字符编的哈夫曼码和译码结果显示在终端上。

测试用例见题集p149。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1、问题描述简述题目要解决的问题是什么。

2、设计存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;3、调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。

4、经验和体会(包括对算法改进的设想)5、附源程序清单和运行结果。

源程序要加注释。

如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。

时间安排:1、第18周(6月28日至7月2日)完成。

2、7月2日08 : 30到计算中心检查程序、交课程设计报告、源程序( CD盘)。

指导教师签名:年月日系主任(或责任教师)签名:年月日目录1设计题目 (1)2问题描述 (1)3.1数据结构设计 (1)3.2主要算法设计 (3)3.3测试用例设计 (6)4调试报告 (7)5结束语 (7)六、课程设计参考资料 (8)附录 (9)F1源代码 (9)F2运行结果 (16)哈夫曼编码1设计题目哈夫曼编码2问题描述输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。

哈夫曼编码译码器课程设计

哈夫曼编码译码器课程设计

目录1 引言 (2)2 需求分析 (2)3 概要设计 (2)3.1设计思路及方案 (2)3.2模块的设计及介绍 (2)4 详细设计 (6)4.1主调函数 (6)4.2建立H UFFMAN T REE (7)4.3生成H UFFMAN树并写入文件 (8)5 调试与操作说明 (9)5.1读出文本 (9)5.2输出哈夫曼树存储结构的初态 (10)5.3输出哈夫曼树存储结构的终态 (10)5.4输出哈夫曼树构成后的抽象图 (12)6学年设计总结与体会 (12)7 参考文献 (13)8 致谢 (13)9 附录 (13)学年设计的主要内容1 引言随着当今信息技术的发展,为了方便和节省信息的存储和传递速度,人们便创建了哈夫曼编码。

哈夫曼编码是将文件进行压缩的一种压缩方法。

哈夫曼编码的最大的功能是能够用更少的内存空间来存储更多的信息。

若要对文件进行编码则必须对其建立哈夫曼树,其次对这个哈夫曼树进行编码。

本学年设计的主要目标就是对如何建立哈夫曼树和如何进行编码的一个详细介绍。

2 需求分析问题描述:打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它作为权值,对所有字符进行构建哈夫曼树。

问题补充:⑴从硬盘的一个文件里读出一段英语文章;⑵统计这篇文章中的每个字符出现的次数;⑶以字符出现字数作为权值,构建哈夫曼树,并将哈夫曼树的存储结构的初态和终态进行输出。

具体介绍:在E盘中预先建立一个filel.txt文档,在文档中编辑一篇文章(大写)。

然后运行程序,调用fileopen()函数读出该文章,显示在界面;再调用jsq()函数对该文章的字符种类进行统计,并对每个字符的出现次数进行统计,并且在界面上显示;然后以每个字符出现次数作为权值,调用ChuffmanTree()函数构建哈夫曼树,并调用print1()和print2()函数将哈夫曼的存储结构的初态和终态进行输出。

3 概要设计3.1 设计思路及方案假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为(W1*L1)+(W2*L2)+.......(Wi*Li)。

哈夫曼编码译码器课程设计

哈夫曼编码译码器课程设计

课程设计说明书课程名称:数据结构与算法设计题目:哈夫曼编\译码器院系:计算机科学与信息工程学院学生姓名:学号:专业班级:软件工程16-2指导教师:2017年12 月11日课程设计任务书哈夫曼编\译码器摘要:采用哈夫曼编码思想实现对字符串的编码,以及对编码的解码。

字符串的长度不小于5000字节。

读取要编码的文本文件,将文件的内容进行编码,生成新的文件。

对编码文件进行解码,获得文本文件。

将译码的文本文件和原文件进行比较,恢复文件和原文件必须完全一致。

关键词:构建哈夫曼树哈弗曼编码哈夫曼译码字符串编码打印编码函数目录1.设计背景 (1)1.1哈夫曼树的介绍 (1)1.2设计的作用、目的 (1)1.3设计任务及要求 (2)2.设计方案 (2)2.1实验内容 (2)2.2操作思路 (2)2.3基本操作 (3)3. 方案实施 (4)3.1 C语言编程 (4)3.2程序介绍 (12)3.3程序流程图以及说明 (13)图3 主程序流程图 (13)4. 结果与结论 (14)4.1程序运行结果 (14)4.2总结 (16)5. 收获与致谢 (17)6. 参考文献 (17)1.设计背景1.1哈夫曼树的介绍Huffman Tree,中文名是哈夫曼树或霍夫曼树或者赫夫曼树,它是最优二叉树。

定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。

(01) 路径和路径长度定义:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。

通路中分支的数目称为路径长度。

若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。

(02)结点的权及带权路径长度定义:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。

结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。

(03) 树的带权路径长度定义:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。

课程设计说明书

课程设计说明书课程设计:哈夫曼编码和译码课程名称:数据结构班级:姓名:学号:教师:信息工程学院计算机系目录一、设计任务书 (3)问题描述 (3)基本要求 (3)小组成员及分工 (3)二、设计题目 (3)三、设计目的 (3)四、算法思想分析 (4)建立哈夫曼树 (4)构造哈夫曼树的过程 (4)一个完整的编/译码系统应具有的功能 (4)选择parent为0且权值最小的两个根结点的算法 (5)统计字符串中字符的种类以及各类字符的个数 (5)构造哈夫曼树 (5)哈夫曼编码 (5)哈夫曼编码算法 (5)建立正文的编码文件 (6)代码文件的译码 (6)五、算法描述与实现 (6)主要算法流程图 (6)主要类型定义 (9)功能描述 (9)程序源代码 (9)六、程序运行结果 (16)七、结论 (17)一、设计任务书问题描述利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。

对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼编/译码系统。

基本要求一个完整的系统应具有以下功能:1.初始化及文本的频率统计。

从终端读入字符集大小n,以及n个字符和n个权值,完成文本的频率统计。

建立哈夫曼树,并将它存于文件中;2.编码。

利用已建好的哈夫曼树,从文件中读入,对正文进行编码。

然后将结果存入文件“CodeFile-姓名”中;3.译码。

利用已建好的哈夫曼树将输入的代码进行译码,将文件“CodeFile-姓名”中的代码进行译码,结果存入文件“Decoding-姓名”中;4.打印哈夫曼树。

将已在内存中的哈夫曼树以直观的方式显示在屏幕上。

小组成员及分工二、设计题目哈夫曼编码和译码三、设计目的利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

哈夫曼编码译码器---课程设计报告.docx

目录目⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ (2)1 程的目的和意⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯32 需求分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯43 概要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯4 4⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.85 分析和果⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.11 6⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯127致⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯138附⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯13参考文献⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..201课程设计目的与意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。

哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。

哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。

树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“ 1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。

通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。

电报通信是传递文字的二进制码形式的字符串。

但在信息传递时,总希望总长度尽可能最短,即采用最短码。

作为计算机专业的学生,我们应该很好的掌握这门技术。

在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。

在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。

这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试 C 程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。

数据结构课程设计哈夫曼编码译码器

题目一: 哈夫曼编码与译码一、任务设计一个运用哈夫曼算法的编码和译码系统, 反复地显示并解决以下项目, 直到选择退出为止。

规定:1) 将权值数据存放在数据文献(文献名为data.txt, 位于执行程序的当前目录中) ;2) 初始化:键盘输入字符集记录字符权值、自定义26个字符和26个权值、记录文献中一篇英文文章中26个字母, 建立哈夫曼树;3) 编码: 运用建好的哈夫曼树生成哈夫曼编码;4) 输出编码(一方面实现屏幕输出, 然后实现文献输出);5)译码(键盘接受编码进行译码、文献读入编码进行译码);6) 界面优化设计。

二、流程图三、代码分解 //头文献 #include<stdio.h> #include<string.h> #include<stdlib.h> #include <conio.h> #define N 1000 #define M 2*N-1 #define MAXcode 6000 //函数声明void count(CHar &ch,HTNode ht[]);void editHCode(HTNode ht[],HCode hcd[],CHar &ch,int n,char bianma[]); //编码函数void printyima(HTNode ht[],HCode hcd[],int n,char bianma[]); //译码函数 void creatHT(HTNode ht[],int n);字符集记录符集记录权值 权值 至文献“哈夫曼树。

t xt” 菜单1.从键盘输入字符集进行编码2.从文献读入字符集进行编码1.从键盘输入编码进行译码2.从文献读入编码进行译码0.返回上级菜单 0.返回上级菜单void CreateHCode (HTNode ht[],HCode hcd[],int n);void DispHCode(HTNode ht[],HCode hcd[],int n);void input_key(CHar &ch);void input_file(CHar &ch);void input_cw(HTNode ht[]);void bianma1(HTNode ht[],HCode hcd[],CHar &ch,int n,char bianma[]); void bianma2(HTNode ht[],HCode hcd[],CHar &ch,int n,char bianma[]); void yima1(HTNode ht[],HCode hcd[],int n,char bianma[]);void yima2(HTNode ht[],HCode hcd[],int n,char bianma[]);void creat_cw();void bianmacaidan();void yimacaidan();void bianmayima();int caidan();//结构体typedef struct{char data;int parent;int weight;int lchild;int rchild;}HTNode;typedef struct{char cd[N];int start;}HCode;typedef struct{char s[N];int num;}CHar;CHar ch;HTNode ht[M];HCode hcd[N];//主函数int main(){int xh;while(1){system("color 1f"); //操作菜单背景颜色 xh=caidan(); //调用菜单函数switch(xh) //switch语句 {case 1:system("cls");creat_cw();break;case 2:system("cls");creatHT(ht,n);break;case 3:system("cls");CreateHCode(ht,hcd,n);DispHCode(ht,hcd,n);break;case 4:system("cls");bianmayima();break;case 0:system("cls");printf("\n\n\n\n\n\n\n\n\n\t\t\t\t感谢使用本系统!\n\n\n\n\n\n\n \t\t\t");exit(0);default:system("cls");putchar('\a');printf("\n\t\t输入有误, 请重新输入:\n");break;}}return 0;}//菜单函数int caidan() //菜单函数模块//{int xh;printf("\n\n\n");printf("\t\t 欢迎使用哈夫曼编码译码系统\n");printf("\t\t \n");printf("\t\t*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("\t\t*= =*\n");printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*= =*\n");printf("\t\t*= 1.建立字符权值=*\n");printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*= =*\n"); printf("\t\t*= 2.建立并输出哈夫曼树=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*= =*\n"); printf("\t\t*= 3.生成并查看哈夫曼编码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*= =*\n"); printf("\t\t*= 4.编码与译码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*= =*\n"); printf("\t\t*= 0.退出系统=*\n"); printf("\t\t*= =*\n"); printf("\t\t*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n"); printf("\n\t\t请输入序号进行选择:");scanf("%d", &xh);return xh; //返回从键盘接受的选项}void bianmayima(){int xh;while(1){printf("\n\n\n\n\n");printf("\t\t 编码与译码\n"); printf("\t\t \n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n");printf("\t\t*= 1.编码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 2.译码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 0.返回上级菜单=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\n\t\t请输入序号进行选择:");scanf("%d",&xh);switch(xh) //switch语句{case 1:system("cls");bianmacaidan();break;case 2:system("cls");yimacaidan();break;case 0:system("cls");return;default:system("cls");putchar('\a');printf("\n\t\t输入有误, 请重新输入:\n");break;}}}void yimacaidan(){int xh;while(1){printf("\n\n\n\n\n");printf("\t\t 译码\n"); printf("\t\t \n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 1.键盘输入编码进行译码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 2.文献读入编码进行译码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 0.返回上级菜单=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\n\t\t请输入序号进行选择:");scanf("%d",&xh);switch(xh) //switch语句{case 1:system("cls");yima1(ht,hcd,n,bianma);break;case 2:system("cls");yima2(ht,hcd,n,bianma);break;case 0:system("cls");return;default:system("cls");putchar('\a');printf("\n\t\t输入有误, 请重新输入:\n");break;}}}void bianmacaidan(){int xh;while(1){printf("\n\n\n\n\n");printf("\t\t 编码\n"); printf("\t\t \n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 1.键盘输入字符集编码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 2.文献读入文章编码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 0.返回上级菜单=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\n\t\t请输入序号进行选择:");scanf("%d",&xh);switch(xh) //switch语句{case 1:system("cls");bianma1(ht,hcd,ch,n,bianma);break;case 2:system("cls");bianma2(ht,hcd,ch,n,bianma);break;case 0:system("cls");return;default:system("cls");putchar('\a');printf("\n\t\t输入有误, 请重新输入:\n");break;}}}void creat_cw(){int xh2;while(1){printf("\n\n\n\n\n");printf("\t\t 建立字符权值\n"); printf("\t\t \n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 1.从键盘输入字符集进行记录=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 2.从文献读入字符集记录=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 3.自定义字符权值=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 0.返回上级菜单=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\n\t\t请输入序号进行选择:");scanf("%d",&xh2);switch(xh2) //switch语句{case 1:system("cls");input_key(ch);break;case 2:system("cls");input_file(ch);break;case 3:system("cls");input_cw(ht);break;case 0:system("cls");return;default:system("cls");putchar('\a');printf("\n\t\t输入有误, 请重新输入:\n");break;}}}//建立字符权值模块void input_key(CHar &ch){int i,j=0;char st[N];printf("请输入字符集(以‘#’结束):\n");for(i=0;i<N;i++){scanf("%c",&st[i]);if(st[i]=='#'){st[i]='\0';break;}}strcpy(ch.s,st);count(ch,ht);printf("按任意键返回!");getch();system("cls");return;}void input_file(CHar &ch){int i;FILE*fp;char filename[20];printf("请输入要打开的文献名(*.txt):");scanf("%s",&filename);if((fp=fopen(filename,"r"))==NULL){printf("\n\t\t文献打开失败");return;}for(i=0;!feof(fp);i++){fread(&ch.s[i],sizeof(char),1,fp);}printf("读入成功!\n");printf("文献中的字符集为:%s\n",ch.s);fclose(fp);count(ch,ht);printf("按任意键返回!");getch();system("cls");return;}void input_cw(HTNode ht[]){int i,w,s,j;char a;printf("要输入的字符总个数是?:");scanf("%d",&s);n=s;printf("请输入字符及其权值:\n");for(i=0;i<s;i++){printf("请输入第%d个字母:",i+1);scanf("%s",&a);ht[i].data=a;printf("请输入其权值:");scanf("%d",&w);ht[i].weight=w;}FILE *fp;if((fp=fopen("data.txt","w"))==0){printf("\n\t\t文献打开失败");return;}printf("\n定义权值成功!\n\n");printf("各字符及其权值为:\n\n");fprintf(fp,"各字符及其权值为:\n");printf(" 字符\t权值");fprintf(fp," 字符\t权值");for(j=0;j<i;j++){ printf("\n");fprintf(fp,"\n");printf(" %-8c%-8d",ht[j].data,ht[j].weight);fprintf(fp," %-8c%-8d%",ht[j].data,ht[j].weight); }printf("\n");printf("\n字符权值已输出至文献“data.txt”!");fclose(fp);printf("输入完毕, 按任意键返回!");getch();system("cls");return;}//记录字符权值函数void count(CHar &ch,HTNode ht[]){int i,j,m=0;char c[N];int sum[N]={0};for(i=0;ch.s[i]!='\0';i++){for(j=0;j<m;j++)if(ch.s[i]==c[j]||(c[j]>='a'&&c[j]<='z'&&ch.s[i]+32==c[j])) break;if(j<m)sum[j]++;else{if(ch.s[i]>='A'&&ch.s[i]<='Z')c[j]=ch.s[i]+32;else c[j]=ch.s[i];sum[j]++;m++;}}for(i=0;i<m;i++){ht[i].data=c[i];ht[i].weight=sum[i];}n=m;FILE *fp;if((fp=fopen("data.txt","w"))==0) {printf("\n\t\t文献打开失败"); return;}printf("\n记录权值成功!\n\n"); printf("各字符及其权值为:\n\n"); fprintf(fp,"各字符及其权值为:\n"); printf(" 字符\t权值");fprintf(fp," 字符\t权值");for(j=0;j<m;j++){ printf("\n");fprintf(fp,"\n");printf(" %-8c%-8d",ht[j].data,ht[j].weight);fprintf(fp," %-8c%-8d%",ht[j].data,ht[j].weight);}printf("\n");printf("\n字符权值已输出至文献“data.txt”!");fclose(fp);}//构造哈夫曼树void creatHT(HTNode ht[],int n){FILE *fp;if((fp=fopen("哈夫曼树.txt","w"))==0){printf("\n\t\t文献打开失败");return;}int i,j,k,lnode,rnode;int min1,min2;for (i=0;i<2*n-1;i++)ht[i].parent=ht[i].lchild=ht[i].rchild=-1;for (i=n;i<2*n-1;i++){min1=min2=32767;lnode=rnode=-1;for(k=0;k<=i-1;k++)if(ht[k].parent==-1){if (ht[k].weight<min1){min2=min1;rnode=lnode;min1=ht[k].weight;lnode=k;}else if(ht[k].weight<min2){min2=ht[k].weight;rnode=k;}}ht[lnode].parent=i;ht[rnode].parent=i;ht[i].weight=ht[lnode].weight+ht[rnode].weight;ht[i].lchild=lnode;ht[i].rchild=rnode;}printf("建立huffman树成功!\n");printf("输出huffman树:\n");fprintf(fp,"输出huffman树:\n");printf("\t字符\t权值\t父节点\t 左子节点\t右子节点");fprintf(fp,"\t字符\t权值\t父节点\t 左子节点\t右子节点");for(j=1;j<i;j++){ printf("\n");fprintf(fp,"\n");printf("\t %-8c%-8d%-10d%-14d%-10d",ht[j].data,ht[j].weight,ht[j].parent,ht[i]. lchild,ht[j].rchild);fprintf(fp,"\t %-8c%-8d%-10d%-14d%-10d",ht[j].data,ht[j].weight,ht[j].parent,h t[i].lchild,ht[j].rchild);}printf("\n");printf("哈夫曼树已输出至文献“哈夫曼树.txt”!按任意键返回!");fclose(fp);getch();system("cls");return;}//生成哈夫曼编码void CreateHCode (HTNode ht[],HCode hcd[],int n){int i,f,c,j=0;HCode hc;for(i=0;i<n;i++){hc.start=n;c=i;hc.cd[hc.start--]='0';f=ht[i].parent;while(f!=-1){if (ht[f].lchild==c)hc.cd[hc.start--]='0';elsehc.cd[hc.start--]='1';c=f;f=ht[f].parent;}hc.start++;for(j=0;j<hc.start;j++)hc.cd[j]=' ';hcd[i]=hc;}}void DispHCode(HTNode ht[],HCode hcd[],int n) {FILE *fp;if((fp=fopen("哈夫曼编码.txt","w"))==0){printf("\n\t\t文献打开失败");return;}int i,k;int sum=0,m=0,j;printf("输出字符哈夫曼编码:\n"); fputs("输出字符哈夫曼编码:\n",fp); for (i=0;i<n;i++){j=0;printf("%c:\t",ht[i].data);fprintf(fp,"\n%c:\t",ht[i].data);for (k=hcd[i].start;k<=n;k++){printf("%c",hcd[i].cd[k]);j++;fprintf(fp,"%c",hcd[i].cd[k]); }m+=ht[i].weight;sum+=ht[i].weight*j;printf("\n");}printf("\n哈夫曼编码已保存至文献“哈夫曼编码.txt!按任意键返回!”");fclose(fp);getch();system("cls");}//编码函数void bianma1(HTNode ht[],HCode hcd[],CHar &ch,int n,char bianma[]){int i;char str[N];printf("请输入要编码的字符集(以‘#’结束):\n");for(i=0;i<N;i++){scanf("%c",&str[i]);if(str[i]=='#'){str[i]='\0';break;}}strcpy(ch.s,str);ch.num=strlen(str);editHCode(ht,hcd,ch,n,bianma);getch();system("cls");}void bianma2(HTNode ht[],HCode hcd[],CHar &ch,int n,char bianma[]) {int i;FILE*fp;char filename[20];printf("请输入要打开的文献名(*.txt):");scanf("%s",&filename);if((fp=fopen(filename,"r"))==NULL){printf("\n\t\t文献打开失败");return;}for(i=0;!feof(fp);i++){fread(&ch.s[i],sizeof(char),1,fp);}ch.num=strlen(ch.s);printf("\n读入成功!\n");printf("文献中的字符集为:\n%s",ch.s);fclose(fp);editHCode(ht,hcd,ch,n,bianma);system("cls");return;}//译码函数void yima1(HTNode ht[],HCode hcd[],int n,char bianma[]) {int i;char code[MAXcode];printf("请输入编码进行译码(以‘#’结束):\n");for(i=0;i<MAXcode;i++){scanf("%c",&code[i]);if(code[i]=='#'){code[i]='\0';break;}}strcpy(bianma,code);printyima(ht,hcd,n,bianma);printf("\n译码完毕!按任意键返回!");getch();system("cls");return;}void yima2(HTNode ht[],HCode hcd[],int n,char bianma[]) {int i;FILE*fp;char filename[20];printf("请输入要打开的文献名(*.txt):");scanf("%s",&filename);if((fp=fopen(filename,"r"))==NULL){printf("\n\t\t文献打开失败");return;}for(i=0;!feof(fp);i++){fread(&bianma[i],sizeof(char),1,fp);}printf("读入成功!\n");printf("文献中的编码是:%s\n",bianma);printyima(ht,hcd,n,bianma);printf("\n译码完毕!按任意键返回!");getch();system("cls");}四、调试结果主菜单建立字符权值选择2.从文献读入字符进行记录输入测试文献名“cs.txt”输出个字符权值建立哈夫曼树并输出至文献生成哈夫曼编码并保存至文献编码选择2.从文献读入字符集编码编码结果保存至文献译码选择2.从文献读入编码, 读入上一步的编码译码完毕, 返回!退出系统。

实验六-哈夫曼编码和译码的算法设计与实现

实验六-哈夫曼编码和译码的算法设计与实现一、实验目的1、根据算法设计需要,掌握哈夫曼编码的二叉树结构表示方法;2、编程实现哈夫曼编译码器;3、掌握贪心算法的一般设计方法。

二、预习与参考1、认真阅读数据结构教材和算法设计教材内容, 熟悉哈夫曼编码的原理;2、设计和编制哈夫曼编译码器。

[参考数据类型或变量]typedef ElemType char;typedef struct node{int w;int flag;ElemType c;struct node *plink,*llink,*rlink;char code[m];}Node;Node *num[n], *root;[参考子程序接口与功能描述]void SetTree( NODE *root )功能: 从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树void EnCode( Node *p )功能: 利用已建好的哈夫曼树,对输入的正文进行编码void DeCode( void )功能: 利用已建好的哈夫曼树,将输入的代码进行译码三、实验要求上机实验时,一人一组,独立上机,熟练运用二叉树与贪心思想对数据进行压缩。

四、实验步骤1、设计SetTree的测试方案和程序,输入测试数据,修改并调试程序,直至正确为止;2、设计EnCode的测试方案和程序,输入测试数据,修改并调试程序,直至正确为止;3、设计DeCode的测试方案和程序,输入测试数据,修改并调试程序,直至正确为止;4、将你的程序整理成功能模块存盘备用。

5、将写的程序如下:#include <stdio.h>#include <string.h>#include <math.h>#include <string>#define maxn 20 //最大结点数目#define inf 0xfffffff //无穷大typedef struct node{double w;int flag;int c;struct node *plink,*llink,*rlink; char code[maxn];int codelen;node() //初始化节点{flag=0;llink=NULL;plink=NULL;rlink=NULL;codelen=0;}}node;node *num[2*maxn-1];//指针数组int n;void SetTree(node *&root)//从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树{int i,m,j;scanf("%d",&n);//输入结点个数nfor(i=0;i<n;i++){num[i]=new node();num[i]->c=i;scanf("%lf",&num[i]->w);//输入结点的权值}m=n;double min1,min2;int pos1=0,pos2=0;for(i=0;i<m-1;i++){min1=inf;min2=inf;for(j=0;j<n;j++) //寻找权值最小的两个结点,保存在pos1和pos2中{if(num[j]->flag==0){if(num[j]->w<min1){min1=num[j]->w;pos2=pos1;pos1=j;}else if(num[j]->w<min2) {min2=num[j]->w;pos2=j;}}}num[pos1]->flag=1; //将pos1和pos2合并在新结点中,作为新节点的子节点num[pos2]->flag=1;num[n]=new node(); //新节点编号从n开始num[n]->c=-1;////添加代码,建立新结点n//// //建立新结点nnum[n]->w=num[pos1]->w+num[pos2]->w;num[n]->llink=num[pos1];num[n]->rlink=num[pos2];num[pos1]->plink=num[n];num[pos2]->plink=num[n];n++;}root=num[n-1];n=m;}void EnCode(node *root,int deep,char code[]) //利用已建好的哈夫曼树,对输入的文本进行编码{int i;if(root->c!=-1){for(i=0;i<deep;i++){root->code[i]=code[i];}root->codelen=deep;return;}code[deep]='0'; //左节点编码为0 EnCode(root->llink,deep+1,code);code[deep]='1'; //右节点编码为1 EnCode(root->rlink,deep+1,code);}void DeCode(node *root,char code[]) //利用已建好的哈夫曼树,对输入的代码进行译码int i;node *temproot=root;int len=strlen(code);int ans[maxn],anslen=0;for(i=0;i<len;i++){////添加代码,根据code[i]的值确定temproot的指向//// //根据code[i]的值确定temproot的指向if(code[i]=='0')temproot=temproot->llink;elsetemproot=temproot->rlink;if(temproot->c!=-1){ans[anslen++]=temproot->c; temproot=root;}if(temproot->llink==NULL && temproot->rlink==NULL){printf("你输入的数据不存在于该哈弗曼树中!\n");return;}}printf("输入数据的译码为:\n");for(i=0;i<anslen;i++){printf("%d",ans[i]);}printf("\n");}void print(){int i,j;for(i=0;i<n;i++){printf("%.2f:",num[i]->w);for(j=0;j<num[i]->codelen;j++) printf("%c",num[i]->code[j]);printf("\n");}}int main(){freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);node *root=NULL;root=new node();SetTree(root);char code[maxn*maxn];EnCode(root,0,code);print();printf("按上面的编码规则输入代码:\n");scanf("%s",code);DeCode(root,code);return 0;}五、测试输入80.6 0.2 0.05 0.05 0.03 0.03 0.030.01输出0.6:00.2:100.05:11000.05:11110.03:110100.03:110110.03:111010.01:11100六、实验报告要求1、阐述实验目的和实验内容;2、提交实验程序的功能模块;3、记录最终测试数据和测试结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档