课程设计题目
在一个加密应用中,要处理的信息来自下面的字符集,各个字符的相关使用频度如下:
字符空格 A B C D E F G H I J K L M
频度 180 64 13 23 3210322 15 4757 1 5 31 20
字符 N O P Q R S T U V W X Y Z
频度 55 63 151 48 56 80 25 7 18 2 16 1
现请编写程序你实现如下功能:
(1)运行时,由用户输入来初始化字符集大小和相应用字符。
(2)输入一个要加密的字符串,将其加密。
(3)输出解密字符串。
〈数据结构〉课程设计综合题目 --信管班组做
一、实训目的
通过课程设计,学会运用数据结构知识,针对具体应用,自己设计合理数据结构,确定存储结构,并能设计具体操作算法,选择使用具体语言进行实现。掌握C++较复杂程序的组织和设计过程,调试技巧。学习解决实际问题的能力。
二、实训环境
计算机windows xp或其它版本,VC6.0或更高版本,或其它语言环境。
代码如下:
#include<iostream.h>
#include<iomanip.h>
#include<windows.h>
const int n=13;
const int m=2*n-1;
struct tree
{
floatweight; //权值
intparent; //指针域(游标)
intlch,rch; //指针域(游标)
};
struct codetype //创建结构体codetype
{
intbits[n+1]; //创建n+1个bits
int start;
char ch;
};
tree hftree[m+1]; //建立数据类型为tree的hftree
codetype code[n+1]; //建立数据类型为codetype的code
void creathuffmantree() //初始化
{
int i,j,p1,p2;
float s1,s2;
for(i=1;i<=m;i++)
{
hftree[i].parent=0;
hftree[i].lch=0;
hftree[i].rch=0;
hftree[i].weight=0;
}
cout<<" ★★★★★★★★★★★★★★★★★★★★★ "<<endl;
cout<<" ★ ★ "<<endl;
cout<<" ★ ★ "<<endl;
cout<<" ★ ★ "<<endl;
cout<<" ★ ★ "<<endl;
cout<<" ★ ★ "<<endl;
cout<<" ★ 班级:信管1133 ★ "<<endl;
cout<<" ★ 学号:201311671313 ★ "<<endl;
cout<<" ★ 姓名:黄俊鸿 ★ "<<endl;
cout<<" ★ 指导老师:易学明 ★ "<<endl;
cout<<" ★ 任课老师:易学明 ★ "<<endl;
cout<<" ★ ★ "<<endl;
cout<<" ★ 根据您的需要,本次编译请输入"<<n<<"个权值 ★ "<<endl;
cout<<" ★ ★ "<<endl;
cout<<" ★ 》》》》》》》》》 ★ "<<endl;
cout<<" ★★★★★★★★★★★★★★★★★★★★★ "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<"★请输入:>>>";
for(i=1;i<=n;i++)
cin>>hftree[i].weight; //输入权值
for(i=n+1;i<=m;i++) //进行次合作
{
p1=p2=0; //p1.p2分别指向两个最小的值的位置
s1=s2=32767; //s1.s2代表两个最小权值
for(j=1;j<=i-1;j++) //选两个最小值
if(hftree[j].parent==0)//该权值还没有被选中
if(hftree[j].weight<s1)
{
s2=s1;s1=hftree[j].weight;
p2=p1;p1=j;
}
else
if(hftree[j].weight<s2)
{
s2=hftree[j].weight;p2=j;
}
//以下为合并
hftree[p1].parent=i;
hftree[p2].parent=i;
hftree[i].lch=p1;
hftree[i].rch=p2;
hftree[i].weight=hftree[p1].weight+hftree[p2].weight;
}
}
void huffcode() //哈弗曼编码
{
codetype cd;
int c,p;
for(inti=1;i<=n;i++)
{
cd.start=n+1;
cd.ch=64+i; //第一个树叶对应字母A,其余依次类推
c=i;
p=hftree[i].parent;
while(p!=0)
{
cd.start--;
if(hftree[p].lch==c)cd.bits[cd.start]=0;
elsecd.bits[cd.start]=1;
c=p;
p=hftree[p].parent;
}
code[i]=cd;
}
cout<<endl;
system("cls");
cout<<"*******************************欢迎使用哈夫曼树系统*****************************"<<endl;
for(i=1;i<=n;i++)
{
cout<<"字符"<<code[i].ch<<"的权值为:"<<hftree[i].weight<<setw(5)<<"编码为:";
for(intj=code[i].start;j<=n;j++)
cout<<code[i].bits[j]<<" ";
cout<<endl;
}
}
void trancode() //哈弗曼译码
{
int i=m;charb;
cout<<"★请输入您所需要发送的电报二进制编码报文(0.1以外的数结束):"<<endl;
cin>>b;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<"★您输入的电报报文内容为:"<<endl;
while((b=='0')||(b=='1'))
{
if(b=='0')i=hftree[i].lch;
elsei=hftree[i].rch;
if(hftree[i].lch==0)
{
cout<<code[i].ch;
i=m;
}
cin>>b;
}
cout<<" "<<endl;
cout<<" "<<endl;
cout<<"★感谢老师的检阅,您辛苦了"<<endl;
}
void main()
{
creathuffmantree(); //建立哈夫曼树
huffcode(); //实现哈夫曼编码
trancode();
}
四 总体要求和说明
本次试验中所遇到的主要问题为哈弗曼编码的算法,以及整个变量的控制。通过学习课本上的基础编码方法,再加上老师所讲的内容,整理修改后得到这个编码系统。 通过本次试验,掌握了树和哈夫曼树的基本操作,以及各个程序的算法。也复习了前面所学习的参数调用和控制变量范围。这次课程设计,在编辑中犯了不应有的错误,统计字符时忘记了应该怎样保存数据,对文件的操作也很生疏,在不断的分析后明确并改正了错误和疏漏,是程序有了更高的质量。另外,在哈夫曼编码树中,树的带权路径长度的含义是各个字符的码长与其出现次数的乘积之和,所以采用哈夫曼树构造的编码是一种能使字符串的编码总长度最短的不等长编码。由于哈夫曼编码树的每个字符结点都是叶子的结点,它们不可能在根结点到其他字符结点的路径上,所以一个字符的哈夫曼编码不可能是另外一个字符的哈夫曼编码的前缀,从而保证了解码的唯一性。
总的来说,不仅是实验的结果,更重要的是过程和思考,是我学到了很多的知识,真的是受益匪浅。