




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
火车订票管理系统假设有5条火车线路(起点均为济南),每条线路所涉及的信息有:终点站、车次、发车时间(年.月.日.时.分)、票价、余票数(假设火车总票数为300)。乘客订票信息包括:乘客姓名、乘客身份证号码、订票数,总票价。 本系统要求用结构体数组和链表实现,将火车线路信息存放在结构体数组中,每条线路对应一个链表,乘客订票就是在链表中插入结点,乘客退票就是在链表中删除结点。链表的结点类型和结构体类型定义如下:struct node/乘客订票信息 char name10; /乘客姓名 char IDcard20; /乘客身份证号码 int TicketNum; /订票数 float FareSum; /总票价 struct node *next; /指针成员;struct Dtime/发车时间 short year; short month; short day; short hour; short minute;struct train/线路 char terminal10; /终点站char sequence10; /车次struct Dtime StartTime; /发车时间float fare; /票价int SpareTicketNum; /余票数struct node *head; /指针成员,指向该线路第一个订票乘客;系统整体结构见图9.3所示。 系统的主要功能包括:1. 火车线路查询功能,乘客输入终点站名称或输入车次,输出相应的火车线路信息。2. 订票功能。乘客输入车次和订票数,先查询该车次的余票数,若余票数大于等于订票数,则为乘客办理订票手续,要求乘客输入姓名、身份证号码,计算出总票价,产生一个新结点,将该结点添加到对应车次的链表中,然后修改该车次的余票数。若余票数小于订票数,则输出提示信息余票数不足,订票失败!。3. 退票功能。乘客输入车次和身份证号码,在该车次对应的链表中查找该乘客,若找到,询问乘客退票数量,若退票数小于订票数,则只需修改结点的订票数;若退票数等于订票数,则将该乘客对应的结点删除,然后修改该车次的余票数;若没找到,则应提示未找到相应信息,要求乘客重新输入车次和身份证号码,再进行查找,如果仍未找到,则输出提示信息输入信息错误,退票失败!。 4. 其他查询功能。(1) 输入车次,输出该车次的全部订票信息。(2) 输入车次,输出该车次的订票数和余票数。(3) 输入终点站名称,输出相关火车线路的信息。(4) 输入日期(年.月.日),输出发车时间为该天的火车线路的信息。(5) 输出余票数为0的火车线路的信息。*/#include stdio.h#include string.h#include stdlib.h#include conio.h #include cstdlib#define SUM_TICKET 300; /车票总数#define PASS_N 5 /车次总数,对应这些个乘客文件/=/函数声明add_train(); /增加车次admin_passger(); /乘客管理admin_password(); /管理员密码管理admin_train(); /管理员权限:管理车次和乘客booking(); /订票checking(int n,char check20); /检查输入的省份证好是否符合规定的位数check_Date(int max,int min,int mn); /检查日期是否符合标准的格式else_find(); /其他查询功能find(); /查找功能mod_train(); /管理员权限:修改车次的信息print(); /从屏幕输出车次信息print_p(struct train *train_p1); /输出对应车次的全部乘客信息read(); /从文件中读取车次和乘客信息refund(); /退票功能void save(); /将车次和乘客信息保存到文件中/=/全局变量struct node *node_p1, *node_p2; /乘客struct train *head=NULL,*train_p1,*train_p2;/线路char admin20;int MaxTicket=300;struct node/乘客passengers订票信息 char name20; /乘客姓名char IDcard20; /乘客身份证号码int TicketNum; /订票数int FareSum; /总票价struct node *next; /指针成员;struct Dtime/发车时间 int year;int month;int day;int hour;int minute;struct train/线路 char terminal20; /终点站char sequence20; /车次struct Dtime *StartTime; /发车时间int fare;/票价int SpareTicketNum; /余票数int MaxTicket;/最大票数struct node *nhead; /指针成员,指向该线路第一个订票乘客struct train *next; /指针成员,指向下一条线路;/=/从文件中读取车次和乘客信息int read(void)/从文件读取信息system(color 1f); /设置控制台背景色FILE *fp,*pa,*ad; /打开文件,实例化三个文件结构体的指针int site_sum=0,sum_ch=0; /总站点int pass_sum5=0; /char ch;printf(n正在读取文件.n);/读取train.txt 文件名和文件路径/printf(n正在读取train.txt文件.n);/如果打不开也写不进,那就新建个if( (fp=( fopen(train.txt,r)=NULL )if( (fp=fopen(train.txt,w)=NULL ) printf(nCannot open the file: train.txt! nPlease confirm the file already exists!n); exit(0); /找不到文件train.txt,请确定train.txt的确存在。fclose(fp);head=NULL; /链表置为空NULL/如果车次源文件不存在,则新建空train文件elseif( (fp=fopen(train.txt,r+)=NULL ) putchar(10);/在控制台输出 10的ASSIC码,同 nfor(int i=0; i=0 )rewind(fp);while( !feof(fp) ) train_p1=(struct train *)malloc(sizeof(struct train); train_p1-nhead=NULL;train_p1-StartTime=(struct Dtime *)malloc(sizeof(struct Dtime); /开辟新节点fscanf(fp,%s%s%d%d%d%d%d%d%dn,train_p1-terminal,train_p1-sequence,&train_p1-StartTime-year,&train_p1-StartTime-month,&train_p1-StartTime-day,&train_p1-StartTime-hour,&train_p1-StartTime-minute,&train_p1-fare,&train_p1-SpareTicketNum);site_sum+;if(site_sum = 1) head=train_p1;else train_p2-next=train_p1;train_p2=train_p1;train_p2-next=NULL;/printf(n共有车次 %d 次!n,site_sum);fclose(fp);/print();/读取admin密码/printf(n正在读取密码文件.n);if( ( fopen(admin.txt,r)=NULL )if( (ad=fopen(admin.txt,w)=NULL ) putchar(10);for(int i=0; i50; i+)printf(%c,23); putchar(10);printf(Cannot open the file: admin.txt! nPlease confirm the file already exists!n); exit(0); strcpy(admin,admin);fprintf(ad,%s,admin); /文件指针,输出字符串,输出表列;将格式化的数据写入文件fclose(ad); /如果密码源文件不存在,则新建空admin.txt文件,初始密码:adminif( (ad=fopen(admin.txt,r)=NULL ) putchar(10);for(int i=0; i50; i+)printf(%c,23); putchar(10);printf(Cannot open the file: admin.txt! nPlease confirm the file already exists!n); exit(0); fscanf(ad,%s,admin); /printf(admin=%sn,admin);if( strcmp(admin,)=0 ) strcpy(admin,admin);fprintf(ad,%s,admin); fprintf(ad,%s,admin); / 如果密码为空,怎初始化为adminfclose(ad);/读取passenger.txt/printf(site=%dn,site_sum);/*/数字转换为字符串char passN20,cc2;/=for( i=0; isequence);/node_p1=train_p1-nhead;strcpy(pass,train_p1-sequence);strcat(pass,.txt);if( (pa=fopen(pass,r+)=NULL )if( (pa=fopen(pass,w)=NULL ) for(int i=0; i=0 )rewind(pa);while( !feof(pa) )node_p1=(struct node *)malloc(sizeof(struct node); node_p1-next=NULL;fscanf(pa,%s%s%d%dn,node_p1-name,node_p1-IDcard,&node_p1-TicketNum,&node_p1-FareSum);pass_sumj+;if( pass_sumj=1 ) train_p1-nhead=node_p1;else node_p2-next=node_p1;node_p2=node_p1;node_p2-next=NULL;fclose(pa);/printf( %dn,j);train_p1=train_p1-next;/=/*if( ( fopen(MaxTicket1.txt,r)=NULL )ad=fopen(MaxTicket1.txt,w); MaxTicket=300; fprintf(ad,%d,MaxTicket); fclose(ad); /printf(n正在读取文件MaxTicket.n);if( (fopen(MaxTicket.txt,r)=NULL ) ma=fopen(MaxTicket.txt,W); MaxTicket=300; printf(n MaxTicket=%dn,MaxTicket);fprintf(ma,%s,admin); else fscanf(ma,%d,&MaxTicket);fclose(ma);*/printf(n全部文件读取完毕!n);/=/从屏幕输出车次信息int print(void)/调试 :输出putchar(10); int i=1;if( (train_p1=head)=NULL ) /如果车次文件是空文件printf(没有任何车次!按任意键返回上一层n); getch(); return 0; /printf(终点站车次发车时间t票价t余票数nn);while( train_p1!=NULL )printf(%s%s%4d-%2d-%2d %2d:%2dtY%dt%dn,train_p1-terminal,train_p1-sequence,train_p1-StartTime-year,train_p1-StartTime-month,train_p1-StartTime-day,train_p1-StartTime-hour,train_p1-StartTime-minute,train_p1-fare,train_p1-SpareTicketNum);train_p1=train_p1-next;/printf(i=%dn,i); i+;return 1;/=/输出对应车次的全部乘客信息print_p(struct train *train_p1)/调试 :输出putchar(10); int i=1;if( (node_p1=train_p1-nhead)=NULL ) printf(该车次没有乘客!n);return 0;printf(车次t乘客姓名t乘客身份证号nn);while( node_p1!=NULL )printf(%st%stt%sn,train_p1-sequence,node_p1-name,node_p1-IDcard);node_p1=node_p1-next;return 0;/=find(void)/查询start_f:system( cls ); /清屏putchar(10);char sect_120=1;char terminal20; /终点站char sequence20; /车次/格式putchar(10);for(int i=0; i50; i+)printf(%c,23); printf(n 欢迎使用 火车票查询 系统 n);for(i=0; i50; i+)printf(%c,23);putchar(10);for(i=0; iterminal)!=0 & train_p1-next!=NULL ) train_p1=train_p1-next; if( strcmp(terminal,train_p1-terminal)=0 ) printf(n终点站车次发车时间t票价t余票数n);printf(%s%s%4d-%2d-%2d %2d:%2dtY%dt%dn,train_p1-terminal,train_p1-sequence,train_p1-StartTime-year,train_p1-StartTime-month,train_p1-StartTime-day,train_p1-StartTime-hour,train_p1-StartTime-minute,train_p1-fare,train_p1-SpareTicketNum);else printf(n没有查询到!n);printf(n-);putchar(10);printf(n); printf( 请选择您所需的操作 n); printf( 1.继续查询 n); printf( 2.返回上一层 n); printf( 3.退出 n); printf(n); printf(n请输入: );scanf(%s,§_1);if( strcmp(sect_1,1)=0 ) goto start_f1;else if( strcmp(sect_1,2)=0 ) goto start_f;else if( strcmp(sect_1,3)=0 ) exit(0);else return 0;else if(strcmp(sect_1,2)=0) start_f2:if( (train_p1=head)=NULL ) /如果车次文件是空文件printf(没有任何车次!按任意键返回上一层n); getch(); goto start_f; printf(请输入车次:); scanf(%s,sequence); while( strcmp(sequence,train_p1-sequence)!=0 & train_p1-next!=NULL ) train_p1=train_p1-next; if( strcmp(sequence,train_p1-sequence)=0)printf(n终点站车次发车时间t票价t余票数n);printf(%s%s%4d-%2d-%2d %2d:%2dtY%dt%dn,train_p1-terminal,train_p1-sequence,train_p1-StartTime-year,train_p1-StartTime-month,train_p1-StartTime-day,train_p1-StartTime-hour,train_p1-StartTime-minute,train_p1-fare,train_p1-SpareTicketNum);else printf(n没有查询到!n);printf(n-);putchar(10);printf(n); printf( 请选择您所需的操作 n); printf( 1.继续查询 n); printf( 2.返回上一层 n); printf( 3.退出 n); printf(n); printf(n请输入: );scanf(%s,§_1);if( strcmp(sect_1,1)=0 ) goto start_f2;else if( strcmp(sect_1,2)=0 ) goto start_f;else if( strcmp(sect_1,3)=0 ) exit(0);else return 0;else if(strcmp(sect_1,3)=0) return 0;else if(strcmp(sect_1,4)=0) exit(0);else printf(请输入正确的选择!n按任意键继续); getch(); goto start_f;/=/订票booking() start_b:read();system( cls ); /清屏putchar(10);char sequence10; /车次int ticket_sum=0; /订票总数char name20; /乘客姓名char IDcard20;/乘客身份证号码char sect_210;/int boolean=0;/是否用的goto,默认为否/格式for(int i=0; i50; i+)printf(%c,23); printf(n 欢迎使用 火车票订票 系统 n);for(i=0; i50; i+)printf(%c,23);putchar(10);for(i=0; isequence); train_p1=train_p1-next; /=printf(n请输入车次: ); scanf(%s,sequence);if( strcmp(sequence,B)=0 | strcmp(sequence,b)=0 ) return 0;/train_p1=head;/printf(n你将要定车次:%s的车票,要定其它车次请返回上一层n,train_p1-sequence); /查找车次while( strcmp(sequence,train_p1-sequence)!=0 & train_p1-next!=NULL ) train_p1=train_p1-next;if( strcmp(sequence,train_p1-sequence)!=0 ) printf(n没有查询到车次%s!n,sequence); goto end_b;node_p2=train_p1-nhead; if( strcmp(sequence,train_p1-sequence)=0 )printf(n余票数:%dn,train_p1-SpareTicketNum); /输出余票数printf(请输入订票数量:); scanf(%d,&ticket_sum);if( ticket_sum=0 ) printf(你没有订票!n); goto end_b; if( train_p1-SpareTicketNum = ticket_sum )/查找到最后的结点,node_p2指向最后的链表if( node_p2!=NULL )while( node_p2-next!=NULL ) node_p2=node_p2-next; /=start_b2:printf(请输入姓名t身份证号码(7位)n );scanf(%s%s,name,IDcard);/验证身份证号码位数是否正确if( !checking(7,IDcard) printf(身份证号格式不正确!n); goto start_b2; node_p1=(struct node *)malloc(sizeof(struct node); strcpy(node_p1-name,name);/乘客姓名strcpy(node_p1-IDcard,IDcard); /乘客身份证号码node_p1-TicketNum=ticket_sum; /订票总数node_p1-FareSum=ticket_sum * train_p1-fare ; /总票价 /printf(MaxTicket=%d,MaxTicket);if( train_p1-nhead=NULL ) train_p1-nhead=node_p1;else node_p2-next=node_p1;node_p2=node_p1;node_p2-next=NULL;train_p1-SpareTicketNum-=ticket_sum; /修改该车次的余票数printf(n订票成功!n);else printf(n余票数不足,订票失败!n);/else printf(n没有查询到!n); boolean=0; goto start_b; save();/getch();/print();end_b:printf(n-);putchar(10);printf(n); printf( 请选择您所需的操作 n); printf( 1.继续订票 n); printf( 2.返回上一层 n); printf( 3.返回主菜单 n); printf( 4.退出 n); printf(n); printf(n请输入: );scanf(%s,§_2);if( strcmp(sect_2,1)=0 ) boolean=1; goto start_b1; else if( strcmp(sect_2,2)=0 ) goto start_b; else if( strcmp(sect_2,3)=0 ) return 0;else if( strcmp(sect_2,4)=0 ) exit(0);else return 0;/=/检查输入的省份证好是否符合规定的位数checking(int n,char check20) int len=0;if( (len=strlen(check)!=n ) return 0;else return 1;/=void save(void)FILE *fp,*pa;printf(n正在保存.n);/存入Trani.txt车次信息/printf(n正在保存Trani.txt.n);/if( (fp=fopen(train.txt,w)=NULL ) for(int i=0; iterminal,train_p1-sequence,train_p1-StartTime-year,train_p1-StartTime-month,train_p1-StartTime-day,train_p1-StartTime-hour,train_p1-StartTime-minute,train_p1-fare,train_p1-SpareTicketNum);train_p1=train_p1-next;fclose(fp);/print();/存入passenger.txtint i=0,j=0;/*/=char passPASS_N20,cc2;for( i=0; inhead;strcpy(pass,train_p1-sequence);strcat(pass,.txt);if( (pa=fopen(pass,w)=NULL )for(int i=0; iname,node_p1-IDcard,node_p1-TicketNum,node_p1-FareSum);nod
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药物制剂发展历史试题及答案
- 激光技术发展与挑战试题及答案
- 2025年高考备考十大策略
- 灾害护理学探讨
- 大学生规划教育
- 育婴师沟通心理学知识试题及答案
- 激光焊接的创新技术与应用试题及答案
- 2025年循环流化床锅炉项目发展计划
- 稽核招聘面试题及答案
- 钓鱼软件考试题及答案大全
- 苏教版一年级数学下册各单元试卷及答案(全册-含期中期末)
- 2024年湖北省武汉市高考数学一调试卷
- 管道阴极保护
- 整理【越南】环境保护法
- 河北工业大学硕士生指导教师(含新申请者)简况表.
- TAIYE370-DTH-IV液压钻机操作维护说明书
- 最新小微企业有限责任公司章程范本
- 吉林大学第一临床医学院进修人员申请表
- 廖金精雷霆八架与律吕择日法
- 吉尔吉斯斯坦共和国公司法
- 建设工程模板支撑体系安全管理重点及措施
评论
0/150
提交评论