城市公交车路线查询系统-

发布时间:   来源:文档文库   
字号:






II




城市公交查询软件
计算机工程与应用数学学院


(




实训任务书
课程名称:软件工程基础实训II 实训题目:城市公交查询软件
已知技术参数和设计要求:
1. 问题描述(功能要求)
1)用户管理
用户管理模块为用户提供用户信息管理的功能,包括用户注册、用户登陆、用户信息修改、用户密码修改、用户注销等功能。

用户注册:用户可以利用此功能完成注册,用户在界面输入注册信息,回车后,软件将注册信息保存到用户信息数据文件中。
用户登陆:用户可以利用此功能完成登陆,用户在界面输入登陆信息,回车后,软件验证登录信息,登陆成功后,软件进入主功能选择界面。
用户信息修改:用户可以利用此功能完成用户信息修改。 用户密码修改:用户可以利用此功能完成密码修改。
用户注销:用户可以利用此功能完成用户信息注销,某用户注销后,便不能再次登录。
2)线路管理
线路管理模块为用户提供公交线路数据的管理和维护,包括线路添加、线路修改、线路删除等功能。

线路添加:用户可以利用此功能增加一条线路。 线路修改:用户可以利用此功能修改一条线路。 线路删除:用户可以利用此功能删除一条线路。
3)站点管理
站点管理模块为用户提供公交站点数据的管理和维护,包括站点添加、站点修改、站点删除等功能。

站点添加:用户可以利用此功能增加一个站点。 站点修改:用户可以利用此功能修改一个站点。 站点删除:用户可以利用此功能删除一个站点。
4)公交查询
公交查询模块为用户提供公交信息查询的功能,包括站点查询、线路查询、站站查询、最短距离查询、最少换乘查询等功能。

站点查询:用户可以利用此功能查看某个站点所停靠的公交线路。


线路查询:用户可以利用此功能查看某条线路所路经的公交站点。
站站查询:用户可以利用此功能查询出发地和目的地之间的所有公交乘车方案。 最短距离查询:用户可以利用此功能查询出发地和目的地之间最短距离的公交乘车方案。 最少换乘查询:用户可以利用此功能查询出发地和目的地之间最少换乘的公交乘车方案。

2. 运行环境要求:
1)能在在Windows平台或Linux平台上运行。

3. 技术要求:
总体技术要求:
1)采用标准C语言实现;
2)运行结果正确,没有异常等报错; 3)界面友好,易于操作;
4)数据结构运用灵活,编码规范,设计合理。 各阶段具体要求: 第一阶段:需求分析阶段 1)写出需求分析(做什么) 2)要求问题分析和功能定义准确 第二阶段:系统设计阶段
1)根据问题描述,设计系统的结构 3)完成数据结构中各个函数的定义 4)用户界面的设计
5)要求数据结构定义合理,类层次结构清晰 第三阶段:编码实现阶段 1)完成代码编写 2)要求代码编写规范 第四阶段:系统测试阶段 1)完成功能调试
2)要求完成必要的测试工作 第五阶段:交付实施阶段 1)提交可正常执行的系统
2)提交系统需求说明书、设计说明书、程序代码 3)撰写实训报告书 4)要求规范地书写文档



实训工作量:
1)软件设计:完成问题陈述中所提到的所有需求功能。
2)实训说明书:要求撰写不少于3000个文字的文档,详细说明各阶段具体要求。
工作计划:
安排一周时间进行集中实训,软件开发步骤如下,1~2天完成12项目,3~5天完成35目,实训说明书同步进行;
1)需求分析 2)结构设计 3)编码实现 4)测试
5)撰写实训说明书并答辩
注意事项: 提交文档
长沙学院实训说明书(含实训任务书,每学生1份) 长沙学院实训鉴定表(纸质打印,每学生1份)




