C语言版--火车站售票系统报告_第1页
C语言版--火车站售票系统报告_第2页
C语言版--火车站售票系统报告_第3页
C语言版--火车站售票系统报告_第4页
C语言版--火车站售票系统报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言大作业设计说明书 - 火车站售票系统学 号:姓 名:班 级:指导教师:2008年6月23日- 6 月27日目录第一章课程认识第二章课题选择第三章总体设计与分析第四章模块详细设计第五章主要实现方法第六章课程设计总结第七章结论第八章建议一、课程的性质、任务、目的 C语言是非常优秀的程序设计语言,应用广泛,是高校计算机专业的一门专业基础课程;学好C语言,是学习计算机专业课程和用好计算机的重要基础。要学好C语言,应抓好理论学习、上机实验以及综合应用这三个环节。在C程序设计课程的学习中,学生在掌握C语言理论知识的同时,通过上机实验完成一定量的实践性题目,初步掌握了程序设计的基本思想、基本概念和基本

2、方法。本课程是计算机专业的学生在完成了C程序设计课程的学习后,为加强学生对程序设计思想的理解、通过解决有一定代表性的小型综合应用类课题从而提高实际编程能力而设置的一门实践性课程。本课程为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机地结合起来,培养和锻炼学生分工协作、分析和解决实际问题并利用计算机求解问题的能力,以提高学生适应实际,实践编程的能力,从而掌握基本的程序设计过程和技巧,具备初步的高级语言程序设计和调试能力。二、课题选择(背景、意义、实用性);背景:现今,人们的生活水平渐渐改善,生活质量也随之提高,人们的精神需求也大了,应此,出行旅游,或是走访亲友成了习以为

3、常的事了,出行已成为现代人的家常便饭,汽车,火车,飞机等交通工具为我们提供了更多的方便。然而在售票中,就需要一个售票系统来帮助售票员来更为快捷,高效,方便的售票,同时也为了车站方面更好的管理票务,因此,一个好的车票管理系统就必不可少了。意义:选择车站售票系统作为课程设计的课题,就车站的售票流程等进一步了解车站的售票系统的原理。在编程过程中能力培养我们团结协作和项目管理能力:设计任务分配和模块划分、参考资料共享、系统基本信息的建立与共享、作业中技术难题的讨论与实验、系统的联合调试、文档资料的建立与维护。自学能力和文献查阅能力项目开发基本流程理解、规划和实施。程序调试能力:程序开发中常用的单步调试

4、、断点设置、中间结果输出等。项目测试能力:掌握基本的测试要素,能完成单体测试和综合测试过程。良好的编程风格:代码缩进书写,合理划分子程序,为程序添加必要的注释以方便程序阅读和维护,采用菜单、图形或各种提示说明方便用户使用程序。实用性:火车站售票系统。随着列车的再次提速,车次也明显增加,新开路线增多,因此票务也变得越来越复杂,而一个便捷,高效的票务管理系统就必不可少了。三、总体设计与分析(总体框架图及简要功能说明);就我们的程序来说,总体框架图如下:退出火车站售票系统管理员售票员修改列车信息删除已无列车信息修改管理员密码售票换票退票修改售票员密码添加新增列车信息退出系统上图就是简易的结构图,先制

