公交路线管理系统C语言课程设计.docx
- 文档编号:12178952
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:26
- 大小:829.32KB
公交路线管理系统C语言课程设计.docx
《公交路线管理系统C语言课程设计.docx》由会员分享,可在线阅读,更多相关《公交路线管理系统C语言课程设计.docx(26页珍藏版)》请在冰豆网上搜索。
公交路线管理系统C语言课程设计
公交路线管理系统C语言课程设计(总19页)
计算机科学与技术系
课程设计任务书
2012~2013学年第一学期
课程
C语言课程设计
课程设计名称
公交路线管理系统
学生姓名
学号
专业班级
指导教师
20131年8月
一、需求分析
本系统主要功能是实现对公交路线的管理和维护。
我们都知道,每个城市都会有公交路线的改动,如果使用这个系统,就可以及时的对路线信息进行修改和保存,是非常方便的,而且该系统使用起来也很方便。
用户只需根据显示的提示信息进行选择和输入就可以实现你要求的功能。
该系统具有添加,查询,删除,修改和显示所有记录的功能。
用户可以根据实际情况进行相应的功能选择。
其具体功能简单描述如下:
(1)保存:
即将信息存入指定文件中。
当用户对原始数据进行相关的改动(主要是对路线信息进行增加、删除、修改)之后,用户可以根据自己的选择判断是否要保存到文件中,这样就实现了信息的记录功能,以方便用户随时进行查看。
(2)添加:
即添加一条新的公交路线或者是某一条路线上的站点。
每次可以添加一条路线信息,若用户想添加多条路线信息的话可以重复执行该功能,同样的,添加站点的话也是每一次添加一个站点,若用户想添加多条路线信息的话也只需要重复执行该功能即可。
这样,就实现了对公交路线的添加信息管理。
(3)查询:
即能够查找出你要的公交路线信息和总共有多少站。
简单地说,就是用户先选择你要查询的公交路线号,在输入起点站和终点站名称,然后系统就会自动显示出起点站和终点站之间共有多少站点,以及起点站和终点站之间所有站点的序号和名称,从而使用户一目了然的知道站点信息,而不需要像看地图那样一个站点一个站点的用肉眼进行查找,这就为用户节省了很多时间。
(4)删除:
即能删除掉一条你所不需要的公交路线信息和某一条路线上的站点。
若要删除路线时只需要输入你要删除的公交路线号即可,若要删除站点也只需输入你要删除的站点序号,不需要输入该站点名称。
(5)修改:
即能修改一条你需要该的路线信息。
修改内容包括:
修改该条公交路线号、修改站点名称(输入新的信息时该条路线的站点长度不能改变,若要改变站点长促可以选择增加和删除功能,即可实现)。
(6)显示路线信息:
即将路线信息显示到屏幕中,供用户查看。
该功能比较简单,在这里不具体说明。
(7)
二、算法设计
1、设计思想:
本系统的设计流程简单比较简单,原始数据全部都保存在文件中,用户就不必自己一个一个的输入信息。
程序执行时从文件中读出,文件的读取操作在下文中我会详细说明,这里就不做具体说明了。
创建动态链表和结构体数组对路线信息进行存储,因为使用链表时对程序的插入、删除会比较方便,那么插入和删除就相当于对链表节点的删除和插入。
写无返回值的主函数voidmain()对系统的功能进行显示,每次用户选择某一功能时都可以看到路线的大致信息,以便于用户更准确的选择功能。
其中利用switch条件分支语句进行子函数功能的选择和调用。
并且使用while循环语句进行多次循环执行,就可以实现对信息的多次删除、增加、修改,知道达到用户满意时由用户自己选择退出系统。
通同时使用了清屏函数,对上一次程序运行的结果清楚只显示本次运行的相关信息,这样的话就做到了界面的友好化,简单明了,不冗杂,更方便观看。
当用户对信息进行有关的改动之后,用户根据自己的选择是否保存入文件中,就可以保存他所要的信息了。
其主要流程图如下:
2、设计表示:
下面我将对各个子模块的功能进行详细的介绍和描述:
模块一:
头文件,定义结构体,结构体中还嵌套了一个结构体,定义结构体成员,同时定义指向该类型的指针head,其对整个程序都有效。
模块二:
菜单显示。
显示该系统所能完成的功能,一目了然。
根据用户的需求自由选择功能实现。
模块三:
从文件中读取信息。
该功能以子函数的形式给出,因为其返回值是head,而head是指向结构体的指针,所以该函数属于指针函数。
执行此程序时首先定义文件指针FILE*fp,在打开此文件时,文本文档里应该有用户需要的数据,从而才能从文件中正确读取出来,若文件打开不成功则会显示“不能打开此文件!
”。
创建动态链表来存储从文件中读出来的数据,每读取一组数据后文件指针后移,这是系统约定俗成的,不需要用户去考虑的,知道文件结束时停止读取。
读取结束后必须要关闭文件,即fclose(fp),这样就完成了从文件中读取信息的功能。
模块四:
显示路线信息。
该功能以子函数的形式给出,无返回值。
定义指向定义过的结构体类型的指针p,并让p指向head,当p为非空时输出结构体成员信息,在这里需要说明的是,在输出站点信息时,当最后一个站点名是end时,停止输出,因此end是作为站点信息输出的结束标志,同时p指针指向链表的下一个节点,再次读取一组数据。
模块五:
增加线路信息。
该函数的返回的是链表的头指针head,因此是一个指针函数。
该函数不仅可以增加一条路线信息,也可以增加某一条路线上的站点信息。
用户根据自己的需要进行选择。
本系统添加一条公交路线时,是在链表的尾部添加的,因为我考虑到公交线路号一般没什么顺序可言,所以就简单的添加在了链表的末节点。
定义BL*p=head,*q。
重新建立一个新的节点来存储你添加的那条线路信息,判断p是否为空,若不为空的话,q指向p,p指针位置后移一个节点,直到p为空。
然后q->next指向新建立的节点,新节点的下一结点赋值为空,从而完成了增加路线信息的功能。
如果是添加路线站点,先确定要在哪条路线上添加,所以要先找到该条路线,并用指针指向该节点,然后找该站点将要插入的位置,找到后,将其后面的站点依次后移,把那个空的位置空间腾出来,用来置放添加的节点的信息,这样就实现了对站点的添加。
模块六:
删除线路信息。
该函数返回的是头指针head,所以该函数是一个指针函数,也是作为子函数的形式出现。
可以删除整条路线,也可以删除线路上的某一个站点,删除一整条路线时,就相当于删除链表中的某一个节点,先确定你要删除的线路号,找到后,只需要将其前一个节点指向其后一个节点,所以删除时还需要考虑到删除的是首节点还是末节点还是中间节点,若删除首节点只需将head指向head的下一个节点,若删除末节点,将倒数第二个节点之后赋值为空即可,因此对线路的删除还是相对比较简单的,但是要求我们对链表的相关操作熟练掌握。
删除站点时,先确定你要删除的是哪条路线上的站点,找到后一个指针会指向该节点,再确定你要删除的站序号,确定后将其后一个站名称移到当前删除节点的位置,就可以将该站名覆盖,从而实现站点的删除。
模块七:
修改线路信息。
同上分析,该子函数也是一个指针函数,修改时,先确定你要修改哪条路线,指针指向该节点,在重新输入新的信息即可,新输入的信息会覆盖原有节点信息,所以可以实现对线路进行修改,但是修改时需要注意的是,修改时新输入的站点数目不能改变。
模块八:
查询路线信息。
该子函数是一个无返回值的函数。
使用时先输入你要找的路线号,再输入你要经历的起点站和终点站,程序就会为你显示出起点站和终点站之间共有多少站,并且输出起点站和终点站之间所有站序号和站点名称。
模块九:
将信息保存到文件中。
当用户对原始路线信息进行改动之后,或许要将修改过后的信息保存起来,此时用户就可以自己选择是否要将信息保存起来,保存的位置是本系统实现设定好的,保存之后的信息在D盘根目录下,也方便用户的查看。
模块十:
主函数。
构建无返回值的主函数,主函数用来实现对子模块的调用功能,用while循环语句来控制循环次数,用户可以根据自己的需求选择任何时候退出系统。
对子模块的调用主要使用switch开关控制语句,根据选择实现用户要求的功能。
3、实现注释:
本系统对于菜单显示表上的功能基本上都能实现,但是不是很完善,很多地方我还没有考虑到,或许是考虑的不够周全,但是有些不足的地方,是我的能力所不能达到的,还望老师体谅,不过等以后学过新的知识用新的方法或许就能将系统做进一步的改进。
4、算法设计中一些新的想法:
我觉得本系统很不完善,很多功能虽然能实现,但是实现的不够完美,很多细节我都没有考虑到,比如查询路线时,不能大致故略出起点站和终点站需要的时间;修改路线信息时,重新输入该条路线的信息时,路线上站点的个数不能改变,要改变的话还得选择增加或删除功能;还有就是用户将改动过后的信息保存到文件中后,以后该文件中的数据用户如果要使用的话,不能从文件中读取显示到屏幕上。
这些都是我的系统一些不完善的地方,希望以后有能力的时候,能进一步对系统进行修改和完善。
三、用户手册
用户在适用本系统时,我在这里有几点说明要解释一下。
以便用户更好的使用本系统。
(1)路线号整形数据,站序号是整形数据,站名时字符串。
(2)输入路线信息时,站的序号是有次序的,从1开始依次往后增加。
如果你要结束站点的输入,只需要在最后一个站点后在输入下一个站的序号,但是本站的站名一定要是end,用来表示站点录入结束的结束标志。
(3)保存信息的文本文档,一点要放入G盘根目录下,因为我在写本程序时就规定了将文本文档置于G盘根目录下,所以以后用户查看数据信息时可以从G盘根目录下查找。
四、调试及测试
本程序的运行结果如下所示:
(1)
(2)
(3)
(4)
(5)
五、课程小结
通过这次实训,增加了我学习软件技术的兴趣,虽然还不明确软件技术包含的具体内容,但从C语言这门课程开始,已发现程序设计的乐趣,在学习C语言的过程中也学到了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解。
这次实训是老师给了题目,经过自己的努力,实现要求。
先做简单的输出,一步步的再做其它要求,在实际操作过程中犯的一些错误还会有意外的收获,感觉实训很有意思。
在具体操作中对这学期所学的C语言的理论知识得到巩固,达到实训的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C语言具有的语句简洁,使用灵活,执行效率高等特点。
发现上机实训的重要作用,特别是对数组和循环有了深刻的理解。
通过实际操作,学会C语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。
深刻体会到“没有做不到的,只有想不到的”,“团结就是力量”,“实践是检验真理的标准”……的寓意。
在此希望以后应多进行这样的实训,加长设间,培养我们独立思考问题的能力,提高实际操作水平。
六、参考资料
1、谭浩强编著,C程序设计1991年7月
2、裘宗燕著,从问题到程序科学出版社,北京大学出版社,1999年4月。
3、刘瑞挺主编,计算机二级教程,南开大学出版社,1996年10月。
4、陈朔鹰等编著,C语言程序设计基础教程,兵器工业出版社,1994年9月
5、姜仲秋等主编,C语言程序设计,南京大学出版社,1998年1月。
6、《C程序设计(第二版)》,谭浩强编,清华大学出版社,1999年12月。
本书以初学者为读者对象,要求的起点低,详细而透彻地讲述了C语言各个语句的语法规则,通过典型的简单的例题,引领初学者进入C语言的世界。
7、《C语言程序设计题解与上机指导》,谭浩强编,清华大学出版社,2000年11月。
与教材配套的上机指导。
附录:
1、源程序清单:
#include""
#include""
#include""
#include""
structstation
{intnum;
charname[20];
}stop[50];
/*公交站*/
typedefstructbusline
{intbusnum;
structstationstop[50];
structbusline*next;
}BL;
BL*head;
/*菜单*/
voidMenu()
{printf("***********************************\n");
printf("*欢迎进入公交信息管理系统*\n");
printf("***********************************\n");
printf("********************************************************************************");
printf("**********************\n");
printf("*0.退出系统*\n");
printf("**********************\n");
printf("*1.显示公交车线路信息*\n");
printf("**********************\n");
printf("*2.增加公交车线路信息*\n");
printf("**********************\n");
printf("*3.删除公交车线路信息*\n");
printf("**********************\n");
printf("*4.修改公交车线路信息*\n");
printf("**********************\n");
printf("*5.查询公交车线路信息*\n");
printf("**********************\n");
printf("*6.保存公交车线路信息*\n");
printf("**********************\n");
}
/*函数功能:
删除*/
BL*Delete()
{BL*q,*p=head;
intkey,r,j=1,x,choise,k;
charch[5]={"end"};
printf("您是要删除公交路线还是线路站点:
\n");
printf("1---删除公交路线2---删除站点\n");
printf("你的选择:
");
scanf("%d",&choise);
switch(choise)
{case1:
printf("请输入你要删除的公交路线号");
scanf("%d",&key);
while(key!
=p->busnum&&p!
=NULL)
{q=p;
p=p->next;
}
if(p->busnum==key)
{if(p==head)
head=p->next;
else
q->next=p->next;
}
else
printf("没有找到你要删除的公交路线!
");
returnhead;
case2:
printf("选择线路:
");
scanf("%d",&key);
while(key!
=p->busnum&&p!
=NULL)
{q=p;
p=p->next;
}
printf("输入你要删除的站点序号:
");
scanf("%d",&x);
for(j=1;j<=x;j++)
{if(x==p->stop[j].num)
break;
j++;
}
r=j;
for(k=r;strcmp(p->stop[k].name,ch)!
=0;k++)
strcpy(p->stop[k].name,p->stop[k+1].name);
strcpy(p->stop[k-1].name,p->stop[k].name);
returnhead;
}
}
BL*Correct()
{BL*p=head,*q;
intkey,j=1;
charch[5]={"end"};
printf("选择你要修改的路线号:
");
scanf("%d",&key);
while(p!
=NULL)
{if(p->busnum==key)break;
q=p;
p=p->next;
}
printf("重新输入该条路线信息(包括路线号、站序号、站名称,各个站的站数不变):
\n");
scanf("%d",&p->busnum);
do
{
scanf("%d%s",&(p->stop[j].num),p->stop[j].name);
j++;
}while(strcmp(p->stop[j-1].name,ch)!
=0);
returnhead;
}
/*函数功能:
添加路线*/
BL*Add()
{BL*p=head,*q,*t;
charnme[20];
intj,choise,k,r,key,x,c;
charch[5]={"end"};
printf("您要添加公交路线还是公交站点\n");
puts("1--添加公交路线2--添加公交站点\n");
printf("请选择:
");
scanf("%d",&choise);
switch(choise)
{
case1:
j=1;
t=(BL*)malloc(sizeof(BL));
printf("输入你要添加的公交路线信息:
\n");
scanf("%d",&(t->busnum));
do
{
scanf("%d%s",&(t->stop[j].num),t->stop[j].name);
j++;
}while(strcmp(t->stop[j-1].name,ch)!
=0);
while(p!
=NULL)
{
q=p;
p=p->next;
}
q->next=t;
t->next=NULL;
returnhead;
case2:
j=1;
printf("选择你要添加站点的公交路线:
");
scanf("%d",&key);
while(p!
=NULL)
{q=p;
if(p->busnum==key)break;
p=p->next;
}
printf("输入你要添加的站序号及站名称:
");
scanf("%d",&x);
scanf("%s",nme);
while(strcmp(p->stop[j].name,ch)!
=0)
{if(x==(p->stop[j].num))
{
r=j;
break;
}
j++;
}
r=j;
c=j;
while(strcmp(p->stop[c].name,ch)!
=0)
c++;
for(k=c;k>=r;k--)
strcpy(p->stop[k+1].name,p->stop[k].name);
strcpy(p->stop[r].name,nme);
returnhead;
}
}
/*函数功能:
查找路线*/
voidSearch()
{BL*p=head,*q;
intkey,j=1,c,d;
charstr1[20],str2[20],ch[5]={"end"};
printf("输入公交车号:
");
scanf("%d",&key);
printf("\n输入起始站和终点站名称:
");
scanf("%s%s",str1,str2);
while(p!
=NULL)
{if(p->busnum==key)break;
q=p;
p=p->next;
}
while(strcmp(p->stop[j].name,ch)!
=0)
{if(strcmp(p->stop[j].name,str1)==0)
c=j;
if(strcmp(p->stop[j].name,str2)==0)
d=j;
j++;
}
printf("起始站和终点站之间共有%d站\n",d-c-1);
printf("各个站的序号及名称为:
\n");
for(j=c;j<=d;j++)
printf("%d%s\t",p->stop[j].num,p->stop[j].name);
printf("\n");
}
/*函数功能:
保存数据*/
Save()
{
FILE*fp;
BL*t;
intj;
charch[5]={"end"};
t=head;
fp=fopen("保存的数据.txt","w+");
if(fp==NULL)
{printf("Filecannotopen!
\n");
exit(0);
}
while(t!
=NULL)
{fprintf(fp,"%d\t",t->busnum);
j=1;
do
{
fprintf(fp,"%d%s--",t->stop[j].num,t->stop[j].name);
j++;
}while(strcmp(t->stop[j].name,ch)!
=0);
fprintf(fp,"\n");
t=t->next;
}
fclose(fp);
}
/*函数功能:
读取数据*/
BL*Creat()
{BL*p,*q;
intj=1;
charch[5]={"end"};
FILE*fp;
fp=fopen("","r+");
if(fp==NULL)
{printf("不能打开此文件!
");
exit(0);
}
p=(BL*)malloc(sizeof(BL));
head=p;
q=p;
fscanf(fp,"%d",&(p->busnum));
do
{fscanf(fp,"%d%s",&(p->stop[j].num),p->stop[j].name);
j++;
}while(strcmp(p->stop[j-1].name,ch)==1);
while(!
feof(fp))
{j=1;
p=(BL*)malloc(sizeof(BL));
q->next=p;
q=p;
fscanf(fp,"%d",&(p->busnum));
do
{fscanf(fp,"%d%s",&(p->stop[j].num),p->stop[j].name);
j++;
}while(strcmp(p->stop[j-1].name,ch)!
=0);
}
q->next=NULL;
fclose(fp);
returnhead;
}
/*函数功能:
显示线路信息*/
voidPut()
{BL*p=head;
intj;
charch[5]={"end"};
while(p!
=NULL)
{
printf("%d\n",p->busnum);
j=1;
do
{
printf("%2d%6s",p->stop[j].num,p->stop[j].name);
j++;
}while(strcmp(p->stop[j].name,ch)!
=0);
p=p->next;
printf("\n");
}
}
/*主函数*/
voidma
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 公交路线 管理 系统 语言 课程设计