1、火车订票管理系统火车订票管理系统假设有5条火车线路(起点均为济南),每条线路所涉及的信息有:终点站、车次、发车时间(年.月.日.时.分)、票价、余票数(假设火车总票数为300)。乘客订票信息包括:乘客姓名、乘客身份证号码、订票数,总票价。 本系统要求用结构体数组和链表实现,将火车线路信息存放在结构体数组中,每条线路对应一个链表,乘客订票就是在链表中插入结点,乘客退票就是在链表中删除结点。链表的结点类型和结构体类型定义如下:struct node /乘客订票信息 char name10; /乘客姓名 char IDcard20; /乘客身份证号码 int TicketNum; /订票数 floa
2、t 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所示。系
3、统的主要功能包括:1. 火车线路查询功能,乘客输入终点站名称或输入车次,输出相应的火车线路信息。2. 订票功能。乘客输入车次和订票数,先查询该车次的余票数,若余票数大于等于订票数,则为乘客办理订票手续,要求乘客输入姓名、身份证号码,计算出总票价,产生一个新结点,将该结点添加到对应车次的链表中,然后修改该车次的余票数。若余票数小于订票数,则输出提示信息余票数不足,订票失败!。3. 退票功能。乘客输入车次和身份证号码,在该车次对应的链表中查找该乘客,若找到,询问乘客退票数量,若退票数小于订票数,则只需修改结点的订票数;若退票数等于订票数,则将该乘客对应的结点删除,然后修改该车次的余票数;若没找到,
4、则应提示未找到相应信息,要求乘客重新输入车次和身份证号码,再进行查找,如果仍未找到,则输出提示信息输入信息错误,退票失败!。 4. 其他查询功能。(1) 输入车次,输出该车次的全部订票信息。(2) 输入车次,输出该车次的订票数和余票数。(3) 输入终点站名称,输出相关火车线路的信息。(4) 输入日期(年.月.日),输出发车时间为该天的火车线路的信息。(5) 输出余票数为0的火车线路的信息。*/#include stdio.h#include string.h#include stdlib.h#include conio.h #include cstdlib#define SUM_TICKET
5、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(
6、); /管理员权限:修改车次的信息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订票信息 ch
7、ar 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; /
8、余票数 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 文件名和文件路径
9、/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文
10、件 else if( (fp=fopen(train.txt,r+)=NULL ) putchar(10);/在控制台输出 10的ASSIC码,同 n for(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%d
11、n,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; tr
12、ain_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 al
13、ready exists!n); exit(0); strcpy(admin,admin); fprintf(ad,%s,admin); /文件指针,输出字符串,输出表列;将格式化的数据写入文件 fclose(ad); /如果密码源文件不存在,则新建空admin.txt文件,初始密码:admin if( (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 confir
14、m 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); / 如果密码为空,怎初始化为admin fclose(ad);/读取passenger.txt /printf(site=%dn,site_sum);/* /数字转换为字符串 char passN20,cc2; /= for( i=0; isequen
15、ce);/ 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
16、-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=30
17、0; 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) /调试
18、 :输出 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
19、_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); retu
20、rn 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; i
21、50; 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-min
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1