火车订票管理系统.docx
- 文档编号:29820832
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:59
- 大小:29.28KB
火车订票管理系统.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->
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 火车 订票 管理 系统