数据结构 课程设计.docx
《数据结构 课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构 课程设计.docx(53页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
课程设计报告
课程名称数据结构
课题名称中缀表达式求值
专业通信工程
班级通信0902
学号200903020212
姓名朱玖琳
指导教师田娟秀、李杰君、张鏖烽
年月日
湖南工程学院
课程设计任务书
课程名称数据结构
课题中缀表达式求值
专业班级通信0902
学生姓名朱玖琳
学号200903020212
指导老师田娟秀、李杰君、张鏖烽
审批
任务书下达日期2011年06月27日
任务完成日期年月日
1设计内容与设计要求
1.1设计内容
(1)课题一:
中缀算术表达式求值
我们很早就学习如何书写及计算表达式,诸如:
8+5*(7-3)之类的表达式,先算括号内的7减去3,得到4,然后再算5乘以4,得到20,再计算8加上20,得到28,因此该表达式的值为28。
这是人们熟悉的运算规则额:
有括号先算括号内;无括号时,先做乘除法,后做加减法;对于相同级别的运算按从左到右的次序运算。
而计算机是如何实现表达式的计算的呢?
应用栈的相关知识,编程序实现之。
设计思路:
从键盘输入中缀表达式,然后将中缀表达式转换为后缀表达式,利用后缀表达式求值。
要求以字符序列的形式从终端输入语法正确的、不含变量的整数表达式,利用给定的算术符优先关系,实现对算数四则混合运算表达式的求值,并演示在求值过程中运算符栈、操作符栈、输入字符和主要操作的变化过程。
(2)课题二:
迷宫探索
随机生成一个迷宫图,迷宫大小为N*N,N预定义为常数,修改N的值可以改变迷宫的大小。
用白色表示可走的路,蓝色表示墙壁不可以通过。
系统设计两种运行方式:
一种是系统自动探索(用递归方法实现);另一种是由人工操作探索通路。
设计思路:
程序首先要考虑迷宫的表示,这是一个二维关系图,所以可选择二维数组来存储。
数组元素只有两种值0和1,分别代表通路和墙壁。
图形的显示可以根据数组元素的值来确定。
如果是人工探索,则依据按键来确定探索物的位置坐标,利用循环语句实现。
如果是系统自动探索,可采用递归算法实现。
(3)课题三:
汉诺塔问题
界面划出大小不等,颜色不同的矩形块分别代表各盘子,盘子规模n为1~15,并可以选择人工控制演示和系统自动运行演示,如果是自动则还要输入演示速度。
在界面的上方显示正在移动的盘子的源座和目标座。
用人工操作时,按任意键移动一个盘子,这样可以清楚每一步过程。
如果是自动运行,可以选择移动一步的暂停时间。
设计思路:
用栈存放塔,定义三个堆栈,用来表示三个塔座,栈的每个结点类型为结构体,其中数据域存放盘子的代号,根据代号计算盘子的大小。
Top为塔的栈顶指针,即每个塔的具体高度。
例如,结构体可以定义如下:
StructH
{intdata[15];/*存放每个盘的代号*/
inttop;/*每个塔的具体高度*/
}num[3];
(4)课题四:
八皇后问题演示
八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
该问题是十九世纪著名的数学家高斯1850年提出:
在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
高斯认为有76种方案。
1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
设计思路:
解决8皇后时,在安放第i行皇后时,需要在列的方向从1到n试探(j=1,…,n):
首先在第j列安放一个皇后,如果在列、主对角线、次对角线方向有其它皇后,则出现攻击,撤消在第j列安放的皇后。
如果没有出现攻击,在第j列安放的皇后不动,递归安放第i+1行皇后。
对于八皇后问题的实现,如果结合动态的图形演示,则可以使算法的描述更形象、更生动。
要求用TurboC实现的八皇后问题的图形程序,能够演示全部的92组解。
(5)课题五:
对电文中的字符串编码和译码
Huffman编码是一种最优变长码,即带权路径最小。
这种编码有很强的应用背景,是数据压缩中的一个重要理论依据。
对输入的一串文字符号实现Huffman编码,再对Huffman编码生成的代码串进行译码,输出电文字符串。
要求完成以下功能:
(a).针对给定的字符串,建立Huffman树。
(b).生成Huffman编码。
(c).对编码文件译码。
(6)课题六:
交通咨询系统
在交通网络非常发达的今天,人们出差、旅游或做其他出行时,不仅关心节省交通费用,而且对里程和所需时间等问题也很感兴趣。
对于这样一个人们关心的问题,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。
图中顶点表示城市,边表示城市之间的交通关系。
设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到达另外一个城市顶点之间的最短路径(里程)的问题。
要求完成以下功能:
(a).根据实际情况,先建立交通网络图的存储结构。
(b).求某个城市到达其余各城市的最短路径。
(c).任一输入两个城市,要求求出他们之间的最短路径。
1.2选题方案:
所选题目根据学号确定,学号模6加1,即(学号%6+1)。
如你的学号为9,则所选题目号为:
9%6+1=(题目4)。
注意,所有的课题都要求用图形方式演示步骤和结果。
有兴趣的同学可以自己针对数据结构课程中所讲算法来设计一个演示过程的算法。
1.3设计要求:
1.3.1课程设计报告规范
(1)需求分析
a.程序的功能。
b.输入输出的要求。
(2)概要设计
a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。
b.课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。
(3)详细设计
a.采用C语言定义相关的数据类型。
b.写出各模块的类C码算法。
c.画出各函数的调用关系图、主要函数的流程图。
(4)调试分析以及设计体会
a.测试数据:
准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果。
b.程序调试中遇到的问题以及解决问题的方法。
c.课程设计过程经验教训、心得体会。
(5)使用说明
用户使用手册:
说明如何使用你编写的程序,详细列出每一步的操作步骤。
(6)书写格式
a.设计报告要求用A4纸打印成册:
b.一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
(7)附录
源程序清单(带注释)
1.3.2考核方式
指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。
具体考核标准包含以下几个部分:
(1)平时出勤(占10%)
(2)系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)
(3)程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)
(4)设计报告(占30%)
注意:
不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。
(5)独立完成情况(占10%)。
1.3.3课程验收要求
(1)运行所设计的系统。
(2)回答有关问题。
(3)提交课程设计报告。
(4)提交软盘(源程序、设计报告文档)。
(5)依内容的创新程度,完善程序情况及对程序讲解情况打分。
2进度安排
第19周:
星期一8:
00——12:
00上课
星期一14:
30——18:
30上机
星期二14:
30——18:
30上机
星期四8:
00——12:
00上机
附:
课程设计报告装订顺序:
封面、任务书、目录、正文、评分表、附件(A4大小的图纸及程序清单)。
正文的格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
正文的内容:
一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。
正文总字数要求在4500字以上(不含程序原代码)。
(一)需求分析
1.系统设计目的与意义
高级语言c语言数据结构课程设计是学习完《高级语言程序设计》课程后进行的一次面的综合性上机实验。
其目的在于为同学提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼同学的分析解决实际问题的能力。
提高学生适应实际,实践基本算法的能力。
2.程序的功能。
进入界面以后选择功能,比如当你选择快速求中最表达式的值,你就输入一个中缀表达式,能求出其后缀表达式和气结果数值,并且能精度在小数后六位。
还有其算法内部单步执行演示,你可以清楚的知道其算式在程序中的栈与数组之间怎么变化执行的。
3.输入输出的要求。
其输入必须是合法的标识符,其算式表达式输入包含:
+,—,*,/,数字。
其他的输入就按系统的提示要求输入。
输出就没有什么要求。
(二)概要设计
程序主要由四个主要大函数组成:
A求后最表达式trans(char*exp,charpostexp[]);B求表达式最终的解值floatcompvlue(char*postexp);其返回值为浮点型;C界面函数Interface();D演示函数Demonstrate(inti)。
其他的函数主要实现程序的优化、调用。
并且各个函数之间有内在的数据联系。
该课题程序主要涉及了栈的数据结构,其存储的字符型和整型。
如:
struct
{
chardata[MaxSize];
inttop;
}op;
其整型的top是伪指针,主要是来区别在栈的第几位置。
(三)详细设计
1.采用C语言定义相关的数据类型。
a定义运算符栈:
struct
{
chardata[MaxSize];
inttop;
}op;
b定义数值栈:
struct
{
floatdata[MaxSize];
inttop;
}st;
2.各模块的类C码算法。
a、将算术表达式转换成后缀表达式
inttrans(char*exp,charpostexp[])/*将算术表达式转换成后缀表达*/
{
struct
{
chardata[MaxSize];
inttop;
}op;
inti=0;
op.top=-1;
while(*exp!
='\0')
{
switch(*exp)
{
case'(':
op.data[++op.top]=*exp;
break;
case')':
while(op.data[op.top]!
='(')
{
postexp[i++]=op.data[op.top--];
}
op.top--;
break;
case'-':
case'+':
if(op.data[op.top]!
='('&&op.top!
=-1)
{
postexp[i++]=op.data[op.top];
op.top--;
op.data[++op.top]=*exp;
}
else
{
op.data[++op.top]=*exp;
}
break;
case'*':
case'/':
if(op.data[op.top]=='*'||op.data[op.top]=='/')
{
postexp[i++]=op.data[op.top];
op.top--;
op.data[++op.top]=*exp;
}
else
{
op.data[++op.top]=*exp;
}
break;
default:
while(*exp>='0'&&*exp<='9')
{
postexp[i++]=*exp;
exp++;
}
postexp[i++]='#';
exp--;
break;
}
exp++;
}
if(op.top>=0)
{
do
{
postexp[i++]=op.data[op.top--];
}
while(op.top!
=-1);
}
postexp[i++]='E';
return1;
}
b、计算后缀表达式的值
floatcompvlue(char*postexp)
{
struct
{
floatdata[MaxSize];
inttop;
}st;
floata,b,c,d;
intj=0;
st.top=-1;
while(*postexp!
='E')
{
switch(*postexp)
{
case'+':
a=st.data[st.top--];
b=st.data[st.top--];
c=a+b;
st.data[++st.top]=c;
break;
case'-':
a=st.data[st.top--];
b=st.data[st.top--];
c=b-a;
st.data[++st.top]=c;
break;
case'/':
a=st.data[st.top--];
b=st.data[st.top--];
if(0==a)
{
printf("Dividendis0!
");
exit(0);
}
else
{
c=b/a;
st.data[++st.top]=c;
}
break;
case'*':
a=st.data[st.top--];
b=st.data[st.top--];
c=b*a;
st.data[++st.top]=c;
break;
default:
d=0;
while(*postexp>='0'&&*postexp<='9')
{
d=d*10+*postexp-'0';
postexp++;
}
st.data[++st.top]=d;
break;
}
postexp++;
j++;
}
return(st.data[st.top]);
}
c、各函数的调用关系图。
图一主函数的调用关系图
(4)调试分析以及设计体会
1.测试数据:
a.如你输入算术表达式(2-3)*(5+7)
图二输入的算术表达式
进行运算以后的结果为:
图三算式运算以后的结果
这就是中缀表达式的运行以后的后缀表达式以及其计算数值。
b.这里还有中缀表达式转换成后缀表达式的具体过程,以及后缀表达式的具体怎么一步步的求值:
以下是第一下单步执行的界面:
图四第一下单步执行的界面
当你按下任意键时,他就会自动在跳转。
以下是后缀表达式的数组:
图五在postexp数组的后缀表达式
以及最后的st数栈的值
图六在最后st数栈的值
2.程序调试中遇到的问题以及解决问题的方法。
a.在调试中经常会遇见这样的情况有时会一闪而过,那基本情况就是你没有让程序停下来让你看见,也就是没显示完以后没有加getch()。
还有就是你的图形初始化函数:
voidfarinitgraph(intfar*gdriver,intfar*gmode,char*path);中的path图形驱动程序所在的目录路径不合格。
b.还有就是在编写程序中不小心出的错误。
比如你少写了一个分号:
图七编译出错
当你按下确定时,系统会自动的跳到你处错误的地方,并标注。
图八错误行
当然你还可以自己双击错误,也会出现以上情况。
还有就是在写while()时一定要好好想想,不然就不能达到你期望的效果运行。
3.课程设计过程经验教训、心得体会。
一周的数据结构课程设计终于结束了!
回想起这一周的课程设计总的来说,我还是很满意我的这次的课程设计的劳动结果。
虽然,有不少画图内容没有加到自己最初想的的设计当中,有很多画图扩展没有去在设计中去实现。
还有在吧画图嵌套到自己的程序当中去,结果就就因为一个函数outtextxy()的字符串的输出,没有实现一个个的输出,而是传递一个地址把后面的全输出,导致最后的程序量大,并且没有达到自己想要的效果。
当然,我还是有把不少问题解决了,我觉得那时就是最爽的时候,激动与自豪。
在这次解决问题的过程中,遇到了画图,在图书馆找了好多参考书。
但是,这些参考书让我的感觉就是所有的内容都一样,没有实际的介绍。
最后只有在网上查质料。
不过还好啊还是找到了很多,并且很详细的介绍其函数的参数,以及怎么用。
最终在我自己两天两夜的努力最后的画图程序就搞定了啊。
那高兴得没有话说啊(那就不说啊)主要是我不知道在这里写什么啊,哎!
呵呵!
调试程序其实是最难的!
花费很久的时间才能理清一个程序的思路,要慢慢的理解其功能的下一步,怎么样达到自己的要求,在写程序过程中遇见了很多问题,一个个函数的调用功能,起组合起会是怎么样的,还有就是箭头我基本吧屏幕的点都搞遍了啊。
不过还好,让我学会了很多,也让我的写程序能力有所提高啊,
通过这次数据结构的课程设计,让我更加了解到数据结构的在程序中重要性。
以及它对我们专业的有些方向发展的作用。
对我们而言,知识上的收获很重要,但精神上的丰收更加可喜。
让我知道了原来我们学的基本就是入门,根本什么都还不会。
但是你要明白学无止境的道理。
我们每一个人永远不能满足于现有学校现状,社会是很现实的,你要么靠边站,要么就是胜者。
人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。
挫折是一份财富,经历是一份拥有。
这次课程设计必将成为我人生旅途上一个非常美好的回忆!
因为在做课程设计时要能够从全面的去考虑,去研究,用多种算法去实现要求。
此次课程设计,学到了很多课内学不到的东西,画图,让自己懂得了今后的工作还是学习不要心急,静心慢慢来。
这样能高效的完成!
(5)使用说明
1.你运行程序会出下以下界面:
图九系统主界面
就按要求输入你就可以。
2.
选项一功能是进行快速中缀表达式求值。
当你在主界面输入1则会出现以下第二界面:
图十第二界面
你就按以下提示输入。
图十一按这进行输入
比如你输入算术表达式(2-3)*(5+7)
图十二输入的中缀表达式
按下enter键就会出现其运行算是表达式的表达式、后缀表达式、运行的算术表达式算
术值:
图十三运算的结果
当你按下任意键就退出回到主界面:
图十五主界面
3.
选项二功能是进行快速中缀表达式求值。
当你在主界面输入2则会出现以下第三面:
图十六进行快速中缀表达式求值
按一下任意键就可以单步看中缀表达式转换成后后表达式:
图十七在postexp数组的后缀表达式转换前
以及最后的计算数值:
图十八运行最后的计算数值
4.选项三功能是进行快速中缀表达式求值。
当你在主界面输入3则以第二的界面一样的运行,不过不需要按键控制起跳转到下一步,而是自动的跳转:
图十九进行快速单步演示
图二十进行快速单步演示
图二十一进行快速单步演示
图二十二进行快速单步演示
图二十三进行快速单步演示
4.当你在主界面没有按要求输入系统会自动提醒你,并按下任意键跳转到主界面。
附件:
#include
#include
#include/*包含用于和宏指令的作用声明*/
#include
#defineMaxSize40
intarw_1[16]={100,115,135,115,135,120,142,110,135,100,135,105,100,105,100,115};
intarw_2[16]={100,137,135,137,135,142,142,132,135,122,135,127,100,127,100,137};
intarw_3[16]={100,159,135,159,135,164,142,154,135,144,135,149,100,149,100,159};
intarw_4[16]={100,181,135,181,135,186,142,176,135,166,135,171,100,171,100,181};
intarw_5[16]={100,203,135,203,135,208,142,197,135,188,135,193,100,193,100,203};
intarw_6[16]={100,225,135,225,135,230,142,219,135,210,135,215,100,215,100,225};
intarw_7[16]={100,247,135,247,135,252,142,241,135,232,135,237,100,237,100,247};
intarw_8[16]={100,269,135,269,135,274,142,263,135,254,135,259,100,259,100,269};
intarw_9[16]={100,291,135,291,135,296,142,285,135,276,135,281,100,281,100,291};
intarw_10[16]={100,313,135,313,135,318,142,307,135,298,135,303,100,303,100,313};
intarw_11[16]={100,335,135,335,135,340,142,329,135,320,135,325,100,325,100,335};
intarw_12[16]={100,357,135,357,135,362,142,351,135,342,135,347,100,347,100,357};
intarw_13[16]={100,379,135,379,135,384,142,373,135,364,135,369,100,369,100,379};
intarw[16]={200,102,300,102,300,107,330,100,300,93,300,98,200,98,200,102};
intArw_1[16]={220,247,255,247,255,252,262,241,255,232,255,237,220,237,220,247};
intArw_2[16]={250,385,231,346,236,343,219,338,217,356,224,353,243,392,250,385};
intArw_3[16]={400,404,420,371,427,377,425,352,405,360,413,366,394,397,400,404};
intArw_4[16]={262,241,227,241,227,236,220,246,227,256