一、引言 ....................................................................................................................................................................... 1 1.1 编写目的 ............................................................................................................................................................ 1 二、需求规约 ............................................................................................................................................................... 1 2.1 问题描述 ............................................................................................................................................................ 1 2.2 需求分析 ............................................................................................................................................................ 1 三、程序设计 ............................................................................................................................................................... 3 3.1 概要设计 ............................................................................................................................................................ 3 3.2 详细设计 ............................................................................................................................................................ 4 3.3 数据结构设计 .................................................................................................................................................. 12 3.4 关键算法1 ....................................................................................................................................................... 13 四、运行测试 ............................................................................................................................................................. 14 4.1 运行环境搭建 .................................................................................................................................................. 14 4.2 测试数据说明 .................................................................................................................................................. 15 4.3 程序运行结果 .................................................................................................................................................. 16 五、总结 ..................................................................................................................................................................... 19 附录 ............................................................................................................................................................................. 19



一、引言
1.1 编写目的

本文档是“城市公交查询软件”的软件设计说明书,编写目的是:明确软件需求、概要设计、详细设计和功能测试用例,为软件后续开发和维护提供指导。本文档的读者对象是需求分析人员、系统设计人员、系统开发人员、系统测试人员。

1.2 参考资料
资料名称
《数据结构与算法(C语言版) 数据结构教程
严蔚敏 李春葆
作者
文件编号、版本 20099月第4 20073月第二版
二、需求规约
2.1 问题描述

随着我国城市公交系统发展和逐渐完善,市民的出行得到了极大的方便,但同时巨大的公交线路网让人们的选择也困难起来,本城市公交系统就是在此背景下进行设计的。本系统以用户为中心,界面简洁,结构简单,功能较为完善,可以满足市民出行的正常需要。系统分为两个部分,一是内部人员使用的管理员部分,这个部分的用来进行管理,包括站点管理,线路管理,城市管理和功能测试。二是一般用户使用的查询部分,这个部分的用来进行查询,包括站点查询,线路查询,站站查询,切换城市,修改密码。
2.2 需求分析

1)用户管理
用户管理模块为用户提供用户信息管理的功能,包括用户注册、用户登陆、用户信息修改、用户密码修改、用户注销等功能。

用户注册:用户可以利用此功能完成注册,用户在界面输入注册信息,回车后,软件将注册信息保存到用户信息数据文件中。
1


用户登陆:用户可以利用此功能完成登陆,用户在界面输入登陆信息,回车后,软件验证登录信息,登陆成功后,软件进入主功能选择界面。

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

线路添加:用户可以利用此功能增加一条线路。 线路修改:用户可以利用此功能修改一条线路。 线路删除:用户可以利用此功能删除一条线路。
3)站点管理
站点管理模块为用户提供公交站点数据的管理和维护,包括站点添加、站点修改、站点删除等功能。

站点添加:用户可以利用此功能增加一个站点。 站点修改:用户可以利用此功能修改一个站点。 站点删除:用户可以利用此功能删除一个站点。
4)公交查询
公交查询模块为用户提供公交信息查询的功能,包括站点查询、线路查询、站站查询、最短距离查询、最少换乘查询等功能。


站点查询:用户可以利用此功能查看某个站点所停靠的公交线路。 线路查询:用户可以利用此功能查看某条线路所路经的公交站点。
站站查询:用户可以利用此功能查询出发地和目的地之间的所有公交乘车方案。 最短距离查询:用户可以利用此功能查询出发地和目的地之间最短距离的公交乘车方案。 最少换乘查询:用户可以利用此功能查询出发地和目的地之间最少换乘的公交乘车方案。
2


三、程序设计
3.1 概要设计

初始界面管理员界面用户界面线

线
1)管理员模块:
进行线路管理,站点管理、城市管理和功能测试。 2)线路管理模块:
线路管理模块为用户提供公交线路数据的管理和维护,包括线路添加、线路修改、线路删除等功能。
3)站点管理模块:
站点管理模块为用户提供公交站点数据的管理和维护,包括站点添加、站点修改、站点删除等功能。
4)城市管理模块:
城市管理模块进行城市数据的管理和维护,包括城市添加、城市修改、城市删除等功能。 5)用户模块
用户模块方便用户进行线路查询、站点查询、站站查询、城市查询等功能。 6)线路查询模块:
用户可以利用此功能查看某条线路所路经的公交站点。 7)站点查询模块:
用户可以利用此功能查看某个站点所停靠的公交线路。 8)站站查询模块:
用户可以利用此功能查询出发地和目的地之间的所有公交乘车方案。
3


3.2 详细设计

1)登陆注册模块
开始输入新用户2)站点管理模块

