长 沙 学 院
课程设计说明书
题系
(
部
目 )
城市公交查询软件 数学与计算机科学 软件工程(2014级4班)
胡辉衡 B[1**********] 钟 旭
2015.12.19—2015.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)
需求分析 系统设计 编码实现 系统测试 交付实施
注意事项
提交文档
长沙学院课程设计任务书 长沙学院课程设计论文 长沙学院课程设计鉴定表
(每学生1份) (每学生1份) (每学生1份)
指导教师签名: 日期: 教研室主任签名: 日期: 系主任签名: 日期:
长沙学院课程设计鉴定表
摘 要
随着我国城市公交系统发展和逐渐完善,市民的出行得到了极大的方便,但同时巨大的公交线路网让人们的选择也困难起来,本城市公交系统就是在此背景下进行设计的。本系统以用户为中心,界面简洁,结构简单,功能较为完善,可以满足市民出行的正常需要。系统分为两个部分,一是内部人员使用的管理员部分,这个部分的用来进行管理,包括站点管理,线路管理,城市管理和功能测试。二是一般用户使用的查询部分,这个部分的用来进行查询,包括站点查询,线路查询,站站查询,切换城市,修改密码。
关键词: 城市公交查询系统
目 录
摘 要 ................................................................................. 错误!未定义书签。 第1章 设计内容与要求 ................................................. 错误!未定义书签。
1.1课程名称 .................................................................................... 错误!未定义书签。 1.2设计要求 .................................................................................... 错误!未定义书签。
第2章 需求分析 ............................................................. 错误!未定义书签。
2.1功能模块 .................................................................................... 错误!未定义书签。 2.2设计环境 .................................................................................... 错误!未定义书签。
第3章 概要设计 ............................................................. 错误!未定义书签。
3.1功能结构 .................................................................................... 错误!未定义书签。 3.2系统流程图 ................................................................................ 错误!未定义书签。
第4章 详细设计 ............................................................. 错误!未定义书签。
4.1登陆注册模块 ............................................................................ 错误!未定义书签。 4.2 站点管理模块 ........................................................................... 错误!未定义书签。 4.3 线路管理模块 ........................................................................... 错误!未定义书签。 4.4城市管理模块 ............................................................................ 错误!未定义书签。 4.5 公交查询模块 ........................................................................... 错误!未定义书签。
第5章 测试 ..................................................................... 错误!未定义书签。
5.1 登陆注册模块测试 ................................................................... 错误!未定义书签。 5.2 站点管理模块测试 ................................................................... 错误!未定义书签。 5.3 线路管理模块测试 ................................................................... 错误!未定义书签。 5.4 城市管理模块测试 ................................................................... 错误!未定义书签。 5.5 公交查询模块测试 ................................................................... 错误!未定义书签。
总 结 ................................................................................. 错误!未定义书签。 参考文献 ............................................................................. 错误!未定义书签。 附 录 源代码 ................................................................... 错误!未定义书签。
第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.1功能结构
第3章 概要设计
3.2系统流程图
第4章 详细设计
11
4.1 登录注册模块
4.2 站点管理模块
4.1-1 注册
12
图
图4.2-1 增加站点
13
图4.2-2 删除站点
14
4.3 线路管理模块图4.2-3 修改站点
15
图4.3-1 增加路线
16
图4.3-2 删除线路
17
4.4 公交查询模块
图4.3-3 修改线路
18
图4.5-1 站点查询
19
图4.5-2线路查询
20
图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
#include
struct user //记录账号信息
{
int identity; //用户身份,值等于false时为普通用户,否则为管理员
int userId; //用户编号
char loginName[40]; //用户登录名
char loginPassword[20]; //登录密码
struct user *next; //指向下一个用户信息的指针,便于建立链表 };
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;
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("\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;
}
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"); } 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) && p->cityId == g_cityId){
mark = true; //表示公交站点已存在,不需要再添加
break;
}
p = p->next;
}
if(mark){
printf("此公交站点已存在!请重新输入公交站点名(输入0表示返回):"); }else if(strlen(stationName) > 20 || strlen(stationName)
printf("公交站点名长度不符合要求!请重新输入公交站点名(输入0表示返回):"); }else{
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");
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;
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)
printf("公交站点名长度不符合要求!请重新输入公交站点名(输入0表示返回):"); }else{
printf("此公交站点不存在!请重新输入公交站点名(输入0表示返回):"); }
}
if(strcmp(stationName,"0")){
printf("请输入新的公交站点名:");
while(1){
fflush(stdin);
gets(stationName);
if(strlen(stationName) > 20 || strlen(stationName)
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);
}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;
}
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{ 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;
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")){
模块出口
return;
}
//把输入0作为
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)
printf("公交站点名长度不符合要求!请重新输入公交站点名(输入0表示返回):"); }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");
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);
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)
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);
}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")){ //把输入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)
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);
}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)
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;
}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;
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)){