公交线路图


一. 设计要求:

1、需要用到多个文件,例如文本文件,文件名stations.txt,保存站点信息,格式可以自行设计,例如:编号 站名。等等

2、设计公交线路所需的存储结构,将文件中的数据读入内存。

3、提供用户操作的菜单和界面实现添加、删除、修改公交、站点、线路信息,注意数据间的关联性。

4、将修改后的信息保存回文件。

5、其他查询操作参见教程。


二. 设计内容:

1、 数据格式**:**

在这个课设中我设计的是两个文件,一个文件用来存放公交车站名的“stations.txt”,一个用来存放公交线路“bus.txt”。

(1)**“stations.txt”**文件的第一行,记录的为公交车站的数量,依次往下,为所存的公交车站名,其格式为:

① 公交车站数

② 公交车站名

③ 公交车站名

④ 公交车站名

(2)**“bus.txt****”**文件的第一行,记录的为公交车每个站之间有几条线路,就是一站算一条线路(例如:公交车从仙来广场到庆丰苑是走了一条线路,从仙来广场到金三角,就要先从仙来广场到庆丰苑,再从庆丰苑到金三角,这样看,是走了两条线路) 第二行开始记录公交名,公交车的一条线路的起点和终点,还有两站之间的距离,其格式为:

① 公交线路数量

② 公交车名 起始站 终点站 距离

③ 公交车名 起始站 终点站 距离

④ 公交车名 起始站 终点站 距离

…………………………
例如:
公交车名 起始站 终点站 距离
105 图书馆 人民政府 432
105 人民政府 万达广场 856
这就说明105路公交车,会经过图书馆–>人民广场–>万达广场。


2、 数据结构**:**

将文件中的数据读入内存,建立图的存储结构,,以下为存储结构的C语言定义:

typedef int StationsType;//StationsType 定义整形的变量

typedef struct TrafficNode

{

char name[MAX_STRING_NUM]; //公交号

int EndCity; //该有向边指向的顶点在数组中的位置,即该公交站编号

int Number ; //用于记录每站之间的距离

} TrafficNodeDat;

typedef struct VNode

{

StationsType stations;

int BusNum; // 标记下面 Bus 数组里元素个数

TrafficNodeDat Bus[MAX_TRAFFIC_NUM]; // 数组成员为结构体,记录了到达的终点站、距离、和公交号

} VNodeDat;

VNodeDat AdjList[MAX_VERTEX_NUM];


3、 查询公交线路:

当输入公交号后,就会输出公交线路的信息如下图:

4、 添加公交站:

输入公交站名存储成功后会输出Save OK

5、 删除公交站:

输入公交需要删除的公交站成功会提醒:

6、 添加公交线路:

输入所规定的起始,终点站,公交号和两站之间的距离:

7、 删除公交:

输入公交号删除成功则输出OK:


二. 系统子程序及功能设计**:**

int ShowMenu()

int SeekStations(char *name) // 寻找公交站

int SearchBus(char *name)// 查询公交站

int InsertStations(char *Name) // 添加公交站

int DelStations(char *Name) // 删除公交站

int SaveSysInfo() // 向程序输入数据

int InsertBus(char *bus, char *StartCity, char *EndStations, int number)//添加公交

int DelPath(char *name)// 删除公交

int InitSysData();


三.实验总结:

1. 在做课设的时候,起初我设计的是一个公交一次性输入许多路线,这样也十分的符合公交的特性,但是在做到最优路径的是吧,出现了大量的bug,于是我进行了查阅资料,于是我就改成了现在的这样,两站两站的输入信息和存储信息,只要起始站和终点站,这样设计。虽然这样麻烦许多,但是在设计的时候自己对于这种方法掌握的更快一点,于是终于设计出来了这个课设。

2. 这个课设还是有很大的完善空间,在继续最优路径搜索的时候,在某些情况下会出现无法输出的情况,在进行了测试后,发现对于一些不存在的公交站查询的时候,不会报错,同时在输出的时候,不是很人性化,同时该程序的一些地方写的代码十分的繁琐,从而影响了运行速度。这些都是在之后的学习中,需要改进和完善的地方。


