城市公交查询软件.doc

上传人:仙人指路1688 文档编号:2388184 上传时间:2023-02-17 格式:DOC 页数:45 大小:434.50KB
返回 下载 相关 举报
城市公交查询软件.doc_第1页
第1页 / 共45页
城市公交查询软件.doc_第2页
第2页 / 共45页
城市公交查询软件.doc_第3页
第3页 / 共45页
城市公交查询软件.doc_第4页
第4页 / 共45页
城市公交查询软件.doc_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《城市公交查询软件.doc》由会员分享,可在线阅读,更多相关《城市公交查询软件.doc(45页珍藏版)》请在三一办公上搜索。

1、长 沙 学 院课程设计说明书题目城市公交查询软件系(部)数学与计算机科学系专业(班级)姓名学号指导教师起止日期课程设计任务书课程名称:软件工程基础实训II设计题目:城市公交查询软件已知技术参数和设计要求:需求说明及要求1.主要功能模块:(1)用户管理用户管理模块为用户提供用户信息管理的功能,包括用户注册、用户登陆、用户信息修改、用户密码修改、用户注销等功能。用户注册:用户可以利用此功能完成注册,用户在界面输入注册信息,回车后,软件将注册信息保存到用户信息数据文件中。用户登陆:用户可以利用此功能完成登陆,用户在界面输入登陆信息,回车后,软件验证登录信息,登陆成功后,软件进入主功能选择界面。用户信

2、息修改:用户可以利用此功能完成用户信息修改。用户密码修改:用户可以利用此功能完成密码修改。用户注销:用户可以利用此功能完成用户信息注销,某用户注销后,便不能再次登录。(2)线路管理线路管理模块为用户提供公交线路数据的管理和维护,包括线路添加、线路修改、线路删除等功能。线路添加:用户可以利用此功能增加一条线路。线路修改:用户可以利用此功能修改一条线路。线路删除:用户可以利用此功能删除一条线路。(3)站点管理站点管理模块为用户提供公交站点数据的管理和维护,包括站点添加、站点修改、站点删除等功能。站点添加:用户可以利用此功能增加一个站点。站点修改:用户可以利用此功能修改一个站点。站点删除:用户可以利

3、用此功能删除一个站点。(4)公交查询公交查询模块为用户提供公交信息查询的功能,包括站点查询、线路查询、站站查询、最短距离查询、最少换乘查询等功能。站点查询:用户可以利用此功能查看某个站点所停靠的公交线路。线路查询:用户可以利用此功能查看某条线路所路经的公交站点。站站查询:用户可以利用此功能查询出发地和目的地之间的所有公交乘车方案。最短距离查询:用户可以利用此功能查询出发地和目的地之间最短距离的公交乘车方案。最少换乘查询:用户可以利用此功能查询出发地和目的地之间最少换乘的公交乘车方案。2.要求:界面友好,易于操作;数据结构运用灵活,编码规范,设计合理。各阶段具体要求:1、需求分析阶段(1)写出需

4、求分析(做什么) (2)要求问题分析和功能定义准确2、系统设计阶段(1)根据问题描述,设计系统的结构(3)完成数据结构中各个函数的定义(4)用户界面的设计(5)要求数据结构定义合理,类层次结构清晰3、编码实现阶段(1)完成代码编写 (2)要求代码编写规范4、系统测试阶段(1)完成功能调试(2)要求完成必要的测试工作5、交付实施阶段(1)提交可正常执行的系统(2)提交系统需求说明书、设计说明书、程序代码(3)撰写实训报告书(4)要求规范地书写文档设计工作量:(1)软件设计:完成问题陈述中所提到的所有需求功能。(2)论文:要求撰写不少于3000个文字的文档,详细说明各阶段具体要求。工作计划:安排两

5、周时间进行课程设计,软件开发步骤如下,2天完成13,3-5天完成46,论文同步进行;1)选定题目2)需求分析3)系统设计4)编码实现5)系统测试6)交付实施注意事项n 提交文档 长沙学院实训任务书(每学生1份) 长沙学院实训说明书(每学生1份) 长沙学院实训鉴定表(每学生1份)指导教师签名: 日期: 教研室主任签名: 日期:系主任签名: 日期:长沙学院课程设计鉴定表姓名学号专业班级设计题目城市公交查询软件指导教师指导教师意见:评定等级: 教师签名: 日期: 答辩小组意见:评定等级:答辩小组长签名:日期:教研室意见:教研室主任签名: 日期: 系(部)意见:系主任签名:日期:说明课程设计成绩分“优

