火车订票管理系统.docx
《火车订票管理系统.docx》由会员分享,可在线阅读,更多相关《火车订票管理系统.docx(59页珍藏版)》请在冰豆网上搜索。
火车订票管理系统
火车订票管理系统
假设有5条火车线路(起点均为济南),每条线路所涉及的信息有:
终点站、车次、发车时间(年.月.日.时.分)、票价、余票数(假设火车总票数为300)。
乘客订票信息包括:
乘客姓名、乘客身份证号码、订票数,总票价。
本系统要求用结构体数组和链表实现,将火车线路信息存放在结构体数组中,每条线路对应一个链表,乘客订票就是在链表中插入结点,乘客退票就是在链表中删除结点。
链表的结点类型和结构体类型定义如下:
structnode//乘客订票信息
{
charname[10];//乘客姓名
charIDcard[20];//乘客身份证号码
intTicketNum;//订票数
floatFareSum;//总票价
structnode*next;//指针成员
};
structDtime//发车时间
{
shortyear;
shortmonth;
shortday;
shorthour;
shortminute;
};
structtrain//线路
{
charterminal[10];//终点站
charsequence[10];//车次
structDtimeStartTime;//发车时间
floatfare;//票价
intSpareTicketNum;//余票数
structnode*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"
#defineSUM_TICKET300;//车票总数
#definePASS_N5//车次总数,对应这些个乘客文件
//================================================================
//函数声明
add_train();//增加车次
admin_passger();//乘客管理
admin_password();//管理员密码管理
admin_train();//管理员权限:
管理车次和乘客
booking();//订票
checking(intn,charcheck[20]);//检查输入的省份证好是否符合规定的位数
check_Date(intmax,intmin,intmn);//检查日期是否符合标准的格式
else_find();//其他查询功能
find();//查找功能
mod_train();//管理员权限:
修改车次的信息
print();//从屏幕输出车次信息
print_p(structtrain*train_p1);//输出对应车次的全部乘客信息
read();//从文件中读取车次和乘客信息
refund();//退票功能
voidsave();//将车次和乘客信息保存到文件中
//================================================================
//全局变量
structnode*node_p1,*node_p2;//乘客
structtrain*head=NULL,*train_p1,*train_p2;//线路
charadmin[20];
intMaxTicket=300;
structnode//乘客passengers订票信息
{
charname[20];//乘客姓名
charIDcard[20];//乘客身份证号码
intTicketNum;//订票数
intFareSum;//总票价
structnode*next;//指针成员
};
structDtime//发车时间
{
intyear;
intmonth;
intday;
inthour;
intminute;
};
structtrain//线路
{
charterminal[20];//终点站
charsequence[20];//车次
structDtime*StartTime;//发车时间
intfare;//票价
intSpareTicketNum;//余票数
intMaxTicket;//最大票数
structnode*nhead;//指针成员,指向该线路第一个订票乘客
structtrain*next;//指针成员,指向下一条线路
};
//============================================================================================================
//从文件中读取车次和乘客信息
intread(void)//从文件读取信息
{
system("color1f");//设置控制台背景色
FILE*fp,*pa,*ad;//打开文件,实例化三个文件结构体的指针
intsite_sum=0,sum_ch=0;//总站点
intpass_sum[5]={0};//
charch;
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("\n※※Cannotopenthefile:
train.txt!
\n※※Pleaseconfirmthefilealreadyexists!
\n");exit(0);}//找不到文件train.txt,请确定train.txt的确存在。
fclose(fp);
head=NULL;//链表置为空NULL
}
//如果车次源文件不存在,则新建空train文件
else
{
if((fp=fopen("train.txt","r+"))==NULL)
{
putchar(10);//在控制台输出10的ASSIC码,同\n
for(inti=0;i<50;i++)
printf("%c",23);
putchar(10);
printf("※※Cannotopenthefile:
train.txt!
\n※※Pleaseconfirmthefilealreadyexists!
\n");exit(0);
}
/*while(!
feof(fp))//feof用来判断是否到了某个流的结尾
{
ch=fgetc(fp);//读取字符
if(ch=='\n'||ch=='')
sum_ch++;
site_sum++;
}
if(sum_ch==site_sum)
{head=NULL;return0;}
*/else
if(ch=fgetc(fp)>=0)
{
rewind(fp);
while(!
feof(fp))
{
train_p1=(structtrain*)malloc(sizeof(structtrain));
train_p1->nhead=NULL;
train_p1->StartTime=(structDtime*)malloc(sizeof(structDtime));//开辟新节点
fscanf(fp,"%s%s%d%d%d%d%d%d%d\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;
elsetrain_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(inti=0;i<50;i++)printf("%c",23);
putchar(10);
printf("※※Cannotopenthefile:
admin.txt!
\n※※Pleaseconfirmthefilealreadyexists!
\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(inti=0;i<50;i++)printf("%c",23);
putchar(10);
printf("※※Cannotopenthefile:
admin.txt!
\n※※Pleaseconfirmthefilealreadyexists!
\n");exit(0);
}
fscanf(ad,"%s",admin);
//printf("admin=%s\n",admin);
if(strcmp(admin,"")==0)
{
strcpy(admin,"admin");
fprintf(ad,"%s",admin);
fprintf(ad,"%s",admin);
}//如果密码为空,怎初始化为admin
fclose(ad);
//读取passenger.txt
//printf("site=%d\n",site_sum);
/*//数字转换为字符串
charpass[N][20],cc[2];
//======================
for(i=0;i{
cc[0]=i+'0';cc[1]='\0';
strcpy(pass[i],"passenger");
strcat(pass[i],cc);
strcat(pass[i],".txt\0");
}
*///=====================
charpass[20];
inti=0,j=0;
train_p1=head;
for(j=0;train_p1!
=NULL;j++)
{
//printf("\n※※正在读取%s文件.......\n",train_p1->sequence);////////////////////////////////////////////
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(inti=0;i<50;i++)printf("%c",23);putchar(10);
printf("※※Cannotopenthefile:
%s!
\n※※Pleaseconfirmthefilealreadyexists!
\n",pass);
exit(0);
}
elsefclose(pa);
}
else
{
if((ch=fgetc(pa))>=0)
{
rewind(pa);
while(!
feof(pa))
{
node_p1=(structnode*)malloc(sizeof(structnode));node_p1->next=NULL;
fscanf(pa,"%s%s%d%d\n",node_p1->name,node_p1->IDcard,&node_p1->TicketNum,&node_p1->FareSum);
pass_sum[j]++;
if(pass_sum[j]==1)train_p1->nhead=node_p1;
elsenode_p2->next=node_p1;
node_p2=node_p1;
}
node_p2->next=NULL;
}
fclose(pa);
}
//
//printf("%d\n",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("\nMaxTicket=%d\n",MaxTicket);
fprintf(ma,"%s",admin);
}
elsefscanf(ma,"%d",&MaxTicket);
fclose(ma);
*/
//printf("\n※※全部文件读取完毕!
\n");
}
//============================================================================================================
//从屏幕输出车次信息
intprint(void)
{
//调试:
输出
putchar(10);inti=1;
if((train_p1=head)==NULL)
{
//如果车次文件是空文件
printf("※※没有任何车次!
按任意键返回上一层\n");
getch();return0;
}//
printf("终点站车次发车时间\t票价\t余票数\n\n");
while(train_p1!
=NULL)
{
printf("%s%s%4d-%2d-%2d%2d:
%2d\tY%d\t%d\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);
train_p1=train_p1->next;
//printf("i=%d\n",i);i++;
}
return1;
}
//============================================================================================================
//输出对应车次的全部乘客信息
print_p(structtrain*train_p1)
{
//调试:
输出
putchar(10);inti=1;
if((node_p1=train_p1->nhead)==NULL)
{
printf("※※该车次没有乘客!
\n");
return0;
}
printf("车次\t乘客姓名\t乘客身份证号\n\n");
while(node_p1!
=NULL)
{
printf("%s\t%s\t\t%s\n",train_p1->sequence,node_p1->name,node_p1->IDcard);
node_p1=node_p1->next;
}
return0;
}
//============================================================================================================
find(void)//查询
{
start_f:
system("cls");//清屏
putchar(10);
charsect_1[20]={"1"};
charterminal[20];//终点站
charsequence[20];//车次
//格式
putchar(10);
for(inti=0;i<50;i++)
printf("%c",23);
printf("\n欢迎使用火车票查询系统\n");
for(i=0;i<50;i++)
printf("%c",23);putchar(10);
for(i=0;i<50;i++)
printf("%c",3);
//
putchar(10);
printf("┌————————————┐\n");
printf("│请选择您所需操作│\n");
printf("│1.按终点站查询│\n");
printf("│2.按车次查询│\n");
printf("│3.返回主菜单│\n");
printf("│4.退出│\n");
printf("└————————————┘\n");
printf("\n\n※※请选择:
");
scanf("%s",sect_1);
if(strcmp(sect_1,"1")==0)
{
start_f1:
if((train_p1=head)==NULL)
{
//如果车次文件是空文件
printf("※※没有任何车次!
按任意键返回上一层\n");
getch();gotostart_f;
}
printf("※※请输入终点站:
");scanf("%s",terminal);
while(strcmp(terminal,train_p1->terminal)!
=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:
%2d\tY%d\t%d\n",train_p1->terminal,train_p1->sequence,train_p1->StartTime->year,train_p1->StartTime->month,train_p1->StartTime->day,train_p1->StartTime->