5、作一个主菜单,进入售票系统的主页面,上面的出现选择菜单,可以根据你输入的字符来选择进入那个部分,分别为管理员与售票员两种,另外,不管是管理员还是售票员,都有一个退出的选择,对于现实生活中的情况,由于在操作时的随意性很大,退出选项并不是退出系统,而是退回到主菜单,则又可以进行选择输入,也可以从管理跳到售票员,而这样就具有人性化了,在管理员修改资料库后必须要检查,所以就要进入售票系统,检查票务是否已经修改或删除完成,在主菜单中可以自由选择。在售票员的系统中又分类进行,划分了五个模块,有售票,换票,还有退票,最后一个就是退出了,可以退到主菜单,在售票中每次都会可以退到售票员。四、模块详细设计(流程图

6、+说明+承担任务);售票员的总体框架图如下:售票员售票选择1换票选择2退出选择5退票选择3修改密码选择4主菜单说明:售票员的程序中也包括了五个部分,分为售票,退票,换票和修改密码以及退出操作,前面的四个部分是基本操作,能够对原文件进行操作的程序,同样是退到主菜单的操作,每次基本操作玩了之后,又会自动转到售票员的主页面去,而退出和以上的管理员的是一样的,自动退到主菜单。下面主要介绍的是售票员的部分。五、主要实现方法(结构体、文件、函数、指针、主要程序段);程序中用到的结构体如下:struct trianchar name10;char qs20;char zd20;char date20;cha

7、r time120;char time220;int price;int num; triN,ticketN;说明:在结构体中triN,ticketN;由于一组两个人的分工不一样,所以在编程时由于喜好不一样就用了两个不一样的结构体变量,在拼凑时,由于用到的地方很多,难以逐个修改,应此就在定义结构体变量时,引用了两个不一样的变量,不过他们承载的功能是一样的,只是形式不一样而已。再来观察结构体,在结构体中定义了出发地,目的地,日期,出发时刻,到达时刻,还有价格,另外,为了高效便捷的记录下票的张数,以及座位号码,而座位号码又是根据票的张数来排的,这样有减少了计算机的工作量又简捷。文件:D:票.txt

8、D:密码.txtD:secret.txt 说明:在程序运行中总共会用得到以上三个文件,第一个是要调用的票务文件,里面总共包括了所有的票务信息,无论是在管理员还是售票员的程序里,自始至终都要用到这个文件,在管理员中,有对列车信息的修改,删除和新增,这些的变化都得在写进总的票务文件,要覆盖掉原来的文件,以保证售票员的买票有效正常。在售票员的程序里,一直是用的票务文件,由于售票员的业务会比较多,差不多票务文件每时每刻都在被修改,所以每次修改后都要被保存到该文件中。“密码”文件:该文件用于存放管理员的密码,在第一次运行中程序时必须要先初始化一个密码,这样才能进入管理员的界面,在才能进入票务文件。在密码

9、的修改中每次修改密码后都必须把新的密码写入密码文件,否则在下次打开时还是原始的密码,而修改的并不能成功。详细见后面程序说明,简言之,就是存放管理员的的密码的文件。“secret”文件:该文见与密码文件是差不多的,它是用看来保存售票员的密码的,在程序初始化的时候也必须写入一个初始化的密码,在使用过程中如果要修改密码,则该文件就是用来保存密码的,当要换新的密码时,由于在后面程序中有相关操作,会自动将要换的密码写进secret文件,并自动将原文件覆盖掉, 从而再次进入 售票员的界面时则要输入的密码会修改成功,原来的密码就不能在用了,会有系统提示“密码输入有误! ”。主要函数:(1)main函数:vo

10、id main()output();int n,t=0;while (t=0)printf(*车站售票系统*n);printf(*请选择用户类型*n1管理员 2售票员 3退出n);scanf(%d,&n);system(cls);switch(n)case 1:guanliyuan();break;case 2: shoupiaoyuan();break;case 3: t=1;break;default: printf(输入错误!n);说明: main函数,主要是编辑了主菜单,有三个选择,会出现选择来让使用人进入那个部分,有管理员和售票员两个,还有一个退出选项,使用了switch语句进行操作