6、秀”、“良好”、“及格”、“不及格”四类;目 录一、引言61.1编写目的61.2参考资料6二、需求规约62.1需求分析62.2功能需求62.3出错处理需求72.4输入输出需求72.5环境需求7三、设计83.1程序流程图83.2抽象数据类型93.3存储结构103.3.1公交路线的存储结构103.3.2公交站点的存储结构10四、编码测试104.1 测试用例104.1.1 站站查询104.1.2 线路查询104.1.3站站查询114.1.4 最短距离查询114.1.5 最少换乘查询114.2程序运行结果12五、总结15六、附录15query.h15query.c16station.h23statio

7、n.c25station_manage.h31station_manage.c31bus.h33bus.c36bus_manage.h41bus_manage.c42一、引言1.1编写目的此公交查询软件主要是对不熟悉公交线路,而又要外出的人提供方便的查询服务,当你想到某个站点去却不知道如何走的话,那就可以使用这款软件,它能满足大多数人的需求,查询最方便的乘车方案。1.2参考资料表1.1 参考资料表资料名称作者文件编号、版本数据结构C语言版严蔚敏 吴伟民编著978-7-113-12943-9C语言版入门经典霍顿(Ivor Horton)第五版算法导论Thomas H.Cormen、Charles

8、 E.Leiserson等第二版二、需求规约2.1需求分析需要构建一张站点的图,然后建立起这些站点的关系,另外还需要保存每一个不同线路的信息,其中经过的站点,构建完这些就可以方便的查询各种信息了。2.2功能需求查询功能:站点查询:查询一个站点所经过的所有线路。线路查询:查询一个线路所经过的所有站点。站站查询: 查询两个站点之间的所有公交乘车方案。最短距离查询:查询两个站点之间的最短距离乘车方案。最少换乘查询:查询两个站点之间最少换乘的乘车方案。2.3出错处理需求当用户查询路径时,输入不存在的站点,程序应当提示用户重新输入,而不是毫无提示或程序崩溃。用户输入操作指令时,若用户输入了非法的指令,应

9、当提示用户重新输入。若两站点之间没有连通,需保证程序不会出错。 管理员添加站点或公交线路时,若添加的站点或线路已经存在,须提示管理员输入有误重新输入。2.4输入输出需求输入的城市名为一字符串,除汉字外不包含任何字符,包含任何字符的都输入非法输入。输出为一字符串和一个数值,该字符串包含最短路径上的所有城市名,城市名之间用一个箭头隔开,额外的一行输出当前的最短路径的里程。表2.1输入输出要求表测试编号测试功能输入输出GJCX-01站点查询一个站点的名字该站点所经过的所有公交GJCX-02线路查询公交的名字改公交所经过的所有站点GJCX-03站站查询起点站和终点站所有可能的乘车方案GJCX-04最短

10、距离查询起点站和终点站最短距离的乘车方案GJCX-05最少换乘查询起点站和终点站最少换乘的乘车方案2.5环境需求此系统是以c语言的C99标准编写的,测试时注意好编译器的版本,检查编译器是否支持C99以免编译器版本不符,造成错误。另外此系统是在DEV-C+4.9.9.2环境下编写。三、设计3.1程序流程图图3.1查询流程图图3.2 站点管理流程图图3.3 线路管理流程图3.2抽象数据类型station.hinit();/初始化free(t);/销毁clear(t);/清空isempty(t);/是否为空count(t);/返回站点的数量add(t,station_name);/添加一个站点add

11、_bus(t,index,bus_name);/往一个站点添加经过的路线remove(t,index);/删除一个站点remove_bus(t,index,bus_name);/删除一个站点经过的路线set(t,index,station_name);/修改一个站点get(t,index);/返回一个站点的名字set_bus(t,index,old_bus_name_new_bus_name);/修改一个站点经过的路线lookup(t,station_name);/判断站点是否存在lookup_bus(t,index,bus_name);/判断站点是否有该线路经过get_bus_count(t

12、,index);/返回一个站点所经过的线路数量get_bus_name(t,index_station,index_bus);/返回一个站点所经过的线路名称save(t);/将站点的信息保存到文件read(t);/从文件中读取信息print(t,index);/打印一个站点的所有线路信息bus.hinit();/初始化free(t);/销毁clear(t);/清空count(t);/返回isempty(t);/是否为空add(t,bus_name);/添加一条线路add_station(t,index,station_naem,distance);/在线路上添加一个站点set_station(

13、t,index,old_station,new_station);/在线路上修改一个站点remove_station(t,index,station_name);/在线路上删除一个站点lookup_station(t,index,station_name);/判断一条线路上是否存在某个站点get_station_count(t,index);/返回一条线路所经过的站点数量get_station_name(t,index_bus,index_station);/返回线路上一个站点的名字get_station_distance(t.index_bus,index_station);/返回一个站点距

