胡鹏《数据结构》课程方案报告.docx
- 文档编号:6032114
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:23
- 大小:273.90KB
胡鹏《数据结构》课程方案报告.docx
《胡鹏《数据结构》课程方案报告.docx》由会员分享,可在线阅读,更多相关《胡鹏《数据结构》课程方案报告.docx(23页珍藏版)》请在冰豆网上搜索。
胡鹏《数据结构》课程方案报告
《数据结构》课程设计报告
<2018--2018学年第1学期)
题目:
校园导航系统
学号:
111608020186
姓名:
胡鹏
指导教师:
方瑞英
信息科学与工程系
目录
1需求分析
河南理工大学万方科技学院紧跟龙子湖校园开发工程的历史机遇,践行“厚德、博学、笃行、创新”校训,建设出一座美丽的校园。
对河南理工大学万方科技学院校园导航系统的模拟,设计一个校园导航程序,为来访的客人提供各种信心查询服务网。
1.1问题分析
为此通过对《数据结构》这一课程的应用,用图的模型对学校景点抽象。
用邻接矩阵存储方法和狄克斯特拉算法及图的遍历实现对校园导游系统的模拟。
此系统七个功能:
浏览学校景点、查看单个景点信息、查看校园地图、导游推荐、查两景点最短路线、查两景点所有景点、退出系统。
1.2基本要求
首先是对校园整个的平面图输出;存储景点信息采用结构体;对各个景点用字母代替,字母组成图,通过对图的操作,求出制定最短路径,并且对图的整个遍历的操作。
2概要设计
2.1主界面设计,
图2-1主控界面
2.2存储结构设计
图2-2邻接矩阵图2-3校园平面图
首先,由LOC-VERTEX(G,v>找到v在图G中的位置,即v在一维数
组vexs中的序号i,则二维数组arcs中第i行上第一个adj域的值为“1”的分量所在列号j,便为v的第一个临界点在图G中的位置。
通知,下一个邻接点在图G中的位置便为j列之后第一个adj的值为“1”的分量所在列号。
2.3系统功能模块设计
我设计有以下几个模块:
(1)身份验证<用户名和密码验证)
(2)校园导航系统的主界面输出;
(3)构造无向图采用数组表示法<邻接矩阵)存储;
(4)学校景点查询模块;
(5)学校景点平面图输出模块;
(6)计算最短路径算法的实现模块;
3模块设计
3.1模块设计
图3-1校园导航系统流程图
3.2系统子程序及功能设计
(1>charMenu(>//主菜单
(2>charSearchMenu(>//查询子菜单
(3>voidsearch(>//查询景点信息
(4>voidCreateUDN//采用数组<邻接矩阵)表示法,构造无向图G
(5>voidintroduce(>//介绍函数
(6>voidpingmu(>//屏幕输出函数
(7>voidShortestPath//迪杰斯特拉算法最短路径函数
(8>voidoutput//输出函数
3.3函数主要调用关系图
图3-2主要函数调用关系图
4详细设计
4.1数据类型定义
(1>整型类型:
adj。
n。
P[NUM][NUM]。
D[NUM]。
i=0,a,j。
i。
v0,v1,i。
flag。
i,j。
v,w,i,t。
a,b,c,d,q=0。
final[NUM]。
(2>字符串类型:
name[20]。
c。
ck。
secret[20]。
sight。
description。
info。
4.2各个模块的程序流程图
图4-1查询模块流程图
图4-2迪杰斯特拉算法流程
4.3关键代码分析说明
voidCreateUDN(intv,inta>//采用数组<邻接矩阵)表示法,构造无向图G。
{inti,j。
G.vexnum=v。
//初始化结构中的景点数!
!
!
G.arcnum=a。
//初始化结构中的边数!
!
!
for(i=1。
i ++i> G.vex[i].number=i。 //初始化每一个景点的编号 //初始化每一个景点名及其景点描述 G.vex[0].sight="学校简介"。 G.vex[1].sight="校大门"。 G.vex[2].sight="三号楼学楼"。 G.vex[3].sight="一号教案楼"。 G.vex[4].sight="行政楼"。 G.vex[5].sight="实验楼"。 G.vex[6].sight="伯苓广场"。 G.vex[7].sight="秀英图书馆"。 G.vex[8].sight="艺术楼"。 G.vex[9].sight="一号食堂"。 G.vex[10].sight="操场"。 G.vex[11].sight="西区宿舍楼"。 G.vex[12].sight="二号食堂"。 G.vex[13].sight="篮球场"。 G.vex[14].sight="力功体育馆"。 G.vex[15].sight="东区宿舍楼"。 //这里把所有的边假定为32767(2^32次方>,含义是这两个景点之间是不可到达。 for(i=1。 i ++i> { for(j=1。 j ++j> { G.arcs[i][j].adj=Max。 G.arcs[i][j].info=NULL。 } } //下边是可直接到达的景点间的距离,由于两个景点间距离是互相的 //,所以要对图中对称的边同时赋值。 G.arcs[1][2].adj=G.arcs[2][1].adj=200。 G.arcs[1][3].adj=G.arcs[3][1].adj=200。 G.arcs[1][10].adj=G.arcs[10][1].adj=1000。 G.arcs[1][13].adj=G.arcs[13][1].adj=1600。 G.arcs[2][3].adj=G.arcs[3][2].adj=400。 G.arcs[2][6].adj=G.arcs[6][2].adj=100。 G.arcs[3][4].adj=G.arcs[4][3].adj=100。 G.arcs[3][7].adj=G.arcs[7][3].adj=200。 G.arcs[4][7].adj=G.arcs[7][4].adj=300。 G.arcs[5][6].adj=G.arcs[6][5].adj=60。 G.arcs[6][7].adj=G.arcs[7][6].adj=200。 G.arcs[6][8].adj=G.arcs[8][6].adj=100。 G.arcs[7][10].adj=G.arcs[10][7].adj=300。 G.arcs[7][11].adj=G.arcs[11][7].adj=200。 G.arcs[8][10].adj=G.arcs[10][8].adj=200。 G.arcs[9][10].adj=G.arcs[10][9].adj=100。 G.arcs[9][12].adj=G.arcs[12][9].adj=200。 G.arcs[10][11].adj=G.arcs[11][10].adj=100。 G.arcs[10][13].adj=G.arcs[13][10].adj=600。 G.arcs[11][14].adj=G.arcs[14][11].adj=200。 G.arcs[12][13].adj=G.arcs[13][12].adj=100。 G.arcs[13][14].adj=G.arcs[14][13].adj=100。 G.arcs[14][15].adj=G.arcs[15][14].adj=100。 } 该模块是对图的建立及使用邻接矩阵存储顶点信息以及权值,而邻接矩阵特点是: 邻接矩阵来表示一个具有n个顶点的有向图时需要n^2个单元来存储邻接矩阵;对有n个顶点的无向图则只存入上<下)三角阵中剔除了左上右下对角线上的0元素后剩余的元素,故只需1+2+...+(n-1>=n(n-1>/2个单元。 5调试分析和测试结果 (1)先是进入身份验证界面,如图所示5-1 图5-1身份验证界面 (2)验证成功后进入副界面,如图所示5-2 图5-2身份验证成功界面 (3)输入数字2,进入万科大导航系统主界面,如图所示5-3 图5-3万科大导航系统主界面 (4)输入数字1,进入万科大学校简介,如图所示5-4 图5-4万科大学校简介界面 (5)退出 图5-5学校平面展示界面 (6)退出 图5-6景点展示界面 (7)退出 图5-7景点查询界面 (8)输入数字1,进入按景点编号查询,如图所示5-8 图5-8景点编号查询 (9)输入1-15任何数字查看景点介绍,如图所示5-9 图5-9查看景点介绍界面<数字) (10)按回车键返回,输入数字2进入按景点名称进行查询,如图所示5-10 图5-10景点名称进行查询界面 (11)按回车键返回到主界面,输入数字5进入计算最短路径算法查询,如图所示5-11 图5-11最短路径算法查询界面 6心得体会 通过此次设计,明白了很多。 首先要从设计的思路入手,思路决定出路,一个好的算法可以使工作量简化达到事半功倍的目的。 平时生活更应该留心观察,多去想,多去做,好的程序是从历练中做出来的。 其次,应该多去交流,去查阅资料,一个程序的产生不是那么容易的,更应该知难而进,积极进取。 参考文献<至少两个) [1]《数据结构》 [2]《C语言程序设计教程》杨路明编 [3]《java开发实战经典》李兴华编 [4]《c语言程序设计》<第四版)谭浩强编 附: 源程序<可运行无误的代码) //--------------------------------------------------------------- //校园导航系统 //校园导航系统包括: 学校简介,场所信息,计算路径 //所使用的文件: CampusNavigation.cpp,用户信息.text //程序编写人员: 胡鹏 //编写程序时间: 2018年10月30日20: 56: 51 //修改程序时间: 2018年11月30日14: 38: 32 //代码规范时间: 2018年12月10日16: 38: 55 //--------------------------------------------------------------- //预处理命令 #include #include #include #include voidinsert(>。 #defineN10 intn。 #defineMax32767 #defineNUM16 typedefstructArcCell {intadj。 //相邻接的景点之间的路程 char*info。 } ArcCell。 //定义边的类型 typedefstructVertexType {intnumber。 //景点编号 char*sight。 //景点名称 char*description。 //景点描述 } VertexType。 //定义顶点的类型 typedefstruct { VertexTypevex[NUM]。 //图中的顶点,即为景点 ArcCellarcs[NUM][NUM]。 //图中的边,即为景点间的距离 intvexnum,arcnum。 //顶点数,边数 } MGraph。 //定义图的类型 MGraphG。 //把图定义为全局变量 intP[NUM][NUM]。 // longintD[NUM]。 //辅助变量存储最短路径长度 voidCreateUDN(intv,inta>。 //创建图的函数 voidpingmu(>。 //屏幕输出函数 voidintroduce(>。 //输入介绍内容,但不输出 voidShortestPath(intnum>。 //最短路径函数 voidoutput(intsight1,intsight2>。 //输出函数 charMenu(>。 //主菜单 voidsearch(>。 //查询景点信息 charSearchMenu(>。 //查询子菜单 voidNextValue(int>。 voiddisplay(>。 //显示遍历结果 voidshow(>。 //显示校园平面图 voidmainn(>。 //---------------------初始系统------------------ structstudent { charname[20]。 charsecret[20]。 }。 structstudentstu[N]。 voidpf(> { printf("\n\n\t\t******信息工程与科学系数据结构课程设计******">。 printf("\n\n\n\t\t--------------------------------------">。 printf("\n\t\t|\t名称: 万科大校园导航系统\t|">。 printf("\n\t\t|\t姓名: 胡鹏\t|">。 printf("\n\t\t|\t班级: 1101网工\t|">。 printf("\n\t\t|\t指导老师: 方瑞英\t|">。 printf("\n\t\t|\t作者: 万科大校园\t|">。 printf("\n\t\t--------------------------------------">。 }//\t表示的是向后空出8个空格,可以使自己输出字符更规范。 //------------------------身份验证------------------------------ voidmain(>//主函数 { chars2[10],s3[10],s4[10],s5[10],s6[10],s1[10],s7[10]="\0"。 inti=0,a,j。 FILE*fp。 //定义的fp是指向FILE类型结构体的指针。 可以使他指向某个文件的结构体变量/,从而通过该结构体变量中的文件信息能够访问该文件。 if((fp=fopen("用户信息.txt","r">>==NULL>//“r”为输出打开一个文本文档 { printf("找不到用户信息.txt文件! \n">。 system("pause">。 //从程序里调用“pause”命令。 exit(0>。 } else { fscanf(fp,"\t%d\n",&n>。 //fscanf(文件指针,格式字符串,输入文件表列> for(i=0。 i i++> fscanf(fp,"\t%s\t%s\n",stu[i].name,stu[i].secret>。 }//从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。 //fscanf(文件指针,格式字符串,输入列表>。 fclose(fp>。 printf("\n\n\n\n\n\n\n\n\t\t保存在用户信息.txt文件中的所有信息已经读入程序中! \n\n\t\t\t">。 system("pause">。 system("cls">。 for(i=0。 i<3。 i++> {pf(>。 printf("\n\n\t\t用户登陆">。 printf("请输入用户名,你还有%d次机会。 \n\t\t\t",3-i>。 gets(s3>。 if(! strcmp(s3,s7>>//strcmp比较两个字符串的大小 {printf("用户名不能空格,谢谢! ! ! ">。 printf("用户名不正确,请从新输入。 \n">。 system("pause">。 //从程序里调用“pause”命令。 system("cls">。 //从程序里调用“clear”命令。 if(i==2> {printf("\n\n\t\t\t用户名不正确,按任意键退出。 \n\n\n\t\t\t">。 exit(0>。 } continue。 } for(j=0。 j j++> { if(! strcmp(stu[j].name,s3>> { printf("用户名正确\n">。 strcpy(s1,stu[j].name>。 strcpy(s2,stu[j].secret>。 system("cls">。 //从程序里调用“clear”命令。 break。 } } if(! strcmp(s1,s3>> break。 printf("用户名不正确,请从新输入。 \n">。 system("pause">。 //从程序里调用“pause”命令。 if(i==2> { printf("用户名和密码不匹配,按任意键退出。 \n">。 system("pause">。 //从程序里调用“pause”命令。 exit(0>。 } system("cls">。 //从程序里调用“clear”命令。 } for(i=0。 i<3。 i++> { pf(>。 printf("\n\n\t用户登陆">。 printf("\n\n用户名正确\n">。 printf("\n请输入用户密码,你还有%d次机会。 \n",3-i>。 printf("密码正确,登陆成功时,系统将自动跳转\n">。 gets(s4>。 if(! strcmp(s2,s4>> { system("cls">。 //从程序里调用“clear”命令。 break。 } Else if(i==2> { system("cls">。 //从程序里调用“clear”命令。 printf("\n\n\n\t\t\t用户名和密码不匹配,按任意键退出。 \n\n\n\t\t\t">。 exit(0>。 } else { system("cls">。 //从程序里调用“clear”命令。 printf("输入错误,请从新输入: \n">。 } } for(i=0。 。 i++> { pf(>。 printf("\n\t\t***********************************\n">。 printf("\t\t*1.退出系统*\n">。 printf("\t\t**\n">。 printf("\t\t*2.进入万科大导航系统*\n">。 printf("\t\t**\n">。 printf("\t\t*3.新增用户信息*\n">。 printf("\t\t**\n">。 printf("\t\t*0.修改密码*\n">。 printf("\t\t********************************\n">。 printf("请选择功能\n">。 scanf("%d",&a>。 if(a==1> { printf("按任意键退出\n">。 break。 } getchar(>。 if(a==2> mainn(>。 if(a==3> insert(>。 if(a==0> { for(i=0。 i<3。 i++> { system("cls">。 //从程序里调用“clear”命令。 pf(>。 printf("\n\n请输入原密码\n">。 printf("两次不正确,系统将自动返回,你还有%d次机会。 \n",3-i-1>。 gets(s3>。 if(! strcmp(s2,s3>> {for(i=0。 。 i++> { printf("\n请输入新密码\n">。 gets(s6>。 printf("\n请在此输入新密码\n">。 gets(s5>。 if(! strcmp(s5,s6>> { system("cls">。 //从程序里调用“clear”命令。 printf("新密码为: %s\n",s5>。 strcpy(s2,s5>。 strcpy(stu[j].secret,s2>。 if((fp=fopen("用户信息.txt","w">>==NULL> { printf("\n保存失败! ">。 exit(0>。 } else { for(i=0。 i i++> fprintf(fp,"\t%s\t%s\n",stu[i].name,stu[i].secret>。 } fclose(fp>。 printf("新用户信息已保存在用户信息.txt中! \n">。 system("pause">。 //从程序里调用“pause”命令。 system("cls">。 //从程序里调用“clear”命令。 break。 } else system("cls">。 //从程序里调用“clear”命令。 printf("\n\n两次输入密码不一样,密码修改失败\n">。 break。 } break。 } else { printf("原密码输入错误\n">。 printf("请珍惜机会,从新输入。 ">。 system("pause">。 //从程序里调用“pause”命令。 system("cls">。 //从程序里调用“clear”命令。 } if(i==2> {exit(0>。 //已经是第三次了,哈哈! } } } } } voidinsert(> {inti。 FILE*fp。 n++。 printf("\n\t\t输入新插入用户信息\n">。 printf("\n输入新用户名: ">。 scanf("%s",stu[n].name>。 fflush(stdin>。 //清空输入缓冲区,通常是为了确保不影响后面的数据读取 printf("\n输入新用户密码: ">。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 胡鹏 课程 方案 报告