VC数据结构实习报告.docx
- 文档编号:8168747
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:16
- 大小:59.39KB
VC数据结构实习报告.docx
《VC数据结构实习报告.docx》由会员分享,可在线阅读,更多相关《VC数据结构实习报告.docx(16页珍藏版)》请在冰豆网上搜索。
VC数据结构实习报告
数据结构与VC编程实习
实习报告
学生姓名:
学号:
专业班级:
计算机09级3班
指导教师:
宋会英
2011年7月7 日
实习题目
编—译码系统的设计
一、任务描述及要求
内容:
(1)读入待编码的文字,统计各字符出现的频率
(2)构造哈夫曼树
(3)得到各字符的哈夫曼编码
(4)对原文进行编码
(5)发送、接收
(6)还原(译码)收到的文字
(7)利用哈夫曼树,从根到叶子读0、1序列,直到终止,再读下一个字符
(8)比较(校验)
基本要求:
(85分)
合理设计窗口界面,待编码的文字通过窗口的编辑界面(类似记事本的编辑界面)录入,在界面上显示各个字符出现的频率及哈夫曼编码,对原文编码并在界面上显示出来;对译码文字还原,显示在界面上与原文对照。
功能菜单或按钮自行设计,以合理为目的。
扩展要求:
(15分)
利用socket进行电文的发送与接收,加5分;
在界面上显示出哈夫曼树及其生成过程,加10分。
二、概要设计
1.抽象数据类型
ADTHuffmanTree
{
DATA:
chIfo*bmifo;//编码信息
intpos;//当前bmifo的大小
CStringbm;
Node*root;
operations:
voiddeleteTree(Node*t);删除
voidmergeTree(Node&ht1,Node&ht2,Node*&father);
voidbianma(Node*subTree);编码
voidDraw(intx,inty,intxlast,intylast,CDC*pDC,Node*t);树形输出
voidcreateTree(chIfow[],intn);创建树
voidDraw(intx,inty,intxlast,intylast,CDC*pDC);
voidbianma(){bianma(root);}
CStringjmText(CStringtext);解码文本
CStringbmText(CStringtext);编码文本
voidstart(CStringstr);根据字符串建树
chIfo*textifo(CStringstr,int&size);统计字符频率
};
发送信息
接收信息
2.整个程序包含功能模块及模块间的调用关系
对话框
发送哈夫曼树
接收哈夫曼树
三、详细设计
1.虚拟实现
即数据结构的C++语言描述
classHuffmanTree
{
protected:
voiddeleteTree(Node*t);
voidmergeTree(Node&ht1,Node&ht2,Node*&father);
voidbianma(Node*subTree);
voidDraw(intx,inty,intxlast,intylast,CDC*pDC,Node*t);
voidcreateTree(chIfow[],intn);
public:
chIfo*bmifo;//编码信息
intpos;
HuffmanTree(chIfow[],intn);
HuffmanTree(){root=NULL;}
~HuffmanTree();
voidDraw(intx,inty,intxlast,intylast,CDC*pDC);
voidbianma(){bianma(root);}
CStringjmText(CStringtext);
CStringbmText(CStringtext);
voidstart(CStringstr);
chIfo*textifo(CStringstr,int&size);
private:
CStringbm;
Node*root;
};
classchIfo
{
public:
charch;//字符
doublen;//出现次数
doublegai;//出现概率
CStringbm;//编码结果
chIfo(){n=0;gai=0;}
voidoperator=(chIfo&c){ch=c.ch;n=c.n;gai=c.gai;bm=c.bm;}
booloperator>(chIfo&c){return(gai>c.gai)?
true:
false;}
booloperator<(chIfo&c){return(gai true: false;} booloperator>=(chIfo&c){return(gai>=c.gai)? true: false;} booloperator<=(chIfo&c){return(gai<=c.gai)? true: false;} booloperator==(chIfo&c){return(gai==c.gai)? true: false;} friendchIfooperator+(chIfo&c1,chIfo&c2) { chIfoc; c.gai=c1.gai+c2.gai; returnc; } }; classNode { private: public: chIfodata; Node*leftChild,*rightChild,*parent; Node(){leftChild=NULL;rightChild=NULL;parent=NULL;} Node(chIfoda,Node*left=NULL,Node*right=NULL,Node*paren=NULL) {data=da;leftChild=left;rightChild=right;parent=paren;} ~Node(){}//deleteleftChild;deleterightChild;deleteparent;} voidoperator=(Noden) { data=n.data; leftChild=n.leftChild; rightChild=n.rightChild; parent=n.parent; } }; classMinHeap { private: Node*heap; intcurrentSize,maxHeapSize; voidsiftDown(intstart,intm); voidsiftUp(intstart); public: MinHeap(intsz=2222); MinHeap(Nodearr[],intn); virtual~MinHeap(); boolIsEmpty(){return(currentSize==0)? true: false;} boolIsFull(){return(currentSize==maxHeapSize)? true: false;} voidmakeEmpty(){currentSize=0;} boolInsert(Node&x); boolRemove(Node&x); }; 2.抽象数据类型中定义的操作算法实现 (1) voidHuffmanTree: : createTree(chIfow[],intn) { bmifo=newchIfo[n]; pos=0; MinHeapmin; //Node*parent,first,second,work; Node*parent=newNode();Node*first=newNode();Node*second=newNode();Node*work=newNode(); for(inti=0;i { work->data=w[i]; min.Insert(*work); } for(i=0;i { first=newNode(); second=newNode(); min.Remove(*first); min.Remove(*second); mergeTree(*first,*second,parent); min.Insert(*parent); } if(n==1) { min.Remove(*first); parent->leftChild=first; parent->data.gai=1.0; } root=parent; } (2) voidHuffmanTree: : bianma(Node*subTree) { if(subTree==NULL)return; if(subTree->leftChild==NULL&&subTree->rightChild==NULL) { subTree->data.bm=bm; bmifo[pos++]=subTree->data; bm=bm.Left(bm.GetLength()-1); return; } if(subTree->leftChild! =NULL) { bm+="0"; bianma(subTree->leftChild); } if(subTree->rightChild! =NULL) { bm+="1"; bianma(subTree->rightChild); } bm=bm.Left(bm.GetLength()-1); } (3) voidHuffmanTree: : Draw(intx,inty,intxlast,intylast,CDC*pDC,Node*t) { if(t==NULL) return; else { CStringstr; str.Format("%.1f",t->data.gai); if(0! =xlast) { pDC->MoveTo(xlast,ylast+11); pDC->LineTo(x,y); } if(t->leftChild==NULL&&t->rightChild==NULL) { pDC->Ellipse(x-15,y-15,x+15,y+15); pDC->TextOut(x-8,y-8,str); pDC->TextOut(x-8,y+15,t->data.ch); pDC->TextOut(x-8,y+33,t->data.bm); } else { pDC->Rectangle(x-15,y-15,x+15,y+15); pDC->TextOut(x-8,y-8,str); } intn=((x+xlast)/2-x); if(n<0) n=(-n); Draw(x-n,y+60,x,y,pDC,t->leftChild); Draw(x+n,y+60,x,y,pDC,t->rightChild); } } (4) CStringHuffmanTree: : bmText(CStringtext) { CStringbmtext; intsize=text.GetLength(); for(inti=0;i for(intj=0;j if(bmifo[j].ch==text[i]) { bmtext+=bmifo[j].bm; break; } returnbmtext;//返回编码后的文本 } (5) CStringHuffmanTree: : jmText(CStringtext) { intsize=text.GetLength(); CStringbm,jmtext; for(inti=0;i { bm+=text[i]; for(intj=0;j if(bm==bmifo[j].bm) { jmtext+=bmifo[j].ch; bm.Empty(); break; } } returnjmtext;//返回解码后的文本内容 } 3.函数之间的调用关系 对话框 接收函数 发送函数 哈夫曼树 bmText jmText DrawTree Start CreatTree bianma textifo mergeTree 最小堆 Remove Insert siftDown siftUp 四、调试分析 1.程序在调试过程中出现的问题及解决方法 (1)静态成员函数调用非静态成员报错 解决方法: 不在静态方法调用非静态方法,将消息传递到非静态的消息响应函数里在进行调用和处理。 (2)当输入只有一个字符时无法建立哈夫曼树 解决方法: 在建立的哈夫曼树的函数里加判断语句判断是否只有一个字符,如果只有一个字符,将此字符作为根的左子树。 (3)发送和接收端无法建立同样的哈弗曼树 解决方法: 将哈夫曼树和编码信息一同发送给接收端。 2.算法的时间复杂度分析 五、测试结果 根据一组提供的测试数据得到什么样的结果 测试数据: Thisismyprograme! 编码后结果: 100010010000011010000011010111101010111111111 001000101111011011011111101100 六、心得体会 通过此次实习,我更好的掌握了MFC的使用,学习他的方法就是经常使用他,用的多自然就能熟练使用,由于平时使用的多,所以觉得这次实习的题目都很简单,只花了两天时间就把这个题目完成了。 通过实习最重要的是掌握自学的方法,了解获得知识的渠道,我获得知识的渠道就是看孙鑫老师的教学视频和XX,常用的MFC的使用孙鑫老师的视频上都有讲,没讲过的不懂的可以XX,当然,在XX之前最好自己查阅一下MSDN,这个VC的帮助文档是很有用的,但是一点不太方便的是它的解释都是英文的,看起来不是很懂,这就需要有好的英语基础。 实在不懂的,就只能XX了。 而且实习过程中大家彼此交流,通过解决别人遇到的问题自己也掌握了解决问题的方法,这也是一种收获。 总之,此次实习有所收获。 指导教师评语 评语: 指导教师(签名):
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 数据结构 实习 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)