名和密码
Y
是否已存在
N
保存新用户
结束
4


开始
选择要增加站点的
线路
输入站点名
Y
是否重复
N增加新站点保存站点信息
结束


5


开始
选择要删除站点的
线路选择要删除的站点Y该线路站点个数是否等于2N删除该站点保存信息
结束

6


3)线路管理模块开始选择线路
选择要改名的站点
输入修改名
Y
修改名是否已
存在修改名称保存信息
结束
7




开始
输入线路名
Y
是否为空N依次输入站点名Y
Y
是否重复N线路名是否存
N保存新增线路和站点信息
结束

8


开始
选择要删除的线路
N
是否删除
Y
删除所选线路的信
结束


9


4)查询模块开始选择要修改的线路
输入修改名
N名字是否变化YY修改名是否存
N修改名称保存新信息
结束
10





开始
输入站点名
Y
是否为空
N
N
是否存在
Y
查找经过该站点的n条线路依次显示这些线路所经过的
站点
结束

11


开始
输入线路名
Y是否为空N3.3 数据结构设计struct user { int identity; int userId; char loginName[40]; char loginPassword[20]; struct user *next; };

struct city{ int cityId; char cityName[20]; struct city *next; };

N
是否存在
Y
查询该线路所经过
的站点
依次显示这些
站点
结束

//记录账号信息

//用户身份,值等于false时为普通用户,否则为管理 //用户编号 //用户登录名 //登录密码



//指向下一个用户信息的指针,便于建立链表

//记录城市信息 //城市编号 //城市名

//指向下一个城市信息的指针,便于建立链表

12







struct station { int stationId; char stationName[20]; int cityId; struct station *next; };

struct road { int roadId; char roadName[20]; int cityId; struct road *next; };

struct relation{ 信息 int stationId; int roadId; int sep; int distance; km int time; (单位:min int cityId; struct relation *next; 链表 };








//记录车站信息

//车站编号 //车站名称 //所属城市编号

//指向下一个站点信息的指针,便于建立链表











//记录公交线路信息

//公交线路编号 //公交线路名称 //所属城市编号
//指向下一个公交线路信息的指针,便于建立链表











//记录车站与公交线路之间的关系和站与站之间的//车站编号 //公交线路编号
//车站在此公交线路的序号
//在此公交线路下这个车站到下一站的距离(单位://在此公交线路下这个车站到下一站所需要的时间//所属城市编号
//指向下一个站点与线路映射信息的指针,便于建立3.4 关键算法1
Dijkstra算法:
基本思想:设GV,E)是一个带权有向图,把图中的顶点集合V分成两组,第一组为已经求出的最短路径的顶点集合(用S表示,初始时S中只有一个原点,以后每求得一条最短路径就加入的集合S中,知道全部顶点都加入到集合中),第二组,为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点就如S中。如果两个顶点之间有权值,并且各个路径的权值不同,就把最小的作为顶点与顶点的最短距离,v0为起始顶点在邻接矩阵顶点数组中的下标,P为二维的布尔矩阵类型,矩阵P用来存储当前已经求得的所有最短路径,若P[v][w]true,w是当前求得的v0v最短路径上的顶点,D为整形数组类型,数组D用来存储从v0到所有顶点的带权路径长度,13

Dijkstra算法求有向网Gv0顶点到其余顶点v的最短路径p[v]及其带权路径长度D[v] 四、运行测试
4.1 运行环境搭建
DEV C++

开始输入起点v,终w调用弗洛伊德算法
输出最短路径

14
4.2 测试数据说明


15


4.3 程序运行结果



16




17




18



五、总结
本部分描述作者在进行本实训过程中的感悟、经验、教训等。
附录

#include #include #include #include
struct user
{










19

//记录账号信息 int identity; 则为管理员
int userId; char loginName[40]; char loginPassword[20]; struct user *next;

//用户身份,值等于false时为普通用户,否

//用户编号 //用户登录名 //登录密码 //指向下一个用户信息的指针,便于建立
链表 };
struct city{ int cityId; char cityName[20]; struct city *next;



链表 };
struct station


{ int stationId; char stationName[20]; int cityId; struct station *next;


链表 };
struct road



