C语言版火车站售票系统报告及代码解析.docx
- 文档编号:12357940
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:23
- 大小:87.68KB
C语言版火车站售票系统报告及代码解析.docx
《C语言版火车站售票系统报告及代码解析.docx》由会员分享,可在线阅读,更多相关《C语言版火车站售票系统报告及代码解析.docx(23页珍藏版)》请在冰豆网上搜索。
C语言版火车站售票系统报告及代码解析
《C语言大作业》设计说明书
---火车站售票系统
学号:
08030337
姓名:
朱陈立
班级:
08软件
指导教师:
曹中心
2008年6月23日--6月27日
目录
第一章——————————————课程认识
第二章——————————————课题选择
第三章———————————总体设计与分析
第四章————————————模块详细设计
第五章————————————主要实现方法
第六章————————————课程设计总结
第七章————————————————结论
第八章————————————————建议
一、课程的性质、任务、目的
C语言是非常优秀的程序设计语言,应用广泛,是高校计算机专业的一门专业基础课程;学好C语言,是学习计算机专业课程和用好计算机的重要基础。
要学好C语言,应抓好理论学习、上机实验以及综合应用这三个环节。
在《C程序设计》课程的学习中,学生在掌握C语言理论知识的同时,通过上机实验完成一定量的实践性题目,初步掌握了程序设计的基本思想、基本概念和基本方法。
本课程是计算机专业的学生在完成了《C程序设计》课程的学习后,为加强学生对程序设计思想的理解、通过解决有一定代表性的小型综合应用类课题从而提高实际编程能力而设置的一门实践性课程。
本课程为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机地结合起来,培养和锻炼学生分工协作、分析和解决实际问题并利用计算机求解问题的能力,以提高学生适应实际,实践编程的能力,从而掌握基本的程序设计过程和技巧,具备初步的高级语言程序设计和调试能力。
二、课题选择(背景、意义、实用性……);
背景:
现今,人们的生活水平渐渐改善,生活质量也随之提高,人们的精神需求也大了,应此,出行旅游,或是走访亲友成了习以为常的事了,出行已成为现代人的家常便饭,汽车,火车,飞机等交通工具为我们提供了更多的方便。
然而在售票中,就需要一个售票系统来帮助售票员来更为快捷,高效,方便的售票,同时也为了车站方面更好的管理票务,因此,一个好的车票管理系统就必不可少了。
意义:
选择车站售票系统作为课程设计的课题,就车站的售票流程等进一步了解车站的售票系统的原理。
在编程过程中能力培养我们团结协作和项目管理能力:
设计任务分配和模块划分、参考资料共享、系统基本信息的建立与共享、作业中技术难题的讨论与实验、系统的联合调试、文档资料的建立与维护。
自学能力和文献查阅能力项目开发基本流程理解、规划和实施。
程序调试能力:
程序开发中常用的单步调试、断点设置、中间结果输出等。
项目测试能力:
掌握基本的测试要素,能完成单体测试和综合测试过程。
良好的编程风格:
代码缩进书写,合理划分子程序,为程序添加必要的注释以方便程序阅读和维护,采用菜单、图形或各种提示说明方便用户使用程序。
实用性:
火车站售票系统。
随着列车的再次提速,车次也明显增加,新开路线增多,因此票务也变得越来越复杂,而一个便捷,高效的票务管理系统就必不可少了。
三、总体设计与分析(总体框架图及简要功能说明);
就我们的程序来说,总体框架图
如下:
上图就是简易的结构图,先制作一个主菜单,进入售票系统的主页面,上面的出现选择菜单,可以根据你输入的字符来选择进入那个部分,分别为管理员与售票员两种,另外,不管是管理员还是售票员,都有一个退出的选择,对于现实生活中的情况,由于在操作时的随意性很大,退出选项并不是退出系统,而是退回到主菜单,则又可以进行选择输入,也可以从管理跳到售票员,而这样就具有人性化了,在管理员修改资料库后必须要检查,所以就要进入售票系统,检查票务是否已经修改或删除完成,在主菜单中可以自由选择。
在售票员的系统中又分类进行,划分了五个模块,有售票,换票,还有退票,最后一个就是退出了,可以退到主菜单,在售票中每次都会可以退到售票员。
四、模块详细设计(流程图+说明+承担任务);
售票员的总体框架图如下:
说明:
售票员的程序中也包括了五个部分,分为售票,退票,换票和修改密码以及退出操作,前面的四个部分是基本操作,能够对原文件进行操作的程序,同样是退到主菜单的操作,每次基本操作玩了之后,又会自动转到售票员的主页面去,而退出和以上的管理员的是一样的,自动退到主菜单。
下面主要介绍的是售票员的部分。
五、主要实现方法(结构体、文件、函数、指针、主要程序段……);
程序中用到的结构体如下:
structtrian
{
charname[10];
charqs[20];
charzd[20];
chardate[20];
chartime1[20];
chartime2[20];
intprice;
intnum;
}tri[N],ticket[N];
说明:
在结构体中tri[N],ticket[N];由于一组两个人的分工不一样,所以在编程时由于喜好不一样就用了两个不一样的结构体变量,在拼凑时,由于用到的地方很多,难以逐个修改,应此就在定义结构体变量时,引用了两个不一样的变量,不过他们承载的功能是一样的,只是形式不一样而已。
再来观察结构体,在结构体中定义了出发地,目的地,日期,出发时刻,到达时刻,还有价格,另外,为了高效便捷的记录下票的张数,以及座位号码,而座位号码又是根据票的张数来排的,这样有减少了计算机的工作量又简捷。
文件:
D:
\\票.txt
D:
\\密码.txt
D:
\\secret.txt
说明:
在程序运行中总共会用得到以上三个文件,第一个是要调用的票务文件,里面总共包括了所有的票务信息,无论是在管理员还是售票员的程序里,自始至终都要用到这个文件,在管理员中,有对列车信息的修改,删除和新增,这些的变化都得在写进总的票务文件,要覆盖掉原来的文件,以保证售票员的买票有效正常。
在售票员的程序里,一直是用的票务文件,由于售票员的业务会比较多,差不多票务文件每时每刻都在被修改,所以每次修改后都要被保存到该文件中。
“密码”文件:
该文件用于存放管理员的密码,在第一次运行中程序时必须要先初始化一个密码,这样才能进入管理员的界面,在才能进入票务文件。
在密码的修改中每次修改密码后都必须把新的密码写入密码文件,否则在下次打开时还是原始的密码,而修改的并不能成功。
详细见后面程序说明,简言之,就是存放管理员的的密码的文件。
“secret”文件:
该文见与密码文件是差不多的,它是用看来保存售票员的密码的,在程序初始化的时候也必须写入一个初始化的密码,在使用过程中如果要修改密码,则该文件就是用来保存密码的,当要换新的密码时,由于在后面程序中有相关操作,会自动将要换的密码写进secret文件,并自动将原文件覆盖掉,从而再次进入售票员的界面时则要输入的密码会修改成功,原来的密码就不能在用了,会有系统提示“密码输入有误!
”。
主要函数:
(1)main函数:
voidmain()
{
output();
intn,t=0;
while(t==0)
{
printf("************************车站售票系统************************\n");
printf("**********************请选择用户类型***********************\n1管理员2售票员3退出\n");
scanf("%d",&n);
system("cls");
switch(n)
{
case1:
guanliyuan();break;
case2:
shoupiaoyuan();break;
case3:
t=1;break;
default:
printf("输入错误!
!
!
\n");
}
}
}
说明:
main函数,主要是编辑了主菜单,有三个选择,会出现选择来让使用人进入那个部分,有管理员和售票员两个,还有一个退出选项,使用了switch语句进行操作,先假定一个变量t,因为存在输入错误的可能,只有当预设条件不成立时才会跳出循环,所以假设t初始值为0,只有当条件成立时才能继续执行,即t=0时;当输入错误的时候,则将t的值重新赋值给1,则引起条件改变,跳出循环。
因此,一个主菜单就完成了。
(2)shoupiaoyuan函数
voidshoupiaoyuan()
{
charkey[128],key1[128],id1[128],id[128]="2";
FILE*fp;
/*fp=fopen("D:
\\secret.txt","wb");//////第一次输入售票员密码,并将密码写进文
if(fp==NULL)文件
{
printf("OpenError!
\n");
return;
}
chars[128]="2";
fprintf(fp,"%s",s);
fclose(fp);
*////////////即初始化密码,也可用于一键还原。
fp=fopen("D:
\\secret.txt","rb");
if(fp==NULL)
{
printf("OpenError!
\n");
return;
}
fscanf(fp,"%s",key);
intflag=1;
intn,i=0;
printf("\t\t\t*********售票员*********\n");
printf("请输入工号:
");
scanf("%s",id1);
printf("请输入密码:
");
while
(1)//////////////////////////////////密码出入处理,出入字符,输出“*”号
{
key1[i]=getch();
if(key1[i]==13)
break;
putchar('*');
i++;
}
key1[i]='\0';
printf("\n");
system("cls");/////////////////////////////输入密码清屏一次
if(strcmp(id1,id)==0&&strcmp(key1,key)==0)
{
printf("\t\t\t***********welcome*********\n");
while(flag==1)///////////flag标记,用于实现循环
{
printf("请选择操作:
\n1售票\n2换票\n3退票\n4修改工作密码\n5退出\n");
scanf("%d",&n);
switch(n)
{
case1:
sell();break;
case2:
change();break;
case3:
back();break;
case4:
secret();break;
case5:
flag=0;break;
default:
printf("输入错误,请重新输入!
\n");
}
}
}
else
printf("登陆错误,前重新输入!
\n");
system("cls");
fclose(fp);
}
说明:
在第一个被取消掉的部分就是密码的初始化程序,同时也用了switch函数,进行了函数选择运行的工作,下一部分中,从secret的文件中读出原始密码,在提示语后输入字符后就进行与原密码的比对,如果相符就可以进如下一步操作,不相符的话就输出“登陆错误,请重新输入!
”,在售票员的主界面中也有选择操作,再次运用了switch语句,就不做过多的介绍了。
(3)sell函数-----售票函数
voidsell()
{
time_tnow;
now=time(NULL);
chars1[128],s2[128],s3[128],s4[128];
chara;
FILE*fp;
inti,len,t,n,m=1;
fp=fopen("D:
\\票.txt","rb");
if(fp==NULL)
{
printf("OpenError!
\n");
return;
}
for(i=0;!
feof(fp);i++)////////读取文件信息,逐条读出,当没有时结束
fread(&ticket[i],sizeof(structtrian),1,fp);
len=i-1;
printf("请输入出发地(全拼):
");
scanf("%s",s1);
printf("请输入目的地(全拼):
");
scanf("%s",s2);
for(i=0;i {当输入的字符串符合条件的话则输出符合的条件的语句 if(strcmp(ticket[i].qs,s1)==0&&strcmp(ticket[i].zd,s2)==0) {printf("%-10s%-10s%-10s%-10s%-10s%-10s%3d\n",ticket[i].name,ticket[i].qs,ticket[i].zd,ticket[i].date,ticket[i].time1,ticket[i].time2,ticket[i].price);/////// m=0;定义一个m,作为标记,用来判断输入的字符串在 }文件中是否能够找得到,只要能够找的到,就让m }等于0(上面定义里m=1),到下面if里面只要m if(m! =0)不为0,就说明没找到,否则,就是输入正确的,则 {继续,m继续赋值为1,用于下一个部分输入的判 printf("输入错误! \n");断 printf("按任意键继续................"); a=getche(); system("cls");////////////当输入错误时,要重新输入,则清屏一次 return; }m=1; printf("请输入所需票的日期: "); scanf("%s",s3); for(i=0;i { if(strcmp(ticket[i].qs,s1)==0&&strcmp(ticket[i].zd,s2)==0&&strcmp(ticket[i].date,s3)==0) {printf("%-10s%-10s%-10s%-10s%-10s%-10s%3d\n",ticket[i].name,ticket[i].qs,ticket[i].zd,ticket[i].date,ticket[i].time1,ticket[i].time2,ticket[i].price); m=0;}上一次的判断结束后,m又赋值了给1 } if(m! =0)//////////////同上的判断一样,利用了变量m值得的变化 { printf("输入错误! \n"); printf("按任意键继续................"); a=getche(); return; } m=1; printf("请输入车次: "); scanf("%s",s4); printf("请输入买的票的张数: "); scanf("%d",&n); for(i=0;i { if(strcmp(ticket[i].qs,s1)==0&&strcmp(ticket[i].zd,s2)==0&&strcmp(ticket[i].date,s3)==0&&strcmp(ticket[i].name,s4)==0) {///////买票成功了,则文件中的票的数据要更改, ticket[i].num=ticket[i].num-n;票的张数要减去卖出的张数,程序结束 t=i;时将剩余张数再次写进文件 m=0; } } if(strcmp(ticket[t].name,s4)! =0) {/////////////每输入一次就判断输入的是否正确,以提高效率 printf("输入错误! \n"); printf("按任意键继续................"); a=getche(); return; } for(i=0;i { printf("%-10s%-10s%-10s%-10s%-10s%-10s%3d%3d\n",ticket[t].name,ticket[t].qs,ticket[t].zd,ticket[t].date,ticket[t].time1,ticket[t].time2,ticket[t].price,ticket[t].num+n-i); ///该条语句为将票有打印机打印出来的顺序,最后将座位号,时间也打印在票上 printf("%s\n",ctime(&now)); } printf("该票剩余数: %2d\n",ticket[t].num); if(ticket[t].num<0) printf("无票! \n");////////////如果读出的剩下的票的张数小于0时,则输 else出无票 printf("恭喜,购票成功! \n"); printf("按任意键继续................"); a=getche(); system("cls");/////////////////////////售完一次票清屏一次 fclose(fp); fp=fopen("D: \\票.txt","wb"); for(i=0;i fwrite(&ticket[i],sizeof(structtrian),1,fp); fclose(fp); } 说明: 首先,打开票务文件,在进入买票的界面后,可以输入出发地和目的地,输入后则判断一次,看在文件中是否能够找的到,在判断中用m变量来实现,具体见程序旁说明,如果过输入不正确则重新输入,输入正确则继续输入下一条字符串,当输入的全部正确的话则将此票在文件中的num减去售出的张数,在打出票时,用循环来实现,座位号要按顺序排下去,则用ticket[t].num+n-i实现,先还原到原始票的张数,在由于i是从0开始增加的,就加上i,则可以打出座位号了,买了几张就打几张票出来,在打出的票上标有出发地,目的地,日期,出发时刻,到达时刻,票价,时间和座位号。 (4)back函数-------退票函数 voidback() { chars1[128],s2[128],s3[128],s4[128];chara;inti,len,t,n,m=1;doublemoney; FILE*fp;////////////////售票员的操作,都是对文件的操作,应此每次都要 fp=fopen("D: \\票.txt","rb");先打开文件 if(fp==NULL) { printf("OpenError! \n"); return; } for(i=0;! feof(fp);i++) fread(&ticket[i],sizeof(structtrian),1,fp); len=i-1; printf("请输入要退的票的出发地(全拼): "); scanf("%s",s1); printf("请输入要退的票的目的地(全拼): "); scanf("%s",s2); for(i=0;i { if(strcmp(ticket[i].qs,s1)==0&&strcmp(ticket[i].zd,s2)==0) m=0; } if(m! =0)////////////同样对输入的字符串在文件中查找判断。 用m {来标记 printf("输入错误! \n"); printf("按任意键继续................"); a=getche(); system("cls"); return; } m=1; printf("请输入所退的票的日期: "); scanf("%s",s3); for(i=0;i { if(strcmp(ticket[i].qs,s1)==0&&strcmp(ticket[i].zd,s2)==0&&strcmp(ticket[i].date,s3)==0) m=0; } if(m! =0)////////////同样对输入的字符串再次在文件中更精确地查找判断。 用m {来标记 printf("输入错误! \n"); printf("按任意键继续................"); a=getche(); system("cls"); return; } m=1; printf("请输入车次: "); scanf("%s",s4); for(i=0;i { if(strcmp(ticket[i].qs,s1)==0&&strcmp(ticket[i].zd,s2)==0&&strcmp(ticket[i].date,s3)==0&&strcmp(ticket[i].name,s4)==0) m=0; } if(m! =0)///////同样用m来标记,实现下面的判断功能 { printf("输入错误! \n"); printf("按任意键继续................"); a=getche(); system("cls"); return; } m=1; printf("请输入退的票的张数: "); scanf("%d",&n); for(i=0;i { if(strcmp(ticket[i].qs,s1)==0&&strcmp(ticket[i].zd,s2)==0&&strcmp(ticket[i].date,s3)==0&&strcmp(ticket[i].name,s4)==0) { ticket[i].num=ticket[i].num+n;//printf("%d",ticket[i].num);printf("333"); t=i; money=ticket[t].price*0.8;//////由于存在乘以80%,所 printf("请返回顾客%f元\n",money*n);以票价要定义double型 m=0; } } if(m! =0)///////////////////同样用m来标记,实现下面的判断功能 { printf("输入错误! \n"); p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言版 火车站 售票 系统 报告 代码 解析