11、,先假定一个变量t,因为存在输入错误的可能,只有当预设条件不成立时才会跳出循环,所以假设t初始值为0,只有当条件成立时才能继续执行,即t=0时;当输入错误的时候,则将t的值重新赋值给1,则引起条件改变,跳出循环。因此,一个主菜单就完成了。(2)shoupiaoyuan函数void shoupiaoyuan()char key128,key1128,id1128,id128=2; FILE *fp;/*fp=fopen(D:secret.txt,wb);/第一次输入售票员密码,并将密码写进文if(fp=NULL)文件printf(Open Error!n);return;char s128=2;

12、fprintf(fp,%s,s);fclose(fp);*/即初始化密码,也可用于一键还原。fp=fopen(D: secret.txt,rb);if(fp=NULL)printf(Open Error!n);return; fscanf(fp,%s,key);int flag=1;int n,i=0;printf(ttt*售票员*n);printf(请输入工号:);scanf(%s,id1);printf(请输入密码:);while(1)/密码出入处理,出入字符,输出“*”号key1i=getch();if(key1i=13)break;putchar(*);i+;key1i=0;print

13、f(n);system(cls);/输入密码清屏一次if (strcmp(id1,id)=0&strcmp(key1,key)=0)printf(ttt*welcome*n);while(flag=1)/ flag标记,用于实现循环printf(请选择操作:n1售票n2换票n3退票n4修改工作密码n5退出n);scanf(%d,&n);switch(n)case 1:sell();break;case 2: change();break;case 3: back();break;case 4: secret();break;case 5: flag=0;break;default:printf

14、(输入错误,请重新输入!n);else printf(登陆错误,前重新输入!n);system(cls);fclose(fp);说明:在第一个被取消掉的部分就是密码的初始化程序,同时也用了switch函数,进行了函数选择运行的工作,下一部分中,从secret的文件中读出原始密码,在提示语后输入字符后就进行与原密码的比对,如果相符就可以进如下一步操作,不相符的话就输出“登陆错误,请重新输入!”,在售票员的主界面中也有选择操作,再次运用了switch语句,就不做过多的介绍了。(3)sell函数-售票函数void sell()time_t now;now=time(NULL);char s1128,

15、s2128,s3128,s4128;char a;FILE *fp;int i,len,t,n,m=1;fp=fopen(D: 票.txt,rb); if(fp=NULL)printf(Open Error!n);return;for(i=0;!feof(fp);i+)/读取文件信息,逐条读出,当没有时结束fread(&ticketi,sizeof(struct trian),1,fp);len=i-1; printf(请输入出发地(全拼):);scanf(%s,s1);printf(请输入目的地(全拼):);scanf(%s,s2);for(i=0;ilen;i+) 当输入的字符串符合条件的

16、话则输出符合的条件的语句if(strcmp(ticketi.qs,s1)=0&strcmp(ticketi.zd,s2)=0)printf(%-10s %-10s %-10s %-10s %-10s %-10s %3dn,,ticketi.qs,ticketi.zd,ticketi.date,ticketi.time1,ticketi.time2,ticketi.price);/ /m=0; 定义一个m,作为标记,用来判断输入的字符串在 文件中是否能够找得到,只要能够找的到,就让m 等于0(上面定义里m=1),到下面if里面只要mif(m!=0) 不为0,就说明没找到,