{ int roadId; char roadName[20]; 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;





//记录城市信息 //城市编号 //城市名
//指向下一个城市信息的指针,便于建立 //记录车站信息 //车站编号 //车站名称 //所属城市编号

//指向下一个站点信息的指针,便于建立 //记录公交线路信息 //公交线路编号 //公交线路名称 //所属城市编号


//指向下一个公交线路信息的指针,便于 //记录车站与公交线路之间的关系和站与站之 //车站编号 //公交线路编号
//车站在此公交线路的序号
//在此公交线路下这个车站到下一站的距离 //在此公交线路下这个车站到下一站所需要的 //所属城市编号

//指向下一个站点与线路映射信息的指针, //记录当前城市编号的全局变量 20
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;
21


}



default:exit(-1; } //printf("a"; if(p == NULL{ continue; }else{

//printf("\t\t你的身份:"; 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; } } }else{ while(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;
}else{ p = Logout(p;break;
} default:exit(-1; } } }
} //system("pause"; } return 0;
22

void SiteAdd({
system("cls"; printf("---------------------------------------------------"; FILE *fp;
int i = 1; bool mark = false; int stationId,cityId;


int stationIdMark = 0; //记录新建公交站点的编号(应大于所有已有的公交站点) char stationName[20]; 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("\n\n本城市已有的公交站点:\n"; //将本城市已有的公交站点全部显示出来 while(p != NULL{
//printf("a";
if(p->cityId == g_cityId{ printf("%s\t",p->stationName; if(i%5 == 0{ printf("\n";
}
23






i++;
} p = p->next; } /*if(p == NULL{ printf("\n\n本城市暂时还没有添加任何公交站点!\n"; }else{ printf("\n\n本城市已有的公交站点:\n";
while(p != NULL{
//printf("a"; printf("\t%s",p->stationName; if(i%5 == 0{ printf("\n"; i++;
} p = p->next; } } */
printf("\n\n\n请输入你想要增加的公交站点名(输入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 && g_cityId{ mark = true; 点已存在,不需要再添加 break;
} p = p->next;
} if(mark{













p->cityId
== //表示公交站 printf("此公交站点已存在!请重新输入公交站点名(输入0表示返回"; }else if(strlen(stationName > 20 || strlen(stationName < 4{
printf("公交站点名长度不符合要求!请重新输入公交站点名(输入0表示返回

";


}else{
24




break; } } //将新建的公交站点结点插入到链表中 if(strcmp(stationName,"0"{ p = (struct station*malloc(sizeof(struct station; p->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; }else{
//释放链表结点,节省内存
printf("文件'city'打开失败!"; system("pause"; return; }
}else{ printf("\n\n\n\n\n\t\t文件'station.txt'打开失败!\n\n\n"; system("pause"; return;
} //system("pause"; }
void SiteChange({
system("cls";
25


printf("---------------------------------------------------"; FILE *fp;
int i = 1; bool mark = false; int stationId,cityId;
char stationName[20];
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("\n\n本城市已有的公交站点:\n"; //将本城市已有的公交站点全部显示出来 while(p != NULL{
//printf("a";
if(p->cityId == g_cityId{ printf("%s\t",p->stationName; if(i%5 == 0{ printf("\n";
} i++;
} p = p->next; }
printf("\n\n\n请输入你想要修改的公交站点名(输入0表示返回"; //对输入的公交站名做正确性验证 while(1{
fflush(stdin;
gets(stationName;








// if(!strcmp(stationName,"0"{ 输入0作为模块出口 break;
} p = head->next;
mark = false;
26



while(p != NULL{ if(!strcmp(p->stationName,stationName g_cityId{ && p->cityId == mark = true; //表示公交站点已存在,可以修改 break;
} p = p->next;
} if(mark{
break; }else if(strlen(stationName > 20 || strlen(stationName < 4{ ";






printf("公交站点名长度不符合要求!请重新输入公交站点名(输入0表示返回}else{ printf("此公交站点不存在!请重新输入公交站点名(输入0表示返回"; } } if(strcmp(stationName,"0"{

printf("请输入新的公交站点名:"; while(1{
fflush(stdin; gets(stationName;

if(strlen(stationName > 20 || strlen(stationName < 4{ printf("公交站点名长度不符合要求!请重新输入新的公交站点名:"; }else{ break; }
} strcpy(p->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; //释放链表结点,节省内存
27
}

}else{ printf("文件'city'打开失败!"; system("pause"; return; }
}else{ printf("\n\n\n\n\n\t\t文件'station.txt'打开失败!\n\n\n"; system("pause"; return; } //system("pause"; void SiteDeleteDeal(int stationId{ //站点删除处理函数 //printf("\n所有经过该站点的公交线路都将跳过该站点!\n"; //printf("%d\n",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; }
28



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;
}else{
29


printf("\n\n\n\n\n\t\t文件'station.txt'打开失败!\n\n\n"; 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; }else{ printf("\n\n\n\n\n\t\t文件'station.txt'打开失败!\n\n\n"; system("pause"; return;
} //system("pause"; }
void SiteDelete({
system("cls"; printf("---------------------------------------------------"; FILE *fp; int i = 1;
char option; bool mark = false; int stationId,cityId;
char stationName[20];
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; 30




fscanf(fp," %d %s %d",&p->stationId,p->stationName,&p->cityId; p->next = head->next; head->next = p;
}
p = head->next; printf("\n\n本城市已有的公交站点:\n"; //将本城市已有的公交站点全部显示出来 while(p != NULL{
//printf("a";
if(p->cityId == g_cityId{ printf("%s\t",p->stationName; if(i%5 == 0{ printf("\n";
} i++;
} p = p->next; }
printf("\n\n\n请输入你想要删除的公交站点名(输入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 && g_cityId{ p->cityId == mark = true; //表示公交站点已存在,可以删除 break;
}
q = p; p = p->next;
} if(mark{
break; }else if(strlen(stationName > 20 || strlen(stationName < 4{
";

printf("公交站点名长度不符合要求!请重新输入公交站点名(输入0表示返回31





}else{ printf("此公交站点不存在!请重新输入公交站点名(输入0表示返回"; } } if(strcmp(stationName,"0"{ system("cls";

printf("经过%s站的公交线路有:",p->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;
}else{ printf("\n输入错误!请重新输入:"; }
} stationId = p->stationId;
switch(option{ case 49:SiteDeleteDeal(stationId;break; default:return;
}
//printf("xx"; q->next = q->next->next;
free(p; //printf("yy"; }else{
p = 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";

32






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("\n\n\n\n\n%s站删除成功!\n\n\n\n",stationName; system("pause"; }else{ printf("文件'city'打开失败!"; system("pause"; return; }
}else{ printf("\n\n\n\n\n\t\t文件'station.txt'打开失败!\n\n\n"; system("pause"; return;
} //system("pause"; }
void ChangeCity({
system("cls"; printf("\n-------------------------------------------\n\n\n\n\n";
FILE *fp; struct city *head,*p;
int i = 0; char cityName[20] = "长沙"; bool mark = false; 是否已收录 head = (struct city*malloc(sizeof(struct city; 市信息的链表
head->next = NULL; fp = fopen("city.txt","r"; if(fp{




//记录输入的城市
//建立存放城 printf("已收录的城市:\n"; //将文件中的数据读取到链表中 while(!feof(fp{

p = (struct city*malloc(sizeof(struct city;
p->next = NULL; fscanf(fp," %d %s",&p->cityId,p->cityName;
printf("\t%s",p->cityName;
33






}
i++; if(i%5 == 0{ printf("\n"; } p->next = head->next; head->next = p; printf("\n请输入你想要切换到的城市(输入0表示返回"; //对输入的城市名做验证 while(1{ fflush(stdin;
gets(cityName; if(!strcmp(cityName,"0"{ break;
} p = head->next;
mark = false;
while(p != NULL{ if(!strcmp(p->cityName,cityName{ mark = true; break;
} p = p->next;
} if(mark{
break; }else if(strlen(cityName > 20 || strlen(cityName < 4{

printf("城市名长度不符合要求!请重新输入城市名(输入0表示返回"; }else{ printf("此城市公交系统暂未收录!请重新输入城市名(输入0表示返回"; } } if(strcmp(cityName,"0"{ g_cityId = p->cityId;
}
p = head->next; //将记录当前城市的全局变量更改为要切换的城市 //将无用的链表进行释放 while(p != NULL{ fprintf(fp," %d %s",p->cityId,p->cityName; head->next = head->next->next; free(p; p = head->next; } free(head; fclose(fp;
//释放链表结点,节省内存
34

}else{ printf("文件'city'打开失败!"; system("pause"; return;
} //system("pause"; }
void AddCity({
system("cls"; printf("\n-------------------------------------------\n\n\n\n\n";
FILE *fp; struct city *head,*p; int i = 0;

char cityName[20] = "长沙"; //char a[5] = "0";





//用于标
// bool mark = false; 记城市名是否存在 head = (struct city*malloc(sizeof(struct city; 立存放城市信息的链表 head->next = NULL;
fp = fopen("city.txt","r"; if(fp{



printf("已收录的城市:\n"; while(!feof(fp{ p = (struct city*malloc(sizeof(struct city;
p->next = NULL;




// fscanf(fp," %d %s",&p->cityId,p->cityName; 文件中的信息取出放到链表中,便于操作 printf("\t%s",p->cityName;
i++; if(i%5 == 0{ printf("\n";
} p->next = head->next; head->next = p; }



printf("\n\n\n请输入你想要增加的城市名(输入0表示返回"; //对输入的城市名做正确性验证 while(1{ fflush(stdin; gets(cityName;
if(!strcmp(cityName,"0"{
35 //把输入

0作为模块出口 break;
} p = head->next;
mark = false;
while(p != NULL{ if(!strcmp(p->cityName,cityName{ mark = true; 收录,不需要再添加 break;
} p = p->next;
} if(mark{




}









//表示城市已 printf("此城市已存在!请重新输入城市名(输入0表示返回"; }else if(strlen(cityName > 20 || strlen(cityName < 4{ printf("城市名长度不符合要求!请重新输入城市名(输入0表示返回"; }else{ break; } //将新建的城市结点插入到链表中 if(strcmp(cityName,"0"{ p = (struct city*malloc(sizeof(struct city; p->next = NULL; p->cityId = i;
g_cityId = i; strcpy(p->cityName,cityName; p->next = head->next; head->next = p; } fclose(fp; fp = fopen("city.txt","w"; if(fp{
p = head->next; while(p != NULL{











//更新城市文 件信息


//printf("b"; fprintf(fp," %d %s",p->cityId,p->cityName; head->next = head->next->next;

//释放链表结点,节省内存
free(p; p = head->next; } free(head; fclose(fp; 36



}else{ printf("文件'city'打开失败!"; system("pause"; return; } }else{ printf("文件'city'打开失败!"; system("pause"; return;
} //system("pause"; }
struct user*ChangePassword(struct user* x{
system("cls"; struct user *p,*q,*head; char password1[20]; char password2[20]; FILE *fp; bool mark;

head = (struct user*malloc(sizeof(struct user; //申请头结点 head->next = NULL; printf("\n------------------------修改密码页面--------------------------\n\n\n\n\n";


printf("请输入新密码:"; //密码验证 while(1{
fflush(stdin; //gets(p->loginPassword; Inputpw(password1,20;

//对密码进行验证 if(strlen(password1 > 20{ printf("\n密码过长!请重新输入密码:"; }else if(strlen(password1 < 6{ printf("\n密码过短!请重新输入密码:"; }else{ if(!strcmp(password1,x->loginPassword{

printf("\n不能与原密码相同!请重新输入密码:"; }else{

printf("\n请再次输入密码:"; fflush(stdin; //gets(password; Inputpw(password2,20; if(!strcmp(password1,password2{ break;

37



}else{ printf("\n两次输入的密码不一致!请重新输入密码:"; } } } } fp = fopen("user.txt","r"; if(fp{ //将用户数据读出存入链表进行操作
while(!feof(fp{ q = (struct user*malloc(sizeof(struct user; q->next = NULL;

fscanf(fp," %d %d %s %s",&q->identity,&q->userId,q->loginName,q->loginPassword;

//printf("%d %d %s %s",q->identity,q->userId,q->loginName,q->loginPassword; q->next = head->next; head->next = q; }

q = head->next; //遍历链表,找到属于本用户的结点,对数据进行修改
while(q != NULL{ if((!strcmp(x->loginName,q->loginName && !(strcmp(x->loginPassword,q->loginPassword{
mark = true; strcpy(q->loginPassword,password1; system("cls";



printf("修改密码成功!"; system("pause"; break;
} q = q->next;
}
fp = fopen("user.txt","w"; //更新用户数据信息
if(fp{ p = head->next; while(p != NULL{

fprintf(fp," %d %d %s %s",p->identity,p->userId,p->loginName,p->loginPassword;
x = p;
p = p->next;
38







if(x != q



//释放链表结点,节省内存 free(x;
} fclose(fp; }else{ //意外处理 printf("文件'user.txt'打开失败!"; system("pause"; return NULL; } if(mark{ return q; }else{
system("cls"; printf("修改密码成功!"; system("pause"; return NULL; } }else{ printf("文件'user.txt'打开失败!"; system("pause"; exit(-1;
} system("pause"; }
struct user*Register({

//printf("注册中···"; system("cls"; printf("\n-----------------------------用户注册页面-----------------------------\n\n\n\n\n"; struct user *p,*q,*x; struct user *head;
bool mark; char password[20];
FILE *fp;
int userId = 0; head = (struct user*malloc(sizeof(struct user; //建头结点,将用户数据全部取出存入到链表中,便于操作
head->next = NULL; fp = fopen("user.txt","r";
if(fp{ while(!feof(fp{




if(userId == 0{

39 //头结点存设定好的管理员信息
fscanf(fp," %d %d %s %s",&head->identity,&head->userId,head->loginName,head->loginPassword;
head->identity = 1;
strcpy(head->loginName,"admin"; strcpy(head->loginPassword,"123456789"; head->userId = 0;
}else{ q = (struct user*malloc(sizeof(struct user; q->next = NULL;
fscanf(fp," %d %d %s %s",&q->identity,&q->userId,q->loginName,q->loginPassword;
//printf("%d %d %s %s",q->identity,q->userId,q->loginName,q->loginPassword; q->next = head->next; head->next = q;
} userId++; 户的编号 }


// 记录用户账号的总数,作为新建用

p = (struct user*malloc(sizeof(struct user; //存储新用户信息的结点 printf("请输入用户名:"; while(1{
fflush(stdin;
gets(p->loginName; //printf("%s",p->loginName; q = head;

//用户名验证 if(strlen(p->loginName < 4{ printf("\n用户名过短!请重新输入:";
continue; }else if(strlen(p->loginName > 40{ printf("\n用户名过长!请重新输入:"; continue; }else{ while(q != NULL{
mark = false; if(!strcmp(q->loginName,p->loginName{

mark = true; break; } q = q->next; } if(mark{



//标记用户名已存在 40





}
} printf("\n用户名已存在!请重新输入:"; }else{ break;
} printf("请输入登录密码:"; //密码验证 while(1{
fflush(stdin;
//gets(p->loginPassword;
Inputpw(p->loginPassword,20; if(strlen(p->loginPassword > 20{
} printf("\n密码过长!请重新输入密码:"; }else if(strlen(p->loginPassword < 6{ printf("\n密码过短!请重新输入密码:"; }else{

printf("\n请再次输入密码:"; fflush(stdin; //gets(password; Inputpw(password,20; if(!strcmp(p->loginPassword,password{ break;
}else{ printf("\n两次输入的密码不一致!请重新输入密码:"; }
}





//记录编号 //标志注册的为普通用户
//将新注册的用户信息结点插入到用p->userId = userId; p->identity = 0;
p->next = head->next;


head->next = p; 户信息的链表中
fclose(fp; //更新记录用户数据的文件 fp = fopen("user.txt","w";
if(fp{
q = head; while(q != NULL{

fprintf(fp," %d %d %s %s",q->identity,q->userId,q->loginName,q->loginPassword;
x = q;
q = q->next;
41









if(x != p



//释放链表结点,节省内存 free(x;
} fclose(fp; }else{ }
}else{ //意外处理 printf("文件'user.txt'打开失败!"; system("pause"; return NULL; //意外处理
printf("文件'user.txt'打开失败!"; system("pause"; return NULL;
} return p; }
void Inputpw(char *password,int len { int i=0; char ch;

fflush(stdin; //清洗流,以防妨碍密码正确输入 for ( ch = getch(; ch!=13;ch = getch( //若用户输入回车则结束密码输入
{ if (i>=len

continue; if ( ch == '\b' {

if ( i > 0
{







//如果已到达len指定的长度 //若用户按了退格键 //如果已显示星数不为0 //退一个格
//password[i-1]的值改为'\0', 已显示星 printf("\b"; password[--i]='\0'; 数减一,数组索引值减一 }



putchar(0; printf("\b"; continue ; } if(!isgraph(ch continue; printf("*";








//显示空字符 //退一个格


42 //密码只能为ASCII码值为32-127的字符 //上述情况都不是则显示一个星


password[i++]=ch; 加一,数组索引值加一
} password[i] = '\0'; }
struct user*FindPassword({
system("cls"; //ch赋给password[i],已显示星数 //设置结尾的空字符
printf("\n请致电183****9338"; system("pause"; return NULL; }
struct user *Logout(struct user *p{
system("cls"; printf("\n\n\n\n\n\n\t\t\t\t注销中\n\n\n";
free(p; system("pause"; return NULL; }
void LineManage({ char option;
while(1{
system("cls"; printf("\n------------------------线路管理页面--------------------------\n\n\n\n\n";



printf("\n\t\t1.线路增加\t2.线路修改\n"; printf("\n\t\t3.线路删除\t4.返回\n\n"; printf("\n\n\n\n\t请输入你要进行的操作:"; while(1{ fflush(stdin; //刷新输入流 option = getch(; printf("%c\n",option; if(option < 49 || option > 52{ //做输入检测,防恶意操 printf("\t输入有误!请重新输入:";
}else{ break; } } if(option == 52{ break;
} switch(option{
43


case 49:LineAdd(;break; case 50:LineChange(;break; case 51:LineDelete(;break; default:break; } } }
void SiteManage({ char option;
while(1{
system("cls"; printf("\n------------------------站点管理页面--------------------------\n\n\n\n\n";



printf("\n\t\t1.站点增加\t2.站点修改\n"; printf("\n\t\t3.站点删除\t4.返回\n\n"; printf("\n\n\n\n\t请输入你要进行的操作:"; while(1{ fflush(stdin; //刷新输入流 option = getch(; printf("%c\n",option; if(option < 49 || option > 52{ //做输入检测,防恶意操 printf("\t输入有误!请重新输入:";
}else{ break; } } if(option == 52{ break;
} switch(option{ case 49:SiteAdd(;break; case 50:SiteChange(;break; case 51:SiteDelete(;break; default:break;
} //system("pause"; //break; } }
void initialize({
FILE *fp1,*fp2,*fp3,*fp4,*fp5;
if(!(fp1 = fopen("user.txt","r"{
44


fp1=fopen("user.txt","w";
} if(!(fp2 = fopen("station.txt","r"{ fp2=fopen("station.txt","w"; /*fprintf(fp2," %d %s %d",0,"长沙火车站",0;*/
} if(!(fp3 = fopen("road.txt","r"{ fp3=fopen("road.txt","w"; /*fprintf(fp3," %d %s %d",0,"1",0;*/
} if(!(fp4 = fopen("relation.txt","r"{ fp4=fopen("relation.txt","w";
} if(!(fp5 = fopen("city.txt","r"{ fp5=fopen("city.txt","w"; /*fprintf(fp5," %d %s",0,"长沙";*/
} fclose(fp1; fclose(fp2; fclose(fp3; fclose(fp4; fclose(fp5; }
int MainInterface({ char option;
system("cls"; printf("\n------------------------欢迎使用城市公交查询系统----------------------------\n\n\n\n\n"; printf("\t\t\t1.登录\t\t2.注册\n"; printf("\t\t\t3.找回密码\t4.退出\n\n\n\n"; printf("\t请选择你要进行的操作:"; //对用户输入的数据做容错处理
while(1{ fflush(stdin; //刷新输入流 option = getch(; printf("%c\n",option; if(option < 49 || option > 52{ //做输入检测,防恶意操作 printf("\t输入有误!请重新输入:"; }else{ break; } } 45

本文来源:https://www.2haoxitong.net/k/doc/2bd9daefcebff121dd36a32d7375a417876fc11b.html

《城市公交车路线查询系统-.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式