数据结构课程设计报告格式new.docx

上传人:b****7 文档编号:10424020 上传时间:2023-02-11 格式:DOCX 页数:20 大小:55.58KB
下载 相关 举报
数据结构课程设计报告格式new.docx_第1页
第1页 / 共20页
数据结构课程设计报告格式new.docx_第2页
第2页 / 共20页
数据结构课程设计报告格式new.docx_第3页
第3页 / 共20页
数据结构课程设计报告格式new.docx_第4页
第4页 / 共20页
数据结构课程设计报告格式new.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

数据结构课程设计报告格式new.docx

《数据结构课程设计报告格式new.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告格式new.docx(20页珍藏版)》请在冰豆网上搜索。

数据结构课程设计报告格式new.docx

数据结构课程设计报告格式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

七、测试数据15

八、测试情况15

结论16

参考文献17

课程设计指导教师评语18

山东建筑大学计算机科学与技术学院

课程设计任务书一

设计题目

哈夫曼编、译码器

已知技术参数和设计要求

[问题描述]

利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码。

对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼码的编/译码系统。

[基本要求]一个完整的系统应具有以下功能。

(1)I:

初始化(Initialization)。

(2)E:

编码(Encoding)。

(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%

指导教师(签字):

教研室主任(签字)

山东建筑大学计算机科学与技术学院

课程设计任务书二

设计题目

算术表达式求值演示

已知技术参数和设计要求

[问题描述]表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。

设计一个程序,演示用算符优先法对算术表达式求值的过程。

[基本要求]以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。

利用教科书表3.1给出的算符优先关系,实现对算术四则运算运河运算表达式的求值,并仿照教科书的例3.1演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。

设计内容与步骤

[实现提示]

(1)设置运算符栈和运算数栈辅助分析算符优先关系。

(2)在读入表达式的字符序列的同时,完成运算符和运算数(整数)的识别处理,以及相应的运算。

(3)在识别出运算数的同时,要将其字符序列形式转换成整数形式。

(4)在程序的适当位置输出运算符栈、运算数栈、输入字符和主要操作的内容。

设计工作计划与进度安排

1、课程设计按照教学要求需要两周时间完成,

2、两周中每天(按每周5天)至少要上机6小时来调试程序。

3、总共至少要上机调试程序60小时。

设计考核要求

1、考勤20%

2、课程设计说明书50%

3、程序实现30%

指导教师(签字):

教研室主任(签字)

题目一哈夫曼编/译码器

一、问题描述:

利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码。

对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼码的编/译码系统。

二、基本要求:

一个完整的系统应具有以下功能。

(1)I:

初始化(Initialization)。

(2)E:

编码(Encoding)。

(3)C:

压缩(Compress)。

(4)D:

译码(Decoding)。

(5)P:

打印代码文件(Print)。

(6)T:

显示哈夫曼树(Treeprinting)。

三、算法思想:

译码过程是分解电文中字符串,从根出发,按字符“0”或“1”确定找左孩子或右孩子,直至叶子结点,便求得孩子串相应的字符。

四、数据结构:

typedefstructcharbits[N]

 

五、模块划分

1、函数:

typedefstruct{}HUFFMANHUFFMANCODEmain()

 

2、函数之间的调用关系main函数调用其他函数

六、源程序

#defineN7/*叶子数目,需要时更改此值即可*/

#defineM2*N-1/*节点总数*/

typedefstruct

{

charbits[N];/*编码存储,位串*/

intstart;/*编码在位串中的位置*/

}codetype;

typedefstruct

{

floatweight;

intlchild,rchild,parent;

}hufmtree;

voidHUFFMAN(tree1)

hufmtreetree1[];

{

inti,j,p1,p2;

floatsmall1,small2,f;

hufmtree*tree;

tree=tree1;

for(i=0;i

{

tree[i].parent=0;

tree[i].lchild=0;

tree[i].rchild=0;

tree[i].weight=0.0;

}

printf("pleaseinputapossibledataweight:

\n");/*输入信源数据*/

for(i=0;i

{

scanf("%f",&f);

tree[i].weight=f;

}

for(i=N;i

{

p1=0,p2=0;

small1=1;small2=1;

for(j=0;j<=i-1;j++)/*从所有的节点中,选出两个权值最小的根节点*/

if(tree[j].parent==0)/*parent值为0,则显示根节点,否则便是非根节点*/

if(tree[j].weight

{

small2=small1;/*改变最小权,次小权及对应的位置*/

small1=tree[j].weight;

p2=p1;/*p1、p2记住这两个根节点在向量tree中的下标*/

p1=j;

}

elseif(tree[j].weight

{

small2=tree[j].weight;/*次小权及位置*/

p2=j;

}

tree[p1].parent=i+1;/*节点分量与下标之间差值为1*/

tree[p2].parent=i+1;/*节点的标号i+1*/

tree[i].lchild=p1+1;/*最小值根节点是新节点的左孩子,分量标号是其下标加1*/

tree[i].rchild=p2+1;/*次小权根节点是新节点的右孩子*/

tree[i].weight=tree[p1].weight+tree[p2].weight;

}

}/*HUFFMANTREE()*/

voidHUFFMANCODE(code1,tree1)/*根据哈夫曼树求出哈夫曼编码*/

codetypecode1[];/*求出的哈夫曼编码所在*/

hufmtreetree1[];/*已知的哈夫曼树*/

{

inti,j,c,p;

codetypecd;/*缓冲变量*/

codetype*code;

hufmtree*tree;

code=code1;

tree=tree1;

for(i=0;i

{

cd.start=N;

c=i+1;/*从叶节点出发向上回溯*/

p=tree[i].parent;/*tree[p-1]是tree[i]的双亲*/

while(p!

=0)

{

cd.start--;

if(tree[p-1].lchild==c)

cd.bits[cd.start]='0';/*tree[i]是左子树。

生成代码'0'*/

else

cd.bits[cd.start]='1';/*否则tree[i]是右子树。

生成代码'1'*/

c=p;

p=tree[p-1].parent;

}

code[i]=cd;/*第i+1个字符的编码存入code[i]*/

}

}/*HUFFMANCODE*/

#include"stdio.h"

main()

{

intk1,k2;

hufmtreetree_fina[M];

hufmtree*p11=tree_fina;

codetypecode_fina[N];

codetype*p21=code_fina;

HUFFMAN(p11);/*建立huffman树*/

HUFFMANCODE(p21,p11);/*haffman码*/

for(k1=0;k1

{

printf("number%dhaffmancode:

",k1+1);

for(k2=code_fina[k1].start;k2

printf("%c",code_fina[k1].bits[k2]);

printf("\n");

}}

 

七、测试数据

0000000

八、测试情况

题目二算术表达式求值演示

一、问题描述:

表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。

设计一个程序,演示用算符优先法对算术表达式求值的过程。

二、基本要求:

以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。

利用教科书表3.1给出的算符优先关系,实现对算术四则运算运河运算表达式的求值,并仿照教科书的例3.1演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。

三、算法思想:

建立两个不同的栈,其中一个为运算符栈,另一个为操作数栈。

输入数据时,首先将操作数进栈,然后将运算符进栈。

继续当有输入运算符时,从前面的运算符栈中,取栈顶元素进行比较。

如果当前输入的运算符的优先级高于栈顶元素则进栈,否则,调用运算函数进行运算直至输入的字符为#时结束。

四、数据结构

typedefstruct{

charstackname[20];

char*base;

char*top;

}Stack;StackOPTR,OPND;

五、模块划分

1、函数:

voidmain()主函数;

intInitStack(Stack*s,char*name);

voidOutputStatus(void);

charPop(Stack*s);

charGetTop(Stacks);

switch(op)

charPrecede(charc1,charc2)

2函数之间的调用关系:

主函数main()调用其他函数六、源程序

六、原程序:

#include

#include

#include

#include

#include

#defineN100

doublenumStack[N]={0};

intnumTop;

charopStack[N];

intopTop;

intop(charch){

if(ch=='+'||ch=='-')return2;

if(ch=='*'||ch=='/')return3;

if(ch=='(')return-1;

return0;

}

doubleresult(doublenum1,charop,doublenum2){

if(op=='+')returnnum1+num2;

if(op=='-')returnnum1-num2;

if(op=='*')returnnum1*num2;

if(op=='/')returnnum1/num2;

return0;

}

intcompute(charstr[]){

doublenum=0;

inti=0,j=1,k=1;

intFlag=0;numTop=opTop=0;

while(str[i]!

='\0'||opTop>0)

{

if(str[i]>='0'&&str[i]<='9')

if(Flag==0)

num=num*10+str[i]-'0';

else

{

num+=(str[i]-'0')/(j*10.0);

j*=10;

}

else

if(str[i]=='.')Flag=1;

else

if(k==1&&str[i]=='-'&&(i==0||op(str[i-1])))k=-1;

else

{

if(i>0&&!

op(str[i-1])&&str[i]!

='('&&str[i-1]!

=')'){

numStack[numTop++]=num*k;

num=0;j=1;Flag=0;k=1;

}

if(opTop==0||str[i]=='(')

opStack[opTop++]=str[i];

else

if(str[i]==')'){

while(opTop>0&&opStack[--opTop]!

='('){

numStack[numTop-2]=result(numStack[numTop-2],opStack[opTop],numStack[numTop-1]);

numTop--;

}

if(opStack[opTop]!

='(')return0;

}

else{

if(str[i]=='\0'&&numTop==0)return0;

while(opTop>0&&op(str[i])<=op(opStack[opTop-1])){

numStack[numTop-2]=result(numStack[numTop-2],opStack[--opTop],numStack[numTop-1]);

numTop--;

}

if(str[i]!

='\0')opStack[opTop++]=str[i];

}

}

if(str[i]!

='\0')i++;

}

if(numTop!

=1||opTop!

=0)return0;

return1;

}

voidface(){

system("cls");

printf("________\n");

printf("Savenumber(S)|Readnumber(R)|Clear(C)|Equal(E)|Quit(Q)\n");

printf("----------\n");

}

main()

{

inti=0,j=0,k;

charstr[N]="\0";

charnum[N]="\0";

charsave[N]="\0";

charch;

doubletemp;

unsignedlongtemp2;

face();

printf("inputanexpression,presskey'E'tocompute\n");

ch=getch();

while

(1)

{

if(ch=='.'||ch==')'||op(ch)||ch>='0'&&ch<='9')

{

str[i++]=ch;

str[i]='\0';

face();

printf("inputanexpression,presskey'E'tocompute\n");

printf("%s",str);

if(ch=='-'&&(i==1||op(str[i-2]))||ch>='0'&&ch<='9')

{

num[j++]=ch;

num[j]='\0';

}

elsej=0;

}

if(ch=='S'||ch=='s')

if(strlen(num))

{

face();

printf("%shasbeensaved\n",strcpy(save,num));

printf("inputanexpression,presskey'E'tocompute\n");

printf("%s",str);

}

else{

face();

printf("thereisnonumbertosave!

\n");

printf("inputanexpression,presskey'E'tocompute\n");

printf("%s",str);

}

if(ch=='R'||ch=='r')

if(strlen(save)){

face();

printf("inputanexpression,presskey'E'tocompute\n");

printf("%s",strcat(str,save));

i+=strlen(save);

}

if(ch=='C'||ch=='c'){

if(strlen(str))str[--i]='\0';

face();

printf("inputanexpression,presskey'E'tocompute\n");

printf("%s",str);

}

if(ch=='E'||ch=='e'){

if(compute(str)){

printf("\n=%g\n",numStack[0]);

j=0;temp=numStack[0];

if(temp<0){

temp=-temp;

num[j++]='-';

num[j]='\0';

}

temp2=(unsignedlong)temp;

k=1;

while(temp2/k>=10)

k*=10;

while(k){

num[j++]=temp2/k+'0';

num[j]='\0';

temp2=temp2%k;

k/=10;

}

temp=temp-(int)temp;

if(temp!

=0){

num[j++]='.';

num[j]='\0';

temp+=0.0000005;

}

for(k=6;k>0;k--){

if(temp==0)break;

temp*=10;

num[j++]=(int)temp+'0';

num[j]='\0';

temp=temp-(int)temp;

}

}

else{

face();

printf("inputanexpression,presskey'E'tocompute\n");

printf("%s",str);

printf("\nwrongexpression!

");

}

i=0;j=0;str[0]='\0';

}

if(ch=='Q'||ch=='q'){

printf("\nareyousuretoquit?

(Y/N)\n");

ch=getch();

if(ch=='Y'||ch=='y')break;

else{

face();

printf("inputanexpression,presskey'E'tocompute\n");

printf("%s",str);

}

}

ch=getch();

}

}

 

七、测试数据

2*(5-0)

八、测试情况

结论

通过两周的课程设计,我学到哈夫曼编码可以节省资源空间,也学到了一些算法的应用,懂得了怎么用表达式求值,学到了不少东西但是在调试程序过程中也遇到了很多困难,使我认识到自己还有很多不足的地方,还需要继续努力!

参考文献

1.严蔚敏,吴伟民.数据结构.清华大学出版社,2005.11

2.谭浩强.C语言程序设计.清华大学出版社,2005.11

3.范辉.VisualC++程序设计.高等教育出版社

山东建筑大学计算机科学与技术学院

课程设计指导教师评语

班级:

061学生姓名:

周磊学号:

2006121143

指导教师评语(包括工作态度,遵守纪律;基本理论、知识、技能;独立工作能力和分析解决问题的能力;完成任务情况及水平):

 

学生成绩(百分制):

 

 

指导教师签名:

年月日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电力水利

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

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