c语言车票管理系统实验.docx
《c语言车票管理系统实验.docx》由会员分享,可在线阅读,更多相关《c语言车票管理系统实验.docx(49页珍藏版)》请在冰点文库上搜索。
c语言车票管理系统实验
《车票管理系统》课程设计报告
题目:
车票管理系统
专业:
信息与计算科学
班级:
1002
学号:
******************************
姓名:
陈婉璐包忠材邱振涛
指导教师:
吴选忠熊保平
完成日期:
2011年12月23日
一、课程设计目的
本课程设计的目标就是要达到理论与实际应用相结合,提高学生组织数据及编写大型程序的能力,并培养基本的、良好的程序设计技能以及合作能力。
设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。
通过这次设计,要在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
二、课程设计内容
一.系统的主要功能:
1.浏览班次信息
2.查询班次:
①按班次查询;②按终点查询;
3.售票
(1)售票成功(当车票有剩余,且车未发出时)
(2)班次不存在
(3)票已售完(当座位数小于等于已定票人数)
(4)车已发出
4.退票
退票成功(输入的班次号存在且当前时间比发车时间早)
退票失败(班次不存在或当前时间比发车时间晚)
三、课程设计过程
1.需求分析
(1)输入的形式和输入值的范围;
录入的班次信息的输入形式和输入值的范围:
车次(类型:
int)发车时间小时(类型:
int[0,24])发车时间分钟(类型:
int[0,60])起始站及终点站(类型:
voidwap(intk))行车时间(类型:
floattimes(intk))额定票数(类型:
number(intk))已定票人数(类型:
nownumber(intk,inti))
(2)输出的形式;printf
(3)程序所能达到的功能;
①录入详细的班次信息(发车时间,起点,终点站,行车时间,额定票数,订票人数,是否已发车……);
②浏览班次信息,可显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息)。
③查询功能(分班次查询和终点站查询两种);
④订票功能。
(当查询出已定票人数小于额定载量且当前系统时间久小于发车时间才能售票,自动更新已售票人数)
⑤退票功能;(输入所退票的班次,当本班车未发出时才能退票,自动更新已售票人数)
⑥临时增加班次功能;
2.概要设计
3.详细设计
4.调试分析
内容包括:
a.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;
1.我们将一个个功能分为一个个函数,在发车时间上我们遇到了一些阻碍!
我本来想通过算法来输出发车时间,没想到一次次的实验不行!
于是我们将发车时间的分为小时段和分钟段!
使用case函数输出.
inthour(intk)
{
switch(k)
{
case1:
return07。
break。
case2:
return10。
break。
。
。
。
。
。
。
。
。
。
。
。
。
(省略一部分)
case27:
return19。
break。
case28:
return22。
break。
/*d到罗源一天的发车时间小时段*/
}
}/*开车时间段*/
intminute(intk)
{
switch(k)
{
case1:
return00。
break。
case2:
return00。
break。
。
。
。
。
。
。
。
。
。
。
(省略一部分)
case27:
return30。
break。
case28:
return30。
break。
/*d到罗源一天的发车时间分钟段*/
}
}/*开车时间段*/
2.是终点站的输出,我们一开始是使用字符串的输出,这样以便于按终点站查找时能进行比较。
但这种方法我们又没有实现!
于是我们干脆用void,使用简便的方法,达到相同的目的.
voidwap(intk)
{
switch(k)
{
case1:
printf("闽清")。
break。
case2:
printf("长乐")。
break。
case3:
printf("连江")。
break。
case4:
printf("永泰")。
break。
case5:
printf("福清")。
break。
case6:
printf("罗源")。
break。
}
}/*输入终点站的函数*/
3.是时间的问题,这源于要比较发车时间与当前的时间,判断这班车到底有没有发车,和能不能订票与退票,我们用了一个时间函数,输出了当前的时间,但那边有年月日,不好进行提取和比较,于是我们采用输出了时间,然后看着那个时间手动的提取。
intshijian()
{
structtm*ptr。
time_tlt。
lt=time(NULL)。
ptr=gmtime(<)。
printf(ctime(<))。
return0。
}/*输出当前时间的函数*/
在主函数中:
printf("请输入上述时间的时辰:
")。
scanf("%d",&s)。
printf("请输入上述时间的分钟:
")。
scanf("%d",&t)。
、
然后再将s和t带入各个需要比较时间的函数中。
4.我们碰到了文件的问题,这是在保存已定票人数中,这需要更新已定票人数和判断能否售票,我们一开始就将这部分留到了最后,一开始我们只写了暂时售票人数为0,在文件的运用上我们感觉比较困难,训练的比较少,也比较少这方面的知识!
在这里我们碰到了比较大的困难,我们一开始建立了一个txt的文本文档,准备使用这个来储存这些数据,但后来我们觉得使用一个文档比较复杂,容易出错,于是我们使用比较麻烦,但是简单的办法,我建立了与班次一样多的文档,一个文档保存一班车的数据,这样就不是那么复杂了。
intnownumber(intk,inti)
{
intn=0。
charfilename[10]。
switch(i)
{
case1:
strcpy(filename,"qiu1.txt")。
break。
case2:
strcpy(filename,"qiu2.txt")。
break。
。
。
。
。
。
。
。
。
。
。
。
case27:
strcpy(filename,"qiu27.txt")。
break。
case28:
strcpy(filename,"qiu28.txt")。
break。
case29:
strcpy(filename,"qiu29.txt")。
break。
}
FILE*fp。
if((fp=fopen(filename,"rt+"))==NULL)
{
printf("cannotopenfile,strikeanykeyexit!
")。
exit
(1)。
}
fscanf(fp,"%d",&n)。
n=n+k。
rewind(fp)。
fprintf(fp,"%d",n)。
//将输入数组里面的数据写到文本里
fclose(fp)。
returnn。
}/*现在已定票人数*/
其他都是一些小问题了,我们可以自己一边调试一边就能自己一会儿解决!
b.算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;
我们车票管理系统使用的语言并不复杂,使用的都是比较常见的,低级的语言,高级的语言和难懂的语言比较少!
这是我们小组自己的成果,做出来了,我们挺有成就感的。
我们也使用了很多的while循环。
在主函数中
while(log)/*循环*/
{
if(x=='a')
banci(s,t)。
/*调用班次的函数,班次一览的函数*/
if(x=='b')
chaxun1(s,t)。
/*按班次查询的函数*/
if(x=='c')
chaxun2(s,t)。
/*按终点站查询的函数*/
if(x=='d')
maipiao(s,t)。
/*买票的函数*/
if(x=='e')
tuipiao(s,t)。
/*退票的函数*/
if(x=='f')
zengban()。
/*增加班次*/
printf("\n")。
printf("返回主界面:
请输入1:
\n")。
printf("退出:
0\n")。
scanf("%d",&n)。
if(n==1)
{
system("cls")。
jiemian()。
scanf("%c",&x)。
}
elseif(n==0)
break。
}
这是在程序运行与退出之间循环
在买票函数中:
if(number(k)>=nownumber(0,i)&&log==1)
{
printf("请输入你要定的票的数量m:
\n")。
scanf("%d",&m)。
nownumber(m,i)。
while(number(k){
nownumber(-m,i)。
printf("这班车已订满,请重新订票:
\n")。
printf("请输入您需要购买票的班次i:
\n")。
scanf("%d",i)。
n=i。
while(n>0)
{
k++。
n=n-tangci(k)。
}
if(i>=10)
printf("%d",i)。
else
printf("%d",i)。
if(hour(i)>=10)
printf("%d",hour(i))。
else
printf("%d%d",o,hour(i))。
if(minute(i)>=10)
printf("%d",minute(i))。
else
printf("%d%d",o,minute(i))。
printf("闽侯")。
wap(i)。
printf("%f",times(k))。
printf("%d",number(k))。
printf("%d",nownumber(0,i))。
if(s{
printf("未发出")。
log=1。
}
elseif(t{
printf("未发出")。
log=1。
}
else
{
printf("已发出")。
log=0。
}
printf("\n")。
}
这是其中一个循环,实现已定人数小于额定数量!
当其大于额定数量时继续循环,直至你所选的班次小于额定数量未知!
这些循环都很容易理解,都不是什么难的问题,程序中还有很多循环我就不一一举例了!
我们改进的思想就是尽可能让它变得简单!
还有很多的不足和瑕疵需要我们继续去奋斗,希望老师不吝赐教!
c.经验和体会等。
这次实验让我们收获良多,这让我们得到了很多经验,又认识了很多的不足,在c语言这方面我们还需要很多的历练!
我想通过这次的练习,我们都有所进展,我们现在需要的就是实践。
完成了任务我们还是很有成就感的,也增添了我们对c语言的热情!
在今后我们知道,凡事都要有自己的见解,我们可以借鉴别人,但别人是不可复制的,我们要明白只有理解才是自己的,只有通过自己实践我们才能深刻的认识到这一点!
5.用户使用说明
该系统是出于对班车的各种信息进行管理和维护,并可以简单的订票和退票功能,还可适当地增加班次。
1.系统说明:
在程序中直接录入车次信息依次是:
车次(类型:
int)发车时间小时(类型:
int[0,24])发车时间分钟(类型:
int[0,60])起始站及终点站(类型:
voidwap(intk))行车时间(类型:
floattimes(intk))额定票数(类型:
number(intk))已定票人数(类型:
nownumber(intk,inti));
2.车次信息的操作:
运行程序就会弹出一个界面如下图所示:
根据您的需求任选:
a,b,c,d,e,f,中的任一功能选项进入系统,无论进入那一个,里面都有详细的信息提示,只要按步操作即可。
a:
详细的班次信息供您浏览;
b:
进入后只需输入您所要定的班次,它就会显示出该车的发车时间、终点站、行车时间、是否有票剩余,是否已发车。
c:
输入您的终点站序号,就会显示出到达该地的所有车次,供您选择。
d:
输入您想买的班次,若有票剩余且未发车,即可订票,程序会显示订票成功;此时再输入您要定的票数;
若车已发出或票卖完了,程序会提示您:
此班不能订票。
e:
输入您想退的班次,若未发车,即可退票,程序会显示退票成功;此时再输入您要退的票数,程序会显示退票成功;
若车已发出,程序会提示您无法退票。
f:
若想增加班次,则要输入密码(qiu),输入您所要加的班次,及增加的终点站,发车时间。
6.测试结果
主界面:
班次查询:
终点站查询:
售票:
退票:
列出你的测试结果,包括输入和输出。
这里的测试数据应该完整和严格,最好多于需求分析中所列。
7.附录
#include
#include/*时间库函数*/
#include/*调用系统函数*/
#include/*串操作及内存操作函数*/
#include
#include
#defineN80/*宏定义多条记录*/
voidmaipiao(ints,intt)。
/*函数定义*/
floattimes(intk)。
inthour(intk)
{
switch(k)
{
case1:
return07。
break。
case2:
return10。
break。
case3:
return13。
break。
case4:
return16。
break。
case5:
return19。
break。
case6:
return21。
break。
/*d到闽清一天的发车时间小时段*/
case7:
return07。
break。
case8:
return11。
break。
case9:
return15。
break。
case10:
return19。
break。
case11:
return23。
break。
/*d到长乐一天的发车时间小时段*/
case12:
return07。
break。
case13:
return11。
break。
case14:
return15。
break。
case15:
return19。
break。
case16:
return23。
break。
/*d到连江一天的发车时间小时段*/
case17:
return07。
break。
case18:
return11。
break。
case19:
return16。
break。
case20:
return20。
break。
/*d到永泰一天的发车时间小时段*/
case21:
return07。
break。
case22:
return12。
break。
case23:
return17。
break。
case24:
return22。
break。
/*d到福清一天的发车时间小时段*/
case25:
return07。
break。
case26:
return14。
break。
case27:
return19。
break。
case28:
return22。
break。
/*d到罗源一天的发车时间小时段*/
}
}/*开车时间段*/
intminute(intk)
{
switch(k)
{
case1:
return00。
break。
case2:
return00。
break。
case3:
return00。
break。
case4:
return00。
break。
case5:
return00。
break。
case6:
return00。
break。
/*d到闽清一天的发车时间分钟段*/
case7:
return00。
break。
case8:
return00。
break。
case9:
return00。
break。
case10:
return00。
break。
case11:
return00。
break。
/*d到长乐一天的发车时间分钟段*/
case12:
return00。
break。
case13:
return00。
break。
case14:
return00。
break。
case15:
return00。
break。
case16:
return00。
break。
/*d到连江一天的发车时间分钟段*/
case17:
return00。
break。
case18:
return30。
break。
case19:
return00。
break。
case20:
return30。
break。
/*d到永泰一天的发车时间分钟段*/
case21:
return00。
break。
case22:
return30。
break。
case23:
return00。
break。
case24:
return30。
break。
/*d到福清一天的发车时间分钟段*/
case25:
return30。
break。
case26:
return00。
break。
case27:
return30。
break。
case28:
return30。
break。
/*d到罗源一天的发车时间分钟段*/
}
}/*开车时间段*/
voidwap(intk)
{
switch(k)
{
case1:
printf("闽清")。
break。
case2:
printf("长乐")。
break。
case3:
printf("连江")。
break。
case4:
printf("永泰")。
break。
case5:
printf("福清")。
break。
case6:
printf("罗源")。
break。
}
}/*输入终点站的函数*/
intshijian()
{
structtm*ptr。
time_tlt。
lt=time(NULL)。
ptr=gmtime(<)。
printf(ctime(<))。
return0。
}/*输出当前时间的函数*/
floattimes(intk)
{
floatt。
if(k==1)
t=1.5。
if(k==2)
t=3.0。
if(k==3||k==4)
t=4.0。
if(k==5||k==6)
t=4.5。
returnt。
}/*输入行车时间的函数*/
intnumber(intk)
{
intf。
if(k==1||k==2)
f=30。
if(k==3||k==4)
f=40。
if(k==5||k==6)
f=45。
returnf。
}/*输入最大载客量的函数*/
intnownumber(intk,inti)
{
intn=0。
charfilename[10]。
switch(i)
{
case1:
strcpy(filename,"qiu1.txt")。
break。
case2:
strcpy(filename,"qiu2.txt")。
break。
case3:
strcpy(filename,"qiu3.txt")。
break。
case4:
strcpy(filename,"qiu4.txt")。
break。
case5:
strcpy(filename,"qiu5.txt")。
break。
case6:
strcpy(filename,"qiu6.txt")。
break。
case7:
strcpy(filename,"qiu7.txt")。
break。
case8:
strcpy(filename,"qiu8.txt")。
break。
case9:
strcpy(filename,"qiu9.txt")。
break。
case10:
strcpy(filename,"qiu10.txt")。
break。
case11:
strcpy(filename,"qiu11.txt")。
break。
case12:
strcpy(filename,"qiu12.txt")。
break。
case13:
strcpy(filename,"qiu13.txt")。
break。
case14:
strcpy(filename,"qiu14.txt")。
break。
case15:
strcpy(filename,"qiu15.txt")。
break。
case16:
strcpy(filename,"qiu16.txt")。
break。
case17:
strcpy(filename,"qiu17.txt")。
break。
case18:
strcpy(filename,"qiu18.txt")。
break。
case19:
strcpy(filename,"qiu19.txt")。
break。
case20:
strcpy(filename,"qiu20.txt")。
break。
case21:
strcpy(filename,"qiu21.txt")。
break。
case22:
strcpy(filename,"qiu22.txt")。
break。