目录
设计一个公交线路管理系统,为乘客提供各种信息查询服务。系统中处理的道路信息和公交线路信息保存在文件busline.txt 中,系统执行时所处理的数据要对此文件分别进行读写操作。整个系统由前台服务和后台管理两个子系统组成。
后台管理具体功能包括:
(1)公交站点的增加:能根据需要增加公交站点。
(2)道路信息的增加:能根据需要增加道路信息。
(3)公交线路的增加:能根据需要增加新的公交线路信息。
(4)公交线路的删除:能根据需要删除已有的公交线路信息。
前台服务具体功能包括:
(1)公交线路信息查询:输入线路号,输出该线路所有站点。
(2)乘车线路方案查询:输入起点站和终点站,输出两站点之间所有乘车方案。
(3)乘车线路最优查询:输入起点站和终点站,输出两站点之间乘车时间(或距离)最短的乘车方案。
第2章 需求分析
本系统主要功能是实现对公交路线的管理和维护。我们都知道,每个城市都会有公交路线的改动,如果使用这个系统,就可以及时的对路线信息进行修改和保存,是非常方便的,而且该系统使用起来也很方便。用户只需根据显示的提示信息进行选择和输入就可以实现你要求的功能。该系统具有录入,查询,删除,修改和显示所有记录的功能。用户可以根据实际情况进行相应的功能选择。其具体功能简单描述如下:
(1)保存:即将信息存入指定文件中。当用户对原始数据进行相关的改动(主要是对路线信息进行增加、删除、修改)之后,用户可以根据自己的选择判断是否要保存到文件中,这样就实现了信息的记录功能,以方便用户随时进行查看。
(2)录入:即录入一条新的公交路线或者是某一条路线上的站点。每次可以录入一条路线信息,若用户想录入多条路线信息的话可以重复执行该功能,同样的,录入站点的话也是每一次录入一个站点,若用户想录入多条路线信息的话也只需要重复执行该功能即可。这样,就实现了对公交路线的录入信息管理。
(3)查询:即能够查找出你要的公交路线信息和总共有多少站。简单地说,就是用户先选择你要查询的公交路线号,在输入起点站和终点站名称,然后系统就会自动显示出起点站和终点站之间共有多少站点,以及起点站和终点站之间所有站点的序号和名称,从而使用户一目了然的知道站点信息,而不需要像看地图那样一个站点一个站点的用肉眼进行查找,这就为用户节省了很多时间。
(4)删除:即能删除掉一条你所不需要的公交路线信息和某一条路线上的站点。若要删除路线时只需要输入你要删除的公交路线号即可,若要删除站点也只需输入你要删除的站点序号,不需要输入该站点名称。
(5)修改:即能修改一条你需要该的路线信息。修改内容包括:修改该条公交路线号、修改站点名称(输入新的信息时该条路线的站点长度不能改变,若要改变站点长促可以选择增加和删除功能,即可实现)。
(6)显示路线信息:即将路线信息显示到屏幕中,供用户查看。该功能比较简单,在这里不具体说明。
第3章 算法设计
3.1 设计思想
本系统的设计流程简单比较简单,原始数据全部都保存在文件中,用户就不必自己一个一个的输入信息。程序执行时从文件中读出,文件的读取操作在下文中我会详细说明,这里就不做具体说明了。创建动态链表和结构体数组对路线信息进行存储,因为使用链表时对程序的插入、删除会比较方便,那么插入和删除就相当于对链表节点的删除和插入。写无返回值的主函数 void main()对系统的功能进行显示,每次用户选择某一功能时都可以看到路线的大致信息,以便于用户更准确的选择功能。其中利用switch 条件分支语句进行子函数功能的选择和调用。并且使用while循环语句进行多次循环执行,就可以实现对信息的多次删除、增加、修改,知道达到用户满意时由用户自己选择退出系统。通同时使用了清屏函数,对上一次程序运行的结果清楚只显示本次运行的相关信息,这样的话就做到了界面的友好化,简单明了,不冗杂,更方便观看。当用户对信息进行有关的改动之后,用户根据自己的选择是否保存入文件中,就可以保存他所要的信息了。
其主要流程图如下:
3.2 设计表示
下面我将对各个子模块的功能进行详细的介绍和描述:
公交车信息:路线编号,司机姓名,途经站台总数,第一个站台名称到最最后一个站台名称,公交车的起始时间和终止时间,票价。
模块一:头文件,函数声明,定义结构体,各个子函数的定义,以便主函数能够直接调用实现其功能。
模块二:菜单显示。显示该系统所能完成的功能,一目了然。根据用户的需求自由选择功能实现。
模块三:从文件中读取信息。执行此程序时首先定义文件指针FILE *fp,在打开此文件时,若没有该文件,则显示文件打开失败,然后会自动创建一个新文件。当文本文档里已经有用户需要的数据,就可以从文件中正确读取出来,若文件打开不成功则会显示“文件打开失败!”。读取结束后必须要关闭文件,即 fclose(fp),这样就完成了从文件中读取信息的功能。
模块四:显示路线信息。该功能以子函数的形式给出,无返回值。当你选择信息显示功能时,你会进入公交车信息库,然后你就可以查看到所有的公交车信息。
模块五:录入线路信息。输入路线编号,司机姓名,途经站台总数,第一个站台名称到最最后一个站台名称,公交车的起始时间和终止时间,再输入票价,创建成功,保存公交车信息。
模块六:删除线路信息。选择该功能后,再输入你需要删除的路线编号,若没有该条路线编号,则显示未找到该路线编号,若有,则显示已找到。再输入1,就将你需要删除的公交车信息删除了。
模块七:修改线路信息。进入之后输入需要修改的公交车路线编号,然后出现一个修改菜单:1.修改路线编号 2.修改车辆信息 3.修改行车路线 4.修改行车时间 5.返回到主菜单。选择1,输入新的路线编号,保存公交车信息。选择2,输入新的司机姓名和单程票价,保存公交车信息。选择3,输入新的行车路线,保存公交车信息。选择4,输入新的行车时间,保存公交车信息。
模块八:查询路线信息。该子函数是一个无返回值的函数。使用时会出现一个查询菜单:1.路线导航查询 2.路线编号查询 3.站台信息查询 4.返回到主菜单。选择1,输入你所在的站点和要前往的站点,便会显示出所有含这两个站点的公交车信息。选择2,输入你要查找的公交路线编号,便会显示出该编号的公交车信息。选择3,输入你要查询的途经站台名称,便会显示出所有经过这个站台的公交车信息。
模块九:将公交车信息保存到文件中。当用户对原始路线信息进行改动之后,或许要将修改过后的信息保存起来,此时用户就可以自己选择是否要将信息保存起来,保存的位置是本系统实现设定好的,保存之后的信息在C:\Program Files (x86)\Microsoft Visual Studio\works\Debug\bus.txt目录下,也方便用户的查看。
模块十:主函数。构建无返回值的主函数,主函数用来实现对子模块的调用功能,用while循环语句来控制循环次数,用户可以根据自己的需求选择任何时候退出系统。对子模块的调用主要使用switch开关控制语句,根据选择实现用户要求的功能。
实现注释:
本系统对于菜单显示表上的功能基本上都能实现,但是不是很完善,很多地方我还没有考虑到,或许是考虑的不够周全,但是有些不足的地方,是我的能力所不能达到的,还望老师体谅,不过等以后学过新的知识用新的方法或许就能将系统做进一步的改进。
算法设计中一些新的想法:
我觉得本系统很不完善,很多功能虽然能实现,但是实现的不够完美,很多细节我都没有考虑到,比如查询路线时,不能大致故略出起点站和终点站需要的时间;修改路线信息时,重新输入该条路线的信息时,路线上站点的个数不能改变,要改变的话还得选择增加或删除功能;还有就是用户将改动过后的信息保存到文件中后,以后该文件中的数据用户如果要使用的话,不能从文件中读取显示到屏幕上。这些都是我的系统一些不完善的地方,希望以后有能力的时候,能进一步对系统进行修改和完善。
- 系统调试及测试(含代码)
4.1 功能截图
主菜单:
信息录入:
信息显示:
信息修改:
信息删除:
信息查询:
4.2 实现代码
/**************************头文件声明************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**************************函数声明************************************/
void init(); //初始化函数
void add(); //信息录入函数
void view(); //信息显示函数
void mod(); //信息修改函数
void modmeun(); //修改菜单
void modnavimeun(); //路线修改菜单
void del(); //信息删除函数
void find(); //信息查询函数
void findmeun(); //查询菜单
void findnavi(); //路线导航查询函数
void findnum(); //路线编号查询函数
void findstameun(); //站台信息查询菜单
void findsta(); //站台信息查询函数
void save(); //信息保存函数
void mainmeun(); //主菜单
char Test(char a,char b,char c); //菜单输入检测函数
/**************************宏定义声明************************************/
#define N 100 //公交车数量
/**************************结构体定义************************************/
struct station //途径站点信息
{
char c[20]; //站点名称
};
struct bus //公交车信息
{
char num[20]; //公交车路线编号
char name[20]; //司机姓名
int n; //站台数目
struct station b[12]; //站台名称
char topen[20]; //起始时间
char tclose[20]; //终止时间
int money; //票价
}a[N];
/**************************子函数定义************************************/
void init() //初始化函数
{
FILE *fp; //文件指针
int i;
if((fp=fopen("bus.txt","r+"))==NULL) //初次尝试打开"bus.txt"文本文件
{
printf("\n\t\t文件打开失败\n\n\t\t正在尝试创建新文件...\n");
fp=fopen("bus.txt","w"); //创建"bus.txt"文本文件
if((fp=fopen("bus.txt","r+"))==NULL) //再次判断是否打开成功
{
printf("\t\t文件创建失败!!!\n");
return;
}
}
fp=fopen("bus.txt","r+");
for(i=0;i<N;i++) //将磁盘中的信息输出到内存中
if(fread(&a[i],sizeof(struct bus),1,fp)!=1)
break;
fclose(fp);
printf("\n\t\t初始化完成!!!\n\n");
return;
}
void add() //信息录入函数
{
FILE *fp=NULL; //文件指针
int i,j;
char cc[20];
for(i=0;i<N;i++)
{
if(*a[i].num!='\0')
continue;
else
{
printf("\n添加第%d辆公交车路线记录:\n",i+1);
printf("\n请输入路线编码(3位编码,第一位为大写字母,后两位为数字):\n"); //路线编码
scanf("%s",cc);
for(j=0;j<N;j++) //检验是否重复
if(strcmp(a[j].num,cc)==0)
{
printf("\n与已有路线编码重复,按回车键返回!!!\n");
fflush(stdin); //清除键盘缓冲区
getchar();
system("cls");
return;
}
strcpy(a[i].num,cc);
printf("\n请输入司机姓名: "); //司机姓名
scanf("%s",a[i].name);
printf("\n请输入途经站台总数(>=2): "); //站台总数
scanf("%d",&a[i].n);
printf("\n");
if(a[i].n<2||a[i].n>12)
{
while(a[i].n<2||a[i].n>12)
{
printf("\n站台总数应满足(2<=n<=12),请重新输入: ");
scanf("%d",&a[i].n);
printf("\n");
}
}
for(j=0;j<a[i].n;j++)
{
printf("请输入第%d个站台名称: ",j+1); //站台名称
scanf("%s",a[i].b[j].c);
}
printf("\n自动生成公交路线:(1) %s",a[i].b[0].c);
for(j=1;j<a[i].n;j++)
{
printf(" ----> (%d) %s",j+1,a[i].b[j].c);
}
printf("\n\n请输入公交车的起始时间(格式为:时:分): "); //起始时间
scanf("%s",a[i].topen);
printf("请输入公交车的终止时间(格式为:时:分): "); //终止时间
scanf("%s",a[i].tclose);
printf("\n请输入公交车的票价: "); //票价
scanf("%d",&a[i].money);
printf("\n第%d辆公交车路线记录创建成功!!!\n",i+1);
save();
printf("\n\t按回车键返回!!!\n");
fflush(stdin); //清除键盘缓冲区
getchar();
system("cls");
return;
}
}
if(i==N)
printf("\n\n\n\t空间已满,不能录入!!!\n");
printf("\n\t按回车键返回!!!\n");
fflush(stdin); //清除键盘缓冲区
getchar();
system("cls");
return;
}
void view() //信息显示函数
{
int i,j,min;
struct bus t;
for(i=0;*a[i].num!='\0'&&i<N;i++) //按“路线编号”用选择法排序
{
min=i;
for(j=i+1;*a[j].num!='\0'&&j<N;j++)
if(strcmp(a[i].num,a[j].num)>0)
min=j;
t=a[i];
a[i]=a[min];
a[min]=t;
}
printf("\n\n 公交车信息库");
printf("\n********************************************************************************\n");
for(i=0;*a[i].num!='\0'&&i<N;i++)
{
printf("\t路线编号: %-6s\t单程票价: %d 元\t\t司机姓名: %s\n",a[i].num,a[i].money,a[i].name);
printf("\t起始时间: %-6s\t终止时间: %-6s\t站台总数: %d\n",a[i].topen,a[i].tclose,a[i].n);
printf("\t公交路线:(1) %s",a[i].b[0].c);
for(j=1;j<a[i].n;j++)
printf(" ---->(%d) %s",j+1,a[i].b[j].c);
printf("\n\n");
}
printf("\n********************************************************************************\n");
printf("\n\t\t公交车信息显示完毕!!!\n");
printf("\n\t\t输入回车键返回主菜单:");
fflush(stdin); //清除键盘缓冲区
getchar();
system("cls");
return;
}
void mod() //信息修改函数
{
int i,j,m=0;
char t,cc[20],mod[20];
printf("请输入要修改信息的公交车路线编号:\n");
scanf("%s",cc);
for(i=0;*a[i].num!='\0'&&i<N;i++) //查找所输入的公交车
{
if(strcmp(a[i].num,cc)==0)
{
m=1;
printf("\n\n\t\t已找到!!!\n");
while(1)
{
system("cls");
printf("\n\n 正在修改的公交车信息\n");
printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
printf("\t路线编号: %-6s\t单程票价: %d 元\t\t司机姓名: %s\n",a[i].num,a[i].money,a[i].name);
printf("\t起始时间: %-6s\t终止时间: %-6s\t站台总数: %d\n",a[i].topen,a[i].tclose,a[i].n);
printf("\t公交路线:(1) %s",a[i].b[0].c);
for(j=1;j<a[i].n;j++)
printf(" ---->(%d) %s",j+1,a[i].b[j].c);
printf("\n\n");
printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
modmeun();
fflush(stdin); //清除键盘缓冲区
t=Test(getchar(),'1','5'); //菜单检测输入函数
system("cls");
switch(t)
{
case '1': //修改路线编号
{
int k;
printf("\n请输入新的公交车编号:");
scanf("%s",mod);
for(k=0;*a[k].num!='\0'&&k<N;k++)
{
if(strcmp(a[k].num,mod)==0)
{
printf("与已有编号重复,按回车键返回主菜单\n");
fflush(stdin); //清除键盘缓冲区
getchar();
system("cls");
return;
}
}
strcpy(a[i].num,mod);
save();
break;
}
case '2': //修改车辆信息
{
printf("\n请输入新的司机姓名:");
scanf("%s",a[i].name);
printf("\n请输入新的公交车票价:");
scanf("%d",&a[i].money);
save();
break;
}
case '3': //修改行车路线
{
void modnavimeun(); //路线修改菜单
int k;
char z;
while(1)
{
system("cls");
modnavimeun();
fflush(stdin); //清除键盘缓冲区
z=Test(getchar(),'1','5'); //菜单检测输入函数
system("cls");
switch(z)
{
case '1': //添加站点
{
if(a[i].n+1>12) //判断是否满足条件
{
printf("\n站台总数达到12个,无法添加新站点\n\n按回车键返回\n");
fflush(stdin); //清除键盘缓冲区
getchar();
system("cls");
return;
}
printf("\n请输入需要添加第几个站点:");
scanf("%d",&k);
while(a[i].n+1<k)
{
printf("目前共%d个站点,无法添加第%d个站点\n请重新输入:",a[i].n,k);
scanf("%d",&k);
printf("\n");
}
a[i].n=a[i].n+1;
for(j=a[i].n;j>k-1;j--)
{
a[i].b[j]=a[i].b[j-1];
}
printf("\n请输入新添加的站点名称:");
scanf("%s",a[i].b[k-1].c);
save();
break;
}
case '2': //修改站点
{
printf("\n请输入需要修改第几个站点:");
scanf("%d",&k);
printf("\n请输入新的站点名称:");
scanf("%s",a[i].b[k-1].c);
save();
break;
}
case '3': //删除站点
{
printf("\n请输入需要删除第几个站点:");
scanf("%d",&k);
for(j=k-1;j<a[i].n;j++)
{
a[i].b[j]=a[i].b[j+1];
}
a[i].n=a[i].n-1;
save();
break;
}
case '4': //重置路线
{
printf("\n请输入新的途径站台总数(2<=n<=12): ");
scanf("%d",&a[i].n);
printf("\n");
while(a[i].n<2||a[i].n>12) //判断是否满足条件
{
printf("\n站台总数应满足(2<=n<=12),请重新输入: ");
scanf("%d",&a[i].n);
printf("\n");
}
for(j=0;j<a[i].n;j++)
{
printf("请输入新的第%d个站台名称: ",j+1);
scanf("%s",a[i].b[j].c);
}
printf("\t公交路线:(1) %s",a[i].b[0].c);
for(j=1;j<a[i].n;j++)
printf(" ---->(%d) %s",j+1,a[i].b[j].c);
printf("\n\n");
save();
break;
}
case '5': //返回菜单
{
printf("\n\t\t按回车键返回菜单\n");
fflush(stdin); //清除键盘缓冲区
getchar();
system("cls");
return; //返回主菜单
}
}
}
}
case '4': //修改行车时间
{
printf("\n\n请输入公交车的起始时间(格式为:时:分): ");
scanf("%s",a[i].topen);
printf("请输入公交车的终止时间(格式为:时:分): ");
scanf("%s",a[i].tclose);
save();
break;
}
case '5':
{
printf("\n\t\t按回车键返回主菜单\n");
fflush(stdin); //清除键盘缓冲区
getchar();
system("cls");
return; //返回主菜单
}
}
}
}
}
if(m==0)
printf("\n\n\t\t无此公交车信息!!!\n");
printf("\n\t\t按回车键返回\n");
fflush(stdin); //清除键盘缓冲区
getchar();
system("cls");
return;
}
void modmeun() //修改菜单
{
printf("\n\t\t 修改菜单 ");
printf("\n\t\t********************************************");
printf("\n\t\t* 1、修改路线编号 *");
printf("\n\t\t* 2、修改车辆信息 *");
printf("\n\t\t* 3、修改行车路线 *");
printf("\n\t\t* 4、修改行车时间 *");
printf("\n\t\t* 5、返回到主菜单 *");
printf("\n\t\t********************************************");
printf("\n\n\t\t请输入您的选择:");
}
void modnavimeun() //路线修改菜单
{
printf("\n\t\t 路线修改菜单 ");
printf("\n\t\t********************************************");
printf("\n\t\t* 1、 站 点 添 加 *");
printf("\n\t\t* 2、 站 点 修 改 *");
printf("\n\t\t* 3、 站 点 删 除 *");
printf("\n\t\t* 4、 路 线 重 置 *");
printf("\n\t\t* 5、 返 回 菜 单 *");
printf("\n\t\t********************************************");
printf("\n\n\t\t请输入您的选择:");
}
void del() //信息删除函数
{
int i,j,t,m=0;
char cc[20];
printf("\n请输入要删改信息的公交车路线编号:\n");
scanf("%s",cc);
for(i=0;*a[i].num!='\0'&&i<N;i++) //查找所输入的公交车
{
if(strcmp(a[i].num,cc)==0)
{
m=1;
printf("\n已找到:\n");
printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
printf("\t路线编号: %-6s\t单程票价: %d 元\t\t司机姓名: %s\n",a[i].num,a[i].money,a[i].name);
printf("\t起始时间: %-6s\t终止时间: %-6s\t站台总数: %d\n",a[i].topen,a[i].tclose,a[i].n);
printf("\t公交路线:(1) %s",a[i].b[0].c);
for(j=1;j<a[i].n;j++)
printf(" ---->(%d) %s",j+1,a[i].b[j].c);
printf("\n\n");
printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
printf("即将删除该公交车信息!!!\n确定请按1:");
scanf("%d",&t);
if(t==1)
{
if(i+1==N)
memset(&a[i],'\0',sizeof(struct bus)); //最后一辆直接进行清空
else
for(j=i;*a[j].num!='\0'&&j+1<N;j++) //后面的公交车信息补上删去的公家车信息
a[j]=a[j+1];
printf("编号为%s的公交车信息删除完毕!\n",cc);
save();
break;
}
}
}
if(m==0)
printf("\n\n\t\t无此公交车信息!!!\n");
printf("\n\n\t输入回车键返回主菜单:");
fflush(stdin); //清除键盘缓冲区
getchar();
system("cls");
return;
}
void find() //信息查询函数
{
char t;
while(1)
{
findmeun();
fflush(stdin); //清除键盘缓冲区
t=Test(getchar(),'1','4'); //菜单检测输入函数
switch(t)
{
case '1': system("cls"); findnavi();break; //路线导航查询
case '2': system("cls"); findnum();break; //路线编号查询函数
case '3': system("cls"); findsta();break; //站台信息查询函数
case '4': system("cls"); return; //返回主菜单
}
}
return;
}
void findmeun() //查询菜单
{
printf("\n\t\t 查询菜单 ");
printf("\n\t\t********************************************");
printf("\n\t\t* 1、路线导航查询 *");
printf("\n\t\t* 2、路线编号查询 *");
printf("\n\t\t* 3、站台信息查询 *");
printf("\n\t\t* 4、返回到主菜单 *");
printf("\n\t\t********************************************");
printf("\n\n\t\t请输入您的选择:");
}
void findnavi() //路线导航查询函数
{
int i,j,k,m=0;
char c1[20],c2[20];
printf("请输入您目前所在的站点:\n\t\t");
scanf("%s",c1);
printf("请输入您想要前往的站点:\n\t\t");
scanf("%s",c2);
printf("\n\n您可选择的公交车信息如下\n");
printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
for(i=0;*a[i].num!='\0'&&i<N;i++)
{
for(j=0;j<a[i].n;j++)
for(k=j+1;k<a[i].n;k++)
if(strcmp(a[i].b[j].c,c1)==0&&strcmp(a[i].b[k].c,c2)==0)
{
m=1;
printf("\n");
printf("\t路线编号: %-6s\t单程票价: %d 元\t\t司机姓名: %s\n",a[i].num,a[i].money,a[i].name);
printf("\t起始时间: %-6s\t终止时间: %-6s\t站台总数: %d\n",a[i].topen,a[i].tclose,a[i].n);
printf("\t公交路线:(1) %s",a[i].b[0].c);
for(j=1;j<a[i].n;j++)
printf(" ---->(%d) %s",j+1,a[i].b[j].c);
printf("\n\n");
}
}
printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
printf("\t\t\t\t显示完毕\n");
if(m==0)
printf("\n\n\t\t\t\t抱歉,无途经此路线的公交车\n");
printf("\n\t\t\t\t输入回车键返回查询菜单:");
fflush(stdin); //清除键盘缓冲区
getchar();
system("cls");
return;
}
void findnum() //路线编号查询函数
{
int i,j,m=0;
char cc[20];
printf("请输入您想要查找的公交路线编号:\n");
scanf("%s",cc);
for(i=0;*a[i].num!='\0'&&i<N;i++)
{
if(strcmp(a[i].num,cc)==0)
{
m=1;
printf("\n已找到:\n");
printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
printf("\t路线编号: %-6s\t单程票价: %d 元\t\t司机姓名: %s\n",a[i].num,a[i].money,a[i].name);
printf("\t起始时间: %-6s\t终止时间: %-6s\t站台总数: %d\n",a[i].topen,a[i].tclose,a[i].n);
printf("\t公交路线:(1) %s",a[i].b[0].c);
for(j=1;j<a[i].n;j++)
printf(" ---->(%d) %s",j+1,a[i].b[j].c);
printf("\n\n");
printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
break;
}
}
if(m==0)
printf("\n\t\t无此公交车信息\n");
printf("\n\t\t输入回车键返回查询菜单:");
fflush(stdin); //清除键盘缓冲区
getchar();
system("cls");
return;
}
void findstameun() //站台信息查询菜单
{
printf("\n\t\t 站台信息查询菜单");
printf("\n\t\t********************************************");
printf("\n\t\t* 1、起始站台查询 *");
printf("\n\t\t* 2、终止站台查询 *");
printf("\n\t\t* 3、途径站台查询 *");
printf("\n\t\t* 4、返回查询菜单 *");
printf("\n\t\t********************************************");
printf("\n\n\t\t请输入您的选择:");
}
void findsta() //站台信息查询函数
{
int i,j,k;
char t;
char cc[20];
while(1)
{
int m=0;
findstameun();
fflush(stdin); //清除键盘缓冲区
t=Test(getchar(),'1','4'); //菜单检测输入函数
system("cls");
switch(t)
{
case '1':
{
printf("请输入您所要查询的起始站台名称:\n");
scanf("%s",cc);
printf("\n以%s为起始站台的公交车如下:\n",cc);
printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
for(i=0;*a[i].num!='\0'&&i<N;i++)
{
if(strcmp(a[i].b[0].c,cc)==0)
{
m=1;
printf("\n");
printf("\t路线编号: %-6s\t单程票价: %d 元\t\t司机姓名: %s\n",a[i].num,a[i].money,a[i].name);
printf("\t起始时间: %-6s\t终止时间: %-6s\t站台总数: %d\n",a[i].topen,a[i].tclose,a[i].n);
printf("\t公交路线:(1) %s",a[i].b[0].c);
for(j=1;j<a[i].n;j++)
printf(" ---->(%d) %s",j+1,a[i].b[j].c);
printf("\n\n");
}
}
printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
printf("\t已全部显示完毕!!!\n");
if(m==0)
printf("\n\t没有公交车以该站点为起始站台\n");
break;
}
case '2':
{
printf("请输入您所要查询的终止站台名称:\n");
scanf("%s",cc);
printf("\n以%s为终止站台的公交车如下:\n",cc);
printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
for(i=0;*a[i].num!='\0'&&i<N;i++)
{
k=a[i].n;
if(strcmp(a[i].b[k-1].c,cc)==0)
{
m=1;
printf("\n");
printf("\t路线编号: %-6s\t单程票价: %d 元\t\t司机姓名: %s\n",a[i].num,a[i].money,a[i].name);
printf("\t起始时间: %-6s\t终止时间: %-6s\t站台总数: %d\n",a[i].topen,a[i].tclose,a[i].n);
printf("\t公交路线:(1) %s",a[i].b[0].c);
for(j=1;j<a[i].n;j++)
printf(" ---->(%d) %s",j+1,a[i].b[j].c);
printf("\n\n");
}
}
printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
printf("\t已全部显示完毕!!!\n");
if(m==0)
printf("\n\t没有公交车以该站点为起始站台\n");
break;
}
case '3':
{
printf("请输入您所要查询的途经站台名称:\n");
scanf("%s",cc);
printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
for(i=0;*a[i].num!='\0'&&i<N;i++)
for(k=1;k<a[i].n-1;k++)
if(strcmp(a[i].b[k].c,cc)==0)
{
m=1;
printf("\n");
printf("\t路线编号: %-6s\t单程票价: %d 元\t\t司机姓名: %s\n",a[i].num,a[i].money,a[i].name);
printf("\t起始时间: %-6s\t终止时间: %-6s\t站台总数: %d\n",a[i].topen,a[i].tclose,a[i].n);
printf("\t公交路线:(1) %s",a[i].b[0].c);
for(j=1;j<a[i].n;j++)
printf(" ---->(%d) %s",j+1,a[i].b[j].c);
printf("\n\n");
}
printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n\n");
printf("\t已全部显示完毕!!!\n");
if(m==0)
printf("\n\t没有公交车以该站点为途经站台\n");
break;
}
case '4':
{
printf("\n\t\t按回车键返回查询菜单\n");
fflush(stdin); //清除键盘缓冲区
getchar();
system("cls");
return; //返回主菜单
}
fflush(stdin); //清除键盘缓冲区
getchar();
system("cls");
}
}
return;
}
void save() //信息保存函数
{
FILE *fp=NULL;
int i;
if((fp=fopen("bus.txt","w+"))==NULL) //以读写的方式打开名称为"bus"的文本文件
{
printf("文件打开错误!!!\n");
return;
}
fp=fopen("bus.txt","w+");
for(i=0;*a[i].num!='\0'&&i<N;i++) //将内存中的数据输出到磁盘中
if(fwrite(&a[i],sizeof(struct bus),1,fp)!=1)
break;
printf("\n\t保存成功!!!\n");
fclose(fp);
return;
}
void mainmeun() //主菜单
{
printf("\n\t\t 主菜单");
printf("\n\t\t****************************************");
printf("\n\t\t* 1、信息录入 *");
printf("\n\t\t* 2、信息显示 *");
printf("\n\t\t* 3、信息修改 *");
printf("\n\t\t* 4、信息删除 *");
printf("\n\t\t* 5、信息查询 *");
printf("\n\t\t* 6、退出系统 *");
printf("\n\t\t****************************************");
printf("\n\n\t\t\t请输入您的选择:");
}
//菜单输入检测函数
char Test(char a,char b,char c)
{
while(a<b||a>c)
{
printf("\n\t\t\t输入错误,请重新输入: ");
fflush(stdin); //清除键盘缓冲区
a=getchar();
}
return a;
}
/**************************主函数定义************************************/
int main()
{
char a;
init();
printf("\n\t\t目前所能录入的公交车数量上限为 %d 辆\n\n",N);
printf("\n\t\t输入回车键继续\n");
fflush(stdin); //清除键盘缓冲区
while(1)
{
system("cls");
mainmeun();
a=Test(getchar(),'1','6'); //菜单检测输入函数
switch(a)
{
case '1': system("cls"); add(); break;
case '2': system("cls"); view(); break;
case '3': system("cls"); mod(); break;
case '4': system("cls"); del(); break;
case '5': system("cls"); find(); break;
case '6': return 0;
}
}
return 0;
}
第5章 课程设计心得
5.1 设计体会
经过这段时间的辅导讨论,我们组的公交线路管理系统基本开发完毕。其功能基本符合设计需求。对于线路的增加、修改、查询、删除等问题通过程序进行了有效解决,并且能够对文件进行有效管理。
通过此次课程设计,使我更加扎实的掌握了有关C语言和数据结构方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍地检查终于找出了原因所在,也暴露出了前期我在这一方面知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。过而能改,善莫大焉。在课程设计中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在课设中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到困难就想要退宿,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上披荆斩棘,而不是知难而退,那样永远不可能获得成功,收获喜悦,也永远不可能得到社会及其他人对你的认可。
回顾起此次课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说是苦多于甜,但是学到了很多很多东西,不仅巩固了以前的知识,还学到了很多书本上没有学到的知识。通过此次课程设计使我懂得了理论和实际结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识和实际相结合,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。实验过程中,也对团队精神进行了考察,让我们在合作中更加默契,在成功之后一起体会喜悦的心情。果然是团结就是力量,只有相互之间默契融洽的配合才能换来最终完美的结果。
5.2 系统改进
由于设计时间较短和本人知识有限,无法做到尽善尽美,所以该系统还有一些不尽人意的地方。系统主要存在以下一些问题:
- 系统的安全性方面的一些问题;
- 系统的某些功能还不能够很好的实现,同时本系统还有某些方面没有考虑到;
- 系统在跨平台运行方面有一些不足;
这些都有待进一步的改善。因此,以后还应加强这几个方面的工作和学习。
第6章 参考文献
[1]黄明等编著《C语言课程设计》北京:电子工业出版社;
[2]郭翠英编著《C语言课程设计案例精编》北京:中国水利水电出版社;
[3〕宁正元《数据结构(c语言)》南京:东南大学出版社。2000年6月第1版;
[4]严蔚敏等《数据结构(c语言版)》北京:清华大学出版社,1997年4月第1版;
[5]谭浩强编著《C程序设计题解与上机指导(第3版)》北京:清华大学出版社;
[6]谭浩强编著《C程序设计(第3版)》北京:清华大学出版社;
[7]洪国胜等编著《C++ Builder程序设计轻松上手》北京:清华大学出版社;
[8〕宁正元《数据结构(c语言)》南京:东南大学出版社。2000年6月第1版;
- 严蔚敏等《数据结构(c语言版)》北京:清华大学出版社,1997年4月第1版;
[10]明日科技编著《Visual C++程序开发范例宝典》北京:人民邮电出版社;
[11]胡学钢等《数据结构算法设计指导》北京:清华大学出版社,1999年第1版。
谢辞
首先非常感谢学校能开设这个课题,为我日后从事计算机方面的工作提供了经验,奠定了基础。
其次,我要特别感谢欧斌老师对我的悉心指导,在设计期间老师帮助我理清设计思路,指导操作方法,并对我所做的课题提出有效的改进方案。老师渊博的知识、严谨的作风、诲人不倦的态度和学术上精益求精的精神让我受益终生。这期间凝结了老师很多的心血,在此我表示由衷的感谢。没有他的帮助,我将无法顺利完成这次设计。
再次,学校在这方面也给我们提供了很大的支持和帮助,学校领导比较重视,给我们安排了较多的上机次数和足够的计算机,让我们有尽可能多的时间上机;并为我们开通了网线,方便我们上网查找信息;另外提供了专门的教室方便我们上机调试;对于学校和老师为我的毕业设计所提供的极大帮助和关心,在此我致以衷心的感谢!
最后还要感谢我的父母和家人,是他们深深的爱和不懈的支持给了我信心和勇气,使我在今后的道路上勇往直前,乐观向上!