四.程序代码**

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ERR 0
#define OK 1
#define Dij_MAXN 100
#define MAX_VERTEX_NUM 100
#define MAX_STRING_NUM 100
#define MAX_TRAFFIC_NUM 100const char StationsFile[] = "stations.txt";
const char BusFile[] = "bus.txt";
typedef int StationsType;//StationsType  定义整形的变量
typedef struct TrafficNode
{char name[MAX_STRING_NUM]; // 公交号  //MAX_STRING_NUM 最为 10int EndStations; // 该有向边指向的顶点在数组中的位置,即该公交站编号int Number ; // 用于记录每站之间的距离
} TrafficNodeDat;
typedef struct VNode
{StationsType stations;int BusNum; // 标记下面 Bus 数组里元素个数TrafficNodeDat Bus[MAX_TRAFFIC_NUM]; // 数组成员为结构体,记录了到达的终点站、距离0、和公交号
} VNodeDat;VNodeDat AdjList[MAX_VERTEX_NUM];
char StationsName[MAX_VERTEX_NUM][MAX_STRING_NUM]; // 公交站名,采用第一下标为该城市在本程序中的编号
int StationsNum; // 公交站数目int ShowMenu()
{printf("\n|****************** 欢迎使用城市交通系统 *******|\n");printf("\n|------------------1:  添加公交站 --------------|");printf("\n|------------------2:  删除公交线路 ------------|");printf("\n|------------------3:  添加交通路线 ------------|");printf("\n|------------------4:  删除公交 ----------------|");printf("\n|------------------5:  查询最短的路线 ----------|");printf("\n|------------------6:  查询公交线路 ------------|");printf("\n|------------------7:  清除屏幕 ----------------|");printf("\n|------------------0:  退出 --------------------|");printf("\n|***********************************************|\n");printf("\n 请输入你的选择 :");return 0;
}int SeekStations(char *name) // 寻找公交站
{int i;for (i = 0; i<StationsNum; i++){if (strcmp(name, StationsName[i]) == 0) // 比较函数,若相等,则返回 i 值{return i;}}return -1;
}int SaveSysInfo() // 向程序输入数据
{FILE *fp;int i, j, total;fp = fopen(StationsFile, "w"); // 打开 StationsFile 文档fprintf(fp, "%d\n", StationsNum); // 往文档中写公交站的数量for (i = 0; i<StationsNum; i++){fprintf(fp, "%s\n", StationsName[i]); // 往文档中写公交站的名字}fclose(fp);// 将 StationsFile 文档关闭total = 0;fp = fopen(BusFile, "w");// 打开 BusFile 文档for (i = 0; i<StationsNum; i++) // 计算公交的数量{total += AdjList[i].BusNum;}fprintf(fp, "%d\n", total); // 往文档中写公交的数量for (i = 0; i<StationsNum; i++) //{for (j = 0; j<AdjList[i].BusNum; j++) // 往文档中写公交的车次、始发站、终点站{fprintf(fp, "%s %s %s ", AdjList[i].Bus[j].name,StationsName[i],StationsName[AdjList[i].Bus[j].EndStations]);fprintf(fp, " %d\n", AdjList[i].Bus[j].Number);// 往文档中写}}fclose(fp);return 1;
}int InsertStations(char *Name) // 添加公交站
{strcpy(StationsName[StationsNum], Name);AdjList[StationsNum].stations = StationsNum;AdjList[StationsNum].BusNum = 0;StationsNum++;return 1;
}int DelStations(char *Name) // 删除公交站
{int stations, i, j,o=1,k=0;stations = SeekStations(Name);printf("%s",Name);while (true){while (strcmp(StationsName[k], Name) != 0){k++;}if (k > StationsNum){o--;printf(" 未找到此公交站,请重新输入! ");return 0;}for (i = stations; i < StationsNum - 1; i++){strcpy(StationsName[i], StationsName[i + 1]);AdjList[i].BusNum = AdjList[i + 1].BusNum;for (j = 0; j < AdjList[i].BusNum; j++){strcpy(AdjList[i].Bus[j].name, AdjList[i + 1].Bus[j].name);AdjList[i].Bus[j].EndStations = AdjList[i + 1].Bus[j].EndStations;AdjList[i].Bus[j].Number = AdjList[i + 1].Bus[j].Number;}}StationsNum--;}return 1;
}int InsertBus(char *bus, char *StartCity, char *EndStations, int number)//添加公交
{int i, j;i = SeekStations(StartCity);j = SeekStations(EndStations);AdjList[i].Bus[AdjList[i].BusNum].Number = number;AdjList[i].Bus[AdjList[i].BusNum].EndStations = j;strcpy(AdjList[i].Bus[AdjList[i].BusNum].name, bus);AdjList[i].BusNum++; // 公交的数加 1return 1;
}int DelPath(char *name)// 删除公交
{int i, j, flag = 0;for (i = 0; i<StationsNum; i++){for (j = 0; j<AdjList[i].BusNum; j++)if (strcmp(AdjList[i].Bus[j].name, name) == 0){flag = 1;break;}if (flag==0){for (; j<AdjList[i].BusNum - 1; j++) // 把删除的公交后的每个公交都前移一位{AdjList[i].Bus[j].Number = AdjList[i].Bus[j + 1].Number;AdjList[i].Bus[j].EndStations = AdjList[i].Bus[j + 1].EndStations;strcpy(AdjList[i].Bus[j].name, AdjList[i].Bus[j + 1].name);}AdjList[i].BusNum--;break;}}return 1;
}int InitSysData()
{FILE *fp;int i, j, num, number;char stmp1[MAX_STRING_NUM];char stmp2[MAX_STRING_NUM];char stmp3[MAX_STRING_NUM];fp = fopen(StationsFile, "r");if (!fp){printf("\nError:Cannot Open Stations File...\n");return -1;}fscanf(fp, "%d", &StationsNum);for (i = 0; i<StationsNum; i++){fscanf(fp, "%s", &StationsName[i]);AdjList[i].stations = i;AdjList[i].BusNum = 0;}fclose(fp);fp = fopen(BusFile, "r");if (!fp){printf("\nError:Cannot Open Bus File...\n");return -1;}fscanf(fp, "%d", &num);for (i = 0; i<num; i++){fscanf(fp, "%s", &stmp1); // 公交的车次fscanf(fp, "%s", &stmp2); // 公交的始发站fscanf(fp, "%s", &stmp3); // 公交的终点站j = SeekStations(stmp2);AdjList[j].Bus[AdjList[j].BusNum].EndStations = SeekStations(stmp3); // 将公交的车号、始发站、终点站读出strcpy(AdjList[j].Bus[AdjList[j].BusNum].name, stmp1);fscanf(fp, "%d", &number);AdjList[j].Bus[AdjList[j].BusNum].Number = number;AdjList[j].BusNum++;}fclose(fp);return 1;
}int SearchBus(char *name)// 查询公交站
{FILE *fp;int i, j, num, number;char stmp1[MAX_STRING_NUM];char stmp2[MAX_STRING_NUM];char stmp3[MAX_STRING_NUM];int stmp4;fp = fopen(BusFile, "r");if (!fp){printf("\nError:Cannot Open Bus File...\n");return -1;}fscanf(fp, "%d", &num);for (i = 0; i<num; i++){fscanf(fp, "%s", &stmp1); // 公交的车次fscanf(fp, "%s", &stmp2); // 公交的始发站fscanf(fp, "%s", &stmp3); // 公交的终点站fscanf(fp, "%d", &stmp4); // 公交站之间的距离if(strcmp(stmp1,name) == 0){printf("%s  %s  %s  %d\n" , stmp1 ,stmp2 ,stmp3 ,stmp4);}}fclose(fp);return 1;
}int main()
{char name[MAX_STRING_NUM]; // 公交站名char s_city[MAX_STRING_NUM]; // 始发站char e_city[MAX_STRING_NUM]; // 终点站int Command, number = 1;int startcity, endcity, traveltype = 0;while (true){printf("\n");ShowMenu(); // 主菜单scanf("%d", &Command);// 输入选择switch (Command) // 对菜单的内容进行选择{case 0: // 退出return 0;case 1: // 添加公交InitSysData(); // 读出文档中已存的信息printf("\n 输入公交站名 :");scanf("%s", &name); // 输入城市名InsertStations(name); // 将城市插入到数组中SaveSysInfo(); // 把公交的信息写入文档中printf(" Save OK!\n");break;case 2: // 删除公交站InitSysData(); // 读出文档中已有的信息printf("\n 输入公交站名 :");scanf("%s", &name);DelStations(name); // 将公交删除SaveSysInfo(); // 将处理过的信息写入文档中printf("Save OK!\n");break;case 3: // 添加路线InitSysData();printf(" 起始公交站名 :");scanf("%s", &s_city); // 起始站printf(" 终点公交站名 :");scanf("%s", &e_city); // 终点站printf(" 输入公交号  :");scanf("%s", &name);printf(" 距离 :");scanf("%d", &number);InsertBus(name, s_city, e_city, number);SaveSysInfo();printf(" Save OK!\n");break;case 4: // 删除公交InitSysData();printf(" 输入需要删除的公交车名 :");scanf("%s", &name);DelPath(name); // 将路线进行删除SaveSysInfo();printf("Save OK!\n");break;/*case 5: // 最小所坐站InitSysData();printf("\n 起始公交站 :");scanf("%s", &name);startcity = SeekStations(name);if (startcity<0){printf("Error station Name:No such station!\n");break;}printf(" 终点公交站 :");scanf("%s", &name);endcity = SeekStations(name);if (endcity<0){printf("Error station Name:No such station!\n");break;}//CalcMinNum(startcity, endcity, traveltype); // 计算最少的站数printf("\n");break;*/case 6:InitSysData();printf(" 输入公交号 :");scanf("%s", &name);SearchBus(name);break;case 7:system("cls");// 清除屏幕}}
}

最后:
在本课设中对于车站的输入大家要格外注意,因为个人水平的原因,使用这种方法更让我好理解和进行搜索,在之后的学习中,我会完善该课设,在之后的博客中会进行补充。
如需要完整代码可以点击下面的链接:
数据结构课设城市公交完整代码(c语言)

数据结构课设城市公交查询系统(C语言)相关推荐

  1. 数据结构课设城市公交完整代码(c语言)

    以下是城市公交的完整代码,如果需要实验报告的可以点击下面的链接: 数据结构课设城市公交查询系统(C语言) 代码如下: #include <stdio.h> #include <str ...

  2. 【C++期末大作业】数据结构课设 | 智能公交车查询系统

    补发一下老东西(未优化) 目录 设计具体内容: 功能模块图: 各模块流程图: 运行效果图: 源码: 设计具体内容: 应用相关数据结构及算法,设计并实现一个具有查询功能的城市公交查询系统.设计其信息数据 ...

  3. 城市公交查询系统c语言,城市公交查询系统城市公查询系统.doc

    城市公交查询系统城市公查询系统 /*----------------------城市公交查询系统-------------------------- *作者:胡辉衡 *学校:长沙学院 *功能:实现城市 ...

  4. 城市公交查询系统c语言,Android的城市公交查询系统

    随着国家大力发展公共交通,越来越多的人选择公交出行,如何才能快速准确地获得出行信息也成为了关注的问题.正在被大家使用的GPS和GIS等手段已经非常成熟,其中最主要的三大功能:站点查询,线路查询,公交换 ...

  5. 城市公交查询系统c语言,城市公交查询系统.doc

    #includestruct user//记录账号信息 { int identity;//用户身份,值等于false时为普通用户,否则为管理员 int userId;//用户编号 char login ...

  6. 基于JAVA的城市公交查询系统毕业论文(含源文件)

    获取项目源文件,学习交流联系Q:1225467431 摘要:公交查询系统是城市道路交通的重要组成部分,是城市发展的必然产物,是联系国民生活.社会生产和流通领域的关键环节.安阳城市公交查询系统的发展处于 ...

  7. C#毕业设计——基于C#+asp.net+sqlserver的城市公交查询系统设计与实现(毕业论文+程序源码)——城市公交查询系统

    基于C#+asp.net+sqlserver的城市公交查询系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C#+asp.net+sqlserver的城市公交查询系统设计与实现,文章末尾 ...

  8. java毕业设计——基于java+JSP+J2EE的城市公交查询系统设计与实现(毕业论文+程序源码)——城市公交查询系统

    基于java+JSP+J2EE的城市公交查询系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+JSP+J2EE的城市公交查询系统设计与实现,文章末尾附有本毕业设计的论文和源码下 ...

  9. 计算机毕业设计ssm基于Java的城市公交查询系统ac5p2系统+程序+源码+lw+远程部署

    计算机毕业设计ssm基于Java的城市公交查询系统ac5p2系统+程序+源码+lw+远程部署 计算机毕业设计ssm基于Java的城市公交查询系统ac5p2系统+程序+源码+lw+远程部署 本源码技术栈 ...

最新文章

  1. 每个人都应该懂点函数式编程
  2. 成田机场坐access到品川_关西机场交通攻略
  3. 后面第一个大于(51Nod-2500)
  4. 下载丨7月数据库技术通讯:LINUX OS配置问题导致数据库重启
  5. pandas读写csv
  6. 【论文写作】课程指导平台的开发中界面设计如何写
  7. 用友超客:社交化业务就是要化繁为简
  8. css3图片 变黑白 变模糊 调整饱和度等
  9. 编程零基础,如何学 Python ?
  10. 霍夫线变换,霍夫圆变换
  11. 快进来,详解MySQL游标
  12. 【企业信息化】信息化与企业信息化管理的相关概念及关系
  13. jacob更新word目录
  14. pr基本图形模板无法使用_Pr基本图形板块教程 Premiere Pro CC Essential Graphics
  15. 超级计算机燕 排名,第一卷 六年之前 HK171 舍弃的超级计算机燕? (485加更)
  16. 如何让用html制作404页面,网站404页面怎么做?
  17. 2019年北航计算机夏令营
  18. react 组件构建_为React构建星级评定组件
  19. 超级玛丽3号max即将停售70版本,到底保障如何,值不值得购买呢
  20. EtherCAT使用与解析-SII信息提取

热门文章

  1. 小型中文版聊天机器人
  2. 如何写出一篇优秀得csdn的文章?为什么要写作?有什么好处?(送给正在努力的你们)
  3. C# DirectoryInfo读取文件夹当前目录或所有子目录
  4. transform: rotate(1turn)
  5. THINKEY:区块链3.0时代的操作系统?|筱静观察
  6. DELL T620服务器硬盘坏,更换硬盘做RAID同步
  7. 想做休闲食品代理,不了解市场怎敢行动
  8. Qt 无法播放音频文件
  9. pages validateRequest=false/在.net4.0中无效的问题
  10. 调用DbHelperACE获取OleDbDataReader后手动关闭连接方法