ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:869.54KB ,
资源ID:4884089      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4884089.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(常州大学课程设计报告.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

常州大学课程设计报告.docx

1、常州大学课程设计报告 序号: 学号: 12453118 课 程 设 计设计课程名称: C语言课程设计 题 目: Data Compression 学 生 姓 名: 郭宏宇 学 院: 数理学院 专 业 班 级: 应数121 指 导 教 师: 王军 专业技术职务: 讲师 设计时间: 2013 年 6 月 17 日 2013 年 6 月 28 日目录1、引言及设计要求 31.1引言 31.2设计需求 31.2.1题目要求 31.2.2输出要求 32 、概要设计 32.1数据结构的描述 32.1.1数据类型的定义 32.1.2主要算法流程描述 42.2流程图 43、详细设计及实现 54、调试分析 55

2、、总结及心得 115.1专题总结 115.2心得体会 116、设计日志及参考文献 126.1设计日志 126.2参考文献 12附录:程序源代码 13第一部分:霍夫曼解码器的实现 13第二部分:实现霍夫曼编码器 171、引言及设计要求1.1引言在多媒体计算机系统中,信息从单一媒体转到了多种媒体,要表示、传输和处理大量的声音、图像甚至影像视频信息,其数据量之大是非常惊人的。数字化多媒体信息的数据量是如此巨大,加之信息种类多、实时性要求高,给数据的存储、传输以及加工处理均带来了巨大的压力,不仅要求计算机有更高的数据处理和数据传输能力以及巨大的存储空间,而且也要求通信信道有更高的带宽。为了解决存储、处

3、理和传输多媒体数据的问题,除了提高计算机本身的性能以及通信信道的带宽外,更重要的则是对多媒体数据进行有效的压缩。因此数据压缩编解码自然就成为了多媒体技术中最为关键的核心技术。1.2设计需求1.2.1题目要求A:在每一次迭代过程中,我们需要跟踪的符号(或复合)的最低频率和第二频率最低的发生。这可以很容易地使用优先队列(一个链表,其中的元素总是插入正确的位置)。文件encode.c包含的模板代码(pq_insert())的实现优先级队列。你需要填写缺少的部分。确保你照顾下列条件:(i)队列为空(ii)新的元素在开始前存储进去(iii)新元素存储在队列最后或中间。B:符号的使用优先队列的pq_pop

4、功能删除。在一个优先队列中,元素总是从一开始就删除。文件encode.c包含模板代码来实现这个。请填写所缺的部分。确保你的更新要被删除的元素的指针。C:一旦代码树是建立在内存中,我们需要生成的每个符号的编码字符串。填入所缺的代码生成generate_code()。D:最后填写缺失的代码来释放所有资源和内存,然后退出代码。1.2.2输出要求程序输出两个文件encoded.txt含有编码的输出和code.txt显示霍夫曼编码。2 、概要设计2.1数据结构的描述2.1.1数据类型的定义struct tnode struct tnode* left; /*used when in tree*/ str

5、uct tnode*right; /*used when in tree*/ struct tnode*parent;/*used when in tree*/ struct tnode* next; /*used when in list*/ float freq; int isleaf; char symbol;struct Symbol char symbol; float freq;/*global variables整体变量*/char codeMAX_SYMBOLSMAX_LEN;struct tnode* root=NULL;/*tree of symbols*/struct t

6、node* qhead=NULL;/*list of current symbols*/struct cnode* chead=NULL;/*list of code*/2.1.2主要算法流程描述Main函数调用pq_insert函数频率初始化,调用pq_pop 、talloc 、pq_insert函数构建树,调用generate_code函数构建代码,调用dump_code函数输出代码,调用encode函数实现一个样品的字符串编码。2.2流程图3、详细设计及实现分配新的代码:动态申请一块区域,用强制类型把它转换成结构体类型struct tnode的指针并赋给同类型的指针变量p,再将信息赋给申

7、请的区域里。在代码功能中显示tnodes的列表:调用struct tnode,输出字符和出现的频率。插入一个元素到优先列表中:利用全局变量qhead,分不同的情况将元素插入到优先列表中。删除第一个元素:利用全局变量qhead,分两种情况删除元素。生成的字符串的代码树:运用递归调用的方法建立一个叶子节点。输出代码文件:将code信息输出到文件(就是code.txt)。Main函数:调用不同的函数完成这个程序。4、调试分析在main函数中调用函数,结果如下: 显示在二叉树中各个字符的寻找路径 111101 110! 10111001111 1011101& 01101100111101001 11

8、1100101( 10111001100111101) 10111001100111100, 011001- 101110000. 1111100/ 0110110011110100000 10111001100101 01101100111112 101110001011003 0110110011110014 1011100110011105 0110110011110116 0110110011110007 1011100110011008 101110001011019 1011100110011111: 11110011111011; 111100111111? 1111001001

9、A 1111001101B 0110110100C 10111001101D 01101100011E 01101100110F 111100111101G 101110011000H 101110010I 0110001J 011011001110K 1011100010111L 10111000100M 1111001000N 10111000110O 10111000111P 111100111100Q 101110011001101R 01101100010S 1111001110T 011011011U 11110011111010V 1111001111100W 111100110

10、0X 0110110011110101Y 0110110010Z 011011001111010001a 1000b 1111000c 101111d 10110e 001f 100110g 011010h 0100i 0000j 10111001110k 0110000l 10010m 111001n 0101o 0111p 1111101q 0110110000r 11101s 0001t 1010u 111111v 0110111w 111000x 0110110101y 100111z 1011100010105、总结及心得5.1专题总结在本专题的课程设计中运用了C语言的知识设计了数据

11、压缩,我们利用C语言的知识设计了可以对数据进行压缩的系统,在系统中我们了解到了霍夫曼编码(Huffman Coding是一种编码方式,是一种用于无损数据压缩的权编码算法。1952年,David A. Huffman在麻省理工攻读博士时所发明的,并发表于A Method for the Construction of Minimum-Redundancy Codes一文)。数据压缩包含的内容很多,我做的这个程序调用的函数也比较多。程序包含7个调用函数和一个主函数,主函数分别调用这几个不同功能的函数。分别为:分配新的代码,在代码功能中显示tnodes的列表,插入一个元素到优先列表中,删除第一个元素

12、,生成的字符串的代码树,输出代码文件,输出压缩流。总结:获取a,b,c.的频率;根据频率做霍夫曼二叉树;根据二叉树获得a,b,c.的编码;编码到文件中在设计中我们利用使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。系统不完善,应进一步设计与细化。5.2心得体会首先感谢王老师在课程中和在为期两周的设计过程中的支持。 这次是我第一次参加课程设计,因此刚完成分组拿到课题是还是很紧张的。由于五人联合完

13、成一个课题,需要较好地处理分步完成和协调好组内同学的配合。在这一方面,数据压缩课题是不同于其他课题的。所以在此次课程设计中,对于我们各位来说团队精神都得到了很大提升。在设计的过程中,除了组内同学的配合之外,我们还得到了其他同学的答疑和帮助,在此也一并感谢。开始时,看了数据压缩的英文版解释,大致了解了这个程序分为三个部分,第一部分:霍夫曼解码器的实现:第二部分:实现霍夫曼编码器;第三部分:压缩大文件。第一部分相对其它两个部分简单点,第二部分应该是其中最难的了。而且,对于第二部分所涉及的C语言知识,我也是没有想到的,因为之前对于链表、递归我还是不了解的,我也通过这次C语言课程设计把落下的知识补上来

14、了。也许我做的还不是很好,但是,通过这次课程设计我学会了在C语言编程中如何更好地运用所学的知识,和别人合作完成一个大的编程。学校组织我们进行课程设计的用意也是希望我们能够把在C语言课程中学到的理论知识同实践结合起来,复合地利用所学知识丰富自己的涵养,提高自己的水平。只有把所学的理论知识与实践相结合起来,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,在这次课程设计之后,我一定会完善自己的不足之处。6、设计日志及参考文献6.1设计日志六月十五号-六月十六号 我们拿到题目

15、,进行了分组。六月十七号-六月十八号 将老师所给题目资料、部分程序代码进行整理和汇总,题目英文部分进行翻译,打印成册,组员每人一份。初步了解设计的要求、目的、所需知识内容,将设计分为三个部分,分配人员负责。六月十九号-六月二十号 进一步了解设计,发现问题,重新部署。六月二十一号-六月二十三号 查阅资料,结合老师已给程序,弄清每部分程序的职能,完成大概的程序填充。六月二十四号-六月二十五号 请教高水平同学,完善粗糙的程序。六月二十六号 进行程序的调试运行,纠错。六月二十七号 撰写程序设计报告,编写设计心得等。六月二十八号 完善设计报告和准备答辩6.2参考文献c语言程序设计(第二版)数据压缩基本原

16、理霍夫曼代码 维基百科,自由的百科全书哈夫曼代码 XX百科附录:程序源代码第一部分:霍夫曼解码器的实现#include #include #include #define MAX_SYMBOLS 255#define MAX_LEN 10struct tnode struct tnode* left; /*used when in tree*/ struct tnode*right; /*used when in tree*/ int isleaf; char symbol;struct code int symbol; char strcodeMAX_LEN;/*global variabl

17、es*/struct tnode* root=NULL; /*tree of symbols*/* function talloc desc allocates new node */struct tnode* talloc() struct tnode* p=(struct tnode*)malloc(sizeof(struct tnode); if(p!=NULL) p-left=p-right=NULL; p-symbol=0; p-isleaf=0; return p;/* function build_tree desc builds the symbol tree given th

18、e list of symbols and code.h NOTE: alters the global variable root that has already been allocated in main*/void build_tree(FILE* fp) char symbol; char strcodeMAX_LEN; int items_read; int i,len; struct tnode* curr=NULL; while(!feof(fp) items_read=fscanf(fp,%c %sn,&symbol,strcode); if(items_read!=2)

19、break; curr=root; len=strlen(strcode); for(i=0;ileft) curr = curr-left; else struct tnode* p=(struct tnode*)malloc(sizeof(struct tnode); curr-left = p; p-left = 0; p-right = 0; p-symbol = 0; p-isleaf =0; curr = p; else if(curr-right) curr = curr-right; else struct tnode* p=(struct tnode*)malloc(size

20、of(struct tnode); curr-right = p; p-left = 0; p-right = 0; p-symbol = 0; p-isleaf =0; curr = p; /*assign code*/ curr-isleaf=1; curr-symbol=symbol; printf(inserted symbol:%c,%sn,symbol,strcode); /* function decode*/void decode(FILE* fin,FILE* fout) char c; struct tnode* curr=root; while(c=getc(fin)!=

21、EOF) /*TODO: traverse the tree print the symbols only if you encounter a leaf node */ if(curr-isleaf = 0) if(c = 1) curr = curr-right; if(curr-isleaf) putc(curr-symbol,fout); curr = root; else curr = curr-left; if(curr-isleaf) putc(curr-symbol,fout); curr = root; curr = NULL; free(curr);/* function

22、freetree desc cleans up resources for tree*/void freetree(struct tnode* root) if(root=NULL) return; freetree(root-right); freetree(root-left); free(root);int main() const char* IN_FILE=encoded.txt; const char* CODE_FILE=code.txt; const char* OUT_FILE=decoded.txt; FILE* fout; FILE* fin; /*allocate ro

23、ot*/ root=talloc(); fin=fopen(CODE_FILE,r); /*build tree*/ build_tree(fin); fclose(fin); /*decode*/ fin=fopen(IN_FILE,r); fout=fopen(OUT_FILE,w); decode(fin,fout); fclose(fin); fclose(fout); /*cleanup*/ freetree(root); getchar(); return 0;第二部分:实现霍夫曼编码器#include #include #include #include #include #de

24、fine MAX_SYMBOLS 128#define MAX_LEN 20struct tnode struct tnode* left; /*used when in tree*/ struct tnode*right; /*used when in tree*/ struct tnode*parent;/*used when in tree*/ struct tnode* next; /*used when in list*/ float freq; int isleaf; char symbol;struct Symbol char symbol; float freq;/*globa

25、l variables*/char codeMAX_SYMBOLSMAX_LEN;struct tnode* root=NULL; /*tree of symbols*/struct tnode* qhead=NULL; /*list of current symbols*/struct cnode* chead=NULL;/*list of code*/* function talloc desc allocates new node */struct tnode* talloc(int symbol,float freq) struct tnode* p=(struct tnode*)ma

26、lloc(sizeof(struct tnode); if(p!=NULL) p-left=p-right=p-parent=p-next=NULL; p-symbol=symbol; p-freq=freq; p-isleaf=1; return p;/* function display_tnode_list desc displays the list of tnodes during code construction*/void pq_display(struct tnode* head) struct tnode* p=NULL; printf(list:); for(p=head

27、;p!=NULL;p=p-next) printf(%c,%f) ,p-symbol,p-freq); printf(n);/* function pq_insert desc inserts an element into the priority queue NOTE: makes use of global variable qhead*/void pq_insert(struct tnode* p) struct tnode* curr=NULL; struct tnode* prev=NULL; printf(inserting:%c,%fn,p-symbol,p-freq); if

28、(qhead=NULL) /*qhead is null*/ /*TODO: write code to insert when queue is empty*/ qhead = p; /*TODO: write code to find correct position to insert*/ else curr = prev = qhead; if(qhead-next = NULL | (p-freq freq) curr = qhead; else do prev = curr; curr = prev-next; if(curr = NULL)|(prev-freq freq)&(curr-freq = p-f

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1