公交车信息查询程序设计.docx
- 文档编号:25348514
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:27
- 大小:396.41KB
公交车信息查询程序设计.docx
《公交车信息查询程序设计.docx》由会员分享,可在线阅读,更多相关《公交车信息查询程序设计.docx(27页珍藏版)》请在冰豆网上搜索。
公交车信息查询程序设计
沈阳航空航天大学
课程设计报告
课程设计名称:
C语言课程设计
课程设计题目:
公交车信息查询程序设计
院(系):
计算机学院
专业:
计算机科学与技术
班级:
学号:
姓名:
指导教师:
完成日期:
第1章概要设计
1.1题目的内容与要求
内容:
编写公交车信息查询程序,通过该程序实现对沈阳市内公交车信息的查询,要求完成的主要功能如下:
(1)增加某路新公交车的信息,包括该路公交车的路经站点的站名及始发站发车的起止时间;
(2)修改某路公交车的信息,包括该路公交车的路线及始发站发车的起止时间;
(3)显示所有公交车的信息(公交车号,公交车站点名称,始发站发车的起止时间);
(4)通过输入公交车站点名称查询经过该站的公交车信息;
(5)通过输入公交车号查询公交车信息。
要求:
(1)查阅沈阳市公交车信息,做好前期准备工作;
(2)使用C语言完成编码和调试,通过检查;
(3)使程序在VC++6.0下运行;
(4)涉及到的公交车不少于3路。
1.2需求分析
对于公交车信息查询系统,需要先查询与公交车系统相关的资料,于是我从网上查找到了关于公交车站点的资料。
同时,还要解决储存信息的问题,所以应先建立一个结构体数组来储存公交车信息。
由于公交车信息量很庞大,应该包含从文件中录入的功能,直接从文件中录入公交车信息,因为功能很多,所以应使用switchcase语句实现多个功能的选择实现,另外由于要查询站点,因此录入时站点应该有分开的标识符“-”,此外由于功能很多,每个功能后应该有返回主菜单的功能。
1.3总体结构
本程序主要分为六个模块:
主模块,录入模块,增加模块,修改模块,显示模块,查询模块。
主模块的功能是调用menu函数,实现各函数的运行。
录入模块的功能是将公交车信息录入结构体中。
增加模块的功能是增加公交车信息,将信息存储在结构体中。
修改模块的功能是修改公交车信息,将修改后的信息放到结构体里存储。
显示模块的功能是将所有公交车信息显示出来,包括公交车号,公交车途经站点及始发站发车的起止时间。
查询模块的功能是通过输入公交车号或者输入公交车站点名称两种形式查询公交车信息。
图1.1公交车信息查询系统功能模块图
第2章详细设计
2.1数据结构设计
structbus_information定义公交车信息结构体数组;
{
intnum;定义公交车号;
charstaa[400];定义公交车站点数组;
chartime[50];定义公交车始发站起始时间数组;
}bus[15];申请15个存储公交车信息空间;
使用文件录入公交车信息,使用结构体数组储存公交车信息,并且在查询时使用。
2.2主模块
控制整个程序的运行,控制菜单操作,通过主函数模块分别调用各个模块,实现各项功能,如下图2.1所示。
图2.1主模块流程图
注释:
(1)先定义整型变量a;
(2)用switchcase语句选择操作,调用函数;
(3)a等于1,则调用luru函数;
(4)a等于2,则调用add函数;
(5)a等于3,则调用modification函数;
(6)a等于4,则调用xianshi函数;
(7)a等于5,则调用station_search函数;
(8)a等于6,则调用num_search函数。
2.3录入模块
将公交车信息通过直接输入或者从文件读取两种方式录入结构体中,实现对公交车信息的查询,流程如图2.2所示。
图2.2录入公交车信息模块流程图
注释:
(1)定义一个整型变量a。
(2)输入1或2选择录入方式,判断a为哪个数值。
(3)若a为1,则直接输入车辆信息,判断num是否等于0,若不等于0,则读入信息,循环操作,直到为0,跳出,输入1返回主菜单,判断a是否为1,若是,则返回主菜单,否则输出“错误”并结束操作;
(4)若a不为1,则在文件bus中录入车辆信息,判断g:
\\bus.txt文件是否为空,若是,则清屏并输出“无法打开文件”,否则读入文件中的信息存到结构体中,判断num是否等于0,若不等于0,则执行pp++并将文件中的信息读入结构体中,循环操作,直到num为0,跳出,输入1返回主菜单,判断a是否为1,若是,则返回主菜单,否则输出“错误”并结束操作。
2.4增加模块
输入要增加的公交车的车号,途经站点名称及始发站发车的起止时间,将新公交车信息存在结构体内,流程如图2.3所示。
图2.3增加公交车信息模块流程图
注释:
(1)定义一个整型变量a。
(2)当结构体中的公交车号num不等于0时,执行pp++操作,执行完后循环判断结构体中的公交车号num是否等于0,若没有读到结构体中存储的公交车的末尾,则执行pp++操作,直到不成立时输入新公交车信息。
(3)输入完新公交车信息后,输出“录入成功,输入1返回主菜单”,读入所输的数字a。
(4)判断a是否等于1,若是,则返回主菜单,否则,输出“错误”,并结束操作。
2.5修改模块
修改结构体中存储的公交车信息,流程如图2.4所示。
图2.4修改公交车信息模块流程图
注释:
(1)定义整型变量a,i,m均等于0。
(2)当结构体中的公交车号num不等于0时,输出车辆信息并执行pp++操作,执行完后循环判断结构体中的公交车号num是否等于0,若没有读到存储的公交车末尾,则输出车辆信息并执行pp++操作,直到不成立时,输入要修改的公交车的号码。
(3)判断i<=15是否为真,若为假,则判断m是否等于0,若m等于0,则输出“未找到车辆,输入1返回主菜单”,判断a是否等于1,若是,则返回主菜单,否则,输出“错误”,并结束操作;若i<=15为真,则判断a等于结构体中存储的车号是否为真,若为真,则输出“重新输入公交车信息”,并使m等于1,结束操作,若a等于结构体中存储的车号为假,则执行i++,pp++,判断i<=15是否为真,如此循环操作。
2.6显示模块
显示出所有公交车的信息,包括公交车号,公交车站点,始发站发车的起止时间,流程如图2.5所示。
图2.5显示公交车信息模块流程图
注释:
(1)定义一个整型变量a。
(2)判断num是否为0,若不为0,则输出车辆信息并执行pp++操作,循环操作,直到读到存储的公交车末尾时,输出“输入1返回主菜单”。
(3)判断a=1是否成立,若是,则返回主菜单,否则,输出“错误”,并结束操作。
2.7查询模块
通过输入公交车站点名称或者公交车号实现对公交车信息的查询,流程如图2.6和图2.7所示。
2.6.1查询公交车信息模块流程图(通过公交车站点名查询)
图2.6.2查询公交车信息模块流程图(通过公交车站点名查询)
注释:
(1)定义一个整型变量a。
(2)用switchcase语句选择操作,调用sta_search(a)函数。
(3)定义公交车站名数组sta_name[50],用for循环将结构体中的公交车站点名与输入的站点名比较,循环操作,若相同则输出公交车信息,若无相同的则输出“无此站点”,结束操作。
图2.7查询公交车信息模块流程图(通过公交车号查询)
注释:
(1)定义一个整型变量n。
(2)判断没有读到存储的公交车末尾是否为真,若是,则根据输入的公交车号输出公交车信息并执行pp++操作,如此循环;若否,则输出“输入1返回主菜单”,判断n是否等于1,若是,返回主菜单,否则,输出“错误”,结束操作。
第3章调试分析
1.菜单中调用的函数在编译后显示出“unidentify”的错误;在主函数前面定义了调用的函数,就解决了问题。
2.运行时无法查询公交车信息,在选择5时再按回车键程序未向下运行;应该在运行时先选择1,录入公交车信息,之后再查询公交车信息,否则没有公交车的信息。
运行后先按1录入公交车信息,再按5,就能够查询公交车的信息了。
3.运行时录入公交车信息后再按4键,但公交车站点信息仍然无法输出;把scanf(“%d%s%s”,&pp->num,pp->staa,pp->time)改为scanf(“%d%s%s”,&pp->num,pp->staa,pp->time),即在”%d%s%s”之间加入空格即可。
在结构体中若scanf中”%d%s%s”之间不加入空格,则信息很容易就会被覆盖了,应该记住在”%d%s%s”之间加入空格。
4.运行后在选择“显示公交车信息”功能时,公交车站点信息只能输出一部分,无法全部输出;把结构体
structbus_information
{
intnum;
charstaa[50];
chartime[11];
}bus[15];
中的staa[50]改为staa[400],time[11]改为time[50],增大空间,站点就能够全部输出了。
5.在调试时录入信息时数据量很大录入过程很繁琐;通过增加录入途径,增加从文件中读取的方式解决。
6.调试时发现程序运行后公交车信息的查看比较麻烦;增加了显示功能,将公交车信息显示出来。
第4章使用说明与执行结果
运行操作及结果:
程序运行后显示出菜单,输入1-7选择操作,先选择1录入公交车信息,分为直接输入和从文件读取两种方式。
若选择1则显示“请输入车辆信息”,之后输入公交车信息即可;若选择2则显示“录入成功,请选择1返回主菜单”。
图4.1录入公交车信息模块截图
在主菜单中选择“2.增加公交车信息”,输出“请输入公交车信息”,先后输入公交车号,途经站,时间即可(站点之间用“-”连接),显示“录入成功,请选择1返回主菜单”,之后返回主菜单。
在主菜单中选择“3.修改公交车信息”,输出“请输入要修改的车辆”,之后输入公交车号即可,显示“请重新输入该车辆信息”,先后输入公交车号,途经站,时间即可(站点之间用“-”连接),显示“录入成功,请选择1返回主菜单”,之后返回主菜单。
图4.2修改公交车信息模块截图
在主菜单中选择“4.显示公交车信息”,则会输出所有公交车信息,并显示“输入1返回主菜单”,之后返回主菜单。
在主菜单中选择“5.查询站点公交车信息”,输出“请选择查询要求:
1.起始站2.终点站3.途经本站”,选择后输入站点名即可显示出公交车信息,之后返回主菜单。
在主菜单中选择“6.查询某一公交车信息”,输出“输入您要查询的公交车号:
”,输入后即会输出公交车信息,并显示“输入1返回主菜单”,之后返回主菜单。
图4.3.1查询公交车信息模块截图
图4.3.2查询公交车信息模块截图
参考文献
[1]张长海.C语言程设计[M].北京:
高等教育出版社,2006
[2]严蔚敏.数据结构(C语言版)[M].北京:
清华大学出版社,2002
[3]谭浩强.C程序设计(第三版)[M].北京:
清华大学出版社,2005
[4]秦峰.数据结构(C语言版)[M].合肥:
中国科学技术大学出版社,2007
[5]刘振安.C程序设计课程设计[M].北京:
机械工业出版社,2009
附录(程序清单)
#include
#include
voidluru();
voidadd();
voidmodification();
voidnum_search();
voidstation_search();
voidsta_search();
voidmenu();
voidxianshi();
voidmain()
{
menu();
}
voidmenu()
{
inta;
system("cls");
printf("\n************************************************\n";
printf("\n****\n");
printf("\n**<<<<<<<<<欢迎来到公交车查询系统>>>>>>>>>>**\n");
printf("\n**Welcome!
**\n");
printf("\n************************************************\n");
printf("\n**温馨提示:
本系统应先从选项1开始操作,再进行其它操作**\n");
printf("\n****************1.录入公交车信息************\n");
printf("\n**2.增加公交车信息**\n");
printf("\n**3.修改公交车信息**\n");
printf("\n**4.显示公交车信息**\n");
printf("\n**5.查询站点公交车信息**\n");
printf("\n**6.查询某一公交车信息**\n");
printf("\n**7.退出**\n");
printf("\n****************************\n");
printf("\n请选择操作:
");
scanf("%d",&a);
switch(a)
{
case1:
luru();break;
case2:
add();break;
case3:
modification();break;
case4:
xianshi();break;
case5:
station_search();break;
case6:
num_search();break;
case7:
exit(0);
default:
{printf("错误");exit(0);}
}
}
structbus_information{
intnum;
charstaa[400];
chartime[50];
}bus[15];
voidluru()
{
FILE*fp;
structbus_information*pp;
pp=bus;
inta;
printf("请选择录入方式\n1.直接输入2.从文件读取\n");
scanf("%d",&a);
if(a==1)
{
printf("请输入车辆信息\n车号途经站点时间\n");
scanf("%d%s%s",&pp->num,pp->staa,pp->time);
while(pp->num!
=0)
{pp++;
scanf("%d%s%s",&pp->num,pp->staa,pp->time);}
}
else
{
printf("请在g:
\\bus.txt中录入\n");
if((fp=fopen("e:
\\bus.txt","r"))==NULL)
{
system("cls");
printf("无法打开文件!
\n请确认g:
\\bus.txt文件存在\n");luru();
}
else
{
fscanf(fp,"%d%s%s\n",&pp->num,pp->staa,pp->time);
while(pp->num!
=0)
{
pp++;
fscanf(fp,"%d%s%s\n",&pp->num,pp->staa,pp->time);
}
}
}
printf("输入1返回主菜单\n");
scanf("%d",&a);
if(a==1)
menu();
else
{printf("错误");exit(0);}
}
voidadd()
{
inta;
structbus_information*pp;
pp=bus;
while(pp->num!
=0)
pp++;
printf("请输入\n车号途经站时间\n");
scanf("%d%s%s",&pp->num,pp->staa,pp->time);
pp++;
pp->num=0;
printf("录入成功\n输入1返回主菜单\n");
scanf("%d",&a);
if(a==1)
menu();
else
{printf("错误");exit(0);}
}
voidnum_search()
{
intn;
structbus_information*pp;
pp=bus;
printf("输入您要查询的公交车号:
");
scanf("%d",&n);
while(pp->num!
=0){
if(pp->num==n)printf("车号途经站点时间\n%d%s%s\n\n\n\n",pp->num,pp->staa,pp->time);
pp++;
}
printf("输入1返回主菜单\n");
scanf("%d",&n);
if(n==1)
menu();
else
{printf("错误");exit(0);}
}
voidmodification()
{
structbus_information*pp;
pp=bus;
inta,i,m=0;
while(pp->num!
=0)
{
printf("车号途经站点时间\n%d%s%s\n\n\n\n",pp->num,pp->staa,pp->time);
pp++;
}
printf("请输入要修改的车辆\n");
scanf("%d",&a);
{
pp=bus;
for(i=0;i<=15;i++,pp++)
{
if(a==pp->num)
{
printf("请重新输入该车辆信息\n");
scanf("%d%s%s",&pp->num,pp->staa,pp->time);
m=1;break;
}
}
}
if(m==0)
printf("未找到车辆\n");
printf("输入1返回主菜单\n");
scanf("%d",&a);
if(a==1)
menu();
else
{printf("错误");exit(0);}
}
voidxianshi()
{
structbus_information*pp;
inta;
pp=bus;
while(pp->num!
=0)
{
printf("车号途经站点时间\n%d%s%s\n\n\n\n",pp->num,pp->staa,pp->time);
pp++;
}
printf("输入1返回主菜单\n");
scanf("%d",&a);
if(a==1)
menu();
else
{printf("错误");exit(0);}
}
voidsta_search(inta)
{
charsta_name[50];
inti=0,j,n=0,m=1,q,t=0;
structbus_information*pp;
pp=bus;
printf("请输入站名\n");
scanf("%s",sta_name);
for(i=0;i<=15;i++,pp++)
{
n=0;
m=1;
for(j=0;j<=400;j++)
{
if(pp->staa[j]=='\0')break;
if(pp->staa[j]==sta_name[n])
{
j++;
n++;
while(sta_name[n]!
='\0')
{
if(pp->staa[j]==sta_name[n]){m++;j++;}
n++;
}
if(m==n)
{
if(a==1)
{if((j-n)==0)
{printf("车号途经站点时间\n%d%s%s\n\n\n\n",pp->num,pp->staa,pp->time);t++;}
}
elseif(a==2)
{if(pp->staa[j]=='\0')
{printf("车号途经站点时间\n%d%s%s\n\n\n\n",pp->num,pp->staa,pp->time);t++;}
}
if(a==3)
{printf("车号途经站点时间\n%d%s%s\n\n\n\n",pp->num,pp->staa,pp->time);t++;}
n=0;m=1;
}
else
{n=0;m=1;}
}
}
}
if(t==0)
printf("无此站点\n");
printf("输入1返回主菜单\n");
scanf("%d",&q);
if(q==1)
menu();
else
{printf("错误");exit(0);}
}
voidstation_search()
{
inta;
printf("请选择查询要求\n1.起始站2.终点站3.途经本站\n");
scanf("%d",&a);
switch(a){
case1:
sta_search
(1);
case2:
sta_search
(2);
case3:
sta_search(3);
default:
{system("cls");printf("错误");menu();}
}
}
课程设计总结:
此次课程设计中,我了解到了许多以前不太会的知识,也在对程序的不断的调试中认识到调试时的细心是很重要的,这些都让我受益匪浅。
譬如,结构体的scanf语句中的“%d%s%d”之间应该有空格,即改为“%d%s%d”,否则结构体中的信息容易被覆盖,无法全部读入;此次课程设计里的公交车站点的查询比较麻烦,用for循环比较站点名称,多次循环,并使用ifelse语句和while语句,最后得出了结果。
在这次课程设计中,我还学会了简单菜单的制作,用switchcase语句以及函数的调用就能制作出一个简单的界面。
这些都是我在以前的学习中不了解的,让我在这次课程设计中学习新知识的同时也感受到很多快乐,对C语言及以后要学习的一些专业课程也产生了浓厚的兴趣,同时我也意识到有很多知识是我不了解的,我还需要更努力的学习,来丰富学习生活,充实自我。
课程设计中固然有困难,但这种挑战也是让我继续前进的动力,我会在以后的学习中也尝试一些挑战,这将会有利于我的学习。
这次课程设计激发了我的兴趣,虽然只是设计公交车查询系统,但我也感受到了程序做完之后的兴奋与自豪,我会更加努力,让未来也充满着这种感觉,不断地补充计算机方面的知识,成为未来的人才。
指导教师评语:
指导教师(签字):
年月日
课程设计成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 公交车 信息 查询 程序设计