1、数据结构课程设计报告格式new山东建筑大学计算机科学与技术学院课程设计说明书题 目: 哈夫曼编、译码器 算术表达式求值演示课 程: 数据结构课程设计院 (部): 理学院专 业: 信息与计算科学班 级: 信计0x1学生姓名: xx学 号: 2006121xxx指导教师: xxx完成日期: 2008-7-4目 录课程设计任务书一 I课程设计任务书二 II题目一 1一、问题描述 1二、基本要求 1三、算法思想 1四、数据结构 1五、模块划分 1六、源程序 2七、测试数据 5八、测试情况 5题目二 6一、问题描述 6二、基本要求 6三、算法思想 6四、数据结构 6五、模块划分 6六、源程序 6七、测试
2、数据 15八、测试情况 15结 论 16参考文献 17课程设计指导教师评语 18山东建筑大学计算机科学与技术学院课程设计任务书一设计题目哈夫曼编、译码器已知技术参数和设计要求问题描述 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编/译码系统。基本要求一个完整的系统应具有以下功能。(1)I:初始化(Initialization)。(2)E:编码(Encoding)。(
3、3)C:压缩(Compress)。(4)D:译码(Decoding)。(5)P:打印代码文件(Print)。(6)T:显示哈夫曼树(Treeprinting)。设计内容与步骤实现提示 (1) 编码结果以文本方式存储于文件中。(2) 用户界面可以设计为“菜单”方式。设计工作计划与进度安排1、 课程设计按照教学要求需要两周时间完成,2、 两周中每天(按每周5天)至少要上机6小时来调试程序。3、 总共至少要上机调试程序60小时。设计考核要求1、 考勤20%2、 课程设计说明书50%3、 程序实现30%指导教师(签字): 教研室主任(签字)山东建筑大学计算机科学与技术学院课程设计任务书二设计题目算术表
4、达式求值演示已知技术参数和设计要求问题描述表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。基本要求以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用教科书表3.1给出的算符优先关系,实现对算术四则运算运河运算表达式的求值,并仿照教科书的例3.1演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。设计内容与步骤实现提示(1) 设置运算符栈和运算数栈辅助分析算符优先关系。(2) 在读入表达式的字符序列的同时,完成运算符和运算数(整数)的识别处理,以及相应的运算。(3) 在识别出运算数的同时,要将其
5、字符序列形式转换成整数形式。(4) 在程序的适当位置输出运算符栈、运算数栈、输入字符和主要操作的内容。设计工作计划与进度安排1、课程设计按照教学要求需要两周时间完成,2、两周中每天(按每周5天)至少要上机6小时来调试程序。3、总共至少要上机调试程序60小时。设计考核要求1、考勤20%2、课程设计说明书50%3、程序实现30%指导教师(签字): 教研室主任(签字)题目一哈夫曼编/译码器一、问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码。对于双工信道(即可以双向传输信息的信
6、道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编/译码系统。二、基本要求:一个完整的系统应具有以下功能。(1)I:初始化(Initialization)。(2)E:编码(Encoding)。(3)C:压缩(Compress)。(4)D:译码(Decoding)。(5)P:打印代码文件(Print)。(6)T:显示哈夫曼树(Treeprinting)。三、算法思想:译码过程是分解电文中字符串,从根出发,按字符“0”或“1”确定找左孩子或右孩子,直至叶子结点,便求得孩子串相应的字符。四、数据结构: typedef struct char bitsN五、模块划分1、 函
7、数:typedef struct HUFFMAN HUFFMANCODE main()2、函数之间的调用关系 main函数调用其他函数六、源程序#define N 7 /*叶子数目,需要时更改此值即可*/ #define M 2*N-1 /*节点总数*/ typedef struct char bitsN;/*编码存储,位串*/ int start; /*编码在位串中的位置*/ codetype; typedef struct float weight; int lchild,rchild,parent; hufmtree; void HUFFMAN(tree1) hufmtree tree1
8、; int i,j,p1,p2; float small1,small2,f; hufmtree *tree; tree=tree1; for(i=0;iM;i+) /*初始化*/ treei.parent=0; treei.lchild=0; treei.rchild=0; treei.weight=0.0; printf(please input a possible data weight:n); /*输入信源数据*/ for(i=0;iN;i+) /*输入前n个节点的权值*/ scanf(%f,&f); treei.weight=f; for(i=N;iM;i+) /* 进行n-1次合
9、并,产生n-1个新的节点*/ p1=0,p2=0; small1=1;small2=1; for(j=0;j=i-1;j+) /*从所有的节点中,选出两个权值最小的根节点*/ if(treej.parent=0) /*parent值为0,则显示根节点,否则便是非根节点*/ if(treej.weightsmall1) small2=small1; /*改变最小权,次小权及对应的位置*/ small1=treej.weight; p2=p1; /*p1、p2记住这两个根节点在向量tree中的下标*/ p1=j; else if(treej.weightsmall2) small2=treej.w
10、eight;/*次小权及位置*/ p2=j; treep1.parent=i+1; /*节点分量与下标之间差值为1*/ treep2.parent=i+1; /*节点的标号i+1*/ treei.lchild=p1+1; /*最小值根节点是新节点的左孩子,分量标号是其下标加1*/ treei.rchild=p2+1; /*次小权根节点是新节点的右孩子*/ treei.weight=treep1.weight+treep2.weight; /*HUFFMANTREE()*/ void HUFFMANCODE(code1,tree1) /*根据哈夫曼树求出哈夫曼编码*/ codetype code
11、1; /*求出的哈夫曼编码所在*/ hufmtree tree1;/*已知的哈夫曼树*/ int i,j,c,p; codetype cd;/*缓冲变量*/ codetype *code; hufmtree *tree; code=code1; tree=tree1; for(i=0;iN;i+) cd.start=N; c=i+1; /*从叶节点出发向上回溯*/ p=treei.parent;/*treep-1是treei的双亲*/ while(p!=0) cd.start-; if(treep-1.lchild=c) cd.bitscd.start=0; /*treei是左子树。生成代码0
12、*/ else cd.bitscd.start=1; /*否则treei是右子树。生成代码1*/ c=p; p=treep-1.parent; codei=cd; /*第i+1个字符的编码存入codei*/ /*HUFFMANCODE*/ #include stdio.h main() int k1,k2; hufmtree tree_finaM; hufmtree *p11=tree_fina; codetype code_finaN; codetype *p21=code_fina; HUFFMAN(p11); /*建立huffman树*/ HUFFMANCODE(p21,p11); /*
13、haffman码*/ for(k1=0;k1N;k1+) /*输出编码*/ printf(number %d haffmancode: ,k1+1); for(k2=code_finak1.start;k2N;k2+) printf( %c,code_finak1.bitsk2); printf(n); 七、测试数据0 0 0 0 0 0 0 八、测试情况题目二 算术表达式求值演示一、问题描述:表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。二、基本要求:以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利
14、用教科书表3.1给出的算符优先关系,实现对算术四则运算运河运算表达式的求值,并仿照教科书的例3.1演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。三、算法思想:建立两个不同的栈,其中一个为运算符栈,另一个为操作数栈。输入数据时,首先将操作数进栈,然后将运算符进栈。继续当有输入运算符时,从前面的运算符栈中,取栈顶元素进行比较。如果当前输入的运算符的优先级高于栈顶元素则进栈,否则,调用运算函数进行运算直至输入的字符为#时结束。四、数据结构typedef struct char stackname20; char *base; char *top; Stack; Stack OPTR,
15、 OPND;五、模块划分1、函数:void main()主函数;int InitStack(Stack *s, char *name);void OutputStatus(void);char Pop(Stack *s);char GetTop(Stack s);switch(op)char Precede(char c1,char c2)2函数之间的调用关系:主函数main()调用其他函数六、源程序六、原程序:#include #include #include #include #include #define N 100 double numStackN=0; int numTop; c
16、har opStackN; int opTop; int op(char ch) if(ch=+|ch=-) return 2; if(ch=*|ch=/) return 3; if(ch=() return -1; return 0; double result(double num1,char op,double num2) if(op=+) return num1+num2; if(op=-) return num1-num2; if(op=*) return num1*num2; if(op=/) return num1/num2; return 0; int compute(char
17、 str) double num=0; int i=0,j=1,k=1; int Flag=0; numTop=opTop=0; while(stri!=0|opTop0) if(stri=0&stri0&!op(stri-1)&stri!=(&stri-1!=) numStacknumTop+=num*k; num=0; j=1; Flag=0; k=1; if(opTop=0|stri=() opStackopTop+=stri; else if(stri=) while(opTop0&opStack-opTop!=() numStacknumTop-2=result(numStacknu
18、mTop-2,opStackopTop,numStacknumTop-1); numTop-; if(opStackopTop!=() return 0; else if(stri=0&numTop=0) return 0; while(opTop0&op(stri)=0&ch=0&ch=9 ) numj+=ch; numj=0; else j=0; if(ch=S|ch=s) if(strlen(num) face(); printf(%s has been savedn,strcpy(save,num); printf(input an expression,press key E to
19、computen); printf(%s,str); else face(); printf(there is no number to save!n); printf(input an expression,press key E to computen); printf(%s,str); if(ch=R|ch=r) if(strlen(save) face(); printf(input an expression,press key E to computen); printf(%s,strcat(str,save); i+=strlen(save); if(ch=C|ch=c) if(
20、strlen(str) str-i=0; face(); printf(input an expression,press key E to computen); printf(%s,str); if(ch=E|ch=e) if(compute(str) printf(n=%gn,numStack0); j=0; temp=numStack0; if(temp=10) k*=10; while(k) numj+=temp2/k+0; numj=0; temp2=temp2%k; k/=10; temp=temp-(int)temp; if(temp!=0) numj+=.; numj=0; t
21、emp+=0.0000005; for(k=6;k0;k-) if(temp=0) break; temp*=10; numj+=(int)temp+0; numj=0; temp=temp-(int)temp; else face(); printf(input an expression,press key E to computen); printf(%s,str); printf(nwrong expression!); i=0; j=0; str0=0; if(ch=Q|ch=q) printf(nare you sure to quit?(Y/N)n); ch=getch(); i
22、f(ch=Y|ch=y) break; else face(); printf(input an expression,press key E to computen); printf(%s,str); ch=getch(); 七、测试数据2*(5-0)八、测试情况结 论通过两周的课程设计,我学到哈夫曼编码可以节省资源空间,也学到了一些算法的应用,懂得了怎么用表达式求值,学到了不少东西 但是在调试程序过程中也遇到了很多困难,使我认识到自己还有很多不足的地方,还需要继续努力!参考文献1. 严蔚敏, 吴伟民. 数据结构. 清华大学出版社, 2005.112. 谭浩强. C语言程序设计. 清华大学出版社, 2005.113. 范辉. Visual C+程序设计. 高等教育出版社山东建筑大学计算机科学与技术学院课程设计指导教师评语班级:061 学生姓名: 周磊 学号: 2006121143指导教师评语(包括工作态度,遵守纪律;基本理论、知识、技能;独立工作能力和分析解决问题的能力;完成任务情况及水平):学生成绩(百分制):指导教师签名: 年 月 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1