14、上一个站点的距离remove(t,index);/删除一条线路lookup(t,bus_name);/判断一条线路是否存在indexof(t,bus_name);/返回一条线路的下标get(t,index);返回一条线路的名称save(t);/将线路的信息保存到文件中read(t);/从文件中读取信息print(t,index);/将公交线路的信息打印出来3.3存储结构3.3.1公交路线的存储结构公交路线采用的是邻接链表的存储方式,每个链上存储的是该公交经过的每一个站点。3.3.2公交站点的存储结构公交站点采用邻接链表的存储方式,链表上的灭个节点存储了每个站经过了哪些线路。四、编码测试4.1

15、测试用例4.1.1 站站查询表4.1站站查询测试用例用例编号测试数据预期结果实际结果判定GJCX-01-01竹园路口101路同预期通过GJCX-01-02五里牌101路、405路同预期通过GJCX-01-03远大路口122路、405路同预期通过GJCX-01-04马王堆122路同预期通过4.1.2 线路查询表4.2线路查询测试用例用例编号测试数据预期结果实际结果判定GJCX-02-01101路第一站 竹园路口第二站 五里牌第三站 火车站第四站 车站路口第五站 窑岭东第六站 梓园路口第七战 广济桥第八站 红旗药号同预期通过GJCX-02-02122路第一站 识字岭第二站 地质中学第三站 梓园路口

16、第四站 湘雅二医院第五站 高建市场第六站 东方新城第七站 远大路口第八站 马王堆同预期通过GJCX-02-03405路第一站 五里牌第二站 南湖大市场第三站 远大路口第四站 万家丽广场同预期通过4.1.3站站查询表4.3 站站查询测试用例用例编号测试数据预期结果实际结果判定GJCX-03-01竹园路口识字岭输出两站点之间的所有乘车方案同预期通过GJCX-03-02五里牌马王堆输出两站点之间的所有乘车方案同预期通过GJCX-03-03远大路口红旗药号输出两站点之间的所有乘车方案同预期通过GJCX-03-04马王堆竹园路口输出两站点之间的所有乘车方案同预期通过4.1.4 最短距离查询表4.4 最短

17、距离查询测试用例用例编号测试数据预期结果实际结果判定GJCX-04-01竹园路口识字岭输出两站点之间的最短距离乘车方案同预期通过GJCX-04-02五里牌马王堆输出两站点之间的最短距离乘车方案同预期通过GJCX-04-03远大路口红旗药号输出两站点之间的最短距离乘车方案同预期通过GJCX-04-04马王堆竹园路口输出两站点之间的最短距离乘车方案同预期通过4.1.5 最少换乘查询表4.5 最少换乘查询测试用例用例编号测试数据预期结果实际结果判定GJCX-04-01竹园路口识字岭输出两站点之间的最少换乘乘车方案同预期通过GJCX-04-02五里牌马王堆输出两站点之间的最少换乘乘车方案同预期通过GJ

18、CX-04-03远大路口红旗药号输出两站点之间的最少换乘乘车方案同预期通过GJCX-04-04马王堆竹园路口输出两站点之间的最少换乘乘车方案同预期通过4.2程序运行结果图4.1 站点查询图4.2线路查询图4.3站站查询图4.4最短距离查询图4.5最少换乘五、总结这次实训时间很短,而难度有比上一周的实训要大得多,对我来说是一次挑战,首先是存储结构的选择,这个问题我纠结了很久,最后我还是选择用邻接链表来存储线路和站点的信息,虽然操作起来有点麻烦,但是思路很清晰,对于解决这个问题来说很方便。这次实训的最难的地方应该就是最少换乘的求解了,该开始对了求解最少换乘毫无思路,不过当我用Dijkstra算法求

