C++公交查询系统报告.docx
- 文档编号:3274630
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:44
- 大小:171.05KB
C++公交查询系统报告.docx
《C++公交查询系统报告.docx》由会员分享,可在线阅读,更多相关《C++公交查询系统报告.docx(44页珍藏版)》请在冰点文库上搜索。
C++公交查询系统报告
题目:
公交查询系统
一、需求分析与任务定义
需求分析:
公交信息包括车辆信息与路线信息。
根据已知的的路线信息,要输出该路线所经过的所有站点信息;.根据输入的站点信息,输出经过该站点的所有公交路线信息;对于用户来说,任意输入两个站台,可以得出两站台之间的所有可实现到达的路线选择,即乘多少路在那个站点转乘另外一路。
任务定义:
实现本程序需要解决以下几个问题:
1.怎样实现对众多的线路与站点信息进行存储。
2.如何进行文本文件的读取。
3.怎样实现对按不同关键字的查找,其查找过程按何种算法比较节省空间是时间。
4.如何实现换乘问题中换乘中转站点的确定,和所乘路线。
问题的关键和难点在于节点信息的存储于查找。
设计要求:
a.节点信息使用结构体进行存储。
b.将所有节点信息保存在文本文件中。
c.能按不同关键字(路线、站点)进行查找。
d.设置一个返回返回查找到的特定站点节点在内存的地址station*u的函数e.换乘问题中采取调用查找函数的方法来找出中转站点。
二、数据结构的选择和概要设计
数据结构的选择:
对于公交信息的存取,定义结构体数据类型来表示公交站点。
以站点为主要节点信息进行存储,在站点前定义一个主参考路线,之后定义一个存储辅助路线的数组,在该数组中,如果经过该站点还有其他公交路线,就在数组中存储起来,反之就以-1来代替存储。
数据类型如下:
typedefstructnode//定义一个公交站点的数据类型
{
intmainline;//用于存储主线路
charstation_name[20];//用于存储站点名称
intline[MAX];//用于存储辅线路,即经过该站点的其他公交线路
structnode*forward,*next;//用双向链表存储该节点
}station;
typedefstructHead//定义一个存储所有公交线路头结点的数据类型
{
station*Line[400];
intlength;//记录所有公交线路的长度
}Headpoint;
概要设计:
定义双向链表存储上面定义的结构体节点。
建立好上面的链表以后,分别进行不同函数模块的设计;然后要在主函数中将个函数集结一体。
最后屏幕输出菜单指导操作。
流程图:
查找部分流程图:
1公交查询系统总流程图:
2公交站点查询程图:
3公交线路查询流程图:
4公交换乘方案流程图:
本程序中包含的函数及其性能:
charmenu()//用户菜单函数,返回值是字符型
Headpoint*f_duqu()//从文件中读出信息,返回读出信息在内存中的地址
voidzhandianchazhao()//站点查询函数;显示经过该站点的公交线路
voidxianluchazhao()//公交线路查询模块,查询某线路经过的公交站点
station*zhandianchazhao(Headpoint*H,charstation_name[20])
/*在公交信息中查找到特定的公交站点;公交信息在内存的地址和特定站点名称Headpoint*H,charstation_name[20];并返回查找到的特定站点节点在内存的地址station*u
*/
intgongzhandianchazhao(Headpoint*H,intline1,intline2,charstart[20],charend[20])
//查找公共站点
voidbuschange()//公交换乘函数
voidmain()//主函数
三、详细设计和编码
实现概要设计中定义的所有的数据类型,对每个操作给出相应的伪码算法
1.本程序所需用到的全局变量和相关数据类型的定义及其结点类型与指针类型。
#include"stdio.h"
#include"malloc.h"
#include"string.h"
#include"windows.h"
#include"conio.h"
#defineMAX20//MAX为辅助路线存储数组的最大存储空间
typedefstructnode//定义一个公交站点的数据类型
{
intmainline;//用于存储主线路
charstation_name[20];//用于存储站点名称
intline[MAX];//用于存储辅线路,即经过该站点的其他公交线路
structnode*forward,*next;//用双向链表存储该节点
}station;
typedefstructHead//定义一个存储所有公交线路头结点的数据类型
{
station*Line[400];
intlength;//记录所有公交线路的长度
}Headpoint;
2.从文件中读取信息,建立双向循环链表
为头指针H动态申请存储空间,H->length初始化为0,为站点L动态申请存储空间,其前后指针分别初始化为空,即L->forward=NULL;L->next=NULL;然后打开文件,同时动态申请站点s的存储空间,并循环进行读取赋值。
L->length循环记录路线的长度。
在函数的最后返回头指针H。
部分代码如下:
FILE*fp;
station*L,*s,*p,*u;
Headpoint*H;
H=(Headpoint*)malloc(sizeof(Headpoint));//为头指针动H态申请存储空间
H->length=0;
L=(station*)malloc(sizeof(station));//为站点
L->forward=NULL;
L->next=NULL;
p=L;
fp=fopen("bus_station.txt","r");//只读式打开文件
while(!
feof(fp)){
s=(station*)malloc(sizeof(station));
s->forward=NULL;
s->next=NULL;
fscanf(fp,"%d%s%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",&s->mainline,
&s->station_name,&s->line[0],&s->line[1],&s->line[2],
&s->line[3],&s->line[4],&s->line[5],&s->line[6],&s->line[7],
&s->line[8],&s->line[9],&s->line[10],&s->line[11],&s->line[12],
&s->line[13],&s->line[14],&s->line[15],&s->line[16],&s->line[17],
&s->line[18],&s->line[19]);
if(L->next==NULL){
H->Line[H->length]=L;
H->length++;//记录路线长度
}
elseif(p->mainline!
=s->mainline){
u=(station*)malloc(sizeof(station));
u->forward=NULL;
u->next=NULL;
L=u;
p=L;
H->Line[H->length]=L;
H->length++;
}
s->forward=p;
s->next=NULL;
p->next=s;
p=s;
}
fclose(fp);
returnH;
}
3.按路线查找所经过站点函数
使用顺序查找算法,依据路线关键字进行查找,输出所有的相关站点。
在循环体for(i=0;i
在flag=1的条件下将该节点的站点信息输出。
最后设置是否继续查找的控制while语句。
部分代码如下:
intline,i,flag=0;
Headpoint*H;
H=f_duqu();//从数据文件中读取公交车线路信息
station*p;
charch;
while
(1){
printf("请输入线路(如要查询1路输入1):
");//提示用户输入公交线路
fflush(stdin);
scanf("%d",&line);
if(H->length==0)
{
printf("系统中未存储任何公交线路信息!
\n");
}
else
{
for(i=0;i
{
p=H->Line[i]->next;
if(p->mainline==line)
{
flag=1;
break;
}
}
}
if(flag==0)
printf("无此线路!
\n");
else
{
printf("%d经过的站点是:
\n",line);
while(p!
=NULL)//显示公交线路经过的站点
{
if(p->next==NULL)
printf("%s",p->station_name);
else
printf("%s",p->station_name);
p=p->next;
}
}
printf("\n是否继续查找线路?
(Y/N)...");
fflush(stdin);
scanf("%c",&ch);
while(ch!
='Y'&&ch!
='y'&&ch!
='N'&&ch!
='n')
{
printf("输入选择错误,请重新输入...");
fflush(stdin);
scanf("%c",&ch);
}
if(ch=='n'||ch=='N')
break;
}
}
5.按站点查找所经过该站点的所有公交路线
使用顺序查找算法,依据站点关键字进行查找,输出所有的相关路线。
用gets(station_name)获取用户输入站点信息;在循环语句for(inti=0;i
p=h->Line[i]->next;当while(p!
=NULL);当if(strcmp(station_name,p->station_name)!
=0)记录该节点,同时设置变量flag=1。
在flag=1的条件下将该节点的路线信息输出。
输出循环语句:
for(intj=0;j if(u->line[j]! =-1)printf("%d\t",u->line[j]);} 最后设置是否继续查找的控制while语句。 在处理方法上类似按路线查找函数。 部分代码如下: voidzhandianchazhao() { station*p,*u; Headpoint*h; charch; h=f_duqu();//从数据文件中读取公交车线路信息 charstation_name[20]; intflag=0; while (1){ if(h->length==0){ printf("系统中未存储任何公交线路站点信息! \n"); return; } else { printf("请输入你要查找的站点: "); fflush(stdin);//清除文件缓冲区 gets(station_name);//获取用户输入站点信息 for(inti=0;i { p=h->Line[i]->next; while(p! =NULL) { if(strcmp(station_name,p->station_name)! =0)//包含在string.h,不匹配,继续查找下个节点 p=p->next; else { flag=1; u=p; break;//匹配即跳出 } } } } if(flag==1) { printf("经过“%s”站的公交线路有: \n",u->station_name); printf("%d\t",u->mainline); for(intj=0;j { if(u->line[j]! =-1) printf("%d\t",u->line[j]); else printf(""); } printf("\n"); } else printf("无此站点\n"); printf("\n是否继续查找? (Y/N)...: "); fflush(stdin); scanf("%c",&ch); while(ch! ='Y'&&ch! ='y'&&ch! ='N'&&ch! ='n') { printf("输入选择错误,请重新输入: "); fflush(stdin); scanf("%c",&ch); } if(ch=='n'||ch=='N') break; } 6.带有返回值的站点查找函数 在公交信息中查找到特定的公交站点;公交信息在内存的地址和特定站点名称Headpoint*H,charstation_name[20];并返回查找到的特定站点节点在内存的地址station*u。 这个函数在下面的公共站点的查询和换乘函数中具有调用。 部分代码如下: station*p,*u; intflag=0; for(inti=0;i { p=H->Line[i]->next; while(p! =NULL) { if(strcmp(station_name,p->station_name)! =0)//包含在string.h,不匹配,继续查找下个节点 p=p->next; else{flag=1;u=p;break;}//匹配即跳出 } } if(flag==1) { printf("经过站点: %s的公交线路有: \n",u->station_name); printf("%d\t",u->mainline); for(intj=0;j<10;j++) { if(u->line[j]! =-1) printf("%d\t",u->line[j]); else printf(""); } printf("\n"); } else { printf("无此站点,输入错误! \n"); buschange(); } returnu; } 7.公共站点查询函数 这个函数模块是为了在下面一个换乘问题中准备的。 对于输入的起始站与终点站,首先要考察分别在那些路线上,对于这些路线,是否有相同的,如果有即说明其不用换乘可以直达。 当不在同一路线上时,要分别对其经过的路线进行考察,看其中路线中是不是有相同的重复站点信息;如有就从该站点换乘。 函数中的控制语句如下: while(u! =NULL){ while(s! =NULL) {f(strcmp(u->station_name,s->station_name)! =0)如果匹配就记录。 部分代码如下: inti,flag=0,flag1=0; station*p,*q,*u,*u1,*s,*s1; for(i=0;i { p=H->Line[i]->next; if(line1==p->mainline) { u=p; } } for(i=0;i { q=H->Line[i]->next; if(line2==q->mainline) { s1=s=q; } } while(u! =NULL) { while(s! =NULL) { if(strcmp(u->station_name,s->station_name)! =0)//如果不匹配,继续查找下个节点 { s=s->next; } else { u1=s;flag=1; printf("\n从起始站点: %s乘坐%d路到%s后换乘%d路即可到达终止站点: %s\n",start,u->mainline,u->station_name,u1->mainline,end); returnflag; } } if(s==NULL){s=s1;} u=u->next; } 8.公交换乘函数 根据用户输入的两公交站点,给出可乘方法。 分别调用上述带有返回值的站点查询函数和公共站点查询函数。 要考虑其可以直接到达与换乘两种情况。 当换乘超过两次就无法实现。 部分代码如下: Headpoint*H; H=f_duqu();//从数据文件中读取公交车线路信息 station*p,*q; charstart[20],end[20],ch; intflag=0; while (1){ if(H->length==0){ printf("系统中未存储任何公交线路站点信息! \n"); return; } else { printf("请输入起始站点: "); fflush(stdin); gets(start);//输入起始站名信息 p=zhandianchazhao(H,start);//调用站点查询函数 fflush(stdin); printf("请输入终止站点: "); gets(end);//输入终点站名信息 q=zhandianchazhao(H,end);//调用站点查询函数 } printf("\n注意: 换乘次数大于2次以上,系统无法完成! \n\n"); inta[11],b[11],c[11];//分别记录两站点所经过的公交路线 a[0]=p->mainline,b[0]=q->mainline; for(inti=1;i<11;i++) { a[i]=p->line[i-1]; b[i]=q->line[i-1]; } intcount=-1; for(i=0;i<11&&a[i]! =-1;i++)//考察两站点是否同一路线上 for(intj=0;j<11&&b[j]! =-1;j++) if(a[i]==b[j])//两站点在同一路线上 { flag=1; count++; c[count]=a[i]; } if(flag) for(intk=0;k<=count;k++) printf("您可以通过乘坐%d路公交线路到达终点站: %s\n",c[k],end); else { intk=0; for(intm=0;m<11&&a[m]! =-1;m++)//当两站点不在同一路线上,调用查找公共站点函数 for(intn=0;n<11&&b[n]! =-1;n++) { k=gongzhandianchazhao(H,a[m],b[n],start,end); } if(! k) printf(""); } printf("\n是否继续查找线路? (Y/N)..."); fflush(stdin); scanf("%c",&ch); while(ch! ='Y'&&ch! ='y'&&ch! ='N'&&ch! ='n') { printf("输入选择错误,请重新输入..."); fflush(stdin); scanf("%c",&ch); } if(ch=='n'||ch=='N') break; } } 9.菜单函数 通过写printf语句输出一些简明的操作提示语句。 代码如下: charmenu()//用户菜单函数,返回值是字符型 { charchoice; printf("\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"); printf("\t欢迎使用公交查询系统\n\n"); printf("\t1公交线路查询\n\n"); printf("\t2公交站点查询\n\n"); printf("\t3公交站点换乘\n\n"); printf("\t4退出查询系统\n\n"); printf("\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"); printf("请选择操作: "); fflush(stdin); scanf("%c",&choice); while(choice! ='1'&&choice! ='2'&&choice! ='3'&&choice! ='4') { printf("无此功能,请重新选择: "); fflush(stdin); scanf("%c",&choice); } 10.主函数 将上面的所有函数有机的整合在一起,通过switch()语句分条实现这些函数,并让其与菜单提示语相匹配。 部分代码如下: for(;ch! ='4';)//ch='4'跳出死循环 { system("cls"); ch=menu(); switch(ch) { case'1': xianluchazhao();break;//调用路线查找函数 case'2': zhandianchazhao();break;//调用站点查询函数 case'3': buschange();break;//调用站点换乘函数 case'4': system("cls");//结束程序 printf("谢谢您的使用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 公交查询 系统 报告