数据结构实训报告(共16页).doc
精选优质文档-倾情为你奉上安徽机电职业技术学院数据结构课程实训报告 校园导游程序系统姓 名:倪远远 小组名称:QG 小组成员:倪远远 沈建曦 指导教师:范宏宇 班 级:软件3112 完成日期:2012年06月16日 专心-专注-专业目 录第一章 概述1.1 任务描述由于学习任务和为方便大一新生们对我校的景点有所了解,我两人决定协作完成校园导游程序。此程序是一个可以实现同学们对我校园区的多数景点的查询,方便新生们对学校各个场所的寻找。该校园导游系统是由校园全景浏览、景点信息查询、最短路径查询和校园美景评价几个功能组成。其中希望实现全景浏览可以俯瞰学校大轮廓,景点信息查询用作为用户介绍景点特色,最短路径查询功能可以告诉用户景点之间最短距离,最后一个功能是用户对景点的评价功能。评价功能中有管理员权限,可以进行景点的修改。程序中用到了结构体函数,顺序链表的存储和修改,图的创建等知识点。1.2 分组情况本小组人员是倪远远和沈建曦,编码工作是由沈建曦为主,倪远远从旁协助。文档的编写由倪远远为主编写。编码的主框架由两人齐力修改,其中沈建曦负责路径长度的修改和学校地图的修改,本人负责图描述的修改。子函数添加的构思组要参考实训要求编写。第二章 需求分析2.1 功能描述 系统主要有的功能:校园全景浏览、景点信息查询、最短路径查询、和校园美景评价等功能模块,其中还有管理员权限。 功能介绍:1、全景浏览功能能够让用户看到我校的大致轮廓图,较为清晰地看到我校的建筑物和景点;2、景点信息查询功能是向用户介绍景点的特点,用户可以输入想要查询的景点,按回车键即可显示你想要查询的景点;3、最短路径的查询功能能够查询用户想要查询的每一个景点之间的最短路径;4、校园美景评价功能可以让每一个用户都能对学校景点进行评价,用户只要输入景点的代号即可进入评价界面,然后可以输入评价;5、管理员权限功能普通用户也可以进入,但是要修改需要获得密码权限,管理员进入权限需要输入密码登陆,它可以进行多个功能的操作,即及时添加或删除景点和对评价进行管理。即管理员权限功能主要是对校方对景点和建筑物的变化进行修改,和搜集用户对特定景点的评价,及时掌握同学们的意见和看法。 2.2 关键技术关键技术是:校园地图的创建、图的创建、景点列表的创建、输出函数的创建、关于修改链表的函数的创建。1、校园地图的创建规划出来了校园的大致轮廓,和学校的主要建筑物的所在位置,较为直观反映了学校建筑规模和建筑的分布情况。校园的地图是由手绘画出来的,由于线条很是繁多,绘画起来很麻烦,花了两天的时间,但是其拥有比界面寻址更加直观的视觉效果。2、图的创建是建立了学校景点的介绍和描述,被景点信息查询功能模块所调用。我们定义了边节点和景点节点,并且计算了各个景点之间的距离,在用户输入景点查询后就可以显示景点之间的最短路径。3、景点列表的创建将各个主要的景点做成了一份表格的形式输出的,比较直观,同时它还调用了景点的查询功能。景点列表也是用手绘图做出来的效果,代码量虽不大,但是视觉效果较为直观,同时在景点查询时需要调用该景点列表。4、输出函数在此程序中毫无疑问是扮演着很重要的一个角色,它实现了图的输出、景点列表的输出、主菜单的输出等等。5、关于修改链表的函数的创建。在此程序中实现了对景点的删除和添加的功能,对多个子函数进行调用,能够及时更新我校的景点评价的变化。修改函数中在管理员权限设置上的问题是:不知道应该将密码登陆代码添加到三个修改函数中的哪个修改函数中,经过多次测试,最终确定添加在modify()函数内解决可以这个问题。其中最为突出的亮点是游客用户的留言簿,游客可以对我校的各个景点进行评价并且可以浏览其他游客对各个景点的评价。同时管理员可以对游客的留言簿进行系统管理,即上述所提到的管理员功能。第三章 概要设计3.1 核心结构体 核心结构体是顺序链表的结构体创建、顶点节点图的创建。下面是结构体的展示:1、typedef struct int number ; char sight50; 此结构体是定义游客对景点的评价,结构体定义了游客可以评价的景点信息, char scrible100 ; 景点编号和游客信息。 char name 50; view;2、typedef struct 定义文件存储: 将各个景点的信息按照线性表的方式存入文件中, 当游客想要了解想要的景点信息时, view v50; 输入景点编号信息就可以从存储的文件里读出并显示。 int last;SeqList;typedef struct VertexNode int number; /景点的编号 char *name; /景点的名称 char *info; /景点的简介 VertexNode; /顶点结点的定义3.2 系统结构(子函数)下面是程序中各个子函数:int xiugai() 修改目录 void Map() 校园地图void CreateGraph() 创建图void OutputPlace() 输出景点列表void SearchPlace() 查询景点信息void SearchPath() 查询最短路径void Shortpath(int i) 计算最短路径void Output(int sight1,int sight2) 景点输出函数void changesight() 景点更改函数gai_number(SeqList *L,int i) 景点代码调数gai_sight(SeqList *L,int i)新景点输入函数gai_scrible(SeqList *L,int i)景点描述函数gai_name(SeqList *L,int i)景点名函数change(SeqList *L)修改景点号的函数int password() 密码设置函数SeqList * init_SeqList()链表函数SaveFile(SeqList *L ) 文件读入OpenFile(SeqList *L) 文件读出Input(SeqList *L) 链表输入Show(SeqList *L) 显示文件内容int edit_menu() 主菜单函数OpenFile(SeqList *L) 文件读出SaveFile(SeqList *L) 文件读入AddNode() 添加评价目录modify() 修改 子函数int edit_menu() 编辑菜单void changesight()引入编辑菜单图3-1系统流程图第四章 详细设计4.1最短路径查找最短路径查找,关键代码: 1)最短路径的查询采用了迪杰斯特拉算法定义了i、w和v为整型的计数变量,整型t表示景点个数。还定义了标志数组、用来存放顶点的信息,用整型min来记录权值、最终输出路径。用For 语句来实现循环:for(v=0;v<NUM;v+)finalv=0; /假设从顶点num到顶点v没有最短路径Dv=G.arcnumv.length;/将num到其余顶点的最短路径长度初始化为权值for(w=0;w<NUM;w+) pathvw=0;/初始化从v到w的路径值if(Dv<MAX) /存在路径pathvnum=1; /存在标志置为一pathvv=1; /自身到自身 2)用数组Dnum=0来初始化新的路径, 用finalnum=1去初始化num顶点属于 final集合,开始主循环后,每一次求得num到某个顶点的最短路径,并将其加入到final集合 ,用for语句来实现:for(i=0;i<NUM;+i) / 其余G.vexnum-1个顶点 min=MAX; /当前所知离顶点num的最近距离for(w=0;w<NUM;+w)if(!finalw) /w顶点在v-s中 if(Dw<min) /w顶点离num顶点更近 v=w;min=Dw; 下面路径查询的实际操作截图:图4-1界面显示图4-2路径查询4.2 文件存储1、文件的存储功能是用来存储学校导游系统的文件信息的,游客留言簿里的文件信息就是用这个子函数存储的,系统采用SaveFile(SeqList *L )来存储实现文件的读入,Show(SeqList *L)来实现显示文件的内容OpenFile(SeqList *L)实现文件的读出。下面是文件读入的部分代码: if(fp = fopen("FileTest.txt","wb")=NULL) printf("打开文件失败"); exit(1); while(i!=-1) if(fwrite(&L->vi-,sizeof(view),1,fp)!=1) printf("写入错误!"); 1)下面是文件输入:图4-3 文件输入2)下面是文件读出的显示操作,读出信息子函数部分代码由if语句完成,代码如下: If (fp = fopen("FileTest.txt","rb")=NULL) printf("打开文件失败"); exit(1); while( fread(&vi,sizeof(view),1,fp)=1) L->last+; L->vL->last=vi; printf("-n"); printf("t景点编号t景点t评价ttttt游客名n"); printf("t%dtt%stt%sttttt%sn",L->vL->last.number,L->vL->last.sight,L->vL->last.scrible,L->vL->last.name); printf("-n");图4-4文件输出4.2 景点信息查询1、景点查询功能实现的是校园景点的查询,游客可以根据景点代码查询景点信息,此功能将会显示与景点相关联的信息咨询。 void SearchPlace()查询景点信息,采用if(num>0 && num<=G.vexnum)来判断信息输入正确与否,用for语句来实现的代码表示为:for(i=1;i<=G.vexnum;i+)if(num=G.vertexi.number)printf("ntttttt景点编号:%dn",i);printf("tttttt景点名称:%sn",G.vertexi.name);printf("tttttt景点简介:%snn",G.vertexi.info);else printf("tttttt信息输入有误!n");num=0;printf("ntttttt是否继续查询景点信息(y/n):");c=getchar(); getchar(); 图4-5景点查询界面显示图4-6景点信息显示界面第五章 系统测试5.1 测试策略首先是测试校园的全景浏览程序的功能,查看校园全景的效果;其次测试校园景点查询的功能看其景点的查询功能是否完善;然后是测试最短路径的功能,看其输出效果是否合理;最后测试景点评价的功能,看其程序执行后评价效果怎样,输出的效果,游客浏览留言簿的显示效果。5.2 测试结果1、校园全景浏览程序测试:单击程序运行将会进入程序主界面,展示在下面:图5-1校园全景图2、景点查询测试:在主界面的光标处输入景点代码,查询结果就会显示输出效果如下图:图5-2景点查询界面显示图图5-3景点介绍显示图3、最短路径的查询:输入想要查询的起点1,回车后输入景点2后回车,即可看到你所想要的查询结果。图5-4最短路径查询界面显示图4、景点评价功能测试:游客进入系统后登陆评价系统,输入自己的意见和建议后,选择3退出并保存。第一幅图是校园导游系统的游客浏览后留言的效果显示图,第二幅是留言簿的效果显示图,如下所示:图5-5游客留言输入显示图图5-6游客浏览留言簿界面显示图第六章 总结1、收获在这的实训中遇到了不少让人纠结的情况,虽然是这样,但是在此次的实训中依然学到了许多知识,虽然这些都是老师课堂上讲过的点,但是想要实现却是比想象中难的多,经过这次的实训却实对于程序的开发有了更深刻的理解。实训中明白了写程序真的很痛苦,但是写好了之后那种成就感真的不知道该怎么形容。同时明白了团队合作的重要性。2、失误实训中失误也很多,不知道管理员密码权限功能应该添加到哪个景点修改之内,还有操作上的失误也有。