/*
车票管理系统
一车站每天有n个 发车班次,每个班次都有班次号、固定发车时间,起点站、终点站、行车时间,固定的载客量、已订票人数
如:
班次 发车时间 起点站 终点站 行车时间 载客量 已订票人数
1 8:00 安阳 郑州 3 45 30
2 6:40 安阳 北京 5 40 20
功能要求:
1、管理员功能
(1)录入班次信息(信息用文件保存),可不定时地增加班次数据(注意班次号不能重复)
(2)删除班次信息
(3)浏览班次信息,可显示出所有班次当前状态
2、普通用户功能
(1)查询路线:可按班次号查询,也可按终点站查询
(2)订票:输入姓名和班次后实现订票功能(只能买订票人数小于载客量且当前系统时间小于发车时间的车次)
(3)查票:输入姓名可查询本人已经买到的查票信息。
(4)退票:输入姓名和退票班次,当本班车未发出时才能退票,自动更新已订票人数
其他要求:
(1)编程使用c语言
(2)采用菜单界面
(3)学生可自动增加新功能模块(视情况可另加分)
*/
/*
单级菜单:
多级菜单:
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>
struct car
{
int cch;
char time1[10]; //11:30
char start[20];
char last[20];
int time2;
int biggest;
int people;
};
struct ticket
{
char xm[20];
int cch;
char time1[10];
char start[20];
char last[20];
int time2;
};
struct sysin
{
char ID[10];
char Password[15];
};
int comparetime(char *s) //判断发车时间和当前系统时间
{
int a[3]={0},i,j;
i=0,j=0;
time_t t;
struct tm *lt;
//将字符串时间整理出十和分(分别在a[0]和a[1])
while(s[i])
{
if (s[i]>='0' && s[i]<='9')
a[j]=a[j]*10+s[i]-'0';
else
j++;
i++;
}
//获取当前系统时间的十和分
time(&t);
lt=localtime(&t);//lt->tm_hour,lt->tm_min
if ((a[0]>lt->tm_hour)||((a[0]==lt->tm_hour)&&(a[1]>lt->tm_min)))
return 1;
else
return 0;
}
void sysload() /** 系统管理员登录页面 **/
{
struct sysin User1,User2;
FILE *file1;
int length,i=0;
void manager();
file1=fopen("d:\\test\\sysin.txt","r");//read
while (i<3)
{
fflush(stdin);
printf("请输入管理员账号和密码:\n");
scanf("%s",User1.ID);
scanf("%s",User1.Password);
if (file1==NULL)
{
file1=fopen("d:\\test\\sysin.txt","w");
fputs(User1.ID,file1);fputc('\n',file1);
fputs(User1.Password,file1);
fclose(file1);
break;
}
else
{
if (i==0)
{
fgets(User2.ID,50,file1);
length=strlen(User2.ID);
User2.ID[length-1]='\0';
fgets(User2.Password,50,file1);
}
if(strcmp(User1.ID,User2.ID)==0)
{
if(strcmp(User1.Password,User2.Password)==0) //账号密码都正确输出
{
break;
}
else
printf("密码错误,请重新输入\n");
}
else
printf("账号错误,请重新输入\n");
}
i++;
}
fclose(file1); //关闭文件
if (i<3)
manager();
}
void addcar() /** 录入班次车次 **/
{
struct car car[100];
int j,k=0,i,flag=0;
FILE *file1;
printf("录入几班列车:");
scanf("%d",&j);
fflush(stdin);
printf("班次: 发车时间: 始发站: 终点站: 行车时间: 额定载客量:\n");
while(k<j)
{
printf("班次:");
scanf("%d",&car[k].cch);
fflush(stdin);
//检测班次号有无重复(如重复则重新录入)
for(i=0;i<k;i++)
if (car[i].cch==car[k].cch) break;
if (i<k) {printf("班次号重复,请重输\n");continue;}
printf("发车时间:");
scanf("%s",car[k].time1);
fflush(stdin);
printf("始发站:");
scanf("%s",car[k].start);
fflush(stdin);
printf("终点站:");
scanf("%s",car[k].last );
fflush(stdin);
printf("行车时间:");
scanf("%d",&car[k].time2);
fflush(stdin);
printf("额定载客量:");
scanf("%d",&car[k].biggest);
car[k].people=0;
fflush(stdin);
k++;
}
file1=fopen("d:\\test\\addcar.txt","r");
if(file1==NULL)
{
file1=fopen("d:\\test\\addcar.txt","w");
}
fclose(file1);
file1=fopen("d:\\test\\addcar.txt","a+");
for(i=0; i<j; i++)
{
fwrite(&car[i],sizeof(struct car),1,file1);
}
fclose(file1);
printf("录入成功!");
}
void allcar()
{
struct car st;
FILE * file1=fopen("d:\\test\\addcar.txt","r");
if (file1!=NULL)
{
printf("---------------------------------------------------------------------------------------------\n");
while (fread(&st,sizeof(struct car),1,file1)==1)
{
printf("|车次:%2d|发车时间:%6s|始发站:%6s|终点站:%6s|行车时间:%2d|额定载客量:%2d|已订票人数:%2d|\n",st.cch,st.time1,st.start,st.last,st.time2,st.biggest,st.people);
}
fclose(file1);
printf("---------------------------------------------------------------------------------------------\n");
}
else
printf("目前没有任何车次信息,请耐心等待!\n");
getchar();
getchar();
}
void delcar()
{
struct car tt[100];
int n=0,i,j,x;
FILE * file1=fopen("d:\\test\\addcar.txt","r");
if (file1!=NULL)
{
printf("请输入删除班次:\n");
scanf("%d",&x);
while (fread(&tt[n],sizeof(struct car),1,file1)==1)
n++;
fclose(file1);
for(i=0;i<n;i++)
if (tt[i].cch==x) break;
if (tt[i].people==0)
{
for(j=i;j<n;j++)
tt[j]=tt[j+1]; //把要删除的班次覆盖掉了
n--;
file1=fopen("d:\\test\\addcar.txt","w");
for(i=0;i<n;i++)
fwrite(&tt[i],sizeof(struct car),1,file1);
fclose(file1);
printf("%d号班次删除成功\n",x);
}
else
printf("%d号车有人订票,不能删除!\n",x);
}
else
printf("目前没有任何车次信息,请耐心等待!\n");
getchar();
getchar();
}
void searchroad() /** 查询路线 **/
{
char ch;
int flag1=0,flag2=0,cc;
char zdz[20];
struct car st;
FILE *file1=fopen("d:\\test\\addcar.txt","r");
if (file1!=NULL)
{
printf(" 请输入查询方式:\n 1.班次查询\n 2.终点站查询\n ");
fflush(stdin);
ch=getchar();
if(ch=='1')
{
printf("请输入你乘坐的班次:");
scanf("%d",&cc);
while (fread(&st,sizeof(struct car),1,file1)==1)
{
if((st.cch==cc)&&comparetime(st.time1))
{
printf("车次信息:\n");
printf("|车次:%2d|发车时间:%6s|始发站:%6s|终点站:%6s|行车时间:%2d|额定载客量:%2d|\n",st.cch,st.time1,st.start,st.last,st.time2,st.biggest);
flag1=1;
break;
}
}
fclose(file1);
if(flag1==0)
{
printf("对不起,未查询到相关的车次信息!\n");
}
}
else if(ch=='2')
{
printf("请输入你乘坐车次的终点站:");
scanf("%s",zdz);
while (fread(&st,sizeof(struct car),1,file1)==1)
{
if((strcmp(st.last,zdz)==0)&&comparetime(st.time1))
{
printf("您的车次信息如下:\n");
printf("|车次:%2d|发车时间:%6s|始发站:%6s|终点站:%6s|行车时间:%2d|额定载客量:%2d|\n",st.cch,st.time1,st.start,st.last,st.time2,st.biggest);
flag2=1;
}
}
fclose(file1);
if(flag2==0)
{
printf("对不起,未查询到相关的车次信息!\n");
}
}
}
else
printf("目前任何车次信息,请耐心等待!\n");
getchar();
getchar();
}
void addticket(char *s,struct car carx)
{
FILE *fp;
struct ticket st;
fp=fopen("d:\\test\\addticket.dat","rb");
if (fp==NULL)
fp=fopen("d:\\test\\addticket.dat","wb");
fclose(fp);
fp=fopen("d:\\test\\addticket.dat","ab+");
strcpy(st.xm,s);
st.cch=carx.cch;strcpy(st.start,carx.start);strcpy(st.last,carx.last);
st.time2=carx.time2;strcpy(st.time1,carx.time1);
fwrite(&st,sizeof(struct ticket),1,fp);
fclose(fp);
}
void buyticket() /** 售票系统 **/
{
char first[20],name[20];
char end[20];
struct car car[100];
int flag=0;
int cc,i,n=0;
FILE * file1=fopen("d:\\test\\addcar.txt","r");
if (file1!=NULL)
{
printf("请输入您的起始站:");
scanf("%s",first);
printf("请输入您的终点站:");
scanf("%s",end);
printf("车次信息如下:\n");
while (fread(&car[n],sizeof(struct car),1,file1)==1)
{
if ((strcmp(car[n].start,first)==0)&&(strcmp(car[n].last,end)==0)&&(car[n].people<car[n].biggest)&&comparetime(car[n].time1))
{
printf("|车次:%2d|发车时间:%6s|始发站:%6s|终点站:%6s|行车时间:%2d|额定载客量:%2d|\n",car[n].cch,car[n].time1,car[n].start,car[n].last,car[n].time2,car[n].biggest);
flag=1;
}
n++;
}
if(flag==0)
{
printf("对不起,未查询到相关车次信息!");
}
fclose(file1);
}
else
{printf("目前还没有车次信息!\n");getchar();
getchar();return;}
if(flag==1)
{
FILE *file1=fopen("d:\\test\\addcar.txt","w");
printf("请输入您的姓名和购买车次:");
scanf("%s%d",name,&cc);
for(i=0; i<n; i++)
{
if(cc==car[i].cch)
{
printf("订票成功!\n");
car[i].people=car[i].people+1;
addticket(name,car[i]);
}
fwrite(&car[i],sizeof(struct car),1,file1);
}
fclose(file1);
}
getchar();
getchar();
}
void findticket()
{
FILE *fp;
struct ticket st;
char name[20];
int i=0,flag=0;
printf("请输入您的姓名:\n");
fflush(stdin);
gets(name);
fp=fopen("d:\\test\\addticket.dat","rb");
if (fp!=NULL)
{
while (fread(&st,sizeof(struct ticket),1,fp)==1)
{
i++;
if (strcmp(st.xm,name)==0)
{flag=1;printf("|序号:%2d|姓名:%8s|车次:%2d|始发站:%6s|终点站:%6s|行车时间:%2d|\n",i,st.xm,st.cch,st.start,st.last,st.time2);}
}
fclose(fp);
}
if (flag==0) printf("%s同志,您当前没有订好的车票!\n",name);
getchar();
getchar();
}
void backticket()
{
FILE *fp;
int bch,flag=0,n=0,k,i;
char name[20];
struct ticket st[10];
struct car tt[50];
printf("请输入姓名和车次:\n");
fflush(stdin);
scanf("%s%d",name,&bch);
//判断该乘客买了该班次的票?
fp=fopen("d:\\test\\addticket.dat","rb");
if (fp!=NULL)
{
while (fread(&st[n],sizeof(struct ticket),1,fp)==1)
{
if ((strcmp(st[n].xm,name)==0)&&(st[n].cch==bch))
{flag=1;k=n;}
n++;
}
fclose(fp);
if (flag==0) {printf("你没有买该班次的票!\n");getchar(); getchar();return;}
}
else
{printf("目前没有任何车票信息!\n");getchar(); getchar();return;}
if (flag==1)
if (comparetime(st[k].time1)) //如果发车时间未到
{
//从购票文件中去掉该张票
fp=fopen("d:\\test\\addticket.dat","wb");
for(i=0;i<n;i++)
if (i!=k)
fwrite(&st[i],sizeof(struct ticket),1,fp);
fclose(fp);
//修改班次文件中的已订票人数
fp=fopen("d:\\test\\addcar.txt","r");
n=0;
while (fread(&tt[n],sizeof(struct car),1,fp)==1)
{
if (tt[n].cch==bch)
tt[n].people=tt[n].people-1;
n++;
}
fclose(fp);
fp=fopen("d:\\test\\addcar.txt","w");
for(i=0;i<n;i++)
fwrite(&tt[i],sizeof(struct car),1,fp);
fclose(fp);
printf("退票成功!\n");
getchar();
getchar();
}
}
void menu3()
{
printf("#====================================#\n");
printf("# 1. 查询班次信息 #\n");
printf("# 2. 订 票 #\n");
printf("# 3. 查 票 #\n");
printf("# 4. 退 票 #\n");
printf("# 0. 返回主菜单 #\n");
printf("#====================================#\n");
printf("请输入0~4选项:");
}
void menu1()
{
printf("#====================================#\n");
printf("# 欢迎使用车票管理系统 #\n");
printf("#====================================#\n");
printf("# 1. 管理员登录 #\n");
printf("# 2. 普通用户登录 #\n");
printf("# 0. 退出系统 #\n");
printf("#====================================#\n");
printf("请输入0~2选项:");
}
void menu2()
{
printf("#====================================#\n");
printf("# 1. 添加车次信息 #\n");
printf("# 2. 删除车次信息 #\n");
printf("# 3. 浏览车次信息 #\n");
printf("# 0. 返回主菜单 #\n");
printf("#====================================#\n");
printf("请输入0~3选项:");
}
void manager()
{
int choice;
void initmenu();
while (1)
{
system("CLS");
menu2();
scanf("%d",&choice);
switch(choice)
{
case 1:
addcar();
break;
case 2:
delcar();
break;
case 3:
allcar();
break;
case 0:
break;
}
if (choice==0)
break;
}
initmenu();
}
void normal()
{
int choice;
void initmenu();
void searchroad();
void buyticket();
void findticket();
void backticket();
while (1)
{
system("CLS");
menu3();
scanf("%d",&choice);
switch(choice)
{
case 1:
searchroad();
break;
case 2:
buyticket();
break;
case 3:
findticket();
break;
case 4:
backticket();
break;
case 0:
break;
}
if (choice==0)
break;
}
initmenu();
}
void initmenu()
{
int choice;
system("CLS");
menu1();
scanf("%d",&choice);
switch(choice)
{
case 1:
sysload();
break;
case 2:
normal();
break;
case 0:
break;
}
if (choice==0)
{
printf(" 正在退出..");
Sleep(1000);
printf(".\n");
Sleep(1000);
printf(".\n");
printf(" 退出成功 .\n");
Sleep(500);
return;
}
}
int main()
{
initmenu();
return 0;
}