19、出最短路径后,我似乎有了一点启发,我用Dijkstra算法的思想,把之前的求最短路径的算法改成了最少换乘,这对我来说试一次提升,我对Dijkstra算法的理解不仅仅只是表面的应用,更重要的是我理解了这个算法的思想,学会算法并不意味着什么,而当我们会自己去创建一个算法的时候,我们才是真正的进入了算法这一领域。六、附录query.h#ifndef _QUERY_H_#define _QUERY_H_#include bus.h#include station.h#include graph.h/*查询经过该站点的所有公交线路*/voidquery_station(struct station *t

20、); /*查询某个公交线路*/voidquery_road(struct bus *t); /*查询两个站点之间的所有乘车方案*/voidquery_stations(struct station *ts, struct bus *tb, struct graph *tg); /*查询两个站点之间的最短路径乘车方案*/voidquery_shortest_path(struct station *ts, struct bus *tb,struct graph *tg); /*查询两个站点之间的最少换乘方案*/voidquery_min_transfer(struct station *ts,

21、struct bus *tb, struct graph *tg); #endif /* _QUERY_H_ */query.c#include #include #include #include #include query.h/*查询经过该站点的所有公交线路*/voidquery_station(struct station *t)char station_name20;printf(请输入您要查询的站点:);scanf(%s,station_name);if(!station_lookup(t,station_name)printf(您输入的站点不存在!n);system(pause)

