Huffman编码和解码以及排序
一、 课程设计目
本课程设计的目的是使学生掌握数据结构的基本概念和算法分析方法,以提高学生的编程能力和解决实际问题的能力。
二、 课程设计内容
设计一个程序,该程序具有下面功能:
(1)能够选择合适的排序算法,如插入排序、归并排序或快速排序,依据该算法对某一数组进行排序,计算完成该操作所需时间。
(2)Huffman编码和解码。
程序界面如下:
1、主界面
------------------------------------------------------------------------
1.排序
2.Huffman编码和解码
3.退出
请选择操作类型(1—3):
------------------------------------------------------------------------
2、排序界面
------------------------------------------------------------------------
1.插入排序
2.归并排序
3.快速排序
4.返回
5.退出
请选择操作类型(1—5):
------------------------------------------------------------------------
是否打印排序前数组(Y/N):
是否打印排序后结果(Y/N):
排序所花时间:(按任意键返回)
3、编码解码界面
请输入字符串:
编码结果为:
解码结果为:(按任意键返回)
三、 课程设计要求
1、课程设计的程序必须用C/C++语言完成。
2、关键算法必须画出流程图。
3、要求写出软件分析和设计。分析部分包括功能需求和界面需求;设计部分包括算法的详细设计和数据结构(包括内存数据结构和文件结构)。
四、 需求分析和模块设计
1、需求分析
程序要完成两大功能:一为内排序,二为Huffman编码与解码。而其中的排序又由三种方法实现,一是插入排序;二是归并排序;三是快速排序。
2、模块分解
把程序分成六大模块,分别是主界面,排序界面,插入排序,归并排序,快速排序,Huffman编码与解码。
3、详细设计
注:这部分对每个函数的功能进行定义,方式如下:
函数名称:menu( ) 编号:001
函数功能:实现主界面
输入参数:无
输出参数:无
返回值:无
数据流程图
-------------------------------------------------------------------------------------------------------
函数名称:sort( ) 编号:002
函数功能:实现排序面
输入参数:无
输出参数:无
返回值:无
数据流程图
-------------------------------------------------------------------------------------------------------
函数名称:inssort( ) 编号:003
函数功能:实现插入排序
输入参数:要排序数组地址,数组长度
输出参数:无
返回值:无
数据流程图
-------------------------------------------------------------------------------------------------------
函数名称:msort( ) 编号:004
函数功能:实现归并排序
输入参数:要排序数组地址,临时数组地址,数组最左边位置,数组最右边位置,
输出参数:无
返回值:无
数据流程图
-------------------------------------------------------------------------------------------------------
函数名称:quicksort( ) 编号:005
函数功能:实现快速排序
输入参数:要排序数组地址,数组最左边位置,数组最右边位置,
输出参数:无
返回值:无
函数名称:huff( ) 编号:006
函数功能:实现Huffman编码与解码
输入参数:建树的字符个数,字符和它的权值
输出参数:无
返回值:无
4、数据结构
插入排序:L
i=1 2 3 4 5 6 7
42 20 17 13 13 13 13 13
20 42 20 17 17 14 14 14
17 17 42 20 20 17 17 15
13 13 13 42 28 20 20 17
28 28 28 28 42 28 23 20
14 14 14 14 14 42 28 23
23 23 23 23 23 23 42 28
15 15 15 15 15 15 15 42
72 6 57 88 60 42 83 73 48 85 |
48 6 57 42 |
60 |
88 83 73 72 85 |
6 |
42 57 48 |
|
72 |
73 |
85 88 83 |
42 48 |
57 |
|
85 83 |
88 |
42 |
48 |
|
83 |
85 |
6 42 48 57 60 72 73 83 85 88 |
20 36 |
13 17 |
14 28 |
15 23 |
13 17 20 36 |
14 15 23 28 | ||
13 14 15 17 20 23 28 36 |
五、计中碰到的问题及解决方法
程序的要求是要进行一个操作后要返回原界面或主界面,我用的是switch的结构,和老师给的有所不同,所以在处理这个问题时出了一点问题,但后来一想,也很简单,再调用一次原来的界面函数不就行了吗?
六、收获和体会
通过这次课程实践,我加深了对数据结构这门课程的理解,更好的掌握了各种排序方法和Huffman编码与解码!更巩固了自己的C和C++的知识。
七、程序清单
主界面:
DS,cpp
#include "stdafx.h"
#include <iostream.h>
#include <iomanip.h>
void sort();//声明要调用的函数
void huff();
void menu()
{
int num;
cout <<endl;
cout <<setw(40) <<"主界面: " <<endl;
cout <<setw(45) <<"1.排序 " <<endl;
cout <<setw(45) <<"2.Huffman编码与解码 " <<endl;
cout <<setw(45) <<"3.退出 " <<endl;
cout <<setw(45) <<"请选择操作类型(1-3):"; cin >>num;cout <<endl;
switch(num)// 通过swich语句进行选择
{
case 1: sort();break;
case 2: huff();break;
case 3: break;
default: cout <<"error";
}
}
void main()
{
menu();
}
排序界面:
Sort.cpp
#include "stdafx.h"
#include <iostream.h>
#include <iomanip.h>
void inssort();/ //首先要声明各个要调用的函数/
void menu();
void msort();
void qsort();
void sort() / 类似于主界面,也通过switch语句进行选择/
{
int num1;
cout <<endl;
cout <<setw(40) <<"排序界面: " <<endl;
cout <<setw(45) <<"1.插入排序 " <<endl;
cout <<setw(45) <<"2.归并排序 " <<endl;
cout <<setw(45) <<"3.快速排序 " <<endl;
cout <<setw(45) <<"4.返回 " <<endl;
cout <<setw(45) <<"5.退出 " <<endl;
cout <<setw(45) <<"请选择操作类型(1-5):";cin >>num1;cout <<endl;
switch(num1)
{
case 1: inssort();break;
case 2: msort();break;
case 3: qsort();break;
case 4: menu();break;
case 5: break;
default: cout <<"error";
}
}