交通咨询系统详细设计说明书_第1页
交通咨询系统详细设计说明书_第2页
交通咨询系统详细设计说明书_第3页
交通咨询系统详细设计说明书_第4页
交通咨询系统详细设计说明书_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、交通咨询系统交通咨询系统 详详 细细 设设 计计 说说 明明 书书 设计成员设计成员 孙坤孙坤-13111196 叶嘉伟叶嘉伟13111198 余富林余富林13111197 原赫原赫-13111195 项目名称详细设计说明书1 详细设计说明书详细设计说明书 1.引言引言 1.11.1 编写目的编写目的 在概要设计设定的大纲与数据结构上进一步完成每一个模块的功能。写出对应的算法 及其伪代码,为下一步细化到代码做准备。本说明书为程序实现提供细化的参考。 1.2 背景背景 待开发系统名称:交通信息查询系统 本系统开发人员为本小组全体成员:13111195 原赫 13111196 孙坤 1311119

2、7 余富林 13111198 叶嘉伟 1.3 定义定义 迪杰斯特拉算法:本系统采用的求解最短路径的算法。 1.4 参考资料参考资料 数据结构(c 语言版) 严蔚敏 吴伟民 清华大学出版社 c 语言程序设计(第四版) 谭浩强 清华大学出版社 项目名称详细设计说明书2 2.系统结构系统结构 选择登陆类型 程序开始运行 显示欢迎界面 普通用户管理人员密码登陆 花费最短路线时间最短路线管理城市管理列车管理航班 判断是否退回主菜单 是 否 以上为本系统的主要结构组成,详细的结构说明参见交通信息查询系统概要设计说明 书 项目名称详细设计说明书3 3.模块详细设计模块详细设计 3.1 模块列表模块列表 说明

3、:以下模块详细设计均以航班一种交通工具为例,对于列车以此类推 模块名称 模块标示符 管理员添加城市 model1 管理员删除城市 model2 管理员添加航班 model3 管理员删除航班 model4 普通用户查询最少花费航班 model5 普通用户查询最短时间航班 model6 3.23.2 模块模块 1 1 (model1model1) 3.2.1 模块描述模块描述 该模块所要实现的功能为将一个新城市加入到交通信息库当中。适用对象为信息库管 理员,要求通过键盘输入所要添加的新城市,并将信息保存到对应的文件中去。同时要求 有一定判错功能。 3.2.2 输入项输入项 要求输入一个城市名作为添

4、加城市名,为了方便起见,这里运用 string 类作为变量 类型。 项目名称详细设计说明书4 3.2.3 输出项输出项 输出项为添加的 string 类城市名,要求输出到文件中去,并修改文件中的城市数 3.2.4 流程逻辑流程逻辑 输入城市名 判别城市是否存在 no yes 修改文件中的信息:写 入城市名、增加城市数 初始化数据结构 end start 3.2.5 接口接口 本模块与其他模块以及整个数据结构的接口为城市文件,通过本模块修改文件以及初始 化操作与数据结构关联起来 项目名称详细设计说明书5 3.2.6 初步代码初步代码 int addcity(graph char ch; int

5、k; int p=0; string c; fstream file; printf(nnn); cout=这里是城市添加管理页面 =nnn; outputcities(t); cout !警告:您的操作将改变交通信息库,输入 1 继续操作,否则离开 :; ch=getchar();dd=ch; for(;ch!=n;) ch=getchar(); if(dd!=1) return 2; coutnn; coutc; getchar(); for(k=1;k=t.citynum;k+) if(c=strk) cout抱歉!您所添加的城市已经存在n; sleep(800); return 1;

6、file.open(file.txt); filesetw(6)t.citynum+1endl; file.seekg(0,ios:end); fileendl; filec; file.close(); initialcities(t); initialflights(t); initialtrains(t); cout*城市已成功添加了呢*; sleep(800); return 0; /添加城市函数,运行完之后不必调用城市初始化,初始化已包含在函数中 3.2.7 测试计划测试计划 测试时通过各种不符合要求的输入来检验本模块的判错能力。同时注意文件中新生成的 信息是否与预想的吻合。 项目名

7、称详细设计说明书6 3.3模块模块 2(model2) 3.3.1 模块描述模块描述 该模块所要实现的功能为将一个已有城市从交通信息库当中删除。适用对象为信息库 管理员,要求通过键盘输入所要删除的城市,并将信息保存到对应的文件中去。同时要求 有一定判错功能。 3.3.2 输入项输入项 要求输入一个城市名作为删除城市名,为了方便起见,这里运用 string 类作为变量类 型。 3.3.3 输出项输出项 输出项为整个城市列表,要求输出到文件中去,并修改城市数 3.3.4 流程逻辑流程逻辑 输入城市名 判别城市是否存在 yes no 将数据结构中的相关内 容全部删除,并重新将 数据结构的信息打入文

8、件中。 end start 项目名称详细设计说明书7 3.3.5 初步代码初步代码 int deletecity(graph unsigned int hour;unsigned int minute; int decreasef=0; /删除城市后减少的航班数 int decreaset=0; /删除城市后减少的列车数 int i,j; string c; char ch; int k; int m; fstream file; /以上为变量声明 cout这里是城市删除管理页面nnnn; coutc; getchar();coutnn; for(k=1;k=t.citynum;k+) if(

9、c=strk) m=k; /m 为想要删除城市的下标 break; if(k=t.citynum) cout抱歉!您想要删除的城市不存在n; sleep(800); return 1; /以上为判定城市是否存在 file.open(file.txt, fstream:out | ios:trunc); filesetw(6)t.citynum-1endl; for(i=1;i=t.citynum;i+) /现在的城市数还是未删之前的 if(i!=m) filestriendl; else continue; file.close(); for(i=m,j=1;j=t.citynum;j+) d

10、ecreasef+=t.mapij.flightnum; decreaset+=t.mapij.trainnum; for(i=1,j=m;i=t.citynum;i+) decreasef+=t.mapij.flightnum; decreaset+=t.mapij.trainnum; decreasef=decreasef-t.mapmm.flightnum; decreaset=decreaset-t.mapmm.trainnum; /以上已经将数据结构更新完毕 接下来将文件全数更新一下即可 3.3.6 测试计划测试计划 测试时通过各种不符合要求的输入来检验本模块的判错能力。同时注意文件

11、中新生成的 信息是否与预想的吻合。 项目名称详细设计说明书8 3.4模块模块 3(model3) 3.4.1 模块描述模块描述 该模块所要实现的功能为将一个新航班加入到交通信息库当中。适用对象为信息库管理员, 要求通过键盘输入所要添加的新航班,并将信息保存到对应的文件中去。同时要求有一定 判错功能。 3.4.2 输入项输入项 要求输入一连串信息作为航班信息:string 类型的出发地、目的地、航班号,以钟点形式 输入起止时间,以整型输入花费。 3.4.3 输出项输出项 输出项为整个型航班信息,要求输出到文件中去,并修改相应量值。 3.4.4 流程逻辑流程逻辑 start 项目名称详细设计说明书

12、9 若航班已 存在 end 以同样的判别形式输 入目的地 若目的地与 出发地相同 输入航班信息并写入 文件,最后初始化文 件 3.4.5 初步代码初步代码 int addflight(graph char ch; int p=0; int k,k1,k2; int j; int i; string c,c1,c2; fstream file; /以上为变量声明 file.open(flight.txt); cout这里是航班添加管理页面; outputflights(t); for(;p=0;) for(k=1;k=t.citynum;k+) if(c=strk) k1=k; p=1; bre

13、ak; if(k=t.citynum) coutc; getchar();coutnn; coutc1; getchar();coutnn; for(p=0;p=0;) for(k=1;k=t.citynum;k+) if(c1=c) coutc1; getchar();coutnn; break; if(c1=strk) k2=k; p=1; break; if(k=t.citynum) coutc1; getchar();coutnn; coutc2; getchar(); for(i=1;i=t.mapk1k2.flightnum;i+) if(t.mapk1k2.flightinfi.

14、code=c2) cout您所要添加的航班已经存在,请核实后再进行添加! n; sleep(800); return 1; 接下来将航班列表文件更新即可 3.4.6 测试计划测试计划 测试时通过各种不符合要求的输入来检验本模块的判错能力。同时注意文件中新生成的 信息是否与预想的吻合。 3.5模块模块 4(model4) 模块 4 与模块 2 的思想与流程基本一致这里只提供初步代码 int deleteflight(graph char ch; unsigned int hour; unsigned int minute; fstream file; int m; int i,j; int k1

15、,k2; /k1 k2 用来记录出发点与目的地 int p=0; string c,c1,c2; int k; /以上为变量声明 cout这里是航班删除管理页面; outputflights(t); for(;p=0;) for(k=1;k=t.citynum;k+) if(c=strk) p=1; k1=k; break; if(k=t.citynum) coutc; getchar();coutnn; coutc1; getchar();coutnn; for(p=0;p=0;) for(k=1;k=t.citynum;k+) 项目名称详细设计说明书11 if(c1=c) coutc1;

16、getchar();coutnn; break; if(c1=strk) p=1; k2=k; break; if(k=t.citynum) coutc1; getchar();coutnn; coutc2; getchar();coutnn; for(i=1;i=t.mapk1k2.flightnum;i+) if(c2=t.mapk1k2.flightinfi.code) m=i; break; if(i=t.mapk1k2.flightnum) cout您所要删除的航班不存在! ; sleep(800); return 1; nflight-; for(i=m;ichu; getchar

17、();coutdao; getchar();coutnn; for(i=1;i=t.citynum;i+) if(chu=stri) p=i; break; else if(i=t.citynum) cout对 不 起,您 输 入 的 出 发 城 市 尚 未 添 加!n; sleep(1000); return 1; 项目名称详细设计说明书13 for(i=1;i=t.citynum;i+) if(dao=stri) q=i; break; else if(i=t.citynum) cout对 不 起,您 输 入 的 目 标 城 市 尚 未 添 加n; sleep(1000); return

18、1; /以上输入并匹配了出发点目的地 for(i=1;i=t.citynum;i+) for(j=1;j=t.citynum;j+) if(t.mapij.flightnum=0|i=j) t.mapij.weight=max; else for(k=1,mincost=max;k=t.mapij.flightnum;k+) if(t.mapij.flightinfk.cost=mincost) mincost=t.mapij.flightinfk.cost; t.mapij.mincostflight=k; /当前最小花费的航班编号被记录下来 t.mapij.weight=mincost;

19、/二维数组 map 的权值已经赋值完毕 for(i=1;i=t.citynum;i+) finali=0; weighti=t.mappi.weight; if(t.mappi.weight!=max) pathi1=p; pathi2=i; finalp=1; /以上为各个辅助数组的初始化 for(;nt.citynum;) min=max; for(i=1;i=t.citynum;i+) if(weighti=min j=i; finalj=1; n+; if(j=q) n=1;break; /以上程序段对当前已更新的辅助数组们进行处理,选出当前 weight 数组中的最小项 for(i=

20、1;iweightj+t.mapji.weight) weighti=weightj+t.mapji.weight; for(m=1;pathjm!=j;m+) pathim=pathjm; pathim=pathjm; m+;pathim=i; n=1; /以上程序段作用为更新各辅助数组中的数据,每次对每个未结束求解顶点对应的数 据进行审查 接下来将 path终点的路径及其信息一一打出即可。 项目名称详细设计说明书14 3.5.5 测试计划测试计划 测试时通过各种情况的交通图来测试算法的正确性。特别是一些特殊情况一定要多多测 试。 3.6模块模块 5 5(model5model5) 3.6.

21、1 模块描述模块描述 在这个模块中,普通用户可以查询两座城市之间的最少时间路径。通过输入两城市名,程 序会列出一条时间最短路径以供参考。 3.6.2 模块主要算法分析模块主要算法分析 这个模块用的也是迪杰斯特拉算法。但是由于路径时间与前一趟航班到达时间有关,所以 图的权值必须在运行过程中慢慢赋值,这是这一个算法与模块 4 最大的区别。 3.6.3 流程逻辑流程逻辑 start 项目名称详细设计说明书15 将 j 的路径中最后一班航班的落地时间记录,将 j 到 i 的每趟 航班之间的等待时间加上航班飞行时间加上 pathj中的权值作 为起点-j-i 的路径时间总长,将之与 weighti进行比较

22、。取 其中较小的作为 weighti的新值。若两趟航班之间间隔不大于 20 分钟,则无法搭乘当日航班,权值需加上 24 小时 end 3.5.4 初步代码初步代码 int timeleast(graph char ch; int jian=1; int p; int q; string chu; string dao; unsigned int min=max; unsigned int mintime=max; unsigned int dtime; int i; int a,b,c,d; int k; int j; int m; int n; unsigned int minute; un

23、signed int hour; unsigned int h; printf(请 输 入 您 的 出 发 城 市:); cinchu; getchar(); printf(请 输 入 您 的 目 标 城 市:); cindao; getchar();coutendl; for(i=1;i=t.citynum;i+) if(chu=stri) p=i; break; else if(i=t.citynum) cout对 不 起,您 输 入 的 出 发 城 市 尚 未 添 加!n; sleep(1000); return 1; for(i=1;i=t.citynum;i+) f(dao=stri

24、) q=i; break; else if(i=t.citynum) cout对 不 起,您 输 入 的 目 标 城 市 尚 未 添 加n; sleep(800); return 1; 输入并匹配出发点与目的地 初始化个辅助数组 选出当前 weight 最小的顶点 j,将其 final 值置为一 若 j 为终点 项目名称详细设计说明书16 for(i=1;i=t.citynum;i+) for(j=1;j=t.citynum;j+) if(t.mapij.flightnum=0|i=j) t.mapij.weight=max; else t.mapij.weight=0; /对不连通的城市进行

25、赋值 max,连通城市初始权值为 0 for(i=1;i=t.citynum;i+,mintime=max) finali=0; if(i=p) weighti=max; else if(t.mappi.flightnum!=0) for(j=1;j=t.mappi.flightnum;j+) dtime=(t.mappi.flightinfj.time2- t.mappi.flightinfj.time1+24*3600)%(24*3600); if(dtime=mintime) mintime=dtime; t.mappi.mintimeflight=j; weighti=mintime;

26、 t.mappi.flightinfj.realwaitingtime=mintime; else if(t.mappi.flightnum=0) weighti=max; if(weighti!=max) pathi1=p; pathi2=i; finalp=1; /以上为各个辅助数组的初始化 for(;nt.citynum;) for(i=1;i=t.citynum;i+) if(weighti=min j=i; finalj=1; n+; if(j=q) n=1; break; /以上程序段对当前已更新的辅助数组们进行处理,选出当前 weight 数组中的最小项 if(min=max)

27、break;for(i=1;i=t.citynum;i+,mintime=max,min=max) if(finali=1) continue; if(t.mapji.flightnum=0) continue; for(k=1;pathjk!=j;k+)if(pathjk+1=j) m=pathjk; n=t.mapmj.mintimeflight; /n 为上一次选出的最短 weight 路径中最后一班航班的编号,从 m 到 j for(k=1,min=max;kt.mapji.flightinfk.time1) t.mapji.flightinfk.realwaitingtime=24*3600- (t.mapmj.flightinfn.time2)+t.mapji. flightinfk.time1+(t.mapji.flightinfk.time2- t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论