17、否则,就是输入正确的,则继续,m继续赋值为1,用于下一个部分输入的判printf(输入错误!n);断printf(按任意键继续.);a=getche();system(cls); /当输入错误时,要重新输入,则清屏一次return;m=1;printf(请输入所需票的日期:);scanf(%s,s3);for(i=0;ilen;i+)if(strcmp(ticketi.qs,s1)=0&strcmp(ticketi.zd,s2)=0&strcmp(ticketi.date,s3)=0)printf(%-10s %-10s %-10s %-10s %-10s %-10s %3dn,ticketi

18、.name,ticketi.qs,ticketi.zd,ticketi.date,ticketi.time1,ticketi.time2,ticketi.price); m=0; 上一次的判断结束后,m又赋值了给1if(m!=0)/同上的判断一样,利用了变量m值得的变化printf(输入错误!n);printf(按任意键继续.);a=getche();return;m=1;printf(请输入车次:); scanf(%s,s4); printf(请输入买的票的张数:);scanf(%d,&n);for(i=0;ilen;i+)if(strcmp(ticketi.qs,s1)=0&strcmp(

19、ticketi.zd,s2)=0&strcmp(ticketi.date,s3)=0&strcmp(,s4)=0) /买票成功了,则文件中的票的数据要更改,ticketi.num=ticketi.num-n; 票的张数要减去卖出的张数,程序结束t=i; 时将剩余张数再次写进文件m=0; if(strcmp(,s4)!=0) / 每输入一次就判断输入的是否正确,以提高效率printf(输入错误!n);printf(按任意键继续.);a=getche();return;for(i=0;in;i+)printf(%-10s %-10s %-10s %-

20、10s %-10s %-10s %3d %3dn,,tickett.qs,tickett.zd,tickett.date,tickett.time1,tickett.time2,tickett.price,tickett.num+n-i); /该条语句为将票有打印机打印出来的顺序,最后将座位号,时间也打印在票上printf(%sn,ctime(&now); printf(该票剩余数:%2dn,tickett.num);if(tickett.num0)printf(无票! n);/如果读出的剩下的票的张数小于0 时,则输else 出无票printf(恭喜,购票成功! n)

21、;printf(按任意键继续.);a=getche();system(cls);/售完一次票清屏一次fclose(fp);fp=fopen(D: 票.txt,wb);for(i=0;ilen;i+)fwrite(&ticketi,sizeof(struct trian),1,fp);fclose(fp);说明:首先,打开票务文件,在进入买票的界面后,可以输入出发地和目的地,输入后则判断一次,看在文件中是否能够找的到,在判断中用m变量来实现,具体见程序旁说明,如果过输入不正确则重新输入,输入正确则继续输入下一条字符串,当输入的全部正确的话则将此票在文件中的num减去售出的张数,在打出票时,用循环

22、来实现,座位号要按顺序排下去,则用tickett.num+n-i实现,先还原到原始票的张数,在由于i是从0 开始增加的,就加上i,则可以 打出座位号了,买了几张就打几张票出来,在打出的票上标有出发地,目的地,日期,出发时刻,到达时刻,票价,时间和座位号。(4)back函数-退票函数void back()char s1128,s2128,s3128,s4128;char a;int i,len,t,n,m=1;double money;FILE *fp;/售票员的操作,都是对文件的操作,应此每次都要fp=fopen(D: 票.txt,rb); 先打开文件if(fp=NULL)printf(Ope

23、n Error!n);return;for(i=0;!feof(fp);i+)fread(&ticketi,sizeof(struct trian),1,fp);len=i-1;printf(请输入要退的票的出发地(全拼):);scanf(%s,s1);printf(请输入要退的票的目的地(全拼):);scanf(%s,s2);for(i=0;ilen;i+)if(strcmp(ticketi.qs,s1)=0&strcmp(ticketi.zd,s2)=0)m=0;if(m!=0)/同样对输入的字符串在文件中查找判断。用m来标记printf(输入错误!n);printf(按任意键继续.);a

24、=getche();system(cls);return;m=1;printf(请输入所退的票的日期:);scanf(%s,s3);for(i=0;ilen;i+)if(strcmp(ticketi.qs,s1)=0&strcmp(ticketi.zd,s2)=0&strcmp(ticketi.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

25、=0;ilen;i+)if(strcmp(ticketi.qs,s1)=0&strcmp(ticketi.zd,s2)=0&strcmp(ticketi.date,s3)=0&strcmp(,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;ilen;i+)if(strcmp(ticketi.qs,s1)=0&strcmp(ticketi.z

26、d,s2)=0&strcmp(ticketi.date,s3)=0&strcmp(,s4)=0)ticketi.num=ticketi.num+n;/printf(%d,ticketi.num);printf(333);t=i;money=tickett.price*0.8;/由于存在乘以80%,所printf(请返回顾客 %f 元n,money*n); 以票价要定义double型m=0;if(m!=0) /同样用m来标记,实现下面的判断功能printf(输入错误!n);printf(按任意键继续.);a=getche();system(cls);return;m=1;

27、/m重新赋值给1用于下一次的判断fclose(fp);fp=fopen(D: 票.txt,wb);/再次打开文件对已改变的文件进行保存for(i=0;ilen;i+)fwrite(&ticketi,sizeof(struct trian),1,fp);fclose(fp);printf(退票成功!n按任意键继续.);a=getche();system(cls);/清屏一次自动退出退票系统,进入售票员主界面(5)change函数-换票函数换票函数:即为售票函数与退票函数的集合,换票就是先退票在买票,具体请看sell函数和back函数。(6)secret函数-修改密码函数void secret()

28、system(cls);/ 进入密码修改清屏一下,直接出现输入提示语char a ;FILE *fp3;fp3=fopen(D: secret.txt,rb); /先读取存放原密码的文件if(fp3=NULL) /正常打开printf(Open Error!n);return;char key128,key1128,newpass1128,newpass2128; fscanf(fp3,%s,key);fclose(fp3);printf(请输入原始密码:);inti=0;while(1)/实现输入字符而输出“*”号key1i=getch();if(key1i=13)break;putchar

29、(*);i+;key1i=0;printf(n);if(strcmp(key1,key)=0)do/一直运行至至条件不符合printf(请输入新密码:);/第一次输入密码i=0;while(1) /实现“*”号输出,不显示字符以提newpass1i=getch();高安全性if(newpass1i=13)break;putchar(*);i+;newpass1i=0;printf(n); printf(请再次输入新密码:);/第二次输入密码i=0;while(1)newpass2i=getch();if(newpass2i=13)break;putchar(*);i+;newpass2i=0;

30、printf(n);if(strcmp(newpass1,newpass2)!=0)/两次的进行比较,如果两次的不一样,则不能正确修改,也不知道是第一次还是第二次输入错误,则可以重新输入printf(两次不符,请重新更改:);printf(按任意键继续.);a=getche();system(cls);while(strcmp(newpass1,newpass2)!=0);/只有当两次输入完全一printf(恭喜,密码修改成功!n); 样系统才会自动覆盖printf(按任意键继续.); 原始secret文件a=getche();system(cls);fclose(fp3);fp3=fopen

31、(D: secret.txt,wb);/将新改的密码写入secret文件fprintf(fp3,%s,newpass1);fclose(fp3);elseprintf(密码错误!n);说明:在密码修改程序中,需要先输入的密码与原密码,如果正确了才能进入修改程序,才会出现修改提示,你的新密码必须连续输入两次,且两次都必须一样才能修改成功,而不管是第一次输入有误还是第二次有误,修改成功的密码会被写入secret文件被保存,用于下一次的登录,下次登录时用的就是新密码了。六、课程设计总结(问题及解决、实现情况、评价、存在问题及改进思路);问题及解决:在开始时写售票程序的时候,首先并没又想到座位号的问题

32、,因此在优化的过程中有增加了座位号的输出,巧妙地利用了票的剩余张数来作为座位号。在开始时从机房拷回家后总是不能运行,后来发现是文件打开的途径不对,经过几次的教训,就把途径不变,把票文件,密码文件,secret文件写到了D盘根目录里去,省去了很多不必要的工作量。在修改密码时老是不能把新密码写入文件,结果改过来还是不能运行,经过仔细的查看程序发现了问题,最终增加了写入文件。还有在写程序的过程中,每次都会遇到打开文件,则我们会用复制粘贴,而忘记了更改读或写的方式,因此在每次复制粘贴之后必须看一下有没有要更改的,有的话一定要及时更改过来,不然到最后程序大了,则会增加工作量。实现情况:在函数的实现过程中,没有遇到很多的问题,只是屏幕上显示的语句太多,因此学会了用清屏语句,system(“cls”)语句,在每次的一个操作结束后,则可以清一次屏,是界面看起来更加的简洁明了。另外,在刚开始在主函数中无法实现功能的选择,通过讲解,学会了使用switch

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论