22、;return;station_print(t,station_indexof(t,station_name);system(pause);/*查询某个公交线路*/voidquery_road(struct bus *t)char bus_name20;printf(请输入您要查询的公交线路:);scanf(%s,bus_name);if(!bus_lookup(t,bus_name)printf(您输入的公交线路不存在!n);system(pause);return;bus_print(t,bus_indexof(t,bus_name);system(pause);static void b

23、uspath_print(struct station *ts, struct bus *tb, int ans, int ans_bus, int cnt)int i;for(i = 0; i = cnt; i+)if(i != 0 & i != cnt & ans_busi != ans_busi-1) printf(在%s站换乘%s路。n,station_get(ts,ansi),bus_get(tb,ans_busi);else if(i = cnt)printf(在%s站乘%s路下车!n,station_get(ts,ansi),bus_get(tb,ans_busi);else i

24、f(i = 0)printf(在%s站乘%s路上车!n,station_get(ts,ansi),bus_get(tb,ans_busi);elseprintf(在%s站乘坐%s路。n,station_get(ts,ansi),bus_get(tb,ans_busi);system(pause);/*对于一条线路用dfs搜出所有的换乘方案*/ static void dfs_station(struct station *ts, struct bus *tb, int ans, int ans_bus,int cnt, int deep)int i;if(deep = cnt)ans_busd

25、eep = ans_busdeep-1; buspath_print(ts,tb,ans,ans_bus,deep); return;for(i = 0; i station_get_bus_count(ts,ansdeep); i+)char *bus_name = station_get_bus_name(ts,ansdeep,i);int index_bus = bus_indexof(tb,bus_name);ans_busdeep = index_bus;if(station_lookup_bus(ts,ansdeep+1,bus_name)/如果下一站包含该线路则继续走 dfs_s

26、tation(ts,tb,ans,ans_bus,cnt,deep+1);else/否则就换车 continue; /*用dfs搜出所有的路径*/static void dfs_path(struct graph *tg, int vis, int ans,int s, int t, int deep, struct station *ts,struct bus * tb)int i;viss = 1;ansdeep = s;if(s = t)int ans_bus100;dfs_station(ts,tb,ans,ans_bus,deep,0);return;for(i = 0; i cnt

27、; i+)if(!visi & tg-arcsi)dfs_path(tg,vis,ans,i,t,deep+1,ts,tb);visi = 0;/*查询两个站点之间的所有乘车方案*/voidquery_stations(struct station *ts, struct bus *tb, struct graph *tg)char start_station20;char terminal_station20;int vis100;int ans100;int index_s;int index_t;printf(请输入起点站:);scanf(%s,start_station);if(!st

28、ation_lookup(ts,start_station) printf(您输入的站点不存在!n);system(pause);return;printf(请输入终点站:);scanf(%s,terminal_station);if(!station_lookup(ts,terminal_station)printf(您输入的站点不存在!n);system(pause);return;index_s = station_indexof(ts,start_station);index_t = station_indexof(ts,terminal_station);memset(vis,0,s

29、izeof(vis);printf(%d %dn,index_s,index_t);dfs_path(tg,vis,ans,index_s,index_t,0,ts,tb);/*用Djikstra算法求出一条最短路径*/static int Dijkstra(struct station *ts, struct bus *tb, struct graph *tg, int s, int t, int ans_path)int vis100;int d100;int path100;int cnt = station_count(ts);int ans_bus100;int ans_cnt =

30、0;/记录ans_path的数量 int i,j;/*初始化*/for(i = 0; i cnt; i+) visi = 0;di = INT_MAX;pathi = -1;ds = 0;/*求最短路径*/for(i = 0; i cnt; i+)/最多循环次数 int minimum = INT_MAX;/当前路径最小值 int x; /每一轮的起点 for(j = 0; j cnt; j+) if(dj minimum & !visj)/找一条s到j的路径最小,且j没有访问过minimum = dj;x = j;visx = 1;if(x = t) break;/已找到从起点到终点的最短路

31、径 for(j = 0; j arcxj != 0 & !visj)/如果两点有路可走 if(dx + tg-arcxj arcxj;pathj = x; if(dt = INT_MAX) return 0;/*保存路径*/ i = t;while(i != -1)ans_pathans_cnt+ = i;i = pathi;for(i = 0; i ans_cnt/2; i+)int t_ans = ans_pathi;ans_pathi = ans_pathans_cnt-i-1;ans_pathans_cnt-i-1 = t_ans;/*对该路径搜换乘方案*/ dfs_station(t

32、s,tb,ans_path,ans_bus,ans_cnt-1,0);return 1;/*查询两个站点之间的最短路径乘车方案*/voidquery_shortest_path(struct station *ts, struct bus *tb, struct graph *tg)char start_station20;char terminal_station20;int ans_path100;int index_s;int index_t;printf(请输入起点站:);scanf(%s,start_station);if(!station_lookup(ts,start_stati

33、on) printf(您输入的站点不存在!n);system(pause);return;printf(请输入终点站:);scanf(%s,terminal_station);if(!station_lookup(ts,terminal_station)printf(您输入的站点不存在!n);system(pause);return;index_s = station_indexof(ts,start_station);index_t = station_indexof(ts,terminal_station);if(Dijkstra(ts,tb,tg,index_s,index_t,ans_

34、path)/passelseprintf(两站点之间没有线路!n);system(pause);return;/*求最少换乘的算法*/static min_transfer(struct station *ts, struct bus *tb, struct graph *tg, int s, int t)int path100;int bus100;int ans_bus100 ;int ans_station100;int ans_cnt = 0;int d100;int vis100;int cnt = station_count(ts);int i,j; /*初始化*/for(i =

35、0; i cnt ; i+) visi = 0;pathi = -1;busi = 0;di = INT_MAX;/*求最少换乘*/i = cnt;ds = 0;while(i)int minimum = INT_MAX;int x;for(j = 0; j cnt; j+)if(dj minimum & !visj)minimum = dj;x = j;visx = 1;if(x = t) break; /已经找到最短路径 i-;for(j = 0; j bus_count(tb); j+)char *station_name = station_get(ts,x);int k;if(bus

36、_lookup_station(tb,j,station_name)for(k = 0; k bus_get_station_count(tb,j); k+)int station_index = station_indexof(ts,bus_get_station_name(tb,j,k);if(!visstation_index & dx + 1 = 0; i-)char *station_name = station_get(ts,ans_stationi);char *bus_name = bus_get(tb,ans_busi-1);if(i = ans_cnt-1)printf(从

37、起点站%s乘坐%s路。n,station_name,bus_name);else if(i = 0)printf(到达终点站%s。n,station_name);elseprintf(到达%s站后转乘%s路。n,station_name,bus_name); /*查询两个站点之间的最少换乘方案*/voidquery_min_transfer(struct station *ts, struct bus *tb, struct graph *tg)char start_station20;char terminal_station20;int index_s;int index_t;printf

38、(请输入起点站:);scanf(%s,start_station);if(!station_lookup(ts,start_station) printf(您输入的站点不存在!n);system(pause);return;printf(请输入终点站:);scanf(%s,terminal_station);if(!station_lookup(ts,terminal_station)printf(您输入的站点不存在!n);system(pause);return;index_s = station_indexof(ts,start_station);index_t = station_ind

39、exof(ts,terminal_station);min_transfer(ts,tb,tg,index_s,index_t);system(pause);station.h#ifndef _STATION_H_#define _STATION_H_#define STATION_INIT_SIZE 100struct station_nodechar bus_name20;struct station_node *next;struct station_arrchar station_name20;/站点名 int bus_cnt;/经过的公交数量struct station_node *next;struct stationint sta

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

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号