资源描述
长沙学院课程设计说明书长 沙 学 院课程设计说明书题目 城市公交查询软件系(部)数学与计算机科学专业(班级)软件工程(2014级4班)姓名学号指导教师起止日期2015.12.192015.12.25课程设计任务书课程名称:软件工程课程设计设计题目:城市公交查询软件已知技术参数和设计要求:需求说明及要求题目一:银行管理系统及ATM前端的模拟设计银行管理系统业务描述如下:银行ATM存取款系统能为用户提供存款、取款、查询、转账和修改密码的功能。为了模拟真实的ATM业务环境,本系统必须实现存款、取款、查询、转账、修改密码以及开户的功能。用户通过开户业务在本系统开立银行账户,之后可以通过该银行账户登陆ATM系统,在系统中实现存款、取款、查询账户信息、修改密码的操作。本系统各个业务有如下注意点:(1) 登陆系统用户登陆之前,必须在登陆界面输入其银行账户,通过其正确输入的银行账户登陆系统。(2) 开户业务 要使用本系统必须首先执行开户业务开立新的银行账户,并且将此新开的银行存储于文件当中。同时,系统以身份证号码作为开户的充分条件,即一个身份证号码只能开立一次银行账户。(3) 存款业务 客户登陆系统后,选择存款业务,即可以将输入的存款金额存入相应的账户。(4) 取款业务客户登陆系统后,选择取款业务,即可以将输入的取款金额从相应的银行账户取出,但是取款金额必须大于目前的账户余额。(5) 查询业务 客户登陆系统后,可以选择查询业务,查询账户余额。(6) 转账业务 客户登陆系统后,可以选择转账业务,进行转账。注意的是转账的目的账户必须是本系统已经存在的银行账户。(7) 修改密码客户登陆系统后,可以选择修改密码业务,进行密码修改。题目二:个人通信录系统模拟设计个人通信录系统模拟设计业务描述如下: 个人通信录必须为用户提供好友管理、系统管理和帮助三个部分。好友管理包括好友信息录入、好友信息修改、好友信息删除和好友信息查询查询的功能,在此基础上可以设置好友分组;系统管理包括密码修改、分组配置;帮助需要为用户提供系统的操作帮助。本系统各个业务有如下注意点:(1)登陆系统用户在登陆界面输入用户名和密码,校验正确后可以登陆系统。(2)好友管理业务新增的好友信息保存至文件,之后对好友信息的管理都是对文件中的好友信息进行处理,并且可以将好友信息进行分组。(3)系统管理可以在密码修改中修改本用户的密码;可以在此功能中配置系统需要的分组名,并且将分组名保存到文件中。(4)帮助帮助业务需要为用户提供系统的操作帮助。各阶段具体要求:1、需求分析阶段熟悉系统业务,从业务中抽取出系统的需求,形成完善的需求说明书。2、系统设计阶段根据需求,进行程序设计,包括定义系统的界面、定义系统数据的存储方式等,形成完善的设计说明书。3、编码实现阶段(1)完成代码编写 (2)要求代码编写规范4、系统测试阶段(1)完成功能调试(2)要求完成必要的测试工作5、交付实施阶段(1)提交可正常执行的系统(2)提交系统需求说明书、设计说明书、程序代码(3)撰写课程设计报告书(4)要求规范地书写文档设计工作量:(1)软件设计:完成问题陈述中所提到的所有需求功能。(2)论文:要求撰写不少于3000个文字的文档,详细说明各阶段具体要求。工作计划:理论课结束后两周进行课程设计,软件开发如下,一周完成。其中,两教学课时用于题目分析与介绍。其他教学可是用于程序设计。1)选定题目2)需求分析3)系统设计4)编码实现5)系统测试6)交付实施计划时间指导老师学生18周魏 歌14软件1班18周卓 琳14软件2班18周潘 怡14软件3班18周何海江14软件4班18周钟旭14软件5班18周杨凤年14软件6班(因为班级较多,各班开始和结束时间根据试验室安排情况灵活确定,以正式课表为准)注意事项n 提交文档 长沙学院课程设计任务书(每学生1份) 长沙学院课程设计论文(每学生1份) 长沙学院课程设计鉴定表(每学生1份)指导教师签名: 日期: 教研室主任签名: 日期:系主任签名: 日期:长沙学院课程设计鉴定表姓名 胡辉衡学号 B20140304401专业软件工程班级14级4班设计题目城市公交查询软件指导教师钟 旭指导教师意见:评定等级: 教师签名: 日期: 答辩小组意见:评定等级:答辩小组长签名:日期:教研室意见:教研室主任签名: 日期: 系(部)意见:系主任签名:日期:说明课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;摘 要随着我国城市公交系统发展和逐渐完善,市民的出行得到了极大的方便,但同时巨大的公交线路网让人们的选择也困难起来,本城市公交系统就是在此背景下进行设计的。本系统以用户为中心,界面简洁,结构简单,功能较为完善,可以满足市民出行的正常需要。系统分为两个部分,一是内部人员使用的管理员部分,这个部分的用来进行管理,包括站点管理,线路管理,城市管理和功能测试。二是一般用户使用的查询部分,这个部分的用来进行查询,包括站点查询,线路查询,站站查询,切换城市,修改密码。 关键词: 城市公交查询系统目 录摘 要I第1章 设计内容与要求11.1课程名称11.2设计要求1第2章 需求分析42.1功能模块42.2设计环境6第3章 概要设计83.1功能结构83.2系统流程图11第4章 详细设计204.1登陆注册模块204.2 站点管理模块224.3 线路管理模块244.4城市管理模块324.5 公交查询模块34第5章 测试495.1 登陆注册模块测试495.2 站点管理模块测试505.3 线路管理模块测试525.4 城市管理模块测试535.5 公交查询模块测试55总 结58参考文献58附 录 源代码58第1章 设计内容与要求1.1课程名称:软件工程基础实训II设计题目:城市公交查询软件1.2设计要求 各阶段具体要求:1、需求分析阶段(1)写出需求分析(做什么) (2)要求问题分析和功能定义准确2、系统设计阶段(1)根据问题描述,设计系统的结构(3)完成数据结构中各个函数的定义(4)用户界面的设计(5)要求数据结构定义合理,类层次结构清晰3、编码实现阶段(1)完成代码编写 (2)要求代码编写规范4、系统测试阶段(1)完成功能调试(2)要求完成必要的测试工作5、交付实施阶段(1)提交可正常执行的系统(2)提交系统需求说明书、设计说明书、程序代码(3)撰写实训报告书(4)要求规范地书写文档第2章 需求分析2.1功能模块1.主要功能模块:(1)用户管理用户管理模块为用户提供用户信息管理的功能,包括用户注册、用户登陆、用户信息修改、用户密码修改、用户注销等功能。用户注册:用户可以利用此功能完成注册,用户在界面输入注册信息,回车后,软件将注册信息保存到用户信息数据文件中。用户登陆:用户可以利用此功能完成登陆,用户在界面输入登陆信息,回车后,软件验证登录信息,登陆成功后,软件进入主功能选择界面。用户信息修改:用户可以利用此功能完成用户信息修改。用户密码修改:用户可以利用此功能完成密码修改。用户注销:用户可以利用此功能完成用户信息注销,某用户注销后,便不能再次登录。(2)线路管理线路管理模块为用户提供公交线路数据的管理和维护,包括线路添加、线路修改、线路删除等功能。线路添加:用户可以利用此功能增加一条线路。线路修改:用户可以利用此功能修改一条线路。线路删除:用户可以利用此功能删除一条线路。(3)站点管理站点管理模块为用户提供公交站点数据的管理和维护,包括站点添加、站点修改、站点删除等功能。站点添加:用户可以利用此功能增加一个站点。站点修改:用户可以利用此功能修改一个站点。站点删除:用户可以利用此功能删除一个站点。(4)公交查询公交查询模块为用户提供公交信息查询的功能,包括站点查询、线路查询、站站查询、最短距离查询、最少换乘查询等功能。站点查询:用户可以利用此功能查看某个站点所停靠的公交线路。线路查询:用户可以利用此功能查看某条线路所路经的公交站点。站站查询:用户可以利用此功能查询出发地和目的地之间的所有公交乘车方案。最短距离查询:用户可以利用此功能查询出发地和目的地之间最短距离的公交乘车方案。最少换乘查询:用户可以利用此功能查询出发地和目的地之间最少换乘的公交乘车方案。 2.2设计环境 IDE:Dev C+ 5.11编译器:G+ 4.9.2操作系统: windows 7 (64位)第3章 概要设计3.1功能结构3.2系统流程图第4章 详细设计4.1 登录注册模块图4.1-1 注册4.2 站点管理模块图4.2-1 增加站点图4.2-2 删除站点图4.2-3 修改站点4.3 线路管理模块图4.3-1 增加路线图4.3-2 删除线路图4.3-3 修改线路4.4 公交查询模块图4.5-1 站点查询 图4.5-2线路查询图4.5-3线路选择第5章 测试5.1 登录注册模块测试5.2 站点管理模块测试5.3 线路管理模块测试5.4 城市管理模块测试5.5 公交查询模块测试总 结本次课程设计对编程能力的要求很高,需要很多的软件工程的思想,在写的过程中也卡住过,但经过老师的指导都得到了很好的解决。在这次的实训中,我的编程能力有的飞跃性的提升。代码的本身也出现了一些BUG但经过测试大部分都背找出并修复。在整个代码编写过程也学会了很多编程技巧,一是数据表的设计,我的系统之所以能够写的较为顺利很大的原因就是数据表的设计,将公交站点,公交线路,站点和线路的关系分别存放在三个文件中,这种设计能是整个程序的数据和逻辑更加清晰,设计好的数据表能节省很多的时间并使算法也变得简单。二是设计模式,不管功能多繁杂,结构多复杂,只要有良好的函数封装,用到合适的设计模式,都能迎刃而解。通过本次实训,我的系统架构能力也有了一定的提升。同时要感谢老师的指导和解惑。参考文献1 严蔚敏 吴伟民著.数据结构(C语言版). 北京:清华大学出版社,2015.2 杜红燕 刘华富著.C语言程序设计教程.复旦大学出版社,2014.附 录 源代码/*-城市公交查询系统-*作者:胡辉衡 *学校:长沙学院 *功能:实现城市公交查询的基本功能 *实现技术:C语言及数据结构 *指导老师:钟旭 *完成时间 :2015年12月21日 -*/ #include #include#include #include#includestruct user/记录账号信息 int identity;/用户身份,值等于false时为普通用户,否则为管理员int userId;/用户编号char loginName40;/用户登录名char loginPassword20;/登录密码 struct user *next;/指向下一个用户信息的指针,便于建立链表 ;struct city/记录城市信息 int cityId;/城市编号 char cityName20;/城市名 struct city *next;/指向下一个城市信息的指针,便于建立链表 ;struct station /记录车站信息 int stationId;/车站编号char stationName20;/车站名称int cityId;/所属城市编号 struct station *next;/指向下一个站点信息的指针,便于建立链表 ;struct road /记录公交线路信息 int roadId;/公交线路编号char roadName20;/公交线路名称int cityId;/所属城市编号struct road *next;/指向下一个公交线路信息的指针,便于建立链表 ;struct relation/记录车站与公交线路之间的关系和站与站之间的信息 int stationId;/车站编号 int roadId;/公交线路编号int sep;/车站在此公交线路的序号int distance;/在此公交线路下这个车站到下一站的距离(单位:km) int time; /在此公交线路下这个车站到下一站所需要的时间(单位:min)int cityId;/所属城市编号struct relation *next;/指向下一个站点与线路映射信息的指针,便于建立链表 ;int g_cityId = 0;/记录当前城市编号的全局变量 int MainInterface();/主界面 struct user *Login();/登录函数 struct user *Register();/注册函数 struct user*FindPassword();/找回密码 void initialize();/初始化 int UserInterface(struct user* p);/用户界面int AdminInterface(struct user* p);/管理员界面 struct user*Logout(struct user* p);/注销函数 void LineManage();/线路管理函数 void SiteManage();/站点管理函数 void LineQuery();/线路查询函数 void SiteQuery();/站点查询函数 void SiteToSiteQuery();/站站查询函数 struct user*ChangePassword(struct user* p);/修改密码函数 void Inputpw(char *password,int len); /密码掩盖函数 void ChangeCity();/切换城市 void AddCity();/增加城市 void SiteAdd();/站点增加函数 void SiteChange();/站点修改函数void SiteDelete();/站点删除函数void SiteDeleteDeal(int stationId); /站点删除处理函数void LineAdd();/线路增加函数 void LineChange();/线路修改函数void LineDelete();/线路删除函数void LineInsertSite(int roadId);/插入站点形成公交线路 void LineDeleteSite(int roadId);/删除公交线路上所有的站点 void LineShow(int roadId);/显示公交线路上所有的公交站点 void SiteShow(int stationId);/显示经过公交站点所有的公交线路 void ShowAllWay(int start,int end);/显示从起点到终点两次换乘及以下的所有乘车方式 void graphFound();/将当前城市所有的公交线路和站点构成一张图void showRoadName(int roadId);/根据线路编号显示公交线路名 void showStationName(int stationId);/根据站点编号显示公交站点名 int main()struct user *p;int option;initialize();while(1)system(cls);option = MainInterface();switch(option)case 49:p = Login();break;case 50:p = Register();break;case 51:p = FindPassword();break;default:exit(-1);/printf(a);if(p = NULL)continue;else/printf(tt你的身份:);if(p-identity)while(p)/避免函数调用函数导致内存爆炸 b:option = AdminInterface(p);switch(option)case 49:LineManage();break;case 50:SiteManage();break;case 51:ChangeCity();break;case 52:AddCity();break;case 53:goto a;/*UserInterface(p)*/;break;case 54:p = Logout(p);break;default:exit(-1);elsewhile(p)/避免函数调用函数导致内存爆炸a:option = UserInterface(p);switch(option)case 49:LineQuery();break;case 50:SiteQuery();break;case 51:SiteToSiteQuery();break;case 52:ChangeCity();break;case 53:p = ChangePassword(p);break;case 54:if(p-identity)goto b;elsep = Logout(p);break;default:exit(-1);/system(pause);return 0;void SiteAdd()system(cls);printf(-站点增加界面-);FILE *fp;int i = 1;bool mark = false;int stationId,cityId;int stationIdMark = 0;/记录新建公交站点的编号(应大于所有已有的公交站点) char stationName20;struct station *head,*p,*q;head = (struct station*)malloc(sizeof(struct station);head-next = NULL;fp = fopen(station.txt,r);if(fp)while(!feof(fp)/产生链表 p = (struct station*)malloc(sizeof(struct station);p-next = NULL;fscanf(fp, %d %s %d,&p-stationId,p-stationName,&p-cityId);if(p-stationId stationIdMark)stationIdMark = p-stationId;p-next = head-next;head-next = p;/printf( %d %s %d,stationId,stationName,cityId);/*if(cityId = g_cityId)p-cityId = cityId;p-stationId = stationId;strcpy(p-stationName,stationName);p-next = head-next;head-next = p;*/p = head-next;printf(nn本城市已有的公交站点:n);/将本城市已有的公交站点全部显示出来 while(p != NULL)/printf(a);if(p-cityId = g_cityId)printf(%st,p-stationName);if(i%5 = 0)printf(n);i+; p = p-next; /*if(p = NULL)printf(nn本城市暂时还没有添加任何公交站点!n);elseprintf(nn本城市已有的公交站点:n);while(p != NULL)/printf(a);printf(t%s,p-stationName);if(i%5 = 0)printf(n);i+;p = p-next; */printf(nnn请输入你想要增加的公交站点名(输入0表示返回):);/对输入的公交站名做正确性验证 while(1)fflush(stdin);gets(stationName);if(!strcmp(stationName,0)/把输入0作为模块出口 break;p = head-next;mark = false;while(p != NULL)if(!strcmp(p-stationName,stationName) & p-cityId = g_cityId)mark = true;/表示公交站点已存在,不需要再添加 break;p = p-next;if(mark)printf(此公交站点已存在!请重新输入公交站点名(输入0表示返回):);else if(strlen(stationName) 20 | strlen(stationName) next = NULL;stationIdMark+; p-stationId = stationIdMark;p-cityId = g_cityId;strcpy(p-stationName,stationName);p-next = head-next;head-next = p;fclose(fp);fp = fopen(station.txt,w);if(fp)p = head-next;while(p != NULL)/更新公交站点文件信息 /printf(b);fprintf(fp, %d %s %d,p-stationId,p-stationName,p-cityId);head-next = head-next-next;free(p);/释放链表结点,节省内存 p = head-next;free(head);fclose(fp);elseprintf(文件city打开失败!);system(pause);return;elseprintf(nnnnntt文件station.txt打开失败!nnn);system(pause);return;/system(pause); void SiteChange()system(cls);printf(-站点修改界面-);FILE *fp;int i = 1;bool mark = false;int stationId,cityId;char stationName20;struct station *head,*p,*q;head = (struct station*)malloc(sizeof(struct station);head-next = NULL;fp = fopen(station.txt,r);if(fp)while(!feof(fp)/产生链表 p = (struct station*)malloc(sizeof(struct station);p-next = NULL;fscanf(fp, %d %s %d,&p-stationId,p-stationName,&p-cityId);p-next = head-next;head-next = p;p = head-next;printf(nn本城市已有的公交站点:n);/将本城市已有的公交站点全部显示出来 while(p != NULL)/printf(a);if(p-cityId = g_cityId)printf(%st,p-stationName);if(i%5 = 0)printf(n);i+; p = p-next; printf(nnn请输入你想要修改的公交站点名(输入0表示返回):);/对输入的公交站名做正确性验证 while(1)fflush(stdin);gets(stationName);if(!strcmp(stationName,0)/把输入0作为模块出口 break;p = head-next;mark = false;while(p != NULL)if(!strcmp(p-stationName,stationName) & p-cityId = g_cityId)mark = true;/表示公交站点已存在,可以修改 break;p = p-next;if(mark)break; else if(strlen(stationName) 20 | strlen(stationName) 20 | strlen(stationName) stationName,stationName);fclose(fp);fp = fopen(station.txt,w);if(fp)p = head-next;while(p != NULL)/更新公交站点文件信息 /printf(b);fprintf(fp, %d %s %d,p-stationId,p-stationName,p-cityId);head-next = head-next-next;free(p);/释放链表结点,节省内存 p = head-next;free(head);fclose(fp);elseprintf(文件city打开失败!);system(pause);return;elseprintf(nnnnntt文件station.txt打开失败!nnn);system(pause);return;/system(pause);void SiteDeleteDeal(int stationId) /站点删除处理函数/printf(n所有经过该站点的公交线路都将跳过该站点!n);/printf(%dn,stationId);FILE *fp,*fp2;int sep;struct relation *head,*p,*q;struct road *head2,*p2,*q2;fp = fopen(relation.txt,r);if(fp)head = (struct relation*)malloc(sizeof(struct relation);head-next = NULL;head2 = (struct road*)malloc(sizeof(struct road);head2-next = NULL;while(!feof(fp)p = (struct relation*)malloc(sizeof(struct relation);p-next = NULL;fscanf(fp, %d %d %d %d %d %d,&p-stationId,&p-roadId,&p-sep,&p-distance,&p-time,&p-cityId);if(p-stationId = stationId)p2 = (struct road*)malloc(sizeof(struct road);p2-next = NULL;p2-roadId = p-roadId;printf( %d ,p-roadId);strcpy(p2-roadName,);p2-next = head2-next;head2-next = p2;p-next = head-next;head-next = p;fclose(fp);p2 = head2-next;while(p2 != NULL)p = head-next;while(p != NULL)if(p-roadId = p2-roadId & p-stationId = stationId)sep = p-sep;/printf( %d n,sep);break;p = p-next;p = head-next;while(p != NULL)if(p-roadId = p2-roadId & p-sep sep)/printf(%d,p-sep);p-sep-;p = p-next;p2 = p2-next;q = head;p = head-next;while(p != NULL)if(p-stationId = stationId)q-next = q-next-next;free(p);p = q;q = p;p = p-next; fp2 = fopen(relation.txt,w);if(fp2)p = head-next;while(p != NULL)fprintf(fp, %d %d %d %d %d %d,p-stationId,p-roadId,p-sep,p-distance,p-time,p-cityId);p = p-next;fclose(fp2);elseprintf(nnnnntt文件station.txt打开失败!nnn);system(pause);return;p = head-next;while(p != NULL)head-next = head-next-next;free(p);p = head-next;free(head);p2 = head2-next;while(p2 != NULL)head2-next = head2-next-next;free(p2);p2 = head2-next;free(head2);elseprintf(nnnnntt文件station.txt打开失败!nnn);system(pause);return;/system(pause);void SiteDelete()system(cls);printf(-站点删除界面-);FILE *fp;int i = 1;char option;bool mark = false;int stationId,cityId;char stationName20;struct station *head,*p,*q;head = (struct station*)malloc(sizeof(struct station);head-next = NULL;fp = fopen(station.txt,r);if(fp)while(!feof(fp)/产生链表 p = (struct station*)malloc(sizeof(struct station);p-next = NULL;fscanf(fp, %d %s %d,&p-stationId,p-stationName,&p-cityId);p-next = head-next;head-next = p;p = head-next;printf(nn本城市已有的公交站点:n);/将本城市已有的公交站点全部显示出来 while(p != NULL)/printf(a);if(p-cityId = g_cityId)printf(%st,p-stationName);if(i%5 = 0)printf(n);i+; p = p-next; printf(nnn请输入你想要删除的公交站点名(输入0表示返回):);/对输入的公交站名做正确性验证 while(1)fflush(stdin);gets(stationName);if(!strcmp(stationName,0)/把输入0作为模块出口 return;q = head;p = head-next;mark = false;while(p != NULL)if(!strcmp(p-stationName,stationName) & p-cityId = g_cityId)mark = true;/表示公交站点已存在,可以删除 break;q = p;p = p-next;if(mark)break; else if(strlen(stationName) 20 | strlen(stationName) stationName);LineShow(p-stationId);printf(n删除该站后经过该站的公交线路都会跳过该站!);printf(n是否确定删除%s站(1.是 2.否):,p-stationName);while(1)fflush(stdin);option = getch();if(option = 49 | option = 50)break;elseprintf(n输入错误!请重新输入:);stationId = p-stationId;switch(option)case 49:SiteDeleteDeal(stationId);break;default:return;/printf(xx);q-next = q-next-next;free(p);/printf(yy);elsep = head-next;while(p != NULL)/更新公交站点文件信息 head-next = head-next-next;free(p);/释放链表结点,节省内存 p = head-next;free(head);fclose(fp);fp = fopen(station.txt,w);if(fp)p = head-next;while(p != NULL)/更新公交站点文件信息 /printf(b);fprintf(fp, %d %s %d,p-stationId,p-stationName,p-cityId);head-next = head-next-next;free(p);/释放链表结点,节省内存 p = head-next;free(head);fclose(fp);system(cls);printf(nnnnn%s站删除成功!nnnn,stationName